Preview, record, and save synchronized video from many scientific cameras through one fast, simple interface. octacam drives Basler, FLIR / Teledyne, and any GenICam USB3-Vision camera from a live web GUI, and turns a day's recordings into archived videos with one command. It auto-detects the best available driver per camera (a backend cascade) with a pip-installable floor, so it just works on modern Python. It is the successor to SeptaCam.
- 📹 Many cameras at once — 8 is not the limit despite the name
- 🖥️ Live web GUI — preview every camera while recording; run it locally or over SSH
- 💾 Record straight to video — monochrome H.264 (or raw) with per-frame drop tracking
- ⚙️ One-command post-processing — transcode, tile into grid videos, and copy to storage
- 📦 Clone-and-go install with uv
📖 Full documentation: https://nely-epfl.github.io/octacam/
git clone https://github.com/NeLy-EPFL/octacam.git
cd octacam
uv tool install . # puts an `octacam` command on your PATHCloning main (always the latest stable release) also gives you the configs/
example rigs and the emulator config the quickstart uses. The Python-installable
backends (pypylon and the always-on pycameleon floor) all ship in core, so a rig
works out of the box on Python 3.10+. FLIR / Teledyne cameras need one manual
step — Teledyne's Spinnaker SDK plus the PySpin wheel (cp310–cp314). See the
installation guide and
camera backends.
No cameras attached? Try the built-in Basler emulator first:
PYLON_CAMEMU=8 octacam gui configs/emulate_basler # 8 fake cameras, live GUIOn a real rig, point octacam at a config directory (camera names, layout, and recording settings — see configs/ for examples):
octacam config <config_dir> # scaffold a new rig config interactively
octacam doctor <config_dir> # check the install + validate the rig
octacam gui <config_dir> # live web GUI on http://127.0.0.1:8765
octacam record <config_dir> # headless recording (no browser)
octacam process --all # transcode + grid + copy everything you recordedEverything after recording — transcoding, composite grid videos, and copying to
a shared destination — is the single command octacam process, driven by a
config snapshot each recording saves alongside its videos.
| Command | What it does |
|---|---|
octacam config [config_dir] |
Interactively scaffold a new rig config (--backend/--force/--no-snapshot-params) |
octacam doctor [config_dir] |
Diagnose the install and list cameras/plugins; validate a rig |
octacam gui <config_dir> |
Launch the live web GUI (--host/--port/--no-browser) |
octacam record <config_dir> |
Record headlessly (--fps/--duration/--output) |
octacam process <paths…> |
Transcode, build grids, and transfer (config-driven) |
Run octacam --help (or <command> --help) for the full option list.
| Guide | |
|---|---|
| Installation | Install, update, FLIR setup, development install |
| Quickstart | Your first recording, with or without hardware |
| Web GUI | Preview, record, and remote operation over SSH |
| Recording | Outputs, the recording summary, transformed vs raw |
| Processing | Transcode, grid videos, and transfer to storage |
| Configuration | The octacam_config.toml reference |
| Camera backends | The auto-detect cascade (Basler → FLIR → Spinnaker → pycameleon) |
| Plugins | Flywheel turntable, 2-photon trigger, and the configurable triggerbox (camera trigger + lights) |
| Troubleshooting | Common errors and fixes |
octacam is released under the MIT License. © 2026 Neuroengineering Laboratory @EPFL — Ramdya Lab.
