Argus turns a Raspberry Pi into the USB drive your Tesla uses for Dashcam, Sentry Mode, LightShow and music. It also serves a web UI so you can review clips from your phone or laptop, without pulling the drive out of the car.
What it is
A single Go binary with the web UI (Next.js, static export) embedded inside it. No containers, no database, no service stack. You install it, configure one config.yaml, and it runs as a systemd service.
Why it exists
The usual flow with a thumb drive is: park, pull the drive, take it to a computer, dig through timestamp-named folders for the clip you want, copy it, plug it back in. And if the filesystem corrupts, you find out the moment you actually need the footage.
Argus stays in the car and handles all of that from there. It’s heavily based on TeslaUSB’s concepts, packaged as one binary instead of a set of scripts.
The two modes
This is the core idea, and it’s worth getting before anything else:
- Present mode: the Pi presents itself to the car as a multi-LUN USB device (TeslaCam, plus optionally LightShow and music). Locally the disks are mounted read-only, so you can look without corrupting anything while the car writes.
- Edit mode: the USB presentation is torn down and the same disks get mounted read/write, for managing them over the web UI or Samba.
Switching between modes is sequenced (unmount, loops, gadget) so the filesystem never gets left half-done. There’s also USB gadget recovery for hung states, which on this kind of hardware does happen.
What you need
- A Raspberry Pi Zero 2 W (the primary target).
- Raspberry Pi OS Lite.
- A microSD with room for the OS plus the disk images.
- A real USB data cable. Not a charge-only one. That mistake happens more often than you’d think.
The kernel needs USB OTG gadget support (dwc2, libcomposite, configfs), systemd, and root for setup.
Installation
|
|
The script installs the latest release binary for your Pi’s architecture (arm64, armv7 or armv6). argus generate writes the config.yaml, and argus setup builds the disk images and the service.
If you’d rather not pipe something straight from the network, clone the repo and run sudo bash scripts/install-argus.sh, or grab the argus_*_linux_* file from the releases page and install it with sudo install -m 0755.
Setup options:
| Flag | Default | What it does |
|---|---|---|
--dir |
~/.argus/ |
Data directory |
--config |
<dir>/config.yaml |
Config file path |
--show-size |
10G (ARGUS_SHOW_SIZE) |
LightShow image size |
--music-size |
32G (ARGUS_MUSIC_SIZE) |
Music image size |
First login
After setup, point your browser at the Pi’s IP on the configured port (80 by default), either over your WiFi or over the AP the device brings up.
The UI asks for a login. Default credentials are admin / argus, and you should change them right away from Settings, or by editing auth_username and auth_password under web: in config.yaml. The login screen nags you while the defaults are still in place.
What’s inside
Video and events
- Browse SavedClips, SentryClips and RecentClips grouped by event.
- Playback with camera switching and HTTP range support, so you can seek inside a clip without downloading the whole thing.
- Telemetry pulled from the video’s SEI data: GPS, speed, battery, gear and more. Rendered as an overlay or served as JSON.
- HUD overlay and an interactive map overlay, both with configurable scale.
- Download a single file, or a whole event as a ZIP with every camera and its metadata.
- Per-event thumbnails, generated automatically from the first available camera.
- Session grouping for RecentClips.
- Encrypted clip detection: files the car locked are shown distinctly instead of failing silently.
- Optional secondary archive path, to keep historical TeslaCam footage within reach.
Chimes
- Upload, rename, delete and preview lock chimes before applying them.
- Pick the active chime.
- Scheduling: weekly, on a specific date, by holiday, or recurring.
- Chime groups, to organize them and randomize within a group.
- Random mode: pick one from the group on every event, or a new one at each boot.
- Tesla’s duration constraints are enforced, so you don’t upload something the car will just ignore.
Lightshows, wraps and music
- Lightshows: upload, download and delete (FSEQ + audio pairs).
- Wraps: upload, thumbnail preview, download and delete.
- Music: hierarchical directory browsing, single or chunked upload for large files, streaming, move, rename, delete, and creating or removing folders.
Cleanup and retention
- Per-folder policies: how many events to keep for SavedClips, SentryClips and RecentClips.
- Dry-run to see what would be deleted before deleting it.
- Optional cleanup at boot, so the card doesn’t fill itself.
Networking: WiFi, AP and Bluetooth
- Offline Access Point as a fallback: configurable SSID, passphrase, channel and DHCP; force-on, auto and force-off modes; RSSI-based activation threshold; grace period and retry cycles before it comes up.
- AP internet sharing: NAT for AP clients through the Pi’s upstream (WiFi or Bluetooth).
- WiFi client: scan networks, connect, view saved ones, forget them, and set autoconnect priority.
- Reliable reconnects: signal strength monitoring, grace periods and retries before the AP kicks in. The point is not getting cut off by a momentary signal drop.
- Bluetooth tethering (PAN): manage the adapter (power, discoverable mode), scan, pair, connect and disconnect devices, to use your phone as the upstream.
- Captive portal detection: responds to the standard probes from Apple, Android and Windows, so your phone doesn’t complain that the network “has no internet”.
Samba
- Enable and disable the service from the UI.
- Set the Samba password and regenerate the config.
- Restart the service from the Settings page.
It’s the comfortable path when you want to move a lot of files at once: mount the share and work from your own file explorer.
Notifications
- Telegram: sends Sentry event clips over a bot. Configurable quality (HD or SD) and an offline queue with a max size, so events that happened without connectivity go out when the network is back.
- Webhook: HTTP POST to a URL you define, with optional HMAC-SHA256 signing so the receiver can verify the message actually came from your device.
Metrics and health
- Storage health score, with alerts and recommendations.
- Per-LUN partition usage.
- Video statistics and estimated remaining recording time per folder.
- System metrics: CPU usage, temperature, clock speed, RAM and power draw.
Real-time
- Server-Sent Events for live log streaming and Sentry event notifications.
- System metrics dashboard with periodic polling.
Startup and reliability
This is what keeps the box alive unattended inside a car. It’s all configurable from the Startup & Reliability section in Settings:
- Present to the car automatically on startup.
- Block startup until the boot pipeline finishes.
- Cleanup at boot.
- Random chime at boot.
fsckchecks at boot.- Hardware watchdog via Debian’s
watchdog.service(/etc/watchdog.conf), with a configurable timeout (60 s by default). - Re-apply the
sysctlprofile on every startup.
Some of these take effect on the next service restart or reboot.
The defaults argus setup generates are already tuned for unattended operation: present on startup, block until ready, cleanup at boot, fsck at boot, watchdog on, and sysctl re-applied.
Updates
- Update check at startup.
- Optional automatic binary updates.
- Channels:
stable,betaanddev.
On the device, by hand: sudo argus upgrade.
Power and preferences
- Reboot and power off the device from the UI.
- Display preferences persisted server-side, not in the browser: speed unit (kph or mph), HUD scale and map scale. Set them once and they hold from any device.
Configuration
Everything lives in ~/.argus/config.yaml, the single source of truth.
| Section | What it controls |
|---|---|
installation |
startup behavior, target user, mount dir, archive path |
disk_images |
image names, partition toggles, boot fsck |
network |
web port, Samba password |
web |
login (auth_enabled, auth_username, auth_password), allowed_hosts, upload limits, chime and lightshow folders, signing secret_key |
offline_ap |
AP behavior, force mode, internet sharing |
system |
watchdog and sysctl at startup |
telegram |
alerting, video quality, offline queueing |
webhook |
callback URL and HMAC-SHA256 signing secret |
update |
update strategy and channel |
viewer_prefs |
speed unit, HUD scale, map scale |
CLI
|
|
argus remove --keep-images uninstalls but leaves the disk images behind, in case you want to reinstall without losing the footage.
A couple of security notes
The API rejects requests whose Host header isn’t a local identity (an IP, localhost, a bare name, *.local or *.lan), as a DNS-rebinding defense. If you front it with a reverse proxy on a real domain, add that hostname to web.allowed_hosts.
Sessions are cookies signed with web.secret_key (auto-generated on first run), HttpOnly and SameSite=Strict, and marked Secure automatically when reached over HTTPS.
You can turn the login off with auth_enabled: false, but that only makes sense on an isolated, trusted network.
Where to get it
Source and releases are on GitHub: github.com/ulm0/argus.
Per-version binaries are on the releases page, one per architecture, uncompressed.