
A production data platform covering 3M records, built solo for ~$500 in ~7 weeks using Claude Code. Here's what the workflow actually looks like — the good, the failures, and the guardrails I had to invent.
I'm not going to tell you Claude Code is magic. It isn't. But if you treat it like a very fast, very literal colleague who forgets things between sessions, you can ship more than you'd think. Here's the workflow that worked for me.
The product is Crime Brasil — an open-data platform for Brazilian crime statistics. Doesn't matter for this post. What matters is the process.
Before any change touching >3 files or introducing new abstractions, I forced a /plan pass. No code, just a tree of what changes where and why.
This cut the "Claude confidently wrote 400 lines of the wrong thing" bug in half. The other half came from me being sloppy about what I was actually asking for.
Pattern:
1. Tell Claude the goal
2. Ask for a plan (no code)
3. Push back on anything that feels wrong — usually scope creep
4. When the plan feels right, say "implement"
Boring. Works.
Independent work ran in parallel sub-agents. Research + implementation + QA could all run concurrently instead of me waiting for each to finish.
research agent — "understand how X works, come back with a map"implement agent — "apply the diff described"qa agent — "verify the fix, run the regression tests"review agent — "is this safe to merge"I'd fire three of these in parallel and get stitched output in a third the wall time.
Claude Code compacts its context when conversations get long. After compaction you can lose crucial decisions from earlier.
Fix: every session writes to a scratchpad file (~/claude-sessions/session_<topic>.md) with timestamped entries. Key decisions, user preferences, things we tried that failed. Before spawning any sub-agent I inject the relevant scratchpad entries into the prompt.
This alone probably saved a dozen hours of "wait, why did we decide not to do that again?"
Claude Code has a memory system that persists across conversations. I ended up writing ~80 memory files over 7 weeks, categorized:
Every time I corrected Claude on the same thing twice, I saved a memory rule. Examples from my actual file:
Never slow bot renders for SEO — fixed a bad server-side bot-detection ideaNo lossy analytics filters — never exclude geographic data to "clean up" analyticsWait-loop pattern — use while pgrep not until ... && ! kill -0 (the latter busy-waits)No arbitrary safeguards — don't add population floors to hide bad data, fix the dataNever substitute solutions — if user asks to fix X, fix X, don't silently solve by changing YThat last one came up repeatedly. Claude loves to pivot to an "easier" problem.
Some rules can't be enforced by just asking nicely. For those, I used Claude Code's hook system to block certain actions entirely.
Examples I ended up needing:
git commit --no-verify (never bypass pre-commit hooks)rm on data files without explicit confirmationgit push origin main — all changes must go through dev branch + staging firstHooks turned bad defaults into impossible-by-default. Worth the setup time.
Claude loves to say "fixed!" based on an API test passing. That's not the same as the feature actually working in a browser.
I ended up with a rule: every UI-touching change gets Chrome-verified before being marked complete. A Playwright script clicks through the real flow and screenshots the result. If the screenshot looks wrong, it's not done.
Memory file: "NEVER report a fix as done without Chrome visual verification."
Before this rule: "fixed!" → deploy → user finds it broken → revert. After: "fixed, verified on /cidade/rs/porto-alegre, panel shows 509K crimes, screenshot attached."
Honest list. These are patterns; I saw each of them multiple times.
Ask for a small bug fix, get back 400 lines of unrelated cleanup. Sometimes broke unrelated features.
Memory rule: "Don't add features, refactor, or introduce abstractions beyond what the task requires. Three similar lines is better than a premature abstraction."
Asked Claude to "call the API to get X data." It wrote code calling /api/thing that didn't exist. Tests failed. When pushed: "oh right, that endpoint doesn't exist. Let me write it first."
Fix: when consuming an API, I started forcing it to read the actual source files first. Read src/api/routes.py, then write the client. Slower, zero hallucinations.
Twice Claude "fixed" a bug by removing the buggy feature. Asked to fix a map polygon render issue, got back code that just disabled polygons entirely. Clean green tests. Feature gone.
Memory rule: "NEVER remove features unless user explicitly says to. 'bugado' means fix, not remove."
The biggest pattern. "Done!" → I check → 2 of 4 items done, 2 untouched. Claude was genuinely under the impression it had finished.
Fix: I stopped taking "done" at face value. Every "done" got a follow-up "walk me through what you changed file-by-file, and show me the diff for each." Usually the second response corrected the first.
| Item | Cost |
|---|---|
| Claude Max subscription ($200/mo × 2) | $400 |
| Hetzner dedicated server ($30/mo × 2) | $60 |
| Resend email API (free tier) | $0 |
| Cloudflare (free tier) | $0 |
| Domain | $12 |
| Total | ~$472 |
For reference: a single senior contract dev week at market rates is $4-6K. I shipped this in 7 weeks of evenings + weekends for ~$472 in tools + hosting.
The caveat: this is a solo project. I didn't have to coordinate with anyone, and nobody needed to review my work. That's a rare situation.
| Category | Lines |
|---|---|
| Python backend (FastAPI + scrapers + ingest + APIs) | 23,559 |
| TypeScript frontend (Next.js + Leaflet) | 18,762 |
| MDX content (articles) | 6,165 |
| Total | 48,486 |
92 commits/day sounds insane. In practice most commits are small and auto-checkpointed. Real "unit of work" commits are maybe 20-30/day.
In priority order:
/plan discipline. Every non-trivial change gets a plan first. Boring, works.CLAUDE.md explaining architecture and conventions prevents a lot of drift.Crime Brasil is live at crimebrasil.com.br. It serves ~3M records across 497 municipalities, gets Google traffic for specific city and neighborhood queries, and was built almost entirely in a Claude Code harness.
I'm happy to answer questions about the workflow. The answer to "can AI replace developers" is still no, but "can a developer with AI replace two developers without AI" is absolutely yes, and that's interesting enough.
Follow along on X at @Crime_Brasil if you want to see what ships next.
aiMost of us have seen a coding agent fail to complete a task we know it can do. We just don't...
googlecloudWhen building Generative AI applications, developers often encounter a massive bottleneck: sequential...
discussI’ve been thinking about sharing some electronic circuit posts on Dev.to — small circuits, DIY...
agentsWhat nobody tells you about exporting your multi-agent prototype to a local workspace. Every...
agenticarchitectAutonomous agents are genuinely good at answering messy business questions. Give one an LLM and a set...
aiPR volume went up, ticket quality didn't, and the gap got filled with LLMs on both sides of the review: bots reviewing, bots replying, bots occasionally arguing with bots about priorities that only existed in a teammate's head. Our CEO named the actual problem, and it's bigger than code review.
Workflows from the Neura Market marketplace related to this Stable Diffusion resource