chmod +x your boat · marine edition

$ Keel as .sh

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.

One command. A few questions. Underway.

The script interrogates your boat, not your patience. Answer what's on board and it resolves, installs, and configures only what those answers require.

pi@helm: ~
$ 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.

Installs what you need. Nothing you don't.

No golden image to flash, no fork of your OS to trust. Your system stays yours — the script just rigs it.

Runs on what you've got

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.

Hardware Q&A wizard

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.

Dependency resolution per answer

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.

Waveshare HATs auto-configured

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.

Idempotent & reversible

Re-run to add hardware later — it converges instead of clobbering. keel.sh --uninstall removes everything it added and nothing it didn't.

Legacy engine friendly

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.

Get the BetaBeta

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.

⇩ Download keel-pi45.sh

v0.MAYBE-pi45 · 35.4 KB · updated 2026-08-09 UTC
SHA-256 ad04609d13d08beb4b25868db5fd46d77e0ea638a30f822fee850b59a40cd4c0

curl curl -fsSL "https://keelas.sh/?dl=keel-pi45.sh&raw=1" -o keel.sh && chmod +x keel.sh && sudo ./keel.sh --dry-run
verify 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.

Hardware support

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 interfaceWhat the script configuresStatus
1Waveshare RS485 CAN HAT (12 MHz)MCP2515 · SPI0 · GPIO25 · can0 + UARTAuto-config
2Waveshare RS485 CAN HAT (legacy 8 MHz)MCP2515 · 8 MHz osc · can0 + UARTAuto-config
3Waveshare 2-CH CAN FD HAT Rev2.1+MCP2518FD ×2 · Mode A · can0 + can1Auto-config
Pi 5: best-effort — not on Waveshare's list
4Waveshare 2-CH CAN HAT+ ← Pi 5 pickMCP2515 ×2 · 16 MHz · SPI1 CS1/CS2 · can0 + can1Auto-config
5Waveshare 2-CH CAN HAT (non-Plus)MCP2515 ×2 · 16 MHz · can0 + can1Auto-config
Documented through Pi 4B only
6PiCAN-MMCP2515 · 16 MHz · can0 · pulls in the 0183 stackAuto-config
7USB SocketCAN adaptergs_usb / candleLight · no overlay needed · can0Auto-config
8No CAN hardwareNMEA 0183 serial only · gpsd + gpsd-clientsAuto-config
J1708/J1587 legacy bridgeNeeds the external keelos-j1708d helper; skipped cleanly if absentHelper req'd
Pi Zero 2 W, Orange Pi, other SBCsScript runs but warns: hardened for Pi 4/5 onlyWarns

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.