The Honest Version
Most build-in-public posts are highlight reels. This isn't one.
I'm Ashish. I'm 17. I live in India. I've been building Overseer — a real-time AI narration layer for AI coding agents — solo for about two months. No funding. No team. No co-founder.
Here's the actual story.
Why I Started
Three months ago I had a production incident that scared me.
I was using an AI coding agent to build a feature. It wrote ~300 lines across 6 files in about 4 minutes. I reviewed it. It looked fine. I shipped it.
Seventy-two hours later it broke in a way I couldn't debug quickly. When I traced the issue, I realized I had never truly understood what the agent wrote. I had read it. Reading and understanding are not the same thing.
I shipped code I didn't own. That's the origin story.
What Almost Stopped It
The API rate limit wall.
Hit quota limits so hard on day 3 of testing that I had to rebuild the analysis layer from scratch. Best accidental decision of the project — latency dropped from ~2s to ~300ms and the free tier is genuinely generous.
JWT token drops. The daemon runs long sessions. During early testing, tokens would expire mid-session and the daemon would die silently. Took 3 days to implement proper auto-refresh. Three days I didn't have.
The "this already exists" spiral. I spent a week convinced someone had already built this. Mapped every competitor: CodeRabbit, Graphite, Greptile, Cursor BugBot. None of them do real-time narration during generation. They all operate after the fact. The gap is real. But that week was brutal.
Per-file API hammering. Without cooldowns, every keystroke triggered a analysis call. I burned through quota in 45 minutes of testing. Added minimum diff size (50 chars) and per-file cooldown (8 seconds). Now the narration is meaningful rather than noisy.
The Technical Pipeline (Simplified)
AI Agent writes code
↓
chokidar watches filesystem
↓
diff extracted from changed files
↓
Analysis engine
↓
structured analysis: { summary, intent, risks, fix }
↓
WebSocket broadcast
↓
Next.js dashboard → live narration cards
Monorepo: Node.js daemon + Express backend + Next.js dashboard. Supabase with 5 tables and Row Level Security. Install: npx overseer watch
Where I Am vs Where I Thought I'd Be
Expected: 2 weeks to working prototype. Reality: 6 weeks to end-to-end working pipeline.
Expected: 10 waitlist signups from launch tweet. Reality: 2 signups from organic activity. Both are real people. I know because I DMed them both.
Expected: Clean technical decisions. Reality: Two API key commits caught before merge, one architecture reversal, one complete AI provider switch.
What I've Learned Building This as a 17-Year-Old
Nobody will take you seriously until you have something that works. So build something that works first.
The problem matters more than the builder's age. If the problem is real and the solution is real, nobody cares that you're 17.
If you're using Cursor, Cline, Windsurf, or any AI coding agent and want early access — [waitlist is open]
https://overseer-zeta.vercel.app/
If you have questions about the technical implementation — drop them in the comments. I'll answer everything
Top comments (1)
The line "I had read it. Reading and understanding are not the same thing" is the kind of thing you usually only learn after an incident burns it into you. The fact that this is the origin story for a tool built by a 17-year-old is almost beside the point—what matters is that the insight came from a real scar, not a hypothetical.
What strikes me about the competitive research spiral is how universal that week is, regardless of age or experience. Everyone building something new hits the moment where they're convinced they're reinventing someone else's wheel. The discipline of actually mapping the competitors and finding the gap—not just feeling anxious about them—is what separates projects that ship from projects that stall in research mode forever. You did the mapping. Found the gap. Kept going. That's the whole game.
The per-file API hammering detail is the kind of honest technical note that most build-in-public posts skip. Every keystroke triggering an analysis call is exactly the naive implementation anyone would write first, and the fix is simple in retrospect but painful to discover in real time. The 50-char minimum diff and 8-second cooldown are the kind of invisible parameters that make the difference between a tool that's usable and one that's just a demo. Those numbers probably came from watching it break in real time and tweaking until it felt right. Is 8 seconds the sweet spot you landed on after testing, or is it still something you're tuning as usage patterns emerge?