CLI reference¶
Every command supports -h / --help, which prints the authoritative,
up-to-date option list (with Rich-styled panels). This page summarizes them.
Global options¶
| Option | Purpose |
|---|---|
--log-level, -l |
Logging verbosity: debug | info | warning | error (default info). |
--version |
Print the version and exit. |
-h, --help |
Show help (on the root or any command). |
gui¶
Launch the live web GUI for the cameras in CONFIG_DIR (default: current
directory). See the Web GUI guide.
| Option | Default | Purpose |
|---|---|---|
--host |
127.0.0.1 |
Bind address. Keep loopback and tunnel over SSH for remote use. |
--port |
8765 |
Port to bind. |
--no-browser |
off | Don't auto-open a browser (also auto-skipped over SSH / headless). |
--plugin <name> |
— | Enable a plugin (repeatable). |
--no-plugins |
off | Disable all plugins for this launch. |
doctor¶
Diagnose the install and, optionally, a rig. Lists detected cameras and bundled
plugins and checks the encoding toolchain, storage, recording cache, and runtime
conflicts. Passing CONFIG_DIR also validates that rig's config, resolves its
save/transfer paths, and cross-checks declared vs detected cameras. It never
opens a camera, so it is safe to run while a session is live.
| Option | Purpose |
|---|---|
--backend <name> |
Only enumerate this backend (basler/flir/spinnaker/pycameleon/fake). Default: the whole available cascade. |
--json |
Emit machine-readable JSON instead of the report. |
--check |
Exit non-zero on warnings too (for CI), not only on errors. |
--probe-serial |
Also open each detected serial port briefly to read its firmware identity (skips ports held by a running session; skip if a board may be armed). |
Exits 0 when no errors are found, so it works as a pre-flight check in scripts.
config¶
Interactively scaffold a new rig's octacam_config.toml: auto-detects the
connected cameras, prompts for the record/transfer settings and an optional serial
plugin, then writes the file (visual per-camera placement is left to octacam
gui). If CONFIG_DIR is omitted you are prompted for one.
| Option | Purpose |
|---|---|
--backend <name> |
Pin the rig to one backend (basler/flir/spinnaker/pycameleon/fake). Default: auto-detect through the cascade. |
--force |
Overwrite an existing octacam_config.toml without asking. |
--snapshot-params / --no-snapshot-params |
Open each detected camera once to save its current sensor parameters (.pfs/.txt); busy cameras are skipped. On by default. |
record¶
Record headlessly (no browser). Encoding, save method, transform, and the
save-directory template come from the config's [record] section; the options
override only the day-to-day values. See Recording.
| Option | Purpose |
|---|---|
--fps, -f |
Frame rate (default: from config). |
--duration, -d |
Duration in seconds (default: from config). |
--output, -o |
Save directory, overriding the templated location. |
--yes, -y |
Don't prompt: reflash a serial plugin's out-of-date board firmware before recording (also lets a headless run flash). |
--plugin <name> |
Enable a plugin (repeatable). |
--no-plugins |
Disable all plugins for this run. |
flash¶
Check a serial plugin's board firmware against the bundled Arduino sketch and,
unless --check, compile + upload the current sketch with arduino-cli. Pass
CONFIG_DIR (whose serial plugins to check), --plugin, or both.
| Option | Purpose |
|---|---|
--plugin <name> |
Serial plugin whose firmware to manage (e.g. triggerbox); enables it even if not in the config. |
--device <path> |
Serial device override (e.g. /dev/ttyACM0 or auto). |
--yes, -y |
Flash without prompting when out of date. |
--check |
Report only; exit nonzero if any board is out of date. Never flashes. |
benchmark¶
A short instrumented dry-run against the cameras in CONFIG_DIR (no video is
kept): tests whether the target frame rate is achievable, searches for the
maximum achievable rate, and measures each pipeline stage — acquire (trigger
+ exposure + USB transfer), transform, enqueue, encode — so you can
see the limiting step. It reports the acquisition and encode ceilings, a verdict
(achievable / not, with the bottleneck), and targeted recommendations.
Like record it opens the cameras, so it cannot run at the same time as a live
GUI or recording on the same rig. Exits nonzero when the target fps is not
achievable, so it works as a pre-flight check in scripts. The same benchmark is
available from the GUI's Benchmark tab.
| Option | Default | Purpose |
|---|---|---|
--fps, -f |
from config | Target fps to test. |
--duration, -d |
5 |
Seconds spent measuring each scenario. |
--find-max / --no-find-max |
on | Search for the maximum achievable fps (software trigger only). |
--freerun / --no-freerun |
on | Also measure the free-run (external-trigger-equivalent) ceiling. |
--sink |
config |
config (encode through the rig's real save method — measures the encode cost) or null (discard frames to isolate acquisition). |
--record-form |
from config | display (bake the transform) or sensor. |
--backend |
from config | Override the camera backend. |
--json |
off | Emit the report as JSON instead of the table. |
process¶
Transcode recordings to mp4, build composite grid videos, and transfer to
storage — all driven by each recording's embedded config snapshot. Pass
recording folders (or parent directories with -r), or select from the cache
with --last / --last session / --all. See
Processing.
Selecting what to process (mutually exclusive; can't combine with explicit
PATHS):
| Option | Purpose |
|---|---|
--last (or --last recording) |
The most recent recording folder. |
--last session |
Every folder from the last GUI session. |
--session-id <id> |
Every folder from one exact session id. |
--all |
Every recording folder still in the cache. |
Controlling the steps:
| Option | Purpose |
|---|---|
-r, --recursive |
Recurse into the given folders. |
--no-transcode |
Skip transcoding; grid/transfer act on existing mp4s. |
--no-grid |
Skip building the grid video(s). |
--no-transfer |
Skip transferring to the [transfer] destination. |
--force |
Re-transcode / rebuild grids even if outputs already exist. |
--delete-source, -d |
Delete each .mkv/.raw once it transcodes successfully. |
--config, -c |
Fallback config dir for recordings with no embedded snapshot. |
--progress-style |
octacam (default) or ffmpeg (native output). |
--dry-run |
Log the intended grid/transfer work without writing anything. |
Environment variables¶
| Variable | Effect |
|---|---|
PYLON_CAMEMU |
Number of emulated Basler cameras (run without hardware). |
OCTACAM_CACHE_DIR |
Override the recording cache location (default ~/.cache/octacam). |
OCTACAM_FFMPEG |
Path to an ffmpeg binary to use instead of the bundled one. |