{"id":41962,"library":"signalk-database","title":"signalk-database","description":"SQLite library and admin UI for SignalK Node Server plugins, version 0.2.0 (early development, active). Provides isolated per-plugin SQLite databases via `openPluginDb(app)`, with WAL mode, foreign keys, caching. Includes web-based admin UI for browsing all plugin databases disk. Requires Node >=22.5.0 (uses built-in `node:sqlite`). No server-side cooperation needed. Differentiator: zero-config per-plugin isolation, admin UI that sees all databases regardless of plugin status, and integration with signalk-backup for transactional backups via `VACUUM INTO`.","status":"active","version":"0.2.0","language":"javascript","source_language":"en","source_url":"https://github.com/dirkwa/signalk-database","tags":["javascript","signalk-node-server-plugin","signalk-webapp","signalk-category-database","signalk-category-utility","typescript"],"install":[{"cmd":"npm install signalk-database","lang":"bash","label":"npm"},{"cmd":"yarn add signalk-database","lang":"bash","label":"yarn"},{"cmd":"pnpm add signalk-database","lang":"bash","label":"pnpm"}],"dependencies":[],"imports":[{"note":"ESM-only due to Node 22+ module system. No CommonJS support.","wrong":"const openPluginDb = require('signalk-database').openPluginDb","symbol":"openPluginDb","correct":"import { openPluginDb } from 'signalk-database'"},{"note":"PluginDb is a TypeScript interface, not a class. Use type-only import.","wrong":"import { PluginDb } from 'signalk-database'","symbol":"PluginDb","correct":"import type { PluginDb } from 'signalk-database'"},{"note":"Migration is a type, not a runtime value. TypeScript only.","wrong":"const Migration = require('signalk-database/types').Migration","symbol":"Migration","correct":"import type { Migration } from 'signalk-database'"}],"quickstart":{"code":"// plugin.js\nexport default function (app) {\n  let db;\n  return {\n    id: 'my-plugin',\n    name: 'My Plugin',\n    async start() {\n      const { openPluginDb } = await import('signalk-database');\n      db = await openPluginDb(app);\n      await db.migrate([\n        { version: 1, sql: 'CREATE TABLE IF NOT EXISTS settings (key TEXT PRIMARY KEY, value TEXT)' },\n      ]);\n      const rows = await db.query('SELECT * FROM settings');\n      console.log(rows);\n    },\n    async stop() {},\n  };\n}","lang":"typescript","description":"Shows how a SignalK plugin ESM module imports openPluginDb, migrates a table, and queries data."},"warnings":[{"fix":"Upgrade Node to 22.5.0 or later.","message":"Requires Node >=22.5.0 because it uses built-in node:sqlite. Older Node versions throw MODULE_NOT_FOUND.","severity":"breaking","affected_versions":">=0.0.0"},{"fix":"Manually disable the plugin in SignalK admin UI if not needed.","message":"The plugin is automatically enabled on install (signalk-plugin-enabled-by-default) after server restart. It may add an unconfigured SQLite database unexpectedly.","severity":"gotcha","affected_versions":">=0.0.0"},{"fix":"Do not call migrate multiple times; check version carefully.","message":"openPluginDb returns a cached handle per plugin ID. Calling with the same pluginId returns the same database instance. The migrate function is re-entrant safe but should only be called once per version.","severity":"gotcha","affected_versions":">=0.0.0"}],"env_vars":null,"search_vec":"'0.2.0':15 '22.5.0':49 'activ':18 'admin':7,39,70 'app':28 'backup':85,88 'base':38 'brows':42 'built':52 'built-in':51 'cach':34 'categori':103,107 'config':65 'cooper':60 'databas':3,25,45,75,104 'develop':17 'differenti':62 'disk':46 'earli':16 'foreign':32 'includ':35 'integr':81 'isol':20,69 'javascript':92 'key':33 'librari':5 'mode':31 'need':61 'node':11,48,54,95 'openplugindb':27 'per':22,67 'per-plugin':21,66 'plugin':13,23,44,68,78,97 'provid':19 'regardless':76 'requir':47 'see':73 'server':12,58,96 'server-sid':57 'side':59 'signalk':2,10,84,94,99,102,106 'signalk-backup':83 'signalk-category-databas':101 'signalk-category-util':105 'signalk-databas':1 'signalk-node-server-plugin':93 'signalk-webapp':98 'sqlite':4,24,55 'status':79 'transact':87 'typescript':109 'ui':8,40,71 'use':50 'util':108 'vacuum':90 'version':14 'via':26,89 'wal':30 'web':37 'web-bas':36 'webapp':100 'zero':64 'zero-config':63","created_at":"2026-06-04T18:54:57.201687+00:00","updated_at":"2026-06-04T18:54:57.201687+00:00","problems":[{"fix":"Add \"signalk-database\": \"^0.2\" to your plugin's peerDependencies and run npm install.","cause":"Peer dependency not installed or not added to package.json.","error":"Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'signalk-database'"},{"fix":"Use dynamic import or static ESM import: import { openPluginDb } from 'signalk-database'.","cause":"CommonJS require incorrectly used on ESM-only package.","error":"TypeError: openPluginDb is not a function"},{"fix":"Upgrade Node to 22.5.0+.","cause":"Node version <22.5.0 does not have built-in node:sqlite.","error":"Error: Cannot find module 'node:sqlite'"}],"ecosystem":"npm","meta_description":null,"install_score":null,"quickstart_score":null,"quickstart_tag":null,"pypi_latest":null,"cli_name":null,"cli_version":null,"type":"library","homepage":"https://github.com/dirkwa/signalk-database#readme","github":"https://github.com/dirkwa/signalk-database","docs":null,"changelog":null,"pypi":null,"npm":"signalk-database","openapi_spec":null,"status_page":null,"smithery":null,"categories":["database","devops"],"base_url":null,"auth_type":null,"provenance":{"verified_status":null,"verified_at":null,"last_verified":"2026-06-04","next_check":"2026-09-02","install_tag":null}}