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.