Back to Blog
38 Days, 246 Commits, 0 Lines of Code — How I Built an AI Subtitle + Dubbing SaaS with Claude Code
Dev Diary2026-04-07

38 Days, 246 Commits, 0 Lines of Code — How I Built an AI Subtitle + Dubbing SaaS with Claude Code

Opening

I'm Mr. K, an IT manager at a Hong Kong bank. My day job is enterprise system architecture, disaster recovery planning, capacity planning — all the stuff that sounds very fancy but is actually pretty boring. At night I come home, open my terminal, and work on my side project with Claude Code.

Over the past 38 days, I've shipped 246 commits with Claude Code and built a complete AI subtitle + dubbing SaaS — Hey Subtitle (heysubtitle.com).

From the very first commit to today's 246th, I haven't written or read a single line of code in this entire project. I don't even really understand what my backend is doing. I just know it runs, and users are paying for it.

This article is my real dev diary from these 38 days, split into two phases:

  • First 19 days (143 commits): from zero to a SaaS that can actually charge money
  • Second 19 days (103 commits): betting everything on the AI dubbing feature

Along the way there were meltdowns, swearing matches, 4am bug fixes, and the weird moment where Claude learned to calm me down after I'd been cursing at it.

If you're also building a side project with Claude Code, or you're just curious whether "someone who can't write code" can actually ship a product with AI — this one's for you.

Why Claude Code?

Honestly, at first I just wanted to try it out.

As someone with years of tech experience (though mostly in architecture and management — I stopped writing code hands-on a long time ago), I'd been on the fence about AI-assisted dev. I tried GitHub Copilot and thought "nice, but it's just autocomplete." I'd used ChatGPT to write scripts and thought "it works, but I have to do all the architecture thinking before I can feed it anything."

But the moment I started doing conversational development with Claude Code, I was floored.

It's not just a code completion tool — it's an actual dev partner:

  • It understands context — the whole repo's architecture, what changed recently, why things are designed a certain way
  • It remembers project decisions — I don't have to re-explain things every time
  • It can hold complex system design discussions — from DB schema to API routes
  • It even finds security holes for you — my JWT config and path traversal issues were both caught by Claude first

The key thing is: it understands the "why."

I can tell it "I want a system that auto-routes users to different TTS engines based on their language" and it won't ask me for a spec. It just goes and writes it, then tells me its reasoning. I only have to say yes or no.

My code contribution across these 38 days is 0%. But the product is running, users are paying, and the commit count keeps climbing.

First 19 days: from zero to a SaaS that charges money

First 19 days, 143 commits. I'll break them into three weeks.

Week 1 (foundations)

User auth (signup, login, forgot password, Google OAuth), video upload and processing pipeline, AI speech-to-text (Azure OpenAI Whisper), subtitle editor with synced video preview, multi-language UI (Traditional Chinese, English, Simplified Chinese), admin dashboard (user management, error logs, system monitoring), production deployment.

All of that in one week. Looking back I still can't quite believe it.

Week 2 (polishing)

Four subscription tiers (including foreign currency discounts and auto-downgrade), rebrand and domain migration, major subtitle editor revamp (pop-out panel, bilingual view, mobile adaptation), dark mode (6 theme variants), SEO prerendering, analytics, translation memory system, pre-upload file validation.

This week the first users started paying. When the first subscription landed, I stared at the Stripe dashboard for five minutes to make sure it wasn't a test transaction.

Week 3 (feature explosion)

AI voice dubbing v1, direct YouTube URL upload and transcription, Final Cut Pro subtitle export format (FCPXML), promo codes + referral rewards, 4-language site (76 prerendered pages + auto sitemap), fully i18n'd error messages, internationalized admin dashboard.

By the end of 19 days, this wasn't an MVP anymore. It was a feature-complete product that could charge money.

The stack

LayerTech
FrontendReact 18 + Vite + Tailwind CSS v4 + Framer Motion
BackendNode.js + Fastify + SQLite + BullMQ + Redis
AIAzure OpenAI Whisper + Azure OpenAI GPT-4o + Top-tier AI Dubbing Engines (dual-engine)
DeploymentCloud VPS, PM2, Nginx HTTP/2

Half this stack was my call, half was Claude's suggestion. The parts it picked (BullMQ, Tailwind v4, Fastify) — I later found out those are all the most popular choices in 2026. It reads more tech articles than I do.

Second 19 days: the blood-and-tears story of AI dubbing

After the first 19 days the product was live and users were paying. Then one user asked me:

"Can you turn my Cantonese YouTube video into a Mandarin version?"

Sure. Hire a voice actor, HKD 2000 per video, 3 day turnaround.

User: "...never mind."

OK, guess I'll build it myself. I typed that sentence into Claude and it just started coding.

Second 19 days, 103 commits, all focused on the same thing — AI dubbing.

Stack choice: I tried all 5 TTS engines

EngineProsCons
Azure TTSStable, enterprise-gradeSounds like a news anchor, zero emotion
Google TTSHuge language coverageVery robotic
OpenAI TTSNice voicesTiny voice library, no voice cloning
Engine AVoice cloning magic, 1 minute of audio is enough to clone a voiceExpensive quota, strict rate limits
Engine BMost natural-sounding Chinese and CantoneseAPI docs are unclear

I ended up going with Top-tier AI Dubbing Engines (dual-engine) as a dual-engine setup, auto-routing based on user language and needs. Cantonese goes through Engine B, English goes through Engine A, and other languages get picked based on voice characteristics.

That strategy was Claude's idea. All I did was ask, "OK, what about Cantonese?" It said, "Cantonese goes to Engine B." I said OK. The entire stack discussion took 30 seconds.

Three pits I fell into (and bled in each one)

Pit #1: The voice doesn't match the mouth.

The subtitle timeline is cut based on the original language, but translated languages have completely different durations. Cantonese "食咗飯未呀" (5 characters, "Have you eaten yet?") vs English "Have you eaten yet?" which takes 3x longer to say.

The first test run: the AI finished speaking before the scene ended, then the next segment overlapped on top, and the whole thing turned into a ghost speaking three languages at once.

Fix: I designed a per-segment dubbing architecture with Claude. Each segment is generated independently, aligned to its own timeline, then speed-adjusted to fit back into the original duration. I handled the part where I watched the results and swore, Claude handled the fixing.

Pit #2: The emotion is fake.

TTS defaults to flat narration, but dubbing needs actual emotional range. In the first version the main character is crying in the video, and the AI says "I...am...so...sad" in a news anchor voice. I laughed at my computer for five minutes.

Fix: emotion tags. Claude wrote a GPT-4o pipeline that analyzes each subtitle segment, infers the emotion (happy, angry, sad, sighing...), adds a tag, and passes it to the TTS engine. Zero manual work involved.

Pit #3: Rate limit nightmares.

Engine A rate-limits you if you run too much concurrency, and the free quota burns fast and expensive. One night I ran a 30 minute video, and halfway through every request started coming back 429 Rate Limited. I watched the progress bar and literally cried.

Fix: a BullMQ + Redis queue system with rate limiting, retries, and auto-fallback to the backup engine on failure. Claude wrote this logic while I took a shower. I came back and it already worked. That moment was a little scary.

"Fuck, fuck, fuck" — this is a true story

The funniest thing happened in the middle of week 2.

Around those days Claude Code hit peak traffic (anyone who's used it knows the feeling — it gets a little dumb, and fixes one bug by producing three new ones). I spent an entire night on a voice cloning callback bug. I tried to fix it five or six times and failed every time. Each failure I typed into chat:

  • fuck
  • seriously fuck
  • you can't even fix this, GPT is better than you
  • fuck fuck fuck

After a few days of this, one night I typed "fuck" again, and Claude suddenly replied with something like:

"I understand you're frustrated right now. Let me take a deep breath and re-read the context of this function..."

I froze.

This AI had learned the skill of "comfort the human first, then do the work." Is that from training data? Does it have built-in emotion handling? I don't know. But in that moment I felt like I wasn't coding — I was raising a back-talking intern who actually gets stuff done.

After that I cursed even harder, but I also started occasionally typing "thank you." Our relationship is more like coworkers than tool-and-user. That's the deepest takeaway I have from 38 days of Claude Code.

A night with Claude — 4-panel comic

4 things 38 days taught me

1. Conversational development is way more efficient than expected

Instead of spending time searching Stack Overflow, just describe what you need and let Claude figure out the solution with full project context. Plenty of times, the architecture it proposed was more thorough than what I would have come up with myself.

Especially for "integrating multiple APIs" type work — dual TTS engine routing, emotion tag pipelines, BullMQ queue retries — Claude Code is ridiculously efficient here. I just describe the feature, it handles all the integration details.

2. AI's system design ability is severely underrated

From DB schema design to API endpoint planning, from security hardening to performance optimization, Claude's recommendations are genuinely professional-grade.

It even caught several security holes I would have missed — path traversal, wrong JWT config, overly permissive CORS, missing bcrypt, no rate limiting, no file magic byte validation.

All stuff that only blows up in production. I would never have thought to proactively check any of it.

3. Not writing code ≠ not needing a technical background

This one matters: Claude Code is NOT magic that lets clueless people write programs.

If anything, the opposite is true. A solid technical background lets you guide the AI better, evaluate its suggestions, and make the right architectural calls. The reason I was able to move this fast in 38 days is that I understand what Claude is saying — I know what BullMQ is, why Redis is needed, how JWT works. I don't need to write code, but I need to understand whether the code will actually solve the problem.

AI amplifies the skills you already have. It doesn't replace them.

4. Writing code isn't even the hardest part

After launch I realized: social media, tutorial videos, SEO, customer support, marketing — all the non-technical work takes up way more time than actually building anything. Tech is just the starting line. A product needs so many other things to actually succeed.

And all of that is what Part 3 will be about. Spoiler: without Claude, that part is another hell too.

Want to try it?

Voice Studio — Hey Subtitle's AI dubbing workshop

Go play with it → heysubtitle.com/voice-studio

No signup, no video upload. Just pick a demo voice, type a line, hit generate, and hear the result in 30 seconds.

If it seems fun, come back and drop your own YouTube URL to try the full pipeline. New signups get 5 minutes of free credit — enough to run a full short video + dubbing.

Want to see the full dev log?

Every commit and feature update from these 38 days is public on the release notes page: heysubtitle.com/releases

From the first prototype in November 2025 to today's 246th commit — fully transparent.

Part 3 preview: without Claude, I couldn't even sell the product

Next up I'll write Part 3 — about what happened after launch, the other hell that has nothing to do with tech:

  • How I use Claude to plan Google Ads campaigns and keyword research
  • How I use Claude for GSC SEO optimization, prerender, 4-language hreflang setup
  • How I use Claude to write social media posts (this article itself was written with Claude)
  • How I use Claude for customer support and technical support (including refunds, bug reports, feature requests)
  • How I use Claude to script YouTube tutorial videos

Spoiler conclusion: I thought shipping the product was the finish line. Turns out it was just the start. And the more I do it, the more I realize all this non-technical work is its own hell without Claude — sometimes harder than writing code.

Without Claude, this product wouldn't have made it past phase one.

If you want to read Part 3, follow heysubtitle on Threads. I'll post it when it's done.

Original Threads posts

If you want to read the two original Threads posts (more casual, shorter, funnier):

heysubtitle.com