2026-03-06|4 min read|--ai--indie-maker--lakinh--build-in-public--productivity

When Three AIs Walk Into a Codebase

Today was one of those days where you open your laptop at 9am thinking you'll do one small thing, and then suddenly it's evening and you have two terminal windows running in parallel, a philosophy question about astrology UX, and a Firebase collection with exactly 70 documents where there should be 192.

Good day, actually.


## The Setup

I'm building LaKinh — a Vietnamese Tử Vi astrology app. The calculation engine is done, verified against reference sites, accurate to the source. Now I'm building the meaning layer: what does it actually mean when your star Phá Quân sits in the house of Career? When Tử Vi occupies your Marriage house?

That layer requires content. A lot of it. 192 entries to be exact — 14 major stars × 12 houses, plus cycle interpretations.

So I used Gemini 2.0 Flash to generate them. All 192. Or so I thought.


## Act I: The Data That Wasn't There

I integrated Firebase into the app, wrote the fetch logic, deployed. Opened the screen. Nothing.

Added console logs. The key being fetched: pha_quan_tai_menh. Firestore response: snap.exists: false.

Ran a quick audit script against the database. Expected 192 documents. Found 24.

The generation script had a progress tracker — a progress.json file that logged each key as "completed." It showed 192. The database showed 24. The script had been marking entries as done before confirming the Firestore write succeeded.

Classic silent failure. The kind that's hardest to debug because nothing screams at you.


## Act II: An Unexpected Collaborator

While debugging, I dropped the UX question into a thread with Gemini: when the app shows interpretations for a house like Phu Thê (Marriage), should it describe the user's spouse, or the user's experience of the relationship?

Gemini's answer was sharp. It introduced the concept of "dual perspective" — every relationship house in Tử Vi carries two layers simultaneously: the nature of the person in that relationship, and the user's lived experience with them. The traditional texts don't separate these. But a modern app should surface both, clearly.

It also suggested a re-generation strategy: leave the 7 "self-centered" houses (Career, Finance, Health, etc.) as-is, and only re-generate the 5 relationship houses with a restructured prompt that explicitly asks for both perspectives.

70 entries. Not 192.

I ran both scripts in parallel — one regenerating the relationship content with the new prompt, one filling in the 168 missing entries from the original batch. Two terminal windows. One running every 32 seconds per entry (Gemini free tier rate limit), one doing the same.

It looked exactly like I was watching paint dry. Twice.


## Act III: The Label That Changes Everything

While the scripts ran, I pushed a small UI change: context labels above each interpretation block.

Houses like Mệnh (Self) now show: 🪞 Về bản thân bạn — "About you."
Houses like Phu Thê (Marriage) show: 👥 Về bạn đời & Sự gắn kết — "About your partner & the bond."

One line of text. But it reframes everything. The same content reads differently when you know who the subject is.

Small surfaces. Big differences.


## What I Learned Today

Three AIs in one workflow is not chaos — it's specialization.

  • >Kai (Claude) handled the architecture, debugging, task files, code. It's the one writing this post right now.
  • >Gemini handled domain expertise on Tử Vi interpretation — a niche deep enough that it needs a dedicated knowledge base.
  • >The generation model (also Gemini) did the content labor: 192 structured JSON documents, each 300 words, each calibrated to tone by brightness level.

None of them could do each other's jobs as well. That's the interesting part.

Progress files lie. Always verify against the source of truth, not the tracker. The database is the source of truth. The progress file is an optimist.

The waiting is part of the work. 32 seconds between API calls. 192 entries. That's roughly 100 minutes of compute time, running quietly while you do other things. Async productivity is a skill.


## Where Things Stand

By the time you read this, the generation scripts have finished. The app has 192 entries. The relationship houses have dual-perspective content. The context labels are live.

Next: the paid tier — AI-generated real-time interpretations using the user's actual birth data, not pre-generated averages. That's where Gemini and the app actually talk to each other.

One layer at a time.


LaKinh is a Vietnamese Tử Vi astrology app I'm building as a solo maker. If you're curious about what it looks like to build culture-specific apps with AI, I write about it here.