Services reference login required

Everything that runs on a box, as systemd units. All run as user kal unless noted.

ServicePortPurpose
crodie.service50271 (TCP/JSON)Recording state machine — camera/LiDAR subprocesses, phone-link protocol, remote shutdown.
crodie-upload.service80 (HTTP)Web UI: data upload (Aspera), network, config, logs, download pages.
crodie-phone-sync.service8081 (HTTP)Receives the phone's own segment uploads.
bikebox-hotspot.service—Brings up the AP interface as a hostapd+dnsmasq hotspot at boot; falls back to the other WiFi interface if the primary AP fails.
bikebox-hotspot-watchdog.timer—Periodically re-checks the hotspot is actually healthy, not just "started."
filebrowser.service8080 (HTTP)Raw browse/download of /mnt/storage. Deliberately unauthenticated — same trust boundary as the rest of the on-box web UI (the box's own WiFi/LAN).
picockpit-* (4 units)—Third-party fleet monitoring agent (picockpit.com) — not part of the crodie codebase.
mnt-storage.mount—Mounts the NVMe by UUID, nofail (boots fine even if the drive is missing).

Common commands

systemctl status crodie.service crodie-upload.service crodie-phone-sync.service
journalctl -u crodie.service -f          # follow live logs
sudo systemctl restart crodie.service    # after deploying new main.py/camera.py/etc.

Full detail (including known gotchas and boot ordering) lives in arcteryxpi/docs/services.md in the repo — this page is the quick-reference version.

Upload pipeline

Uploads go through IBM Aspera (ascp), installed at /usr/local/bin/ascp → /home/kal/.aspera/sdk/. Files are staged via symlink (not copied) before transfer, so a large session doesn't double local disk usage.

Fan / thermal status

The Config page's fan/temperature readout is display-only — it reads /sys/class/thermal/ and the NVMe's own hwmon sensor directly, no separate service involved.