Live The conveyor

Dating Coach

That it scales. The same system delivered a second product, in a much harder domain, in two weeks.

Quick facts
Launched
2026-04
Stack
Flutter · FastAPI · LLM · subscription
Audience
Consumer
Status
Live
What it proves
Same system delivered a second product in a much harder domain
The real work was the domain and its go-to-market, not the engineering

Why I built it

Working on Dreambook I realized that a model, given a personality, makes a genuinely good conversational partner. So I went looking for a real pain. I found anxious people who tense up at the thought of a date and dread the dating chat itself. I checked the space and found a free niche, sitting between pickup apps that run the conversation for you and psychologists and dated old sites. Coaching landed right in that gap. That is how Dating Coach was born.

The moment

I wrote the Dating Coach website with Claude running on my home PC, connecting to it over SSH from my phone, while I was at Everest Base Camp. Possibly the highest-altitude site ever written. This was governed autonomy in the field, two months before the big publications started writing about it. I wrote specs into Notion with Claude on mobile, connected to the laptop, ran Claude Code in execution loops with self-checks against the spec, and verified the result straight on production. There were no users yet, so I could afford to test on prod.

The hard part

The challenge here was prompt engineering, not classic software engineering. A system of prompts so the models converse correctly, hold the line, keep context, and stay inside the scenarios I set. Like Dreambook, the localized content generation matters too. The app, the site and part of the content factory all run on the governed autonomy approach.

L1 Client
Mobile app Flutter; sends a message, taps Finish
L2 Conversation engine Dating Coach API
Conversations router Orchestrates a turn
Practice router Finish + level progression
Free-tier gate Subscription + per-mode / level limits
Prompt builder Assembles the system prompt
Evaluator LLM-grades a practice attempt
Progress service Applies level unlocks
L3 Character config served from S3
Characters characters.json: 8 personas (1 coach + 7 dates), each a base prompt
Modes Practice / open chat / analysis / reflection
Scenarios Per-mode scenario + 3 difficulty levels + eval criteria
L4 Memory Postgres
User profile Name, goals, prefs (semantic memory)
Conversation history Full transcript replayed every call (episodic memory)
Progress + attempts Unlocked / passed levels
The hard part: one message runs through memory, persona and the level system before the model answers.
What I learned
  • The technical side is maybe 35 percent of a product. The other 65 is marketing, traffic and sales. Every domain promotes differently. The engineering is nearly the same every time.
  • A sensitive domain will fight your SEO. Google pulled all of our pages, twice. Bing indexes us cleanly. With Google we are still clawing back through external links.
  • Governed autonomy is a combine harvester. It does not care which crop. What it depends on is the experience of the person operating it.