How building works
One command builds every model a creator needs, starting from a list of their YouTube videos. It takes one to two days, mostly unattended, and stops only when a person has to decide something.
./alive down # building needs the whole card
./alive build huberman --dry-run # what would run next, in every stage
./alive build huberman # do it; run the same command again after any stop
./alive build huberman --stage voice # one stage only
Stages, in order: videos, answers, voice, clips, motion,
render. The live app is not a build stage; it is a settings file (stage 6).
It runs on the system python3 and picks each step's environment itself.
What needs what
Six stages. Each makes something the later ones read, which is why they run in this order.
What one build step looks like
For each stage, the build asks that recipe's status command what is next and runs it, until the recipe says it is done. When the next step is a decision only a person can make, it looks for a recorded answer.
./alive build <creator> again; it carries on from there.What a stop looks like, and how to clear it
STOPPED at a decision only a person can make:
voice: choose the step to release from the sweep table (RECIPE.md), and record it
as voice.release_step in build.json
Record it, then run the same command again; finished stages are skipped.
Every stop names the file to change. You edit it by hand; there is no separate tool. The stops, and the edit each one wants:
| stop says | what to do |
|---|---|
answers: no persona note | write data/answers/<name>/creator.md (how) |
voice: ... read it off | read the speaker table the step printed; set SPK_THRESHOLD = 0.60 (your value) in the voice profile |
voice: choose the step to release | read the sweep table; set "release_step": 8000 under voice in build.json |
clips: look at .../clusters_full/ and write verdicts.json | look at each group's sheet and write creators/<id>/build/clips/<take>/verdicts.json (format) |
motion: look at the joins sheet / render: ... | open the image it names; if the mouths line up, run the command it names with --ack "what you saw" (motion) or --yes (render). Or rerun the build with --trust-gates, which records that nobody looked |
motion: read the sweep's validation ranking | set "run": "<winner>" and "wrong": "what is still wrong" under motion in build.json |
The creator's build file
creators/<creator>/build.json says which videos and which settings, and records the decisions
that are one value. Larger decisions sit beside it in creators/<creator>/build/.
{
"videos": {"folder": "huberman", "ids": ["QmOF0crdyRU", "XeN6eGO6FVQ", ...], ← YouTube ids
"download": ["--full", "--no-video", "--a2f", "--subs"]}, ← whole video kept as a file; frames are
cut later, only for the tracked one
"answers": {"creator": "huberman"},
"voice": {"profile": "huberman", "release_step": 8000}, ← which trained step to keep
"clips": {"profile": "huberman", "takes": ["vXTK0Ac9i1Q"]}, ← which of the ids above to track
"motion": {"profile": "huberman", "run": "huberman_S_seed0", "wrong": "..."}, ← which training run to keep
"render": {"profile": "huberman", "deployed": true, "wrong": "..."}
}
The stages at a glance
| stage | makes | time | a person decides |
|---|---|---|---|
| 1 · Answers | an index of their words, and their persona note | minutes | which 18 passages show how they talk |
| 2 · Voice | their cloned voice | ~1.5 h | the speaker-filter threshold; listening to the reference clip; which training step to keep |
| 3 · Face clips | clean, tracked clips of their face | 10-20 h per video | which shots really show them, framed as wanted |
| 4 · Voice to face motion | their face rig and a motion model | ~2 h | looking at their rig; the sound/face timing sheet; which run to keep |
| 5 · Face motion to picture | a renderer of their face | ~4 h | the camera/mesh sheet; what is still wrong with it |
| 6 · Live app | the live settings | minutes | the resting pose |
--trust-gates to accept them, and the record will say nobody looked. The only inputs you supply are the licensed files from
setup and the two persona notes, which quote the creators' own words and so are not in git.
A rebuild is close to ours, not identical: the GPU steps are not bit-exact (tracking fits agree to about 0.1 mm), and YouTube regenerates its automatic captions now and then, so the answer archive can differ by a few passages. A from-scratch Huberman rebuild on 2026-10-04 reproduced the voice to the same scores and every shot group exactly.