The core is a pipeline you can run on your own machine: transcribe with Whisper, ask an LLM for the strongest moments, cut and crop to 9:16 with FFmpeg, and burn in word-timed captions. An agent gets that running in an afternoon, and open-source projects such as OpenShorts and AI-Youtube-Shorts-Generator show the shape. The weekend goes on what makes clips look finished: keeping a speaker framed as the camera cuts between people, caption styling that matches a brand, and a timeline editor to fix the picks. AI image and video generation, hosted rendering and the API are not worth rebuilding.
Before you buildBlitzReels has no free plan, but OpenShorts is MIT-licensed and free to self-host. Try it before building, since it already covers the clip finder.
Build me a local long-video-to-shorts tool to replace BlitzReels. Requirements: - Python 3.12 CLI: `shorts make <file-or-url> --clips 5` writes ./out/<name>/clip-01.mp4 and so on. FFmpeg and yt-dlp run as external programs; fail early with a clear message when either is missing. - Transcribe with `faster-whisper` (WHISPER_MODEL in .env, default small) and keep word-level timestamps in ./out/<name>/transcript.json so a re-run skips this step. - Pick moments: send the transcript in chunks to an OpenAI-compatible endpoint from .env and ask for 20-90 second segments that start and end on sentence boundaries, each with a title and a one-line reason. Keep the best N and never let two clips overlap. - Reframe to 1080x1920 with FFmpeg: a face-tracked crop using `mediapipe` for one speaker, and a blurred-background fit when no face is found. Smooth the crop path so it does not jitter. - Captions: write an ASS file with `pysubs2` from the word timestamps, three or four words per line with the spoken word highlighted. Three styles live in ./styles/*.json (font, size, colors, position), chosen with --style, and are burned in by FFmpeg. - Pauses: `--trim-pauses` cuts silences longer than 0.7 seconds, found from word gaps. - Preview: `shorts serve` shows http://localhost:4830 with each clip in a player and buttons to move its start or end by 0.1 s and re-render only that clip. - Single user. No accounts, no telemetry, local-first: only the LLM request leaves the machine, and the README says it sends the transcript text. - Out of scope: AI image or video generation, stock B-roll, stacked two-speaker layouts, posting to social platforms, team features. - README: installing FFmpeg and yt-dlp, rough render times on CPU for a 60-minute video, and a reminder to process only videos you have the rights to.
Opens your agent with the prompt filled in, you press enter. Or copy it and paste it into an empty folder.
The first prompt builds the core. Run these one at a time in the same folder to grow it into your own BlitzReels.
Add a two-speaker layout to the shorts tool in this folder. Requirements: - Detect faces with mediapipe on a frame every 0.5 seconds; when two faces are present for more than 2 seconds, render them stacked, each cropped to 1080x960. - Switch back to the single-speaker crop when only one face is visible, using a 0.4-second crossfade. - Place captions at the seam between the two halves. - A --layout auto|single|stacked flag; auto is the default. - Add a test with a short sample clip and update the README.
Add post text to the shorts tool in this folder. Requirements: - For each clip, ask the LLM for three hook lines under 60 characters, a 150-character description and five hashtags, based only on the clip's transcript. - Write them to clip-NN.json beside the video and show them in the preview page with a copy button. - Never claim anything the transcript does not say; include the transcript excerpt used. - A --lang flag for the language of the post text. - Update the README.
Add folder watching to the shorts tool in this folder. Requirements: - `shorts watch ~/Recordings` processes each new video file once it stops growing for 30 seconds, using the settings in a watch.toml file. - Keep a processed.json log by file hash so a restart never re-renders a file. - Run one job at a time and write errors to ./out/errors.log instead of stopping. - Send a desktop notification on macOS when a job finishes. - Update the README with a launchd example.
Posting short clips is a chore that repeats: import, cut, caption, reframe, export. A hosted tool does it without installing FFmpeg or Whisper, renders in the cloud so a busy laptop stays free, and keeps captions styled the same each time. Teams add seats and the API on top.
Estimate · Runs on your machine; Whisper and FFmpeg cost only time. Picking highlights costs a few cents of LLM tokens per hour of video. The build is token usage on your agent plan.
| Plan | Monthly | Annual, per month | What you get |
|---|---|---|---|
| Starter | $39 | $29 | 30 exports and 15 AI credits a month, 10 projects, 25 GB storage, 1 seat, up to 4K output, captions, reframing, cleanup, AI image and video creation. No watermark. |
| Growth | $79 | $59 | 150 exports and 75 AI credits a month, 100 projects, 500 GB storage, 3 seats, Series with reusable branding and Story Kits. |
| Agency | $199 | $149 | Unlimited exports and projects, 250 AI credits a month, 2 TB storage, 10 seats, 5 concurrent exports. |
No free plan. A 7-day trial needs a card and allows one import (720p, up to 15 minutes) and three 720p exports of up to 3 minutes each, with a watermark.
Kinda. The core is a weekend build with the prompt on this page, but real gaps remain: A browser timeline editor for adjusting cuts, captions and B-roll, 50+ ready-made caption styles and a stock B-roll library.
About $39 a month on the Starter plan, $468 a year (checked 2026-10-19).
A browser timeline editor for adjusting cuts, captions and B-roll; 50+ ready-made caption styles and a stock B-roll library; Reusable brand Series and Story Kits; AI image and video generation credits; Hosted rendering, team seats, and the REST API, CLI and agent integrations. If any of those matter to you, keep paying.
Yes: OpenShorts (open source), AI-Youtube-Shorts-Generator (open source), FunClip (open source).