Inspiration

A creator finishes a 20-minute video and the work isn't done — it's just starting. Now come the vertical cuts for TikTok and Reels, a YouTube description with chapters, a LinkedIn post, an X thread, thumbnail ideas. Hours of work, all derived from footage that already exists.

The tools that exist mostly cut clips. They don't understand the video. A tool that doesn't know what your video is about can't write a LinkedIn post about it, and it certainly can't tell you which 40 seconds are worth clipping.

So we built RECAST around one idea: understand the video first, then everything else falls out of that understanding.

What it does

Upload one video. RECAST:

  1. Transcribes it with word-level timing
  2. Extracts Content DNA — topic, content type, tone, audience, core message
  3. Finds the best moments, scored on hook strength, information density, emotion, and whether the clip stands alone
  4. Cuts vertical shorts at 1080×1920 with captions burned in
  5. Writes native copy for six platforms — YouTube, Instagram, TikTok, LinkedIn, Facebook, X
  6. Generates thumbnail concepts composed over real frames from your video
  7. Grades its own campaign and says what would make it stronger

The key detail: each platform is written from scratch against the Content DNA, not by rewording one master post. A LinkedIn post and a TikTok caption should have almost nothing in common, and here they don't.

How we built it

Frontend — Next.js 16, React 19, TypeScript, Tailwind v4, shadcn/ui. Polling drives live pipeline status, so you watch the stages advance instead of staring at a spinner.

Backend — FastAPI with SQLAlchemy and SQLite. FFmpeg does all media work: probing, audio extraction, cutting, reframing, caption burn-in.

AI — Groq for everything. whisper-large-v3-turbo for transcription, llama-3.3-70b-versatile for analysis and copywriting.

Vertical reframe — cropping 16:9 down to 9:16 cuts people out of frame. Instead we scale the footage to fit and place a blurred, zoomed copy of the same frame behind it. Nothing is lost, and it reads as a deliberate choice rather than a crop.

Testing — 277 tests across 23 modules, covering the pipeline, the FFmpeg paths, and every API route.

Challenges we ran into

Rate limits that lie about their cause. Groq returned 429s, so our key pool rotated to the next key — which also failed, instantly. All 11 keys died within the same second. The 429 body named a single organisation at Used 99607 / Limit 100000: the cap is per organisation, not per key. Adding keys from the same account does nothing. We rebuilt the pool to cool down keys with real retry windows, and made the UI say "Rate limited · back in 16 min" instead of leaving a button that silently does nothing.

FFmpeg didn't fit in the box. Shorts generation kept returning 502 in production. Measuring peak memory found it: 531 MB against a 512 MB container. The culprit was a gaussian blur running on a full 1080×1920 frame.

Ephemeral storage made one bug look like another. When that OOM killed the container, the platform wiped the filesystem on restart. The user-visible symptom wasn't "clip failed" — it was "project not found." Two unrelated-looking bugs, one root cause.

Uploads hit a wall we didn't own. Serving the API through a tunnel, every upload over 100 MB failed at the proxy's body limit while our videos averaged 159 MB. The backend was never even reached.

Accomplishments that we're proud of

The memory fix. Blurring at quarter resolution and scaling back up is visually indistinguishable — it's a blur either way — and it took peak memory from 531 MB to 357 MB while running 18% faster. We verified it frame by frame rather than assuming.

Six genuinely different posts. The easy version of this product rewords one caption six times. Writing each platform independently against the Content DNA is why the LinkedIn post and the TikTok caption don't sound like siblings.

It tells the truth when it's broken. The health endpoint reports how many API keys are actually usable and when the next one frees up, and the UI surfaces it. A demo that says "rate limited, back in 16 minutes" is far better than one that appears frozen.

Nothing gets cropped out. The blurred-background canvas means faces and on-screen text survive the trip from 16:9 to 9:16 — the failure everyone notices in auto-generated shorts.

277 tests. Every FFmpeg path is covered, including the stream-copy shortcut and the accuracy check that falls back to re-encoding when a cut drifts.

What we learned

Measure before optimising. "Clip generation is broken" could have been ten things. Peak RSS at 531 MB against a 512 MB limit was one number that ended the guessing instantly.

Honest failure states are a feature. The most valuable thing we built wasn't a model call — it was the health check that makes the system's real capacity visible.

Structured output is the whole game. Content DNA is the difference between six genuine posts and six paraphrases. Getting the model to commit to topic, tone, audience and core message first is what makes everything downstream coherent.

Read the error body, not just the status code. The 429 told us the limit was per organisation. Without reading it, we'd have kept adding keys that could never have helped.

What's next for Recast

Direct publishing — post to each platform from inside RECAST instead of copying and pasting.

Speaker diarisation — know who is talking, so multi-person videos can be clipped per speaker.

B-roll suggestions — mark moments where the transcript describes something the footage doesn't show.

Brand voice profiles — learn a creator's actual voice from past posts, so the copy sounds like them and not like a model.

Team workspaces — shared libraries, review before publish, and per-brand tone settings.

Built With

Share this project:

Updates

Submission history