--- title: "A ghost hand and an audience of one" date: 2026-07-18T09:00:00-04:00 draft: false description: "I taught my software test suite to record training videos, first for an app with exactly one user." tags: - projects - ai - video --- {{< callout type="info" title="TL;DR" >}} I taught my software test suite to record training videos. They star the real application, they narrate themselves with captions, and when the app changes, I rebuild them with one command instead of re-filming anything. The system was invented in an evening to teach one person her own custom software; the next night it made a forty-nine-video library for LocallyGrown.net. This is the story; a [companion post](/posts/2026-07-18-your-test-suite-is-a-video-studio/) has the technical details. {{< /callout >}} Modern software developers write automated tests for their applications that use the app the way a person does. The tests open a browser, sign in, tap the buttons, fill in the forms, and check that the right things happened. Normally all of this runs invisibly, in what's called a headless browser, which is exactly what it sounds like: a browser with no window, doing its work where nobody can see. You just get a list of green checkmarks at the end. Earlier this week I gave the tests for one of my projects a visible mode, mostly out of curiosity, so I could watch them run instead of trusting the checkmarks. It was oddly satisfying. A ghost hand glided through the app, tapping and typing, doing in seconds what would take me a minute. And watching it, I sent a message to the AI coding assistant I work with that said, nearly verbatim, "I watched the tests run and they're nice! It made me wonder what it would take to generate a training video I could give to Carol." The answer turned out to be about an hour. --- ## Built for Carol Carol is my partner, and Refreshing Spaces is her professional organizing and decluttering business. This week, I built her an app from scratch to run it, covering her clients and visits, invoices and payments, mileage, and the before-and-after photos that really show off all of her work. She works from her phone in clients' homes, so everything is designed for a phone screen. The app's entire user base is one person, and she is not a software developer. That makes for a strangely pure version of a problem every software company faces: how do you teach someone to use a thing? There is no manual for an app that exists nowhere else, and nobody has recorded a YouTube tutorial for software with one user. If the app was going to be learnable, I had to make it teach itself. And in my household, as in most, "watch this forty-second video" beats "read this document I wrote." --- ## What a generated video looks like {{< rawhtml >}} {{< /rawhtml >}} Each video is under a minute. It opens on the app already signed in, with a caption bar across the bottom narrating each step in a sentence. A small blue ring plays the part of a finger, gliding to a button and pulsing when it taps, moving at a pace you can follow. Text gets typed one character at a time, the way a person types. Everything on screen is the real application, doing real work. Now, viewers of my YouTube cooking series will know I'm no stranger to the world of video editing, but still I found this part genuinely pleasing: no camera was involved, and no video editor either. The videos are recorded by the same kind of automation that runs the tests. A short script says, in effect, "show this caption, tap this button, type this name, wait for the save," and the browser does it while recording itself. The video file that comes out is less like a film and more like a compiled program. The script is the source; the video is just what it produces today. That one property makes maintaining these a dream, and I'll come back to it at the end. The videos are silent on purpose, though that wasn't the original plan. The plan was voiceover, and each recording still produces a little narration script with timestamps for a voice to read. Some day I might play around with automated voice generation (synthesized speech continues to improve by leaps and bounds) but while creating these I realized the silent, captioned versions were the better product anyway. Carol can watch one in a client's living room without headphones, in a spare minute, with nothing to unmute. All fifteen are public, so Carol can brag about her bespoke software to her friends: [refreshingspaces.life/help/videos](https://refreshingspaces.life/help/videos). They're grouped by the shape of her workday, with sections like "Start here," "Getting paid," and "Out and about," because when there's one user, the natural organization is her day, and I know exactly what her day looks like. --- ## Feeling human Getting the recordings to feel like a person showing you something, rather than a machine executing steps, took several rounds of watching them and wincing. The first version jumped from place to place, the way automation naturally moves, because a computer has no reason to scroll gradually when it can arrive instantly. A human would scroll and swipe with smooth motions, so every movement became a smooth, eased glide. Jump-cuts read as a machine. Eased motion reads as someone showing you. The second problem only revealed itself on watching: the caption bar sits at the bottom of the phone screen, which is exactly where apps put their most important buttons, so several taps happened underneath the caption. Now, when a tap is headed for the bottom of the screen, the caption politely hops to the top for that moment. It's a small behavior, and it's the difference between a video you trust and one that visibly hides the thing it's teaching. The third appeared on camera inside an error message. A form arrived with an amount already filled in, the automation typed a new amount on top of it, and the video proudly displayed "36.5012.00." The typing now clears a field before it fills it, the way you would. All three of these were caught by a human (me!) watching the finished video, not by any automated check, and that's worth repeating for anyone leaning on automation for anything: reviewing your own generated material is the quality control, and it doesn't automate away. One more choice from this stage, which I think about more than I expected to. I sprinkled Carol's business tagline throughout her app, but I chose to leave it out of the training captions. It belongs to her voice, and somehow it felt wrong seeing her voice in the caption bar narrating to herself where to tap. Somebody has to decide where a brand's voice does and doesn't go, and it turns out that's true even when the brand is your partner's and the audience is her. --- ## Porting it to LocallyGrown The prototype was built in an evening for one person. The next night I brought the system to LocallyGrown.net, the farmers market platform I've built and run since 2002, and everything became plural. Shoppers, growers, and market managers each needed their own walkthroughs. People often shop on phones while managers often run markets on laptops (but not always!), so most walkthroughs got recorded twice, at phone size and at computer size. Twenty-five walkthroughs now produce forty-nine videos at [locallygrown.net/docs/videos](https://locallygrown.net/docs/videos), and short "watch" links sit inside the written documentation, right next to the paragraphs they illustrate. {{< rawhtml >}}