{"id":14011,"library":"signalk-server","title":"Signal K Server","description":"Signal K Server is an open-source Node.js application that functions as a central data hub for marine electronics, implementing the Signal K standard for boats. It aggregates data from various sources such as NMEA 0183, NMEA 2000, and SeaTalk, then makes this information available to other applications and devices via WebSockets and HTTP APIs. Currently at stable version 2.25.0, the project maintains an active release cadence with frequent minor and patch updates, often including beta versions, addressing features, fixes, and performance improvements. Key differentiators include its role as a vendor-agnostic data standard implementer, its extensibility through a robust plugin architecture, and its ability to run efficiently on embedded hardware like Raspberry Pis and Victron Cerbo GX devices. It enables a wide range of functionalities such as serving as a wireless AIS and navigation hub for popular marine apps, providing anchor watches, functioning as a weather station, and generating automatic logbooks.","status":"active","version":"2.25.0","language":"javascript","source_language":"en","source_url":"https://github.com/SignalK/signalk-server","tags":["javascript","signalk","kjson","nmea","seatalk","gps","sailing","boat","marine"],"install":[{"cmd":"npm install signalk-server","lang":"bash","label":"npm"},{"cmd":"yarn add signalk-server","lang":"bash","label":"yarn"},{"cmd":"pnpm add signalk-server","lang":"bash","label":"pnpm"}],"dependencies":[],"imports":[{"note":"The primary programmatic entry point to initiate the Signal K server process. It accepts a configuration object.","wrong":"const start = require('signalk-server').start","symbol":"start","correct":"import { start } from 'signalk-server'"},{"note":"Used for gracefully shutting down a programmatically started Signal K server instance. Takes the server instance returned by `start`.","wrong":"const stop = require('signalk-server').stop","symbol":"stop","correct":"import { stop } from 'signalk-server'"},{"note":"The core server class. Primarily for advanced embedding or testing purposes, typically not needed for standard server operation. The import path is internal and subject to change across versions.","wrong":"import { App } from 'signalk-server'","symbol":"Server","correct":"import { Server } from 'signalk-server/lib/server'"}],"quickstart":{"code":"import { start, stop } from 'signalk-server';\nimport path from 'path';\nimport { fileURLToPath } = from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nasync function runSignalKServer() {\n  const serverConfig = {\n    port: 3000,\n    // For a minimal example, the server will use its default paths for plugins, webapps, etc.\n    // In a production application or custom setup, you might specify:\n    // configPath: path.join(__dirname, 'my-config'),\n    // pluginsPath: path.join(__dirname, 'my-plugins'),\n    // security: { strategy: 'none' } // Use with caution; disables security for development\n  };\n\n  console.log(`Attempting to start Signal K server on port ${serverConfig.port}...`);\n  let serverInstance;\n  try {\n    // The start function returns a server object which contains the express app and other components\n    serverInstance = await start(serverConfig);\n    console.log(`Signal K Server is running on http://localhost:${serverConfig.port}`);\n    console.log(`Admin UI available at http://localhost:${serverConfig.port}/admin`);\n    console.log('Press Ctrl+C to stop the server.');\n\n    // Keep the process alive until SIGINT (Ctrl+C) is received\n    process.on('SIGINT', async () => {\n      console.log('\\nReceived SIGINT. Shutting down Signal K server...');\n      if (serverInstance) {\n        await stop(serverInstance);\n        console.log('Signal K server has been stopped.');\n      }\n      process.exit(0);\n    });\n\n  } catch (error) {\n    console.error('Failed to start Signal K server:', error.message);\n    if (error.code === 'EADDRINUSE') {\n      console.error(`Port ${serverConfig.port} is already in use. Please choose another port or stop the conflicting process.`);\n    }\n    process.exit(1);\n  }\n}\n\nrunSignalKServer();","lang":"typescript","description":"Demonstrates how to programmatically start and stop a Signal K server instance with a basic configuration, listening on a specified port. This is useful for embedding or testing."},"warnings":[{"fix":"Upgrade your Node.js environment to version 24 (LTS recommended) using `nvm install 24 && nvm use 24` or your preferred Node.js version manager.","message":"Node.js Version Update: Signal K Server now requires Node.js 22 or higher, with version 2.24.0 updating the default to Node.js 24. Older Node.js environments will fail to run the server.","severity":"breaking","affected_versions":">=2.22.0"},{"fix":"Review your server's security configuration, adjust `allow_readonly` setting, or configure authentication for remote WebSocket providers. Exercise caution if using `DISABLE_SECURITY_ACTIVATION` as it can weaken security.","message":"Security Defaults Changes: Version 2.24.0 changed the default `allow_readonly` to `false` when security is enabled, potentially restricting read access for previously unauthenticated clients. Version 2.25.0 introduced `DISABLE_SECURITY_ACTIVATION` for specific overrides, and WebSocket provider connections to secured remote servers now require authentication.","severity":"breaking","affected_versions":">=2.24.0"},{"fix":"Upgrade to `arm/v8` (64-bit ARM) hardware or use `signalk-server` versions prior to 2.22.0 if `arm/v7` compatibility is strictly required.","message":"Removal of ARMv7 Container Images: Starting with version 2.22.0, official Docker container image support for `arm/v7` platforms has been dropped. Users deploying on older ARM-based devices (e.g., some Raspberry Pi models) will need to use older server versions or compile images themselves.","severity":"breaking","affected_versions":">=2.22.0"},{"fix":"Clear browser cache if UI issues arise after an upgrade. Report any significant UI breakage or compatibility problems to the project maintainers.","message":"Admin UI Migration to React 19: The server's Admin UI was migrated to React 19 in v2.22.0, with naming changes completed in v2.24.0-beta.4. While offering new features and improvements, users may experience changes in the interface and potential incompatibilities with custom themes or very old browser versions.","severity":"gotcha","affected_versions":">=2.22.0"},{"fix":"Plugin developers should verify compatibility of their plugins with the updated `baconjs` version if they directly or indirectly interact with its streams or related APIs. Update plugins to their latest compatible versions.","message":"Bacon.js Library Upgrade: An internal dependency, `baconjs`, was upgraded from v1.0.1 to v3.0 in version 2.24.0. While primarily an internal change, it could potentially affect custom plugins or advanced integrations that might have implicitly relied on older `baconjs` behaviors or type definitions.","severity":"gotcha","affected_versions":">=2.24.0"}],"env_vars":null,"search_vec":"'0183':40 '2.25.0':64 '2000':42 'abil':110 'activ':69 'address':82 'aggreg':32 'agnost':97 'ai':138 'anchor':147 'api':59 'app':145 'applic':13,52 'architectur':107 'automat':156 'avail':49 'beta':80 'boat':30,165 'cadenc':71 'central':18 'cerbo':122 'current':60 'data':19,33,98 'devic':54,124 'differenti':89 'effici':113 'electron':23 'embed':115 'enabl':126 'extens':102 'featur':83 'fix':84 'frequent':73 'function':15,131,149 'generat':155 'gps':163 'gx':123 'hardwar':116 'http':58 'hub':20,141 'implement':24,100 'improv':87 'includ':79,90 'inform':48 'javascript':158 'k':2,5,27 'key':88 'kjson':160 'like':117 'logbook':157 'maintain':67 'make':46 'marin':22,144,166 'minor':74 'navig':140 'nmea':39,41,161 'node.js':12 'often':78 'open':10 'open-sourc':9 'patch':76 'perform':86 'pis':119 'plugin':106 'popular':143 'project':66 'provid':146 'rang':129 'raspberri':118 'releas':70 'robust':105 'role':92 'run':112 'sail':164 'seatalk':44,162 'serv':134 'server':3,6 'signal':1,4,26 'signalk':159 'sourc':11,36 'stabl':62 'standard':28,99 'station':153 'updat':77 'various':35 'vendor':96 'vendor-agnost':95 'version':63,81 'via':55 'victron':121 'watch':148 'weather':152 'websocket':56 'wide':128 'wireless':137","created_at":"2026-04-20T01:57:28.502562+00:00","updated_at":"2026-04-20T01:57:28.502562+00:00","problems":[{"fix":"Upgrade Node.js to version 24 (LTS recommended) using a tool like `nvm` (`nvm install 24 && nvm use 24`).","cause":"The installed Node.js version is older than the minimum required by `signalk-server`.","error":"Error: The Signal K server requires Node.js version 22 or higher. You are running vX.Y.Z."},{"fix":"Stop the application currently occupying the port, or configure `signalk-server` to use a different port by modifying its `settings.json` or by passing a `port` option to the `start` function if used programmatically.","cause":"The default port (3000) or a configured port is already being used by another application on your system.","error":"Error: listen EADDRINUSE: address already in use :::3000"},{"fix":"Configure proper authentication credentials for your WebSocket provider connections, or explicitly set `allow_readonly: true` in your server's security configuration if anonymous read access is intended (with awareness of security implications).","cause":"Security enhancements in `signalk-server` versions >=2.24.0, such as requiring authentication for WebSocket provider connections or setting `allow_readonly: false` by default when security is enabled.","error":"WebSocket connection failed: 401 Unauthorized (or 403 Forbidden) after server upgrade."},{"fix":"Update the problematic plugin to its latest version, or check the plugin's documentation for compatibility with `signalk-server` versions >=2.24.0. If no update is available, consider reporting the issue to the plugin developer or temporarily downgrading `signalk-server`.","cause":"An older plugin is incompatible with the `baconjs` v3 upgrade that occurred in `signalk-server` v2.24.0.","error":"TypeError: baconStream.onValue is not a function (or similar Bacon.js related errors from a plugin)."}],"ecosystem":"npm","meta_description":null,"install_score":null,"quickstart_score":null,"quickstart_tag":null,"pypi_latest":null,"cli_name":"signalk-server","cli_version":null,"type":"library","homepage":"https://signalk.org","github":"https://github.com/SignalK/signalk-server","docs":null,"changelog":null,"pypi":null,"npm":"https://www.npmjs.com/package/signalk-server","openapi_spec":null,"status_page":null,"smithery":null,"categories":["web-framework","http-networking","data"],"base_url":null,"auth_type":null,"provenance":{"verified_status":null,"verified_at":null,"last_verified":"2026-06-17","next_check":"2026-07-18","install_tag":null}}