Inspiration
Every solo creator we talked to described the same broken loop: an idea scribbled in Notes, a script drafted in a Doc, a video edited in one app, captions burned in another, and then five minutes of re-typing the same title into YouTube Studio and Instagram separately — only to lose track of what was scheduled where. None of that busywork makes a video better. It just taxes the one resource a solo creator doesn't have: time between ideas.
We wanted to collapse that whole loop into one place a creator could actually talk to.
What it does
Bro is a command center for solo creators publishing YouTube Shorts and Instagram Reels. It:
- Infers a creator's niche from their synced account history, with evidence and a confidence score — not a guess.
- Scores time-bounded topic opportunities for that niche and country.
- Drafts a versioned, editable script from a topic, with per-section regeneration.
- Accepts an uploaded file or a video recorded straight from the browser camera.
- Transcribes the spoken audio once a video validates, and auto-drafts the YouTube title/description and Instagram caption from it.
- Generates English captions from that same transcript and burns them into the video with FFmpeg on request.
- Publishes now or schedules to YouTube and Instagram independently, with durable delivery and per-destination retry — one platform failing never blocks the other.
- Syncs comments from owned posts and answers grounded questions about them, citing the exact comments used.
- Wraps all of it in Bro Chat, a typed-or-voice assistant that calls the same 19 application tools the UI does, aware of the creator's timezone and any draft it already wrote so it doesn't ask twice for something it already knows.
How we built it
A pnpm/TypeScript monorepo: a Next.js App Router frontend, a durable pg-boss worker for everything that shouldn't block a request (uploads, transcription, caption rendering, publishing), Supabase for auth/storage/Postgres, and Drizzle with row-level security scoping every row to its owner.
The AI layer is provider-agnostic on purpose: OpenRouter's free Nemotron model for text (niche, scripts, chat, comment analysis) and Groq's free Whisper for transcription, both with Gemini/OpenAI as fallback — so the whole app runs on free tiers with no functionality gated behind a paid key. Every structured AI output is validated against a Zod schema before it touches the database; nothing gets stored on trust.
Publishing uses each platform's real API — YouTube's resumable upload, Instagram's Reels container + Graph API — behind a state machine that tracks each destination independently, so a partial failure is a fact the UI shows honestly rather than something that silently corrupts the other platform's job.
Challenges we ran into
- Instagram's permalink lookup is genuinely optional. A successful Reels publish can still fail to fetch its own permalink afterward. Treating that as a hard error would mean retrying and risking a second, duplicate Reel — so a successful publish has to stay successful even when the "nice to have" link comes back empty, and the UI has to say why honestly instead of just showing a blank field.
- Foreign keys don't know a creator wants to clean up. Deleting a video whose publish jobs are long finished still hit a FK constraint, because nothing ever detached the historical job/comment records from the project row. The fix was to only block deletion on jobs still in flight, and detach — not delete — the finished history, since comments still cite it.
- Contrast is a spec, not a vibe. An audit of the stylesheet found the brand coral measured 3.55:1 against white text — under the 4.5:1 WCAG AA bar — on every primary button in the app. Fixing it without changing the brand meant splitting coral into two tokens: one for shape (icons, dots, borders) and a darker one for anything actually carrying text.
- A worker with no success log is indistinguishable from a hung worker. We only logged job failures for most of the build, which made "did my publish actually go through" impossible to answer from infrastructure logs alone during testing — a two-line fix that should have shipped on day one.
What we learned
The unglamorous 20% — retry semantics, what's safe to detach vs. delete, which error state deserves a red dot vs. an amber one — is where a workflow tool either earns trust or doesn't. None of it demos well. All of it is why a creator would actually keep using it after the first day.
What's next
Automatic comment replies, deeper vertical editing (trim, reframe, B-roll, music), automatic scheduling informed by a channel's own performance history, saved style preferences applied across every draft, and niche analysis grounded in live web research instead of owned-account history alone
Built With
- ffmempeg
- groq
- node.js
- react
- typescript
- whisper