signalk-opencpn
v0.3.0
Published
Run OpenCPN in a container and use it from any browser on the boat
Maintainers
Readme
signalk-opencpn
Run OpenCPN on your Signal K server and use it from any browser on the boat — laptop, tablet or phone, with nothing to install on the client.
This plugin is a thin shim around the
npgause/opencpn-kiosk
container image, which runs OpenCPN and streams its display over
Xpra's HTML5 client. Signal K pulls, configures, starts and
updates the container; OpenCPN itself is unmodified.
Features
- One-click launch — an OpenCPN tile appears in Signal K's Webapps list and opens the chart plotter in a new tab.
- Right image, automatically — the upstream image ships architecture-specific
tags (
x86,pi) and nolatest; the plugin picks the correct one for your machine. - GPU when you have one —
/dev/driis detected at startup and passed through with the correct device groups, falling back to CPU rendering when there is no GPU. - Finds your instruments — the container runs with host networking, so OpenCPN can discover NMEA sources and the Signal K server over mDNS/multicast.
- Settings survive — charts, routes and waypoints persist in the plugin's data directory across restarts and image updates.
Requirements
- Signal K server ≥ 2.31.0, Node ≥ 22
- The
signalk-containerplugin, installed and enabled (it provides the container runtime integration) - Podman or Docker on the host
Install
Install OpenCPN from the Signal K App Store, enable it, and open the OpenCPN entry in Webapps. The first start pulls roughly 400 MB, so give it a few minutes on a slow connection — the plugin status line reports progress.
Configuration
The source of truth is src/config/schema.ts.
| Setting | Default | Meaning |
| ------------ | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Web UI port | 14500 | Port OpenCPN's web interface listens on. Host networking means this is the real port on the machine. |
| Image tag | auto | auto selects x86 or pi from your CPU. Set an explicit tag to pin one. |
| Share charts | on | Mounts the chart directory from signalk-charts-provider-simple read-only; OpenCPN reads its MBTiles natively. Ignored when that plugin is not installed. |
| Memory limit | 2g | Hard cgroup cap for OpenCPN, Xpra and chart rendering. Empty means unlimited. |
Chart sharing needs a recent signalk-container; on older releases the mount is
dropped, OpenCPN still starts, and the reason is logged.
How it works
Browser ──► Signal K :3000 /signalk-opencpn/ ──► redirect
│
Browser ─────────── WebSocket ─────────────────────►┴─ Xpra :14500 ─► OpenCPNThe plugin serves only a small landing page and a JSON status endpoint. The chart display itself is a direct connection from your browser to the container's Xpra port — the plugin is not in that data path, which is what keeps the remote display fast and its WebSocket stable.
Security
⚠️ Port 14500 is not protected by Signal K authentication. Anyone who can reach that port on your network gets an OpenCPN session. This matches how the upstream image is normally run and is reasonable on a boat LAN, but do not expose the port to the internet. If you need authenticated access, reach your boat network over a VPN (for example signalk-tailscale).
License
Source-available, no redistribution — see LICENSE.md. Free for personal use aboard your own vessel, for your company's internal operations, and for non-commercial education and research. You may redistribute verbatim official releases (so registries, mirrors and your own backups are fine), but not modified versions.
OpenCPN and the npgause/opencpn-kiosk image are the work of their respective
authors, are licensed separately, and are not affiliated with this plugin.
Contributing
See CONTRIBUTING.md.
