I should have started this weekly diary at the start of the build, not three weeks in. Catching up — three posts this week, then weekly from here on.
—
The trial timer is real. That’s the headline.
After a week of deploying six Edge Functions, debugging five things that broke on first contact with production, and migrating my entire AI memory setup to a self-hosted server — the thing I’ll actually remember is a tiny text label in the Dictare UI: “Free trial — 30m 0s remaining.”
Pulling from Supabase. Through a real Edge Function. Behind a real paywall. If you exhaust the trial, the app stops and asks you to subscribe.
That happened on Thursday evening. It’s Sunday now and I’m still slightly smug about it.
—
What the Week Actually Looked Like
Monday, Tuesday, and Wednesday evenings were mostly Phase 5a preparation — building enough understanding of the backend architecture to brief my AI assistant accurately. I’m not a backend engineer. I’d never deployed Supabase in production, never configured a Stripe webhook, never touched a Deno Edge Function. The preparation phase is me reading documentation until I can describe the problem clearly enough to get useful help solving it.
Thursday evening was the deployment itself. Supabase Auth, six Edge Functions (transcribe, translate, polish, check-subscription, create-checkout-session, stripe-webhook), the SQL migration, and the Stripe webhook wiring — all in one session. The full account of that evening has its own post because it deserves the space. The short version: it worked, but not before teaching me five things I should have known before I started. The SQL migration has to run before your first sign-up, not after. Old API keys cause silent failures that look like network errors. Google service account JSON files do not like spaces in their filenames.
Friday evening and Saturday were cleanup. Three more fixes committed to the codebase: per-function JWT verification logic, a 25MB audio size cap on the transcribe function (to prevent anyone attempting a three-hour recording), and a paywall pre-check in the recording flow so the app asks before it starts recording, not after you’ve spoken. Commit, test, confirm working. That branch is now production-ready.
Today — Sunday — I migrated my AI memory setup from the cloud service I’d been using to a fully self-hosted stack running locally: Qdrant as the vector database, Ollama for embeddings, and a lightweight MCP server connecting the two to Claude. 139 memories migrated. The reason was practical: the cloud service had been throwing “read-only transaction” errors for two weeks, silently dropping everything I was trying to save. Fixed now, and I’ll never be dependent on someone else’s uptime for this again. Full guide is written up separately.
—
The State of the Build
What’s live and working:
Still to do before launch:
Known bug logged:
The usage dashboard currently shows Google STT results even when Whisper is selected as the transcription engine. Logged, not blocking, fixing in Phase 6.
—
Phase 6: What’s Next
Phase 6 is the polishing pass before I start letting people actually use this thing.
Custom vocabulary. You’ll be able to give Dictare a word list — your name, your company, your product names, your technical jargon — and it primes the Whisper prompt with those terms before each transcription. Simple mechanic, big practical difference for anyone dictating specialist content.
UK English spelling. The GPT-4o-mini polish pass will default to British English. If you’ve ever watched a voice-to-text tool consistently write “color” and “organize” and “labor” at you, this is for you. It’s fixing a real annoyance, and it’s built into the polish toggle with a note explaining what it does.
Usage dashboard overhaul. The current dashboard shows API costs per transcription. That made sense when I was the one absorbing per-call costs. Under a subscription model it’s irrelevant — subscribers don’t care about my API bill. Replacing it with something actually useful.
Longer term — not Phase 6 but on the roadmap — I’m thinking about a higher tier that uses the DeepL Pro API, with privacy guarantees and glossary support as the selling points. That’s a later decision.
—
The Blog
This week produced two full post drafts alongside this one:
Both are publishing this week. The blog is finding its rhythm. Honest accounts of what keeps breaking and what eventually works seem to be the right format — at least, they’re the posts I’d want to read when I’m building something similar.
—
This Week in Numbers
—
The goal is still the same: a working product other people can subscribe to. That feels genuinely close now in a way it didn’t three weeks ago. The infrastructure is real, the paywall works, and the next month is about getting the rough edges off.
Phase 6 starts this week.
— Badger
—
Badger is building an AI-powered side income in public. No gurus, no fluff — just honest accounts of what’s working, what isn’t, and what it’s actually costing.