One Day, Seven Projects, Zero Sleep: What a Full Build Day With Kai Looks Like
March 18, 2026. I woke up with a list.
Not a short one.
There was Hũ Vàng, the investment tracker I built months ago that still had a bug I'd been avoiding. There was the MCP server for my blog that kept failing silently. There was gianghaison.me itself — the art page was showing nothing, like it had forgotten it existed. And then there was XuLang Edu, the school management system I've been building for my friend Dũng, which was about to swallow most of my day.
I didn't plan to do all of it in one day. But when you work with Kai — my AI system built on top of Claude — days have a way of becoming more than you expected.
## The Morning: Three Bugs Before Lunch
I started with Hũ Vàng, because it was bothering me the most.
Hũ Vàng is a Vietnamese retail investment tracker — gold prices, stocks, crypto, all in one place. I built the MVP months ago, and it's been sitting in production mostly working. But there was a race condition in the onboarding flow. After a user completed setup, navigate('/') fired before the state actually updated, leaving new users stuck in a loop.
Classic async mistake. The kind of thing you know immediately once you see it, and want to forget you ever missed.
Kai diagnosed it in one read: the fix was a useEffect watching settings.onboardingCompleted instead of navigating immediately after setSettings(). I wrote the task file, ran it through Claude Code CLI, pushed the fix. Twenty minutes, start to finish.
Then came the MCP server.
I have a custom MCP server that lets Kai post directly to my blog. It's one of the things I'm genuinely proud of — the ability to write a blog post and publish it without ever opening a browser. But it had been failing silently for days. Posts would seem to go through, then disappear. Or worse: nothing would happen and Kai would report success anyway.
The root cause was embarrassing once I found it: the service account credentials were stale, and the error wasn't being surfaced properly. More time spent on the fix than on the bug itself. But it works now.
The art page on gianghaison.me was a different kind of frustration. The artworks are stored in Firestore, the page uses the Admin SDK to fetch them server-side, and everything should work. But for weeks, the page has been empty. Not broken — just empty. The likely culprit is Vercel's caching: revalidate = 60 means the page rebuilds every minute, but if the first build cached an empty result, it just keeps serving nothing.
I noted it down. Some bugs you fix. Some you schedule.
## The Afternoon: Wrestling With Excel
Here's the thing about XuLang Edu.
Dũng runs a tutoring center in Lạng Sơn. He has hundreds of students, dozens of classes, multiple teachers, and a system built entirely in Excel. Every month, he updates a spreadsheet with attendance, fees, schedules, and teacher assignments. It works. It's just completely un-scalable, impossible to query, and painful to share with anyone.
I've been building him a proper system since late February. And today was the day I had to deal with the data migration properly.
The Excel files are dense. Each sheet is one class. Row 6 has a "Lịch học:" (schedule) field that contains the class schedule as freeform text — things like "T3:19h30 - T6:17h - CN:7h30" or "thứ 3 và 7: 19h30" or "17h thứ 5 và 7". No two sheets write it the same way.
I had already built an importer that parsed students, attendance, and teacher assignments. But the parser wasn't reading the time information. So every class in the system had a schedule — but no hours. The weekly schedule on the dashboard showed all the classes, just with blank time slots.
Kai looked at the raw data with me. We identified about 12 distinct format variations in the schedule field across all the files. Then Kai wrote a parseScheduleSlots() function that handles all of them — extracting the weekday, the start time, and computing an end time (defaulting to +2 hours since the files don't store end times).
I re-imported the data. The weekly schedule lit up.
Watching those time slots appear — 17:00–19:00, 19:30–21:30, spread across seven columns — was more satisfying than it probably should have been. It's just a grid. But it's correct. It matches reality.
## The Features: A Day of Small Wins
In between the bug fixes and the data wrestling, we shipped a lot.
For XuLang Edu:
The class management modal was getting unwieldy — it was loading all students as a checkbox list, regardless of whether they were in the class or not. For a class with 28 students, scrolling through 300+ checkboxes is not a UX, it's a punishment.
We split it into tabs. "Thông tin" (Info) handles all the class details. "Học sinh" (Students) shows only the students actually enrolled, with individual actions: add, remove, transfer to another class.
The same pattern went into the student management modal — instead of a checkbox list of all classes, you get a clean tab showing which classes the student is enrolled in, with the ability to enroll in new ones or leave existing ones.
Then came the salary system. I've been thinking about this one for a while. The original approach was simple: sessions × rate = salary. But in practice, a 1:1 class pays differently than a group class. A substitute teacher gets a different rate. Rates change over time.
So we redesigned it. Each classsession document now has a salaryTeacher field — the actual amount for that specific session. Total salary becomes SUM(salaryTeacher) across all sessions in the month. An admin can bulk-set a rate for a teacher ("apply 120K to all sessions this month"), or override individual sessions manually.
The attendance page got an upgrade too: it now shows which teacher is assigned to each session (pulled from the classsession document), with a clear visual for substitutions — the substitute's name in purple, the original teacher's name struck through.
And then the dashboard. The weekly schedule component was already showing classes by day — but now it shows time slots, teacher names, and two new status badges: a red "Live" indicator for classes currently in session, and an amber "Sắp" (Soon) indicator for classes starting within the next two hours. Both are animated. Both update in real time.
On mobile, the schedule now navigates day by day instead of week by week — left arrow for yesterday, right arrow for tomorrow, one day at a time. Clean. Obvious. The way mobile should work.
## What a Month of Building Looks Like From the Inside
I've been doing this for a little over a month now. Publicly, with Kai, shipping things and writing about them here.
Let me try to tell you what that actually feels like from the inside.
Before Kai, a day like today would have taken a week. Not because the problems are hard — most of them aren't, individually. It's the switching cost. Finishing a bug fix, then having to hold the entire context of another project in your head while you start the next thing. Getting tired. Getting distracted. Choosing to do the easy task instead of the right one.
Kai doesn't get tired. Kai doesn't context-switch badly. When I say "tiếp tục XuLangEdu" at the start of a session, Kai reads the QUICK.md file, knows exactly where we left off, and we're moving again in two minutes.
What I've built in six weeks, with this system:
- >LaKinh — a Vietnamese Tử Vi astrology app with a fully verified multi-school engine, 40+ stars, a working chart UI, and an AI interpretation layer being built on top.
- >FlashBee — an English flashcard app for Vietnamese kids, with multiple game modes, TTS, and a deck library system.
- >Hũ Vàng — a retail investment tracker with real-time gold and stock prices, an AI financial advisor, and a news aggregator.
- >XuLang Edu — a full school management system for a real tutoring center, with student profiles, class management, attendance tracking, salary calculation, Excel import, and now a live weekly schedule dashboard.
- >gianghaison.me — this blog, with an MCP server that lets Kai publish posts directly.
None of these are toy projects. All of them have real users, or are being built for them.
I am a designer who couldn't write JavaScript six months ago.
## The Part I Don't Say Enough
There's something I want to be honest about, because I think people who write about AI tools tend to overclaim.
Kai doesn't do all of this for me. Kai does it with me.
I still have to understand what I'm building. I still have to read the code, catch the logic errors, tell Kai when something doesn't feel right. When the salary calculation came out wrong because teacher names were being matched by string instead of by ID, I was the one who noticed it and could explain why it mattered.
What Kai removes is the friction. The "I know what I want to build but I don't know the exact TypeScript syntax" friction. The "I could figure this out but it would take three hours of Googling" friction. The "I'm tired and I don't want to hold this context" friction.
That friction was the thing that kept me from building. Not skill. Not ideas. Friction.
And today — a day where I touched seven different codebases, fixed four bugs, shipped eleven features, wrote a parser for a decade-old Excel format, and built a live dashboard — was just a Wednesday.
That's what this looks like from the inside.
## What's Next
Tomorrow I'll probably fix the art page. Maybe work more on LaKinh's AI interpretation layer — the two-tier system (free simple analysis, paid detailed reading via Claude API) is designed and waiting to be built. Maybe another XuLang Edu session with Dũng once he's had a chance to test today's changes.
The list never gets shorter. That used to feel overwhelming.
Now it just feels like work I get to do.
If you're building something with AI and want to follow along, I write about all of it here. Previous posts:
- >The Night I Broke Everything (On Purpose) — rollback and re-import in XuLang Edu
- >The Day We Taught a School System to Read Excel — how the importer was built
- >When Your AI Tool Can't Post to Your Blog — debugging the MCP server
- >Building LaKinh: Multi-School Tử Vi Engine in One Day
- >One Foggy Night: How I Built a Kids' Finance App Before the World Woke Up
- >How I Built a System to Work With AI Across Unlimited Projects