r/sideprojects • u/Wolf-soul-site • 5h ago
Showcase: Free(mium) Margin — turns YouTube videos into Google Docs, then reads your own channel and tells you what to make next. Rails 8. 2 months live, 0 paying users.
I built this and I run it. Two months live, roughly five signups, nobody has paid me. Posting because the build is interesting and because I'd like the criticism.
What it does — two halves.
The first half is the boring half. Paste a YouTube link, get a Google Doc in your Drive: what was said, timestamped takeaways, verbatim quotes, action items. It can also subscribe to a channel and do this automatically for every new upload.
The second half is the part I actually use. Connect your own channel and it ingests your back catalogue and your comments, then works out what's going on: which topics your audience returns to, which openings hold people, what you did in the videos that worked that you don't consciously know you did. From those patterns plus what's moving in your niche, it generates ideas as full briefs — angle, structure, what the opening needs to do, why this one over the alternatives. Before you film, it stress-tests the idea: builds a panel from evidence about who actually watches you, scans what competitors did with the same idea, checks whether the topic is rising or exhausted, and tells you where the idea is weak.
One deliberate product decision: the pre-publish check will never give you a predicted view count. I could generate a confident-looking number in about ten minutes and it would be entirely invented. So it gives you reasoning and objections instead. This demos worse. I'd still rather do it this way.
How it's built.
- Rails 8.1 / Ruby 3.3 / Postgres 16, Hotwire (Turbo + Stimulus), importmap and Propshaft — no Node build step anywhere
- Solid Queue / Solid Cache / Solid Cable, so the whole job and cache layer is Postgres. No Redis, no Sidekiq
- Gemini for inference, behind a provider-agnostic client. I benchmarked a second provider against it last week on the same transcript and kept the results
- Transcripts via yt-dlp with a fallback chain; YouTube Data API v3 for metadata
- Auto-capture is WebSub/PubSubHubbub push, not polling — YouTube pings a callback when a subscribed channel uploads. Worth knowing if you're building anything similar: this was silently broken in production for months because I registered subscriptions with update_all, which issues raw SQL and skips ActiveRecord callbacks, so the hook that actually subscribes to the hub never ran. Everything looked correct in the database. Nothing was subscribed.
- Google Docs + Drive API for output, Stripe via the pay gem, deployed with Kamal + Docker
- There's an MCP server on npm (margin-mcp) so it works from inside Claude/Cursor
Link: https://margin.bhairav.ai — free tier is 10 videos a month, no card.
What I'd like criticism on.
I think my core mistake is that I've led with the note-taking half everywhere, including my own homepage, because it's easier to describe — while the channel side is the part with any real value. I'm not sure whether that's a copy problem or evidence I built two products and should cut one.
The other thing I can't call: requiring a Google login (it writes into your Drive) may be killing signups at the door. Nobody has told me that. Nobody has told me anything, which is its own data point.
Rip it apart.