Building in Public: Week 1 — The Paywall Is Live

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:

  • Supabase Auth — sign-up, sign-in, user management
  • Full transcription pipeline — record → Whisper → DeepL → GPT-4o-mini polish → paste
  • Trial system — 30 minutes of free transcription, tracked in real time
  • Paywall — expired trial stops recording, subscription check on every transcribe call
  • Phase 5b (Windows port) scaffolded and waiting
  • Still to do before launch:

  • Credential rotation — all API keys used during testing need rotating before external users see a build. I have the process, I have the order. Doing it once paywall testing is fully signed off.
  • Landing page for dictare.co — email confirmation is currently disabled because there’s nowhere to redirect users after they confirm. That needs to exist before I turn it back on.
  • Phase 6 features (see below)
  • 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:

  • A full account of the Phase 5a deployment day, with every mistake documented
  • A complete setup guide for running mem0 self-hosted with Qdrant and Ollama
  • 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

  • Edge Functions deployed: 6
  • Production bugs hit and fixed: 5 (Thursday evening), 3 more (Friday evening + Saturday) = 8 total
  • Memories migrated to self-hosted mem0: 139
  • Blog post drafts written: 3 (including this one)
  • Times the macOS accessibility permission quietly revoked itself: 1
  • 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.

    Leave a Comment

    Your email address will not be published. Required fields are marked *

    Scroll to Top