In the prologue I said I ran git init on the night of June 24th. This post is about the six days that followed.
Fair warning: this is not an "AI made coding easy!" post. If anything, it's the opposite. Roughly half of what I did over those six days was distrusting what the AI produced.
The hand I was dealt
- Backend dev, 9 years. Java, Kotlin, Spring, JPA — on this turf I do everything from design to deployment alone.
- But: nine years of MySQL and MariaDB only. I picked PostgreSQL for this project for the deeply professional reason that I'd always wanted to try it. So even on my home turf, one thing was brand new.
- React Native: zero lines written. Ever.
- Expo? I genuinely thought it was a trade fair.
- Time budget: weekday evenings after work and the gym — roughly 10pm to midnight — plus weekends.
The old me would have started with "step 1: complete a React Native course." And we all know how that goes. The side project dies quietly somewhere around week 3 of the course. My GitHub has three repos that died exactly that death.
This time I skipped the course and sat an AI down as my pair.
The division of labor — this is the whole trick
People hear "vibe coding" and picture typing "make me an app" and watching magic happen. Six days in, my conclusion is different: it only works when the division of labor is explicit.
What I kept:
- The domain model. A three-layer structure — Template → Schedule → Daily Check. Checks are hierarchical with three states. Daily logs are snapshot copies of the template, so editing a template never rewrites your history. Decisions like these are human work. This is where nine years actually got spent.
- API design and the entire server. Home turf.
- And verification. Whether AI-written code gets merged is my call, every time.
What I delegated:
- Every React Native screen. Components, navigation, state management — the conventions of an ecosystem I didn't know.
- Hundreds of "how do I do X in Expo?" questions. Hours of doc-diving compressed into a few conversation turns.
So I drew the blueprints, the AI laid the bricks, and I walked around tapping the walls. It's a lot like the code review I do at my day job — except this reviewer never sleeps and never sulks.
The six days, replayed from the commit log
I dug up the actual commit log to write this post. It didn't match my memory. The log is scarier.
Day 0 — June 24 (Wed), night.
App repo at 21:54, server repo at 21:55. One minute apart. And the second commit of the night, in both repos, isn't code — it's docs: add CLAUDE.md, an architecture document written for my AI pair. I onboarded it the way you'd onboard a human teammate: design intent and next steps, written down before bed. Looking back, this was the move that bought the speed. In vibe coding, the first real commit is context, not code.
Day 1 — June 25 (Thu).
6:52am, before leaving for work: backend API complete. Migrations, service layer, REST endpoints — a full loop in under a day. Home turf is fast.
The real event was that night. 21:50 template screen → 21:56 schedule → 22:11 trends → 22:16 settings → 23:13 login. A screen landing every 6, 15, 5 minutes — from a guy who had never written a line of RN. Here's what it actually looked like: I define "this screen, this data, this structure," the AI builds it, I poke at it in the simulator, and if it holds, I commit. That loop ran all night. I felt like a magician. Completely lost track of time.
Day 2 — June 26 (Fri).
Free-tier gating, pick-one meal slots, a "+2.5kg?" double-progression hint. And then, at 17:58, this commit: fix: enforce JWT userId in all controllers — remove ?userId= param dependency. Early on, for convenience, I'd let a query parameter switch the user. That day I started tearing the backdoor out. What I didn't know yet was how uncomfortably close I'd cut it. Next post.
Day 3 — June 27 (Sat).
No daytime commits. Gym, and time with my wife. The deep-work session started at night and rolled into —
Day 4 — June 28 (Sun).
Five commits in the 2am range: account deletion, onboarding coach marks, a new app icon. One of them, at 2:28am: fix: JPQL path (userId → user.id). That one compiles clean and crashes on boot — a landmine specific to the JPA + PostgreSQL combo that nine years of MySQL had never shown me. It would bite me again later, more than once.
Daytime: i18n (Korean/English), notifications, kg/lb units. And at 23:04 — submitted to the App Store. Four days after git init.
Day 5 — June 29 (Mon).
Rejected. Two issues. Fixed after work, resubmitted as build 4 at 21:47.
Day 6 — June 30 (Tue).
Didn't sit still while waiting on review: completion feedback, a rest timer between sets, one-line daily notes.
So — I remembered it as "an MVP in 6 days." The log says the app had taken shape by night two, went to review on day four, and by day six had already eaten a rejection and been resubmitted. My memory was modest. The log was precise.
It wasn't free, though
If I stopped here, this would read like a vibe-coding hype post. That's not what this is.
AI code is optimized for runs right now. And nine years in backend teaches you exactly what "runs right now" leaves behind: temporary hacks, over-broad exception handling, convenience doors left unlocked. None of it shows up in a demo. It shows up in production, at the worst possible moment.
Day-6 me was drunk on having a working MVP and didn't notice the bill piling up. How much it came to — I'll write that next. Hint: I found it right before launch, and I did not sleep that night.
One rule survived all six days, and it's the one I'd give anyone trying this: speed from the AI, accountability on me. If something in this app breaks, it's not the AI's fault. It's mine, for skipping verification.
Baanbok is free on the App Store — no sign-up required, guest mode gets you everything.
Next: the night before launch, when I found the door wide open.
Top comments (0)