An AI agent built my dictation app in one afternoon. The plan did the work.
The commercial dictation tool kept writing Hal as howl, so an agent built a replacement in one afternoon: local Whisper speech-to-text, a classifier that settles misheard words, a small language model only when the classifier is unsure, and a dictionary that learns from edits. The point of the story is not the code. It is the plan: seventeen lines of wishes, one planning interview until every question was closed, homework only a human can do, measurements before any code, then six steps each tested by using the app.
Chapters
- 0:00Cold open: the word it kept getting wrong
- 0:33Why build it at all
- 1:18Seventeen lines
- 2:11The interview
- 3:05What I chose and what I delegated
- 3:50Homework: the keys
- 5:04Measure before you build
- 5:56The first dictation
- 6:37Auto mode, and a dictation app looks like spyware
- 7:23The window, and the coyote
- 8:07Using the tool to build the tool
- 8:42What the plan did
Transcript
The narration, as written. The voice is synthetic.
0:00Cold open: the word it kept getting wrong
I talk to agents more than I type to them. For a while I did that through a commercial dictation tool, and it was good, with one habit I could not train out of it. My name is Hal. It wrote howl. Every few dictations, there it was again: a coyote in the middle of a sentence about a server. This is the story of replacing that tool in one afternoon, and the point of the story is not the code. It is the plan.
0:33Why build it at all
The reasons were ordinary. The tool I was using has a free tier with a usage meter, and a meter is a small monkey on your back: every long dictation is a glance at how much is left before the monthly fee begins. Dictation is faster than my typing, and it lets me think out loud and get a whole idea down before the keyboard argues. And I wanted features nobody was going to ship for me: a correction loop that learns my words, and a second opinion on grammar when the first pass is not sure. Owning the source means the next button is mine to add. People call this moment the software-as-a-service apocalypse. I would just call it describing what you want and having it built.
1:18Seventeen lines
So the project started as a text file. Seventeen lines in an empty folder: a dictation app for Windows, push-to-talk, text lands in whatever box has focus, a small always-on-top window, an auto mode for long dictations, a history I can edit, and the edits become a dictionary. One line named the problem by example: I say Hal, it writes howl. That example did more work than any feature sentence. An agent can build a generic word swap from a feature. From an example it can find the right mechanism. Before I opened the agent, I added one more requirement I had forgotten: the keys for any paid service live in the operating system's credential store, never in a file.
2:11The interview
Then I handed the file to a planning agent and asked for questions, not code. It came back with a page of them. Local speech recognition or a cloud service? What is this classifier you named? Does the dictionary travel with the program? Which language? Is there a graphics card to lean on? I answered by dictation, with the old tool, while we planned its replacement. Local recognition, yes. No graphics card, ever: it has to run on any laptop I copy it to. The dictionary travels. The classifier is a new product, so go read its documentation. It did, and came back with a design and two recommendations I had not asked for: a small fast language model as the fallback corrector, and a language better suited to Windows than the one I would have reached for.
3:05What I chose and what I delegated
Some choices were mine and some were the agent's, and knowing which is which is most of the craft. I chose the database, because I have used it in a dozen products and I know what it is good at: one file, standard queries, easy to open by hand. I chose the classifier, because I had used it before and knew what it could do. That is domain experience, and it is allowed to be opinionated. The language, the speech model, the window sizes: I had no experience worth imposing, so I said choose the best fit and tell me why. The plan it wrote recorded both kinds of decision in the same table, and that table is what the build ran on.
3:50Homework: the keys
Before any code, I had homework, and it was the only part only a human should do. Two paid services meant two API keys. I made new ones, one for this application, even though I already hold keys at both providers for other work. That is the doctrine: one key per application. Rotating this app's keys later touches nothing else I run, and if one leaks, the blast radius is one program. Each provider's site warned me, correctly, that a key that never expires is a bearer token: whoever holds it spends on your account. So each one went straight into the Windows credential manager under the name the agent asked for, and nowhere else. Two things worth knowing if you have never done this. A key is shown to you once; copy it before you close the window, because the only way back is to make a new one. And a fresh key does nothing until the account behind it has credit. I am showing this part with the key blurred, because the point is the motion, not the secret. And yes, these keys were rotated before this video went up.
5:04Measure before you build
With the keys stored, the agent did not start on the app. It wrote a test program first. It timed two local speech models on this laptop's processor, and found that the engine always processes thirty seconds of audio even for a four-second clip, which it fixed by fitting the window to the clip. The small model was fast but dropped the first words of a sentence; the larger one was slower and perfect. Accuracy won. Then it tried the classifier on the real problem: not a grammar question, but a choice question. At this spot, did the speaker most likely say Hal or howl? That question was right every time. And the fallback model fixed four broken sentences without rewording a single correct one. All of that was known before the first line of the real program existed.
5:56The first dictation
Step one was the smallest thing that could work: hold the keys, speak, let go, and text appears in a notepad. A dark pill at the top of the screen said it was listening, then transcribing, then a green check. What landed was exactly what I said, question mark included. From here on every step ended the same way: the agent built, and I tested by using it. That is the rhythm that made the afternoon work. The plan was the source of truth, the agent ran on its own, and the human's job was to watch for the rails and try the thing.
6:37Auto mode, and a dictation app looks like spyware
Step two was auto mode: hold the keys past ten seconds and it keeps listening after you let go, until you stop talking. It worked the first time. Step three, the full interface, did not, for a reason that had nothing to do with the code. The build kept stalling, and the antivirus kept popping up. Think about what this program does. It listens to the microphone, turns speech into text, reads credentials, and sends text to the network. That is the exact shape of spyware, and the antivirus was doing its job. The fix in development is an exclusion for the folder. The fix for anyone else's machine is a signed release. Both went into the plan's risk table.
7:23The window, and the coyote
Once it ran, the pill grew a history pane, a settings window, and a tray icon. In settings I changed the hotkey, tested both keys with a button that reads them and reports back, and set how long a pause ends auto mode. Then the test that mattered. I dictated a paragraph that used howl for the animal and Hal for the person, several of each, in one breath. Every one came out right. The classifier picked the word from the sentence around it, and when it was not sure, the fallback model took a look, well under a second. The thing I built the tool for worked on the first real try.
8:07Using the tool to build the tool
By step five I had stopped using the old tool. The next request to the agent, that every window's text was too small, was dictated with the app we were building. It made the windows bigger. I found a cancel button that had never been wired to anything, said so, and it was fixed in a minute. The dictionary window now showed the first learned rule, howl to Hal, with a count of how often it had been applied. Whether that learning gets better over months is a promise, not a proof. The only honest test is using it, which I am.
8:42What the plan did
Step six packaged it: one folder, one executable, the database beside it, the model downloaded on first run. Copy the folder and the app moves with its memory. Look at the shape of the afternoon. A list of what I wanted. An interview until every open question was closed. Homework only a person can do. Measurements before construction. Then six steps, each one tested by using it. No code was written until there was nothing left to decide. That is why it took an afternoon. The agent did the building. The plan did the work.