Skip to content

Nightly automation

CamReview supplies a deterministic daily command but no scheduler or long-running daemon. Schedule one independent process per camera after that camera's recordings for the day are closed. The command defaults to all footage, all report formats, motion-only processing, no extraction, and a 30-second file-settle window.

Operational command

camreview daily /media/cameras/upstairs --recursive --date yesterday \
  --report-dir /media/reports/upstairs --quiet

Report names are deterministic and same-directory atomic writes replace the previous run, so rerunning a camera-date does not create duplicates. It does recompute the scan. Keep JSON because it is the checkpoint used for later classification or extraction.

Run the command as an account that can read recordings and create and replace files in the report directory. For SMB/CIFS, mount or authenticate the share at the operating-system level before CamReview starts. Use absolute paths in unattended jobs.

Cron

This example runs at 00:10 local time and scans the previous date:

10 0 * * * /opt/camreview/.venv/bin/camreview daily /media/cameras/upstairs --recursive --date yesterday --report-dir /media/reports/upstairs --quiet

Cron provides a limited environment. Use the virtual environment's absolute executable and redirect stdout/stderr to the logging destination you monitor if --quiet is omitted.

systemd

Create /etc/systemd/system/camreview-upstairs.service:

[Unit]
Description=Review yesterday's upstairs camera recordings
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
User=camreview
ExecStart=/opt/camreview/.venv/bin/camreview daily /media/cameras/upstairs --recursive --date yesterday --report-dir /media/reports/upstairs --quiet

Create /etc/systemd/system/camreview-upstairs.timer:

[Unit]
Description=Run CamReview nightly for the upstairs camera

[Timer]
OnCalendar=*-*-* 00:10:00
Persistent=true

[Install]
WantedBy=timers.target

Then enable it:

sudo systemctl daemon-reload
sudo systemctl enable --now camreview-upstairs.timer
systemctl list-timers camreview-upstairs.timer

Windows Task Scheduler

Create a daily task after midnight with:

Program/script: C:\path\to\camera-review\.venv\Scripts\camreview.exe
Arguments: daily D:\Cameras\upstairs --recursive --date yesterday --report-dir D:\Reports\upstairs --quiet
Start in: C:\path\to\camera-review

Use a UNC path when the task account does not receive an interactive user's mapped drives. Store share credentials through Windows rather than in arguments or TOML.

Separating motion and classification

A small storage server can run motion-only daily, then a GPU workstation can classify the JSON later:

camreview classify /reports/upstairs_2026-08-12_motion.json \
  --source-root /mounted/cameras/upstairs

Preload the model with a short explicit classification before an offline scheduled job. Bare model names use the local cache described in Configuration.

Monitoring and recovery

Use process exit codes and inspect run.status in JSON. Exit 0 can still include non-strict warnings, so also monitor issues, timeline_gaps, and files_skipped. Exit 130 means an interrupted scan wrote a report marked interrupted. A motion_complete_classification_pending report is safe input to camreview classify.

Use --strict when any unreadable or malformed input must fail the scheduled job. Without it, CamReview favors a usable partial report with explicit gaps. See Troubleshooting for all exit codes.