The 3-Day MVP: How I Built and Launched SubflowAI in 19 Days using Claude Code
Behind the scenes story of SubflowAI - the fastest way to Schedule Substack Notes
I didn’t plan to build a product. I just wanted to stop worrying about whether I’d posted a Substack Note today.
That frustration turned into a 3-day coding sprint over weekend. The sprint turned into a working product. And 19 actual build days later, SubflowAI was live on the Chrome Web Store.
This is the full build log - the real timeline, the failures, and everything that happened between “what if I built this” and “it’s live.”
The Frustration That Started It All
I create a lot of content. YouTube tutorials. Substack articles. And I wanted to repurpose all of it into Substack Notes. Those short-form posts that help you stay visible between newsletters.
The problem?
Substack has no scheduling for Notes. You write, you post, you hope you remember to do it again tomorrow.
I tried automating it with n8n. Built a workflow using Substack Community Node to post Notes on a schedule. It worked for a few days. Then it broke with a “Forbidden” error. Then it worked again. Then it broke again.
The issue?
No public Substack API. No official integration. Just reverse-engineered endpoints that could change anytime. Authentication kept failing randomly.
I’m someone who likes to batch-create content. Sit down once, write a week’s worth of Notes, schedule them, move on. But without scheduling, I was carrying mental overhead every single day:
Did I post today? What should I post? When did I last post?
That overhead was killing my consistency.
The Decision: Build It Myself
In last week of November 2025, I made a decision: if the tool I needed to suit my content system didn’t exist, I’d build it using Claude Code.
A bit about my background:
I started my career as a software engineer in 2006 and now lead a Cloud FinOps practice full-time for an IT services provider. It’s been 7-8 years since I’ve written production code professionally. But I’ve kept my hands dirty with side projects like my 17-year-old travel blog often required basic automation and coding. I was building Chrome extensions from scratch, though.
What I do have is strong product sense from shipping enterprise software solutions. I know how to scope features, think about UX, prioritize ruthlessly, and ship. The gap was always execution speed because I could spec something in a day, but building it would take weeks or months, even with a developer.
Enters Claude Code
I had been experimenting and troubleshooting that issue with n8n workflow with Claude Code, Anthropic’s AI coding assistant and something on the lines of Chrome exetentions was suggested by it.
One thing led to another. While brainstorming solutions for the broken n8n workflow with Claude in Desktop, one suggestion was to solve it using a Chrome extension. I was like, hmm... let’s try that out.
December 1st, 2025. I opened Claude Code and typed:
“I want to build a Chrome extension that helps schedule Substack Notes. Walk me through what I need.”
What followed was the most productive 3 days of my life.
👋 Julley, I’m Dheeraj and I’m an AI systems builder.
I build production-grade AI systems at work by day and ship my own products by night (9+). This newsletter is the bridge between those two worlds. Every system, every build, documented step by step.
Join 1,100+ builders getting the exact AI setups, prompts, and production configs that actually work in your business.
Days 1-3: The MVP Sprint
38 commits. 3 days. A working product.
By the end of day 3, SubflowAI could:
Show a visual calendar of your entire month
Let me write Notes with rich text formatting
Offer smart time slots (7am, 10am, 1pm, 4pm, 7pm)
Connect to a Cloudflare Worker backend
Call Google’s Gemini API to repurpose long articles into 5-7 ready-to-post Notes
Schedule Notes to post automatically
This wasn’t a prototype.
I could paste an article URL or content directly → click “Generate” → see 5-7 Note variations → pick my time slots → and schedule them. Done.
The “vibe coding” approach
I didn’t write most of the code myself. I described what I wanted. Claude wrote the code. I tested it. We iterated.
Some sessions, Claude would build entire features while I focused on UX decisions. Other sessions, I’d update code or direxction and ask Claude to review it. The collaboration felt less like using a tool and more like pair programming with a patient senior developer who never gets tired and knows every API.
Claude handled about 70% of the implementation. It knows Chrome APIs deeply. When I said “I need scheduled posts to survive browser restarts,” Claude set up the Chrome alarms system, the onInstalled listener, the onStartup re-initialization; all the plumbing.
The 30% I handled was mostly debugging things that only show up in real usage. And the product decisions → what to build, what to skip, and when to stop.
By December 4th, I had something I’d actually use. The question was:
could this be more than a personal tool?
The Belief Moment
Here’s the thing about side projects: most of them stay side projects. You build something for yourself, use it for a while, and eventually abandon it.
But around day 3, I looked at SubflowAI and asked myself: Would I pay for this?
The answer was yes. Not because it was perfect, but because it solved a real problem. Batch content creation. Visual scheduling. AI repurposing. The core value was there.
That’s when the project shifted from “personal tool” to “potential product.”
Days 4-11: Monetization & Polish
7 active build days. 168 commits.
If this was going to be a real product, it needed:
A way for people to pay
A license system that wasn’t annoying
Enough polish that anyone could use it
The license system - hard work
I integrated Lemon Squeezy for payments. Users could start a free trial (no credit card required), and if they liked it, grab lifetime access for $49.97 (5-year license). for first 50 early adopters. I also set up the monthly plan at $4.97 for the same user set.
But Lemon Squeezy turned out to be one of the harder integrations. Claude didn’t have fully updated API knowledge, so a lot of the work was manually testing sandbox APIs, passing back the information to Claude, and making sure updated documentation was fetched and fed to Claude’s project memory.
License validation in dev vs. production environments behaves differently, and no amount of AI can tell you that - you need to test every combination yourself.
The first version of license validation was a disaster. I built it to check the license every 30 seconds. Claude pointed out the math:
30 seconds = 2 API calls per minute
2 × 60 × 24 = 2,880 API calls per day
Per user
Even when they weren’t using the extension
The fix: “Smart Lazy Validation.”
Only check the license when users actually do something (open the extension, post a note, generate content). Cache the result. Revalidate only when needed.
API calls dropped from 2,880/day to about 10. A 99% reduction.
The 58-commit day
December 17th was the most intense day - 58 commits in a single late night session.
That’s when I built batch scheduling. You generate 5-7 Note variations from an article, and with one click, schedule all across the week. The feature went from idea to working code by midnight.
Other features built this phase:
Automatic backup to Chrome’s cloud sync
Interactive onboarding tour for new users
Rich text editor improvements
Testing framework (Playwright for E2E, Jest for unit tests)
The ProseMirror Nightmare
This deserves its own section because it was the hardest technical challenge of the entire build.
Substack uses ProseMirror internally for its editor, and their Note format is undocumented JSON. You can’t just send HTML. It has to be their specific document structure with exact node types, marks, and attributes.
I spent hours on this.
Claude would generate a format converter. I’d test it. It would work for plain text but break on bold text. Fix bold, links break. Fix links, lists break. Fix lists, nested formatting breaks.
The issue was that Claude was working from general ProseMirror documentation, but Substack’s implementation has custom node types and specific validation rules that aren’t publicly documented. Empty paragraphs cause HTTP 500 errors. That’s not in any documentation.
I found it by posting a Note with a blank line and watching it fail.
I had to:
reverse-engineer the format by creating Notes in Substack’s editor,
inspecting the API payload in Chrome DevTools, and
feeding those real examples back to Claude.
Even after that, during beta, one user faced formatting issues I hadn’t caught because I couldn’t test every possible combination.
It wasn’t that I “did it manually”. I did the research manually and let Claude do the coding. That’s the actual workflow. AI is incredible at implementation, but sometimes you need a human to figure out what the correct implementation even looks like.
The Holiday Pause (December 19-27, 2025)
I took 9 days off for Christmas. No commits. No coding.
When I came back, I immediately spotted three edge cases I’d missed. Fresh eyes caught what tired eyes couldn’t.
Lesson: Sometimes stepping away is the most productive thing you can do.
This article gives you the story, not the session structure. The prompts, the Claude Code workflow, the 2-hour evening cadence that made 19 build days possible — figuring all that out on your own could cost you weeks of dead ends.
PluggedIn members get the prompt templates and build frameworks behind sessions like this one.
Days 12-17: The Non-Code Work
This is the part nobody talks about: shipping a product isn’t just code.
Privacy Policy & Terms of Service
Chrome Web Store requires a privacy policy URL. Your submission gets rejected without one.
I used Claude to draft both documents in plain language:
What data we collect (notes, license keys)
Where it’s stored (locally, on Cloudflare)
What we don’t do (sell data, track users)
Deployed them to www.genaiunplugged.com. Done.
Screenshots & Store Assets
The Chrome Web Store listing is your first impression. I needed:
Up to 5 screenshots showing the main features
A promotional tile (440×280 pixels)
Store listing copy with character limits
Even a video (optional)
Taking good screenshots is harder than it sounds. Real data looks messy. I created a “demo mode” with polished sample notes and captured each view.
The store listing copy took multiple iterations. Summarizing your product in 132 characters forces clarity:
“Write & schedule 30 days of Substack Notes in 5 minutes with AI repurposing and smart scheduling.”
Marketing Content
The non-coding stuff continues. I wrote the:
articles you might be reading alongside this one.
The Chrome Store submission guide.
The launch announcement.
Substack Notes, a full month of it scheduled through SubflowAI 😀
Social posts for LinkedIn.
This content doesn’t write itself. Budget time for it.
Security Audits: Trust But Verify
I ran two comprehensive security audits using Claude’s subagent capabilities. One before submitting to the Chrome Web Store, and one after getting beta user feedback from AI Meets Girlboss (thanks to her for being few of the early beta testers and adopters)
First audit - Production Readiness Review
Three parallel agents were spawned:
Security Audit - XSS, injection, API key exposure, permissions, CSP
Performance Testing - 1,000+ notes handling, storage limits, UI lag
Technical Debt Cleanup - Dead files, unused code, optimization
Any issues found were systematically fixed before the release went out.
Second audit - Deep Security Sweep
Four parallel security review agents, each focused on a different attack surface:
Every
chrome.tabs.createcall auditedAll permissions and content script scopes checked
Network requests analyzed
Every interval and loop in the codebase reviewed
The report came back: 100% clean.
The architectural philosophy from day one
SubflowAI never touches your Substack password or token. The rule was simple, “if we don’t need to store it, we don’t store it.” The fewer secrets we manage, the fewer things that can go wrong.
Days 18-19: Chrome Web Store Submission (January 6-13, 2026)
The submission journey looked like
Jan 6: Event: First submission
Jan 8: Event: Rejection #1 - Unnecessary
tabspermissionJan 8: Event: Fixed manifest, resubmitted
Jan 10: Event: Rejection #2 - Extension appeared non-functional
Jan 10: Event: Added test instructions, resubmitted
Jan 13: Event: APPROVED
Rejection #1 was my fault. I’d requested the tabs permission but didn’t actually need it. Easy fix.
Rejection #2 was frustrating. The extension worked perfectly, but the Google reviewer couldn’t test it without a license key. From their perspective, it looked broken.
The fix: added detailed testing instructions with a magic test key (TEST_ACTIVE) so reviewers could experience the full product.
Third submission was approved in 3 days.
Lesson: Your submission isn’t just for users. It’s for reviewers who’ve never seen your product. Make their job easy.
The Timeline: 19 Actual Build Days
MVP Sprint
Calendar Days: Dec 1-4
Build Days: 4
Commits: 38
Monetization & Polish
Calendar Days: Dec 8-18
Build Days: 7
Commits: 168
Holiday Break
Calendar Days: Dec 19-27
Build Days: 0
Commits: 0
Non-Code Work
Calendar Days: Dec 28 - Jan 5
Build Days: 4
Commits: 16
Submission
Calendar Days: Jan 6-13
Build Days: 4
Commits: 16
Total
Calendar Days: 43 calendar days
Build Days: 19 build days
Commits: 238 commits
From first commit to Chrome Web Store approval: 19 days of actual work, 238 commits.
Post-launch, SubflowAI has grown to 310+ total commits across 11 releases.
Post-Launch: User-Driven Development
SubflowAI (Beta) went live on January 13th, 2026. But launch was just the beginning.
As of February 2026, SubflowAI (v1.011) has 20 active beta users with a couple of paying customers. Most are on free trials. Every feature since launch came directly from user feedback:
Request: “I only post 3x/day, not 5x. Let me pick which time slots to use.”
Shipped: v1.0.10 (1 week later)
Request: “Ability to tag Substack users”
TBD
Request: “Add a Clear button to reset the AI Studio”
Shipped: v1.0.11
Request: Emoji picker in editor
Shipped: v1.0.5
Request: Image uploads
Shipped: v1.0.7
Request: Link preview cards for URLs
Shipped: v1.0.11
The backlog is 100% user requests or user validated except Image and Emojji support that I wanted to only build if I hear feedback. No guessing what to build next.
What I Removed (And Why It Mattered)
Everyone asks about features. Nobody asks about what I deliberately cut. And the cuts are what made the product good.
Claude Code suggested a full theme customization system. I cut it to just a dark/light toggle.
It suggested notification badges and floating widgets. Cut.
It suggested a YouTube transcription mode that would turn my video content into Notes. I actually built it, then hid it because it wasn’t reliable enough.
The 58-commit day where I built batch scheduling produced the most important feature in SubflowAI.
But the following week, I removed three features that were making the UI cluttered:
The undo/redo buttons went away (Ctrl+Z still works)
The image upload button got simplified
A “suggested topics” panel got deleted entirely
Shipping is choosing. And choosing what to remove is harder than choosing what to build. AI will happily build everything you ask for. Your job is to not ask for everything.
What I Learned Building Chrome Extension using Claude Code?
1. Vibe coding works but with the right human in the loop.
I have a software engineering background, but I haven’t written production code in years. Claude Code wasn’t a shortcut, it was a collaborator and fast senior developer. The AI handled implementation while I made product decisions.
But the human-in-the-loop design was critical: SubflowAI never auto-posts silently.
Every scheduled Note shows up on the visual calendar. You see exactly what’s going out and when. The AI gives you 5-7 variations, you review, edit, and explicitly schedule. There’s always a human in the loop before anything touches your Substack account.
2. The MVP matters more than polish.
3 days gave me a working product. Everything after was refinement. If I’d waited until it was “perfect,” I’d still be building.
3. Budget time for non-code work.
Privacy policy. Screenshots. Store listing copy. Marketing content. Security audits. This took 4 full days, almost as long as the MVP may be more if I count publishing this article too. Don’t underestimate it.
4. Rejections aren’t failures.
Google Chrome Webstore rejected SubflowAI twice. Each rejection taught me something. The third submission was better because of the first two.
Many peole will say “no” when you reach out to test or try. Get comfortable with it.
5. Users know what they need. Listen.
Most of the post-launch feature came from real feedback. Elena’s customizable time slots request and Pinkie’s push towards Link Preview Cards in the note made the SubflowAI significantly better. Listen to users.
6. Build it in the margins.
I have a full-time day job leading a Cloud FinOps practice. GenAI Unplugged, the courses, SubflowAI - all of it happens in early mornings, late nights, and weekends.
Claude Code makes this possible by compressing what used to take days into 2-hour evening sessions.
Before AI tools, 2 hours meant “read the codebase and remember where I left off.” Now it means “describe, iterate, test, commit.”
The Numbers
3 days to build the MVP
19 days of actual work to launch
~$135 total build cost ($5 Chrome Web Store fee + ~$100 Claude Code subscription + $4.70 in AI API credits)
238 commits from first line to Chrome Web Store approval
310+ total commits (and counting)
58 commits in a single day (batch scheduling)
2 rejections before approval
99% reduction in API calls (Smart Lazy Validation)
20 beta users with a couple of paying customers
11 releases in 4 weeks post-launch
Where SubflowAI Is Now
As of February 2026, SubflowAI is live with paying users. The core features:
Visual calendar - See your entire month of Notes
Smart scheduling - One-click time slot selection
AI repurposing - Paste an article, get 5-7 ready-to-post Notes (powered by Google Gemini)
Batch scheduling - Schedule a week of content in 30 minutes
Image uploads - Add images to Notes (stored on Cloudflare R2)
Link preview cards - URLs generate rich previews automatically
Backup and recovery - If Chrome wasn’t running, missed Notes post when you open the browser
Substack Writer Mentions, Images, Code Blocks, Emojis, wtc..
It’s not perfect.
There’s no Safari or Firefox version yet. Scheduled posts require Chrome to be running. But it solves the problem I set out to solve: consistent Notes without the daily mental overhead.
Get lifetime access (5-year license): $49.97 ONLY for first 50 users on GenAI Unplugged Lemon Squeezy Store
Should You Build Your Own Tool?
If you’re frustrated by a problem and can’t find a solution, maybe the solution is you.
You don’t need to be an engineer (though it helps to have built things before).
You need:
A clear problem
Willingness to iterate
The right collaboration (for me, Claude Code)
Patience for the non-code work
The cost floor has collapsed. I built a monetized Chrome extension with AI features, serverless backend, payment processing, and image hosting for about $135 and 19 build days. The math on “build vs. buy vs. use what exists” is completely different now.
The tool you wish existed might be 3 days away.
PS: Have you built something to solve your own problem? I’d love to hear about it. DM me on Substack or reply to this article.
Get PluggedIn
You don't need weeks to figure out the Claude Code build workflow — you need the one that already shipped a product.
Every week you spend reverse-engineering this approach is a week you're not shipping.
Get PluggedIn to go from reading about a 3-day MVP to running your own sprint with the exact workflow that produced one













Great article . Great work .
I am learning N8N . Do you thing it’s right for me to learn as you faced issue from building it in N8N ?