Blog · Haunts.IO

Haunts.IO, Six Months Later: The Other 20%

Six months ago we published a case study about building Haunts.IO in five days. It ended with 250,000 lines of code, two months of polish, and a working platform a handful of people used every day. This follow-up is about what happened next: the months of work that turned a working prototype into a public app with a growing userbase, and what that work was made of.

By Michael Pierce · MDPSync · September 1, 2026

10 min read

In my experience, vibe-coding a prototype gets you roughly 80% of what you need in days, or even hours with a well-structured prompt. The other 20% can take months: testing, guardrails, monitoring, cost control, privacy enforcement, and the structured workflow that lets AI keep building at full speed without breaking what already shipped. AI is the builder, but a lazy one prone to shortcuts and a wandering mind. The person driving it is the architect, and the architect's real output is the machinery around the code.

From Check-Ins to Stories

"Check-ins are the breadcrumbs that become stories" has been the Haunts tagline from the start. Six months of work have turned that line from an intent into a description of the actual product. Check-ins captured on a road trip become map-matched routes. Routes become rendered trip videos with music and cold-open titles. Days become journals written by AI against the evidence of where you went, and trips become printable posters and share cards you can hand to someone.

A user on r/hauntsio described what that feels like from the other side, and their own words carry it better than any summary could:

A Haunts user on r/hauntsio

"My memory absolutely sucks, that's why I enjoy using Swarm, Facebook, Google Maps and now Haunts.

Two years ago, for example, I went to Legoland in Billund, Denmark. One of my favorite trips ever, and I was fascinated to read the recap of my trip from Haunts because it mentioned an aquarium. For the life of me, I couldn't remember until it finally clicked, Legoland's aquarium! And boom, literally memories unlocked.

To be able to read and revisit these memories is amazing for me and this helps me more than I could imagine. There [are] 12 years of stories, that I surely have forgotten a lot, waiting for me to remember them.

Thank you really."

A real afternoon from a favorite trip, lost for two years, returned by a story written from their own check-ins. Twelve years of those afternoons are waiting behind it, and the stories can return them one at a time. The breadcrumbs were already there. They needed a system to surface them as stories.

Then and Now

The original case study published its own numbers, which makes the comparison easy.

At launch Today Change
Lines of code 250K+ ~480K +92%
API endpoints 120+ 181 +51%
Database migrations 110 341 3.1×
Background jobs 30+ 101 3.4×
Repositories 1 5
Client surfaces Web, iOS, Android, Watch, Wear OS + CarPlay, Android Auto, widgets +3

The web/api repository alone now holds over 330,000 lines of PHP, SQL, and supporting code. The four repositories that did not exist six months ago tell the growth story on their own. A dedicated media server, 144,000 lines of Go built in seven weeks, hardware-encodes every uploaded video into adaptive HLS and serves it through a Cloudflare R2 edge tier with signed playback URLs. A native Android admin console, built in four days, carries moderation, analytics, live config editing, and system alerts to a phone. A documentation repository holds the contracts between all of them. And a 7.5 GB Google Takeout archive sits on disk as the test corpus for the Timeline importer, because you cannot write a real importer against a spec.

The Prototype Held Up

None of these discredits the prototype. The five-day baseline is still the foundation of everything above, and the honest caveat is that going public required one structural rewrite: the original backend assumed a handful of cohorts, and on the day scalable multi-user support landed, the commit history restarted with it. Social graphs, privacy tiers, and moderation are not features you bolt onto a single-user schema.

The stronger evidence for vibe coding is what the 80% looks like now that the machinery exists. That admin console went from an empty repository to a finished, sideloaded app in four days, at commercial quality, with fixture tests against real API responses from day one. The prototype speed never went away. It compounds, because every guardrail built for the last project is already standing when the next one starts.

The Other 20%

Here is what the months of work went into.

Testing

The prototype had close to no tests at the start, now the platform has 9,653 automated test cases. In the backend, 43% of all PHP is test code. In the Go media server, the ratio is higher: 54% of the source is tests. Among them are 136 named regression guard tests, each one pinning a specific class of bug that was found and fixed, so it cannot return quietly.

The test infrastructure itself went through a maturity step. Unit tests with mocked databases carried the project for months, and then stopped being enough, so August brought a seeded suite that runs against a real local MySQL with per-branch schemas. Mocks test against what you assume the database will do. The seeded suite runs the same logic against a real MySQL instance and catches what the assumption missed.

Guardrails

Every guardrail here is enforced automatically, in code. A commit is blocked unless a code review has passed. A commit message starting with fix: is blocked unless a formal bug hunt has completed first, which requires three written hypotheses and a failing test that reproduces the bug before any fix is written. There are 104 of those hunts on file. A pre-push hook runs the typecheck before any version bump leaves the machine, because a red build wastes a 25-minute release cycle. A deploy guard refuses to ship from any checkout that is stale, dirty, or diverged from what production carries.

Every one of those gates exists because AI writes code fast enough to outrun human review. The gates make that speed safe to use without slowing it down.

I've often spoken to others about the velocity of AI development and the challenges it puts on our human brains. It's not possible for us to keep up with this kind of development pace without taking the time to understand what it's doing. And, even then, when we are switching from one project to another, there is that lag of realigning our thoughts. I can't emphasize enough how important a structured workflow is to try to keep up, and not burn out.

The Architect's Job

Building with AI at this pace is a dispatching problem. Planning happens in the strongest reasoning model available. Implementation runs in a faster, cheaper one. Final review goes to a different model from a different vendor, on the theory that a reviewer should not share the author's blind spots. Around that routine sit 40 custom skills and 54 automated hooks covering everything from simulator QA journeys to deploy checklists.

My typical workflow might look like this: Brainstorm with Claude Fable, Ultraplan, Codex adversarial reviews, reiterate until it goes to Implementation Planning, codex reviews. On to implementation using a lower cost module like Sonnet. And then on to code reviews with Codex and Fable before sim qa tests.

The clearest measure of where the effort goes is a repository that contains no code at all. It holds the architecture contracts between the five repos and an append-only status log for each surface, and in its first 27 days it accumulated 292 commits, more than any other satellite repository in the system. Multiple AI sessions work concurrently across the codebase, and the only reason that works is that writing down what happened is treated as part of the work itself.

Privacy and Cost Controls

Privacy and cost both hardened into invariants over the summer. In early July, a full-codebase audit program swept the platform in five waves and found seven privacy leaks and two data-loss bugs. All were fixed before any user was affected, the default visibility for new content was moved from public to friends, and a privacy probe now runs against production after every deploy.

Cost got the same treatment. A commercial product cannot run on someone else's free tier, so every external vendor now has a quota bucket, spend rolls up daily, and an advisor job files a month-end report on where the API dollars went. Billing itself is wired end to end, webhooks, reconciliation jobs and all, and sits dormant behind a flag until the moment is right to start charging.

Six Months of Receipts

The Numbers

~480K
Lines of Code
9,653
Automated Test Cases
341
Database Migrations
181
API Endpoints
101
Background Jobs
6
Client Surfaces
104
Recorded Bug Hunts
4,900+
Commits in Six Months

Phone, Apple Watch, Wear OS, CarPlay, Android Auto, and home-screen widgets, backed by five repositories, a dedicated media pipeline, and a test suite that outnumbers the features. All of it from one architect and AI.

Lessons From the Incident Log

Three incidents from the log show where the machinery above came from.

For five days in August, edge delivery of media was silently disabled. Nothing threw an error and no user saw a symptom, since the system fell back to the origin, and every documented post-deploy check passed the entire time, because all of them pass with edge delivery fully off. The fix re-enabled edge delivery and added a new alert for the condition the existing checks were structurally unable to see.

On August 19, a deploy from a stale working copy silently reverted the live admin interface to an older version. That failure produced the deploy guard, which now refuses any deploy that is not clean, current, and identical to what the repository says production should be.

And the feed query behind the app's busiest screen was taken from 275 milliseconds to about 1.5 milliseconds through covering indexes and buffer pool tuning, the kind of work a five-day prototype has no reason to do. Even now, benchmarking is a daily review of data to identify opportunities for performance boosts.

The System Today

The architecture diagram below shows the current state. In March this picture had three boxes: a web app, an API, and a database. The media pipeline, the R2 edge tier, the admin console, the monitoring plane, and the cross-repo documentation layer are all products of the last six months, and each exists because the simple version stopped being enough at public scale.

Haunts.IO system architecture diagram showing web, mobile, media pipeline, R2 edge delivery, admin console, and monitoring plane The Haunts.IO platform, September 2026. Click for the full 4K version.
The Math

What the Six Months Would Cost the Traditional Way

The launch case study priced the original build at $2M to $4M through a traditional agency. The six months since are a separate engagement, and a different kind of team. A streaming media engineer for the HLS pipeline, the hardware transcoding ladder, and the edge delivery tier. A Go engineer for the media daemon and its job queue. An SRE for the monitoring plane, the alerting rules, and the deploy guards. A database performance engineer for the index and buffer pool work that took the feed query from 275 milliseconds to 1.5. A security firm for the audit program that swept the codebase in five waves. A QA team to write and maintain 9,653 automated tests. An Android engineer for the admin console, a privacy review for the visibility model, and a project manager to keep ten people from stepping on each other.

That team does not finish in six months. Hardening a live platform while shipping new features is slower than greenfield work, and twelve to eighteen months is the realistic window. At 2026 US agency rates of $175–$300/hour, the six months of work described in this post lands at $1.5M to $3M, on top of the original build.

One architect and AI tooling delivered it in six months of sessions, at a fraction of that cost, while the app stayed live and users kept checking in.

Traditional Agency
12–18 months
Streaming Media Engineer Go Engineer SRE / DevOps Engineer Database Performance Engineer Security Audit Firm QA Automation Team Android Engineer Privacy Review Project Manager
$1.5M – $3M on top of the original $2M–$4M build
Vibe-Coding with MDPSync
6 months of sessions
Senior Architect + AI
A fraction of the cost

The Bottom Line

The five-day prototype was real, and the case study that described it holds up. What six months of production hardening adds is the part of the argument that matters to anyone deciding whether to build this way: the 80% comes fast on the same models everyone has, and the 20% is a long stretch of testing, guardrails, and operations where an experienced architect earns the title. Haunts became a commercial product because that machinery got built.

Today the app runs across six surfaces, carries half a million lines of code, and holds up under strangers using it in ways no demo ever predicted. If you want the same arc for your product, tell us what you need built and we will tell you what it takes.

Tell Us What You Want Built

From a five-day prototype to a commercial platform in six months, with the receipts to show for it. Start a conversation and we will tell you what your build takes.

← Back to Proof of Work