Not a distro, not an OS — one executable script that turns the Linux you already run into a marine instrument bridge. It asks what's on board, then installs only the dependencies that setup needs: CAN bus, NMEA 2000, J1939, and gauges at the helm.
The script interrogates your boat, not your patience. Answer what's on board and it resolves, installs, and configures only what those answers require.
$ curl -fsSL "https://keelas.sh/?dl=keel-pi45.sh&raw=1" | sudo bash keel.sh v0.MAYBE — marine bridge deployment Detected: Raspberry Pi 5 · aarch64 · apt · systemd [1/5] Which CAN interface is physically installed? 1) Waveshare RS485 CAN HAT (12 MHz) 5) Waveshare 2-CH CAN HAT (non-Plus) 2) Waveshare RS485 CAN HAT (8 MHz) 6) PiCAN-M (MCP2515 + NMEA 0183) 3) Waveshare 2-CH CAN FD HAT Rev2.1+ 7) USB SocketCAN (gs_usb) 4) Waveshare 2-CH CAN HAT+ ← Pi 5 8) None — NMEA 0183 serial only > 4 [2/5] Engine bus protocol? [N]MEA 2000 / [J]1939 / [B]oth > B [3/5] Legacy J1708/J1587 diesel to bridge? [y/N] > n [4/5] NMEA 0183 serial devices? [y/N] > y → found /dev/ttyUSB0 (gpsd/Signal K can use it) [5/5] Boot into kiosk gauge dashboard? [Y/n] > Y Resolving dependencies for YOUR answers only: + pkgs: can-utils iproute2 gpsd gpsd-clients jq chromium cage + npm: signalk-server (global) + webapp on :3000 + dtoverlay: spi1-3cs · mcp2515,spi1-1/spi1-2 (16 MHz, IRQ 22/13) + units: keelos-can keelos-j1939 keelos-dashboard keelos-kiosk - skipped: J1708 bridge, CAN FD stack (not requested) Done in 94 s. Reboot to raise can0/can1. Re-run anytime — it's idempotent.
No golden image to flash, no fork of your OS to trust. Your system stays yours — the script just rigs it.
Raspberry Pi OS, Armbian, Ubuntu Server, whatever's already on the card. Detects apt, dnf, or pacman and speaks the local dialect. No reflash, no repartition.
Asks which HAT, which buses, which serial gear — and probes SPI/USB to pre-answer what it can. Ships --answers file.yml for unattended fleet installs.
Pick NMEA 2000 only? You don't get a J1939 stack. Skip the dashboard? No GUI packages land. Every install is the minimal set your answers require.
Device-tree overlays for the RS485/CAN HAT and 2-CH CAN FD HAT (MCP2515 / MCP2518FD) — SPI bus, oscillator frequency, and interrupts written for you, verified on reboot.
Re-run to add hardware later — it converges instead of clobbering. keel.sh --uninstall removes everything it added and nothing it didn't.
Answer yes to J1708/J1587 and it configures the RS-485 bridge onto vcan2 — because the boats that need monitoring most were built before the bus existed.
The Pi 4/5-hardened build is live for testing. Under active development — dry-run it first, keep backups, and don't make it the only instrumentation between you and the water.
curl -fsSL "https://keelas.sh/?dl=keel-pi45.sh&raw=1" -o keel.sh && chmod +x keel.sh && sudo ./keel.sh --dry-run
echo "ad04609d13d08beb4b25868db5fd46d77e0ea638a30f822fee850b59a40cd4c0 keel.sh" | sha256sum -c
Beta means Beta: the script asks before touching anything, records every change to a manifest, and --uninstall reverses it. Start with --dry-run, verify the checksum, read the script — it's one file on purpose.
This table is generated from what keel-pi45.sh actually configures — same options, same numbering, same caveats as its built-in --hat-guide. Hardened for Raspberry Pi 4/5; anything else runs with a warning.
| # | CAN interface | What the script configures | Status |
|---|---|---|---|
| 1 | Waveshare RS485 CAN HAT (12 MHz) | MCP2515 · SPI0 · GPIO25 · can0 + UART | Auto-config |
| 2 | Waveshare RS485 CAN HAT (legacy 8 MHz) | MCP2515 · 8 MHz osc · can0 + UART | Auto-config |
| 3 | Waveshare 2-CH CAN FD HAT Rev2.1+ | MCP2518FD ×2 · Mode A · can0 + can1 | Auto-config Pi 5: best-effort — not on Waveshare's list |
| 4 | Waveshare 2-CH CAN HAT+ ← Pi 5 pick | MCP2515 ×2 · 16 MHz · SPI1 CS1/CS2 · can0 + can1 | Auto-config |
| 5 | Waveshare 2-CH CAN HAT (non-Plus) | MCP2515 ×2 · 16 MHz · can0 + can1 | Auto-config Documented through Pi 4B only |
| 6 | PiCAN-M | MCP2515 · 16 MHz · can0 · pulls in the 0183 stack | Auto-config |
| 7 | USB SocketCAN adapter | gs_usb / candleLight · no overlay needed · can0 | Auto-config |
| 8 | No CAN hardware | NMEA 0183 serial only · gpsd + gpsd-clients | Auto-config |
| — | J1708/J1587 legacy bridge | Needs the external keelos-j1708d helper; skipped cleanly if absent | Helper req'd |
| — | Pi Zero 2 W, Orange Pi, other SBCs | Script runs but warns: hardened for Pi 4/5 only | Warns |
Status legend: AUTO-CONFIG = the wizard writes overlays, network config, and services end-to-end · HELPER REQ'D = enabled only when its daemon is installed · WARNS = proceeds at your own risk. Tip from the script itself: read the exact PCB name, chip marking (MCP2515 vs MCP2518FD), and oscillator before choosing — not the connector shape.