CAN bridge + web GUI for the DFR EV-26 FSAE car. Runs on a Raspberry Pi connected to the vehicle CAN bus.
- can-bridge — Rust backend that reads/writes CAN FD frames and exposes a WebSocket API (port 9002)
- gui — React frontend served by Caddy, reverse proxies
/wsto the backend
| Command | Description |
|---|---|
just build | Cross-build both container images for arm64 |
just push | Push images to ghcr.io/schommie/ |
just deploy | Build + push, then run podman auto-update on the Pi |
just dev | Start dev environment with hot reload |
just up | Start production stack on the Pi |
just down | Stop all services |
just check | Run cargo check for can-bridge (cross-compile) |
just deployThis builds arm64 images, pushes them to GHCR, and prints a reminder to update the Pi.
Pull and restart with the latest images:
sudo podman auto-updateOr manually:
podman-compose pull && podman-compose up -dPlace Quadlet .container files in /etc/containers/systemd/ on the Pi:
/etc/containers/systemd/can-bridge.container
[Container]Image=ghcr.io/schommie/ev-can-bridge:latest
Network=host
AutoUpdate=registry
[Service]Restart=always
[Install]WantedBy=default.target/etc/containers/systemd/gui.container
[Container]Image=ghcr.io/schommie/ev-gui:latest
Network=host
AutoUpdate=registry
[Service]Restart=always
[Install]WantedBy=default.targetThen reload and start:
sudo systemctl daemon-reload
sudo systemctl start can-bridge guijust devStarts both services with volume mounts for hot reload — can-bridge uses cargo-watch, gui uses Vite dev server on port 5173.