Shorty · open source · runs on one core

Long video in.Short video out.

Give Shorty a link, a search phrase, or a file. It transcribes every word, then an editor model reads the transcript and decides which passages stand on their own — checking each one again in isolation before it ships — and cuts them into captioned vertical clips that follow the subject.

1API key to direct
0GPUs required
19Signals per cut
The pipeline

Eight stages, one pass, no guesswork.

URL, search or upload goes in one end; clips, posters, SRT/VTT and the reason each one was chosen come out the other.

01Acquireyt-dlp, or your file — grabs existing subtitles too
02Probeduration, dimensions, rotation, streams
03Audio16 kHz mono · RMS envelope · adaptive speech gate
04Transcribeword-level timings, punctuation, sentence segmentation
05Analyseone decode pass → motion · saliency · faces · scene cuts
06Directthe model picks the passages · each verified in isolation
07Reframeper-clip subject tracking → smoothed camera path
08Rendercrop · push-in · grade · animated captions · loudness
The interesting part

A model directs the cut, then checks its own work.

Paste an API key — Anthropic, OpenAI, Groq or OpenRouter — and the model becomes the editor rather than an adviser. Two passes, and the separation between them is the point.

Pass one · Direct

One call, the whole transcript.

The model works out what the video is about — its niche — and returns the passages that work as standalone shorts, each broken into the four beats a short needs. It answers in sentence numbers from the transcript, so a hallucinated timestamp is structurally impossible.

Pass two · Verify

One call per passage, shown only that passage.

No transcript, no neighbours, no title it wrote a moment ago. A model handed a bare excerpt has to hunt for the missing referent, because it is missing for the model too. A passage that fails is dropped, and the next best takes its place.

Hook

earn attention on its own, with no setup

Story

develop — an argument built, an event unfolding, an example worked through

Context

carry everything a cold viewer needs, inside the clip

End

land — a conclusion, a turn, a punchline; not a trailing clause

The Islamic profile

Some subjects break in their own ways.

A ruling separated from its condition is not a clip that performs badly — it is a clip that says something the speaker did not say. The Islamic profile ships with checks the verifier answers from the transcript alone. Every check is about the edit; none is about the subject.

Quotations are wholerejects a verse, hadith or supplication that starts or ends part-way through
Conditions still attachedrejects “this is allowed” where the speaker said “allowed when travelling
Attribution intactrejects a position the speaker relayed from others reading as his own, or a dropped source
Answers keep their questionrejects an answer cut away from what it answers

A failed profile check rejects the cut exactly as hard as a failed general one. The profile is chosen from the words you typed, so the interface can say which checks are in force before a job starts. Without a key it still works — transcription runs locally through faster-whisper and the scoring engine chooses the cuts by itself.

Nineteen signals

Four channels that are hard to fool together.

Text can lie — a great sentence delivered flatly. Audio can lie — a shout about nothing. Features are normalised across the candidate set, so the engine adapts to each video.

Text
  • opening hook, payoff
  • topical centrality (TextRank)
  • concrete detail, emotional charge
  • question-and-answer shape
  • filler, repetition, severed clauses
Audio
  • peak and dynamics vs. this speaker’s baseline
  • speech ratio
  • both cut points inside a real pause
Vision
  • motion
  • face presence
  • shot stability
  • proximity to scene cuts
Structure
  • speaking pace
  • length fit
  • position past the intro

Cuts land on sentences, then on silence

A clip may only begin where a sentence begins and end where one ends. Boundaries are then nudged onto the quietest nearby instant, with a lead-in and lead-out so no syllable is clipped.

The key stays here

Stored in one file, mode 0600, never written into a job record, a log line or an event. Only transcript text reaches the provider; the video never leaves the machine.

Fails soft, adapts to the box

If the model is unreachable or returns nonsense, the heuristic ranking stands and the job finishes. Ask for large-v3 on a 1 GB machine and it runs base — and says so.

Run it

One prerequisite: ffmpeg.

run.sh creates the virtual environment, installs dependencies, fetches the optional face model, checks the environment and starts the server on port 8080.

Quick start
# clone and run
git clone https://github.com/Mulhimfy/shorty.git
cd shorty
./run.sh

# then open
http://localhost:8080
Without the browser
python -m shorty clip "https://example.com/talk" -n 5 --min 15 --max 45
python -m shorty clip ./interview.mp4 --captions boxed --niche "startup hiring"
python -m shorty clip ./lecture.mp4 --no-render --json   # analyse only
python -m shorty doctor
Docker
docker compose up --build

The image installs ffmpeg and a proper caption font, and keeps clips and model weights in named volumes.

Manual install
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python scripts/fetch_models.py     # optional, ~230 KB
python -m shorty doctor            # confirm the environment
python -m shorty serve
Live

Drive your local Shorty from here.

If Shorty is running on this machine, this page can talk to it: check its health, start a job from a link, and watch the queue. Nothing passes through any server but your own.

Shorty address
Not connected
Open Shorty
Source link
Clips
Min s
Max s
Niche