A showroom TV that tells the story itself.
One web app for AHA’s showroom TV: a pitch that plays itself, a path-traced 3D tour of the experience centre, pressable product demos and an idle loop.
- Role
- Owner, product and engineering. Built with Claude Code
- When
- Sep – Oct 2026
- Built with
- JavaScript · three.js · WebGL · WebCodecs · Service Worker · Supabase / Postgres
- Where
- AHA Smart Homes
How it helped AHA
- A demo anyone can runWhoever is showing a visitor round plays AHA’s story from the remote: seven chapters, including a 3D walk through the experience centre.
- Working when nobody presentsLeft alone, the TV loops AHA’s moments, products, client stories, both centres’ opening hours and a QR code.
- Films to sendDemo films are recorded straight from the app, with 720p versions small enough to email.
The problem
- The first guided walkthrough took 15 minutes and depended on who was presenting.
- The screen is a 2 GB TV with a D-pad remote, and its BACK button leaves the app.
- Five separate pages did overlapping jobs: a desktop map, a TV mode, a wall display, a sleep page and a calendar.
What I did
- One app for every screen: the TV and laptops run the same app, and the five older pages folded into it.
- A pitch that plays itself: seven chapters, each flowing into a “To remember” slide. Read →
- The experience centre in 3D: path-traced offline, then crossfaded between lighting scenes on the TV. Read →
- Products you can press: the X7 switch, the smart lock, the aroma diffuser and the hub, each demoed on screen.
- An idle loop: after 20 quiet seconds the TV plays AHA’s moments, also exported as a standalone screensaver. Read →
- Films from the app: demo videos recorded headless with WebCodecs, without ffmpeg. Read →
- Built for the TV: a lite mode, compositor-only animation, and a BACK button that stays inside the app. Read →
Results
The pitch runs about 5½ minutes when a presenter clicks through, down from 15. On a Chrome stand-in for the TV, memory fell 35% and the heaviest animation went from 20 to 57 fps.