A photo, a ticker, and something to say. It writes the
narration, speaks it, animates a presenter and composites a 9:16 clip.
Two ways to use it
The same pipeline is available two ways, and they trade speed for effort
in opposite directions.
Your hardware Install it
Everything on this page: a pip install that runs the models on your
own GPU. Fastest renders, no queue, no per-video cost beyond your
machine. This is the way to run it at volume or to modify it.
Hosted API Call it
No GPU, no install. Create an account at
variantvideo.com, mint a key
under API keys, and submit
renders over HTTPS — they run on our hardware and you get a webhook
when the video is ready. The reference lives at
/developers.
Free while in beta; plans and higher limits later.
Install
$ pip install video-gen-local
$ vgl install # GPU environment + models, ~1 hour$ vgl serve # studio on localhost:7860
Three commands, and the middle one does the heavy lifting.
About an hour on a fresh machine, nearly all of it downloading.
That is the whole install — no clone, no checkout. The setup scripts ship
inside the package, so vgl install runs from wherever pip put
it.
Why two steps and not one
pip install gives you the CLI, the studio, the renderers,
text-to-speech and captions. It cannot give you the avatar model, for two
reasons that are not going away:
It needs Python 3.10 where the rest of this needs 3.12,
so it lives in its own environment.
Its flash-attn wheel has to match the C++ ABI of the torch
that was just installed. A dependency list cannot say "whichever
wheel matches the torch you are about to have".
And the weights are about 110 GB of model downloads, which
are not Python packages at all — pip was never going to fetch those.
vgl install does both jobs, in the order that matters (torch
before the requirements that would overwrite it, numpy re-pinned last).
Prefer to work from source? git clone then
pip install -e . gives you the same three commands.
What you need
Component
Minimum
Comfortable
GPU
24 GB VRAM, CUDA 12.x
80 GB (H100 / A100)
Disk
150 GB
250 GB
RAM
32 GB
64 GB
OS
Linux, ffmpeg
Python 3.10 and 3.12
A GPU is required. There is no hosted fallback and no CPU path. If
nvidia-smi does not print your card, nothing here works.
Runs the same on your own machine, on Nebius, or on AWS. The only real
difference between providers is whether stopping the machine wipes its disk —
on a VM cloud it does not, on RunPod or Vast it does, and
vgl install simply re-provisions.
Keys
Every account is your own. There are no shared credentials in the source,
and the studio refuses a job whose template needs a key you have not set
rather than failing partway through a render.
Variable
Needed for
POLYGON_API_KEY
Prices, company name, market cap
FAL_KEY
The fight card only — it generates its artwork
HEDGEFUND_API_KEY
The events feed — catalyst, showdown and recent-event read it
FMP_API_KEY
earnings-call only — call transcripts. A plan that includes the transcript endpoints (they sit above FMP's Starter tier)
SEC_USER_AGENT
recent-event's quote. The SEC requires a declaring User-Agent with a contact address on EDGAR requests
$ cp .env.example .env # required keys are at the top, uncommented
Make one
Open the studio, pick talking-head, drop in a front-facing
photo, type a ticker and a sentence of notes, press Generate. About fourteen
minutes at 480p.
The studio has no authentication. Reach it over an SSH tunnel
rather than exposing the port:
ssh -fN -L 7860:localhost:7860 user@host
General videos: every template can render with no identity bar at all — no handle, channel, tier band or ticker chip in the frame. Tick General video in the studio, or pass is_general: true on the API. Publishing to a Variant channel with asChannel implies it.
Templates
The layouts. They differ in what they put on screen and what they need
from you — not in quality.
catalystA ~10s alert. Presenter on a solid field under a looping graphic.ticker · notes or events feed
not yet rendered on this machine
catalyst-splitThe alert, split in half: an establishing shot generated for the
event loops on top, the presenter speaks on a soft blue gradient below,
a black channel bar riding the seam.
The script pass writes the shot's visual direction in the same
breath as the alert.ticker · events feed · FAL_KEY
showdownA three-hander debate. Narrator, bull and bear, each with their own face and voice.insights feed · three faces
showdown-no-lipsyncA fight card. Generated art per round, claims spoken over it, no lip-sync.insights feed · two faces · FAL_KEY
not yet rendered on this machine
recent-eventA filing, explained. Headline card, presenter over a chart on a forest-green
field, animated points, and a quote copied verbatim from the SEC filing with
the executive who said it. Writes itself; a blank ticker covers the newest
confident catalyst in the feed.nothing required · optional ticker · HEDGEFUND_API_KEY
not yet rendered on this machine
earnings-callThe latest earnings call, on a violet field. The narration and on-screen
points are written from management's prepared remarks in one pass, and the
quote is a sentence lifted from the transcript with its named speaker —
never composed. A blank ticker covers the newest call on a US listing.nothing required · optional ticker · FMP_API_KEY
not yet rendered on this machine
social-clipPresenter over a live stock chart, with an optional X post card above
it — or, with no ticker at all, the post alone carries the clip and the
narration reacts to it.ticker or X post · one face
not yet rendered on this machine
chart-headThe talking head over the ticker's live chart, on a slate field —
navy gradient page, matching dark chart card, white identity bar.
Every spoken word is yours.ticker · one face · notes or script
not yet rendered on this machine
talking-headPresenter only, over a flat background. The simplest thing that works.one face · notes
not yet rendered on this machine
talking-head-splitThe split frame with your words: a generated establishing shot
loops on top, the presenter speaks below on a colour you pick
(blue, green, red, black, purple, orange — always the same
pale-into-deep gradient), the channel band on the seam. No opener,
no feeds.one face · notes or script · optional ticker · FAL_KEY
not yet rendered on this machine
trade-videoA move announced on location: the face is re-staged into a scene —
beach, limo or penthouse — before it is animated, so the whole frame
is the shot. The alert line is written from your trade facts, your
notes, or spoken verbatim from your script.one face · script, trade facts or notes · FAL_KEY
These are frames from real renders on this machine, not mockups.
The two without one have simply never been run here — the studio shows every
template regardless.
How it works
runs on your GPU Variant supply it yourself instead leaves your machine
Variant is a shortcut, not a requirement. Connect a key and
it supplies the face, the branding and the research, then takes the finished
video back. Skip it and you upload a photo, write your own notes, and keep
the file. Everything between is a model on your own hardware
either way.
Variant integration
Access note: publishing finished videos into Variant
uses Variant’s pre-made publish endpoint, which is a restricted
capability — your Variant account needs publish access granted in
addition to an API key. Request it from Variant; rendering works either
way, only the publish step needs the grant.
If you publish to Variant, the studio can render as one of your
avatars and post the finished video back. Your token is the identity —
paste it once and everything else is read from it.
The key is the identity, so the server holds none. Each person
supplies their own in the browser and sees only their own avatars — two
people can share one studio without either being able to post as the
other. Clearing the field disconnects.
The render is the expensive part; the posting is not.
Once the file sits at a public URL, every destination is one API call
against the same asset — which is how one GPU-hour becomes five audiences
instead of one. Variant is the one wired today; the rest are what
that URL makes straightforward, not features that already exist.
Publishing needs the CDN step. Variant fetches the file from a
public URL, so a render that was never uploaded has nothing to post.
If something breaks
Symptom
Fix
libcublas.so.12 missing
Torch drifted to CUDA 13. vgl install venvs
Python.h missing
apt-get install python3.12-dev
Render dies at the last segment
VRAM. vgl install detect re-measures and caps clip length
A template is greyed out
It needs a key you have not set. The message names it
Slower than yesterday
On a container cloud you were rescheduled onto a different host
vgl doctor --deep checks every stage and tells you which one
is unhappy.