The CLI and the GUI call the same @reeleel/core services, so anything you can
do in the app you can script.
reeleel [global options] <command> [subcommand] [options]
| Option | Meaning |
|---|---|
-p, --project <ref> |
Project to act on: a path, a registered id, or a name |
--json |
Machine-readable output only. Errors become JSON on stderr with a stable code |
-q, --quiet |
Suppress non-essential output |
--no-color |
Disable colour |
-v, --version |
Print the version |
How a project is chosen, in order: the positional argument, then
--project, then $REELEEL_PROJECT, then the nearest project directory walking
up from the current directory. So cd my-game && reeleel analyze just works.
Every group follows the same pattern, so you rarely have to check:
| Canonical | Aliases |
|---|---|
list |
ls |
update |
set, edit (plus trim on moments and clips) |
remove |
rm, delete, del |
show |
info |
create |
new |
Group names also answer to their singular/plural forms: project/projects,
athlete/athletes/player/players, clip/clips, reel/reels,
moment/moments/highlights, job/jobs, model/models.
reeleel project create <name> [--sport soccer] [--path <dir>]
[--description <text>] [--opponent <team>]
[--date <yyyy-mm-dd>] [--tag <tag>]
reeleel project list [--sport <sport>]
reeleel project show [ref]
reeleel project update [ref] [--name <name>] [--sport <sport>]
[--description <text>] [--opponent <team>]
[--date <yyyy-mm-dd>] [--tag <tag>]
reeleel project remove [ref] [--delete-files --yes] [--derived-only] [--forget]
reeleel project clean [ref]
reeleel project import <dir>Aliases: create→new/init, show→info/view, import→register/add.
Passing an empty string to --description, --opponent or --date clears
that field.
project remove only unregisters by default; files stay put. --delete-files
is destructive and requires --yes. --derived-only (or project clean)
deletes only what can be regenerated — proxies, thumbnails, analysis, clips and
exports — and keeps your sources and your accept/reject decisions.
reeleel probe <file> # inspect without importing
reeleel import <file...> [--copy] # import footage
reeleel import list
reeleel import update <ref> [--path <file>] [--order <n>] [--reprobe]
reeleel import remove <ref> [--delete-file]
reeleel import proxy <ref> [--height 540]
reeleel import thumbnails <ref> [--count 60]
reeleel import check # report moved or missing sourcesAliases: import→video/videos, thumbnails→thumbs, check→verify.
Source media is referenced in place by default; --copy stores it in the
project instead. import remove --delete-file only works on copied media —
ReelEel will not delete a file it did not put there.
Moved a file? reeleel import update <id> --path <new location> re-points it and
re-probes.
Supported containers: anything a phone, action cam, drone, mirrorless body,
camcorder or screen recorder writes — .mp4, .m4v, .mov, .qt, .3gp,
.3g2, .mts, .m2ts, .m2t, .ts, .mkv, .webm, .ogv, .avi,
.divx, .mpg, .mpeg, .mpe, .m1v, .m2v, .vob, .wmv, .asf,
.mxf, .dv, .dif, .flv, .f4v, .insv, .h264, .264, .h265,
.265, .hevc.
The extension is only a cheap pre-check, so an import fails before a large file
moves rather than after. FFmpeg has the final say: a file that probes with no
readable video or audio stream is rejected whatever it is called. Camera raw
formats (.braw, .r3d, .ari) need vendor SDKs FFmpeg does not ship —
transcode those to .mov or .mp4 first.
<ref> accepts an id, a 1-based index, or a filename fragment.
reeleel athlete add [--name <name>] [--number <jersey>] [--team <team>]
[--color <color>] [--focal]
reeleel athlete list
reeleel athlete show <ref>
reeleel athlete update <ref> [--name …] [--number …] [--team …] [--color …]
[--focal] [--track <trackId>]
reeleel athlete focus <ref>
reeleel athlete remove <ref>Every field is optional. The first athlete added becomes focal automatically,
and exactly one athlete is focal at a time. <ref> accepts an id, a name or a
jersey number.
Identity is bound to a track during analysis; --track rebinds it after a
tracking correction, and --track "" unbinds.
reeleel analyze [ref] [--preset fast|balanced|accurate|custom]
[--video <ref>] [--skip-media] [--score-only]
reeleel rescore [ref] [--window <seconds>] [--keep]analyze runs proxy → thumbnails → detection → tracking → scoring, recording
progress on a job you can inspect afterwards. Ctrl-C cancels cleanly and the job
is marked canceled rather than left running.
rescore re-scores existing tracks into moments without re-running
detection. Editing a reel never needs to pay for analysis twice.
Presets trade speed for accuracy: fast samples every 5th frame at 512px on the
proxy; accurate runs every frame at 1280px on the original.
reeleel moments list [--included] [--rejected] [--favorites] [--min-score <n>]
reeleel moments show <ref>
reeleel moments add --start <time> --end <time> [--title <text>] [--video <id>]
reeleel moments update <ref> [--include] [--exclude] [--undecided]
[--start <time>] [--end <time>] [--title <text>]
[--favorite] [--unfavorite]
reeleel moments remove <ref>Aliases: add→mark/new, update→set/edit/trim.
Times accept 90, 1:30, 1:02:03 or 90.5.
<ref> is the # from moments list or the moment id.
A moment's decision is a tri-state: undecided, keep, reject. Only kept moments become clips — undecided ones are skipped, which is the whole point of the review step. Moments you mark yourself are never overwritten by re-analysis.
reeleel tracks list [--video <id>] [--class <name>]
reeleel tracks update <id> [--class <name>] [--athlete <id>]
[--uncertain] [--certain]
reeleel tracks merge <targetId> <sourceId>
reeleel tracks split <id> <frame>
reeleel tracks remove <id>
reeleel tracks clearmerge fuses two tracks that are really the same object; frames already claimed
by the target win. split cuts a track where the tracker swapped identity and
flags the tail as uncertain.
tracks clear discards all cached analysis. Moments you marked yourself survive.
reeleel clips list
reeleel clips from-moments [--include-undecided] [--camera <mode>]
reeleel clips add --start <time> --end <time> [--video <id>]
[--camera <mode>] [--title <text>]
reeleel clips update <ref> [--start …] [--end …] [--camera <mode>]
[--title <text>] [--order <n>]
reeleel clips reorder <ids...>
reeleel clips remove <ref>
reeleel clips render <ref> [--aspect 16:9] [--no-crop]Camera modes: follow-player, follow-action, wide, follow-ball
(experimental).
Trimming a clip or changing its camera mode invalidates its previous render, so you never ship a stale file.
clips reorder takes the ids you care about; anything unlisted keeps its
relative order after them.
reeleel reel list
reeleel reel create <name> [--aspect 16:9|9:16|1:1] [--clip <id>]
[--title-card <text>] [--music <file>]
[--no-original-audio]
reeleel reel update <ref> [--name …] [--aspect …] [--clip <id>]
[--title-card <text>] [--music <file>]
[--original-audio on|off]
reeleel reel add-clips <ref> <ids...>
reeleel reel remove-clips <ref> <ids...>
reeleel reel remove <ref>
reeleel export [ref] [--reel <name>] [--aspect …] [--fps <n>]
[--quality low|medium|high] [--output <file>]
[--label <text>] [--watermark]
reeleel exports list
reeleel exports remove <id> [--delete-file]Output sizes: 16:9 → 1920×1080, 9:16 → 1080×1920, 1:1 → 1080×1080.
Removing a reel keeps its clips. Removing a clip from a reel keeps the clip.
reeleel dataset export [ref] [--format coco|yolo|reeleel] [--output <dir>]
[--train 0.7] [--val 0.2] [--test 0.1]
[--seed <seed>] [--video <id>]
[--include-out-of-frame]
reeleel dataset import <path> [ref] [--format coco|yolo|reeleel]Splits are by video, never by frame. Adjacent frames are near-duplicates, so a frame-level split leaks the validation set into training and makes every metric a lie. The split is a deterministic hash of the video id and the seed, so re-exporting a dataset is reproducible.
reeleel models list [--sport <sport>]
reeleel models add <name> --version <v> --sport <sport>
[--file <weights>] [--link]
[--architecture <name>] [--runtime <name>]
[--license <spdx>] [--classes <list>]
[--dataset-version <version>]
reeleel models show <ref>
reeleel models update <ref> [--license <spdx>] [--path <file>] …
reeleel models remove <ref> [--purge]
reeleel models verify <ref>Aliases: add→install/register, remove→uninstall (plus the usual).
<ref> accepts an id, a name, or name@version. A bare name resolves to the
newest version.
Record the license. A FOSS framework does not make its weights
redistributable; doctor warns about any model whose license is unknown.
verify re-checksums the weights and reports if they moved or changed.
reeleel jobs list [--status <status>] [--limit <n>]
reeleel jobs show <id>
reeleel jobs cancel <id>
reeleel jobs retry <id>
reeleel jobs remove <id>
reeleel jobs prune [--status completed,failed,canceled]Aliases: show→info/logs, cancel→stop, prune→clean.
retry re-queues a failed or canceled job with its original parameters as a new
job; the original record is kept for history.
reeleel config list
reeleel config get <key>
reeleel config set <key> <value>
reeleel config unset <key>
reeleel config path
reeleel doctor
reeleel sports list
reeleel sports show <id>Useful keys:
| Key | Default | Notes |
|---|---|---|
ffmpeg.ffmpeg, ffmpeg.ffprobe |
null |
Explicit binary paths when they are not on PATH |
analysis.preset |
balanced |
Default for analyze |
analysis.backend |
auto |
cpu, cuda, rocm, coreml, directml |
projects.dir |
~/ReelEel |
Where project create puts new projects |
projects.copySource |
false |
Copy imported media instead of referencing it |
export.aspect, export.fps, export.quality |
16:9, 30, high |
Export defaults |
privacy.telemetry |
false |
There is none; the switch exists so it stays off |
| Variable | Purpose |
|---|---|
REELEEL_PROJECT |
Default project reference |
REELEEL_HOME |
Override config/data/cache root (tests, portable installs, containers) |
REELEEL_PROJECTS_DIR |
Where project create puts new projects (default ~/ReelEel) |
REELEEL_FFMPEG, REELEEL_FFPROBE |
Explicit binary paths |
REELEEL_AUTH_TOKEN |
Protects the API/web app. Unset = local, no login. Required to bind publicly |
REELEEL_SESSION_SECONDS |
Browser session lifetime (default 7 days) |
REELEEL_DB_URL, REELEEL_DB_AUTH_TOKEN |
Turso for the machine-wide registry |
REELEEL_DB_REPLICA_PATH, REELEEL_DB_SYNC_INTERVAL |
Embedded replica tuning |
REELEEL_CV_WORKER, REELEEL_PYTHON |
Locate the CV worker |
REELEEL_DEBUG=1 |
Print stack traces on unexpected errors |
--json prints one JSON object and nothing else. Errors go to stderr with a
stable code, and the exit status is non-zero:
reeleel --json moments list | jq '.moments[] | select(.score > 0.8) | .id'
# accept everything above 0.8
for id in $(reeleel --json moments list | jq -r '.moments[] | select(.score > .8) | .id'); do
reeleel --quiet moments update "$id" --include
doneError codes you can branch on include PROJECT_NOT_FOUND, FFMPEG_MISSING,
SOURCE_MISSING, MEDIA_UNSUPPORTED, WORKER_MISSING, MODEL_MISSING,
CONFLICT and INVALID_INPUT.