#indie dev
37 posts- 3 min
A deck on my desk — Darkroom Notes, Season 6, and STIL.HUB
That little machine on a streamer's desk, rows of buttons across its face — I'd always been a bit envious of it. Your everyday actions, sitting there as physical buttons. Then it struck me: there was already an iPhone on my desk. Darkroom Notes Season 6 is about STIL.HUB, the app that turns an iPhone into a control deck for your Mac.
- 3 min
Listening twice — when English broke the transcript
The Japanese play-by-play came through fine. But the moment an English comment began, the transcript collapsed into "Wel actaltlysputure…" — a string that looks like English and isn't. A transcription model can only listen in one language at a time. So I decided to have two of them listen to the same audio.
- 3 min
No second take — Darkroom Notes, Season 5, and STIL.NOTE
Take notes, and you stop hearing the conversation. Listen properly, and nothing gets written down. I spent years going back and forth between the two. Unlike a photo, a conversation has no second take. Darkroom Notes Season 5 is about STIL.NOTE, the voice app — starting, as always, with why I built it.
- 3 min
"OK" doesn't mean it opened — chasing a PDF that never appeared
Open a Mac file from the iPhone. Run it, and the log says "ok." But on the Mac's screen, nothing happens. The hunt for the culprit ended somewhere unexpected — an app that had been left running for fourteen days. And the real lesson wasn't about the culprit. It was about the "ok."
- 3 min
Same room only — a six-digit passphrase
The family so far has been tools that keep your data from leaving. STIL.HUB carries the opposite kind of danger: this tool can operate your Mac. So this time, "nothing goes out" wasn't enough — I had to design "nothing gets in." A six-digit passphrase, and a conversation that never leaves the room.
- 3 min
Save the audio first — after losing fifteen minutes
Fifteen minutes of recording, gone. I pressed stop, and while waiting for the summary I went back to the home screen. That's all it took. The cause was my own design: saving sat at the end of the pipeline. A conversation has no second take, I wrote in the first post. My design hadn't caught up with my own words.
- 3 min
Speak here, type there — when I stopped asking the Mac
One button at my hand, and the Mac's dictation wakes up — that was the whole plan. But no matter how I asked, the Mac wouldn't listen. After enough stubbornness, I stopped asking. Don't make the Mac listen; let the iPhone do it. At the end of the detour sits my favorite feature in the app.
- 3 min
The meeting that never happened — teaching the summary not to invent
A recording of nothing but the word "Yes." came back with a full meeting summary attached — decisions, to-dos, the lot. Summarize a 14-minute conversation and you'd get "28 decisions." The real number was zero. The AI was saying more than it had heard, again. What I fixed wasn't the model. It was how I was asking.
- 3 min
The name was a sticky note — rebuilding speaker identification
Enroll a voice, and that person's lines get their name — that was the feature, supposedly. Except recordings of people I had never enrolled were coming back labeled with enrolled names. Digging in, I found the model had no mechanism for matching voices at all. The name was a sticky note on a seat. The most surprising story of this series.
- 3 min
The phone becomes a deck — a sixth tool, and the end of Darkroom Notes Season 6
Move a companion into the Mac, exchange a six-digit passphrase, lay out the buttons. Everything this season has covered joins up between two machines on one desk. To finish, I trace the flow start to end, tell the story of the family's first-ever "free," and close Darkroom Notes Season 6.
- 3 min
The talk becomes a note — a fifth tool, and the end of Darkroom Notes Season 5
Record, transcribe, sort, shape, export. Everything this season has covered, one post at a time, joins up over a single recording. To finish, I trace that flow from start to end, write down what building a fifth tool taught me, and close Darkroom Notes Season 5.
- 3 min
The words I couldn't write — hunting down a subtitle
The first subtitle read "Control your Mac from iPhone." App Review's objection was the way it used the word iPhone. Just swap the words — except the same words were living in the site's headline, in the social-share image, and in the opening seconds of the very video I'd filmed for review. Changing words, it turned out, was not a matter of fixing one place.
- 3 min
I built it for my own taxes — Darkroom Notes, Season 4, and STIL.RECEIPT
Every year at tax time, I'd wrestle with the pile of receipts stuffed in drawers and my wallet. Date, amount, store, tax rate — type each one in by hand, or leave them and cry about it later. The person it troubled most was me. Darkroom Notes, Season 4: my receipt app, STIL.RECEIPT, starting with why I made it.
- 2 min
Every real bug becomes a test — one receipt stands guard
A discount line vanishes entirely. A payment made with iD gets recorded as cash. With something as endlessly varied as receipts, fixing one may be breaking another. So I decided to turn every receipt that tripped me up on a real device into a test, on the spot. The story of how the receipt that troubled me becomes a guard.
- 3 min
Harder to read than a card — a table splits into two lines
A receipt's line items run name on the left, amount on the right. To the human eye, it's clearly one row. But text recognition sometimes returned that name and amount as separate fragments. What looked like one row split into two — and that "table" was the part of this app I struggled with most.
- 3 min
When a receipt becomes an expense — a fourth tool, and the end of Darkroom Notes Season 4
Capture, read, sort, verify, turn into an expense. The pieces I've written one by one come together on a single receipt. To close, I trace that flow from start to finish, write what I came to think after building a fourth tool, and end Darkroom Notes Season 4.
- 2 min
The total never lies — fixing tax mix-ups with math
The "10% taxable" field would end up holding the tax amount instead of the taxable amount. AI and rules alike mix it up when similar numbers sit nearby. And worse, the wrong number really does exist somewhere on the receipt. What rescued it wasn't a clever reader, but one unmoving fact — the total.
- 3 min
The word I won't write — wording around tax
"Fully compliant with the invoice system." "Fully compliant with the recordkeeping law." Written in one line, it would probably be strong. Clear, eye-catching. But I didn't write it. Tax is law, and I'm someone who builds apps, not a tax accountant. Holding back the convenient one-liner — a story about wording.
- 3 min
The cards I didn't want to upload — Darkroom Notes, Season 3, and a fourth app: STIL.BIZ
The contents of a business card holder, when you think about it, aren't really yours. The names, companies, phone numbers, emails — they're other people's personal data. Uploading all that to a server just because it's convenient never sat right with me. Darkroom Notes, Season 3: my fourth app, STIL.BIZ, starting with why I made it.
- 4 min
Hidden in plain sight — Darkroom Notes, Season 2, and a second app: STIL.TOON
I want to pass on the heat of a moment, just as it was. But this is an age where showing faces takes a little care. My own family is fine — yet a friend, or a stranger who happened to be in the frame, isn't mine to put out into the world. — Darkroom Notes, Season 2. The story of my second app, STIL.TOON, starting with why I made it.
- 3 min
The iPhone turns a face into a drawing — Vision finds it, Apple Intelligence draws it
Last time I wrote that STIL.TOON redraws a face rather than erasing it. So how does it find the face, and how does it draw it? Vision finds it; Apple Intelligence draws it. And the first place I tripped was calling the tool the way I assumed it worked, instead of the way it actually did.
- 3 min
It froze on the fifth — when debugging changes the spec
The machinery was in place. But scanning several cards in a row, the screen froze around the fifth. Offloading the heavy work, trimming the memory — both were correct improvements. Yet the real way out lay further on. Chasing the bug, I'd ended up rebuilding the way the app captures, without noticing.
- 3 min
On the shelf in a week — the unglamorous paperwork of shipping a second app
STIL.TOON went from kickoff to the App Store in a week. But the thing that stopped review at the end wasn't a bug in the code. A bank account, tax forms, a contract to sign — shipping an app takes preparation that isn't digital at all. Darkroom Notes, Season 2, the finale.
- 3 min
Past the AI cutoff line — making it run on every iPhone
Reading a scanned card and sorting it into name, company, and the rest — that part runs on Apple Intelligence. But that AI only works on newer iPhones. At first I thought, "then make it an app for supported devices only." But cutting along that line left too many people out. So I decided to deliver the same experience to the side where the AI doesn't run.
- 3 min
I rebuilt it before anyone came — a second app, and moving as a family
Right after release, I rebuilt STIL.TOON — account system and all — while almost no one was using it yet. The only time you can rebuild cleanly is before real users arrive. And this wasn't TOON's call alone; it was the whole family turning together.
- 4 min
The background that doubled — cutting out a face with only Apple's public APIs
Turning a face into a drawing — that part worked. The problem was putting the drawing back onto the photo: only the face swapped, the background and clothes left as they were. It didn't come easily. The background doubled, I hit two dead ends, and still cut my way through with only Apple's public APIs — the record of one day.
- 2 min
I stopped saying "the focus seems soft" — facing a placeholder number
A perfectly readable card sometimes got dropped with "the focus seems soft." Tracing the cause led to a gate placed before text recognition, and a single number left standing there. "Provisional — tune on device": a number marked that way, and then never touched again.
- 2 min
The camera I didn't build — leaving it to VisionKit
The heart of a card app is the capture. So I assumed the hardest part would be taking the card in cleanly — fixing the skew, removing the shadow, evening out the brightness. I was even ready to build a custom camera for it. But I didn't. The iPhone already had one.
- 3 min
When a card becomes a contact — a fourth tool, and the end of Darkroom Notes Season 3
Capture, read, sort, turn into a contact. The pieces I've written one by one come together on a single card. To close, I trace that flow from start to finish, write what I came to think after building a fourth tool, and end Darkroom Notes Season 3.
- 3 min
A watermark is a limit and an advertisement — why I don't hold the free tier back
If the AI is free for everyone, where does Pro come in? STIL.TOON's answer is a small watermark on export. It's both a doorway to Pro and, every time a free user's image spreads, a way for my name to travel along with it — not a loss, but an acquisition channel.
- 3 min
I decided not to hold your data — how I removed the account itself
STIL. has no sign-up. It never asks for your email or a password. Not because that's convenient, but because I decided not to hold your material. What happens when you throw the account away — and how the app still stands without it. The second frame of the series is about privacy.
- 3 min
Doing it all alone — solo development, and AI as a partner
I build STIL. alone — the planning, the design, the code, the copy. Why not hand it off? And how do I keep running a workload one person can't possibly run? The sixth frame of the series is about a maker's way of working.
- 2 min
From one app to a family — closing Season 1
STIL. began as an app that pulls one frame from a video, and it's slowly becoming a family. A sibling that turns faces into illustrations; a sibling that organises business cards. What's growing isn't features — it's the same single promise. The close of Season 1 of the series.
- 3 min
How does the iPhone know which frame is good — inside best-frame extraction
Hand it a video and STIL. picks, from hundreds of frames, the one that stands as a photograph. So what is the iPhone looking at when it judges a frame as good? I'll look, as plainly as I can, at the three eyes it measures with — blur, faces, and attention. The fourth frame of the series.
- 3 min
The film colours are made of my own obsessions — about the eight film looks
The film colours inside STIL. weren't chosen by market research. They're colours I actually love and have chased for years. The softness of Portra, the night of Cinestill, the 90s of VHS. Less a feature than a crystallisation of obsession — the third frame of the series is about the film looks.
- 3 min
The moment you missed is still in the video — starting "Darkroom Notes"
The best expression usually slips away between shutter presses. But if you were filming, that instant is still right there. — Starting today, alongside From the Shelf, I'm beginning a second series about the app I build myself: STIL. The first frame is the simplest question — why I made it.
- 3 min
Rejected three times, approved on the fourth — a record of App Store review
STIL. was rejected three times by App Store review. Permissions, payments, and finally the robustness of the app itself. Each time: deflate a little, fix the cause, submit again. The grittiest record of finally getting through on the fourth try. The fifth frame of the series.