{"_id":"signalk-stowage-mgmt","_rev":"39-0c4f2f8157c10d7d48437cd8f210ce88","name":"signalk-stowage-mgmt","dist-tags":{"latest":"1.3.0"},"versions":{"0.3.2":{"name":"signalk-stowage-mgmt","version":"0.3.2","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"Apache-2.0","_id":"signalk-stowage-mgmt@0.3.2","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"a87d5762b595aa096095ef94ad8beba81696ca9d","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.3.2.tgz","fileCount":14,"integrity":"sha512-p6bErM0aZ9Pc5Pcog1u1njeJR9Pw9s4tnT8kSbE5RiEk36/dyCta6ZHDM8jU67zXGpTHy5fzPQpK5tn6YwL3og==","signatures":[{"sig":"MEQCICpZfvVK0Ti9B8o32tClQVdPy1IliviX7KBAJbX6jWBYAiALEZv/daILdVaFwGwJixtdeecpdTVKfy2J5ZdS+anvOg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":132631},"main":"plugin/index.js","engines":{"node":">=20"},"gitHead":"0a68ec3fa2a4842736f630b5dff34618fbeff3e4","signalk":{"displayName":"Stowage Management"},"_npmUser":{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"10.9.7","description":"SignalK Stowage Management: organize items into containers and storage spaces, and locate them on an SVG floorplan.","directories":{},"_nodeVersion":"22.22.2","allowScripts":{"better-sqlite3@11.10.0":true},"dependencies":{"express":"^4.18.0","better-sqlite3":"^11.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.3.2_1783498385842_0.9701314613926484","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.3.3":{"name":"signalk-stowage-mgmt","version":"0.3.3","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"Apache-2.0","_id":"signalk-stowage-mgmt@0.3.3","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"beb9f41b99a83d3a9d83f4ef23ad8c01b3ac09a1","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.3.3.tgz","fileCount":14,"integrity":"sha512-Lv/WxBUGos03aW9PU2edPfe2OFxap/tpMkOjOOIixUXp7Z6I4bckAAW7yB4JMNVGs8icHdaAf0giv0QWbBI2wQ==","signatures":[{"sig":"MEUCIGq0Z5jHAgTIAGJ5qOpnc31cnOEPYirMpYvMB2i01PUrAiEAmMHNhAsLlzKFP6lBghggNNAtkL7eMVWJ8LhwD9eaNyI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":132616},"main":"plugin/index.js","engines":{"node":">=20"},"gitHead":"56471656cc84df3652b0d892fa5ec1979d73e86f","signalk":{"displayName":"Stowage Management"},"_npmUser":{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"10.9.7","description":"SignalK Stowage Management: organize items into containers and storage spaces, and locate them on an SVG floorplan.","directories":{},"_nodeVersion":"22.22.2","allowScripts":{"better-sqlite3@11.10.0":true},"dependencies":{"express":"^4.18.0","better-sqlite3":"^11.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.3.3_1783500737288_0.9845469141958285","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.3.6":{"name":"signalk-stowage-mgmt","version":"0.3.6","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"Apache-2.0","_id":"signalk-stowage-mgmt@0.3.6","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"9113f1cf1c9e6ee3ea169d99ca86a9fa8ab67095","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.3.6.tgz","fileCount":14,"integrity":"sha512-GjIYFHnfbG9MCY2SljxSHyE6MXissuCkWoQgtRdHq4XLYDVXo69pinyRuTdYwcybT9rjtQK1sS7BbywNrCcj+Q==","signatures":[{"sig":"MEYCIQCybNONnAUYr0I41Yt1KGG38z6ZnKXey5VQIfuEXo5mZQIhAN5+68DeT5YCPfedQDe4Qs8LsbWAFrWeU73jsx6Hj38e","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":136344},"main":"plugin/index.js","engines":{"node":">=20"},"gitHead":"1d6940f9579cb6479e91cf8efbca69da054fe97b","signalk":{"displayName":"Stowage Management"},"_npmUser":{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"10.9.7","description":"SignalK Stowage Management: organize items into containers and storage spaces, and locate them on an SVG floorplan.","directories":{},"_nodeVersion":"22.22.2","allowScripts":{"better-sqlite3@11.10.0":true},"dependencies":{"express":"^4.18.0","better-sqlite3":"^11.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.3.6_1783577196110_0.5180226427847978","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.5.0":{"name":"signalk-stowage-mgmt","version":"0.5.0","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"Apache-2.0","_id":"signalk-stowage-mgmt@0.5.0","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"40e60d8fd2ec8d4f5c8d8f1d9bda9fdf2e915ee8","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.5.0.tgz","fileCount":16,"integrity":"sha512-0vRarkzuAOMcPqfFnL3xoGXUw8EhNqqBuOafI8o3F9WMmxbrFSIR28EPk1Ui5B8MsaiNEc6OA2Bc+9Cb05aZlg==","signatures":[{"sig":"MEUCIQCuzmbBGrq/zzpM3fVeqk9ksltUjhdx8V/P96g/gcw3HQIgdPZqeb90WepgCqR4sFfI0y/hY5yBD1RBojB4QPDk4uI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":136904},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"bccd56e0af525f42270dd9d7f1e015d51e9fc253","scripts":{"test":"node -e \"console.log('No dedicated test suite yet. See CI job steps (entry point, schema, and start/stop lifecycle checks) for automated plugin validation.')\""},"signalk":{"displayName":"Stowage Management"},"_npmUser":{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"10.9.7","description":"SignalK Stowage Management: organize items into containers and storage spaces, and locate them on an SVG floorplan.","directories":{},"_nodeVersion":"22.22.2","dependencies":{"express":"^4.18.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.5.0_1783580356381_0.3558811205054595","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.5.4":{"name":"signalk-stowage-mgmt","version":"0.5.4","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"Apache-2.0","_id":"signalk-stowage-mgmt@0.5.4","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"8a23321ef62517b00de56e49003ddecd52d7b1f3","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.5.4.tgz","fileCount":18,"integrity":"sha512-pe1+8Yp8nl4RjabEmxxQv2sFTu+QHkI1lcWXr/aVsXAm6t7kevmSOq63h/DD6QTtqMqLJPMdSVKUF48wyi4NJQ==","signatures":[{"sig":"MEUCID181iP2j2NKzq0abmMs8LBKpBDh9Wag7ztxAfuI7v4dAiEA7vWFikxzPZJcEQVKpCSRGQ/M4Y7RucyoZJUXpyV+xmM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":170569},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"70343d16b7989016baebc14cf240586f8295f868","scripts":{"test":"node -e \"console.log('No dedicated test suite yet. See CI job steps (entry point, schema, and start/stop lifecycle checks) for automated plugin validation.')\""},"signalk":{"displayName":"Stowage Management"},"_npmUser":{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"10.9.7","description":"SignalK Stowage Management: organize items into containers and storage spaces, and locate them on an SVG floorplan.","directories":{},"_nodeVersion":"22.22.2","dependencies":{},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.5.4_1783588733570_0.6671719833887804","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.6.0":{"name":"signalk-stowage-mgmt","version":"0.6.0","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"Apache-2.0","_id":"signalk-stowage-mgmt@0.6.0","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"93f2126d6dc94a2df563ccbd2924fb1571a09b35","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.6.0.tgz","fileCount":35,"integrity":"sha512-yh/ez23+CuOQb8yjEC0pUXDBfzXjQ7aqTKZRh1TfFCRpt8aw1ZELPDbPXRg0a0ioqUeqyOVCPkzzZBS4/Wtnhg==","signatures":[{"sig":"MEUCIQDg9qMIr5CWO/RIsO1Nm74sSAW6+t8BH7FP8TCsQtBRYAIgUEzr+npS5RjtpJy75ezMHm1u0TQ8XIuukR2CjzveK6s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":192270},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"73443337e489273ae77a175c8b579d317ee29867","scripts":{"test":"node -e \"console.log('No dedicated test suite yet. See CI job steps (entry point, schema, and start/stop lifecycle checks) for automated plugin validation.')\""},"signalk":{"displayName":"Stowage Management"},"_npmUser":{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"10.9.7","description":"SignalK Stowage Management: organize items into containers and storage spaces, and locate them on an SVG floorplan.","directories":{},"_nodeVersion":"22.22.2","dependencies":{},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.6.0_1783631038732_0.007958004079078096","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.7.2":{"name":"signalk-stowage-mgmt","version":"0.7.2","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"Apache-2.0","_id":"signalk-stowage-mgmt@0.7.2","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"8f4a24b80c11e82f8c16561d45238f6ddaaf1742","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.7.2.tgz","fileCount":38,"integrity":"sha512-6LQtX4tUZ9uIAE17px0xXHonLghP73rgoGDs3v6N34YK/UeEdzyPqB7zBoevgOS4pO7A8Z86KQjcz2TEpxhdcw==","signatures":[{"sig":"MEYCIQCAxzSBptyoVfJKEAvXiESR+g7ukdkzI6BLEpmvphq38QIhALAmEj/Qa4NG3utrE1WQUvvfrN7Olo8aiAcPlDsr/OHq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":232302},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"dde553b271fdbc22d1b44819c9345719205c9981","scripts":{"test":"node -e \"console.log('No dedicated test suite yet. See CI job steps (entry point, schema, and start/stop lifecycle checks) for automated plugin validation.')\""},"signalk":{"displayName":"Stowage Management"},"_npmUser":{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"10.9.7","description":"SignalK Stowage Management: organize items into containers and storage spaces, and locate them on an SVG floorplan.","directories":{},"_nodeVersion":"22.22.2","dependencies":{},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.7.2_1783696943916_0.7391831861827172","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.8.1":{"name":"signalk-stowage-mgmt","version":"0.8.1","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"Apache-2.0","_id":"signalk-stowage-mgmt@0.8.1","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"fe1b31c49c9c905e6b741af4d77419a9788ddc24","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.8.1.tgz","fileCount":41,"integrity":"sha512-i+AkCVZFF4psYw33LkMiZC3UaMQRGzMjfO+PGw/E+NbyYOShMPmuleb+pIq7xvBKNrZkCxRJWLwfhxPdsDKAyA==","signatures":[{"sig":"MEQCIGrFWLpzP6HC+bbdABj/vIguXoHm40q2SIgpf6jsUsuwAiAr5/GWBW2tg0NeSZIZUYDLjMZAzxLGy3Xsi7CmtXkr7A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":517043},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"c01851644f5591389b428b88419b592538b19d37","scripts":{"test":"node -e \"console.log('No dedicated test suite yet. See CI job steps (entry point, schema, and start/stop lifecycle checks) for automated plugin validation.')\""},"signalk":{"appIcon":"./assets/icons/icon-512.png","displayName":"Stowage Management"},"_npmUser":{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"10.9.7","description":"SignalK Stowage Management: organize items into containers and storage spaces, and locate them on an SVG floorplan.","directories":{},"_nodeVersion":"22.22.2","dependencies":{},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.8.1_1783763971269_0.30379230802663515","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.8.2":{"name":"signalk-stowage-mgmt","version":"0.8.2","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"Apache-2.0","_id":"signalk-stowage-mgmt@0.8.2","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"bd1dd7cb33e60c4381823179f2864de0fd677d8a","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.8.2.tgz","fileCount":43,"integrity":"sha512-NwazcV1qWDp3krY2DRn/370VLOq6djvxBGURtCAZL6Sd8B5FEE9MOCdM2zMVJkDi7u32du3TJy5/w8MphvTJhQ==","signatures":[{"sig":"MEUCIQCmOA7Hr+S9iy5nCTXAHrHoGUZ+tCazndrF1F1v4++C6gIgJnfEDIbtVibNsXQ2r+w3EOraYvKaDdlPgQv9d3FxJPw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":531367},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"9eb98607e2b07a70d140ea391de6fcea2d6a43a0","scripts":{"test":"node -e \"console.log('No dedicated test suite yet. See CI job steps (entry point, schema, and start/stop lifecycle checks) for automated plugin validation.')\""},"signalk":{"appIcon":"./assets/icons/icon-512.png","displayName":"Stowage Management"},"_npmUser":{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"10.9.7","description":"SignalK Stowage Management: organize items into containers and storage spaces, and locate them on an SVG floorplan.","directories":{},"_nodeVersion":"22.22.2","dependencies":{},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.8.2_1783848973055_0.918918975357857","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.8.4":{"name":"signalk-stowage-mgmt","version":"0.8.4","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"Apache-2.0","_id":"signalk-stowage-mgmt@0.8.4","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"201c649c48a4632e07f6dd90f1cb252edbd85dbb","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.8.4.tgz","fileCount":45,"integrity":"sha512-du/EwEYbuvUV2t9cGUOZOrNr62VZh/s3FQJ/GYla2pV7r0Pd/+iLLGPB6yFGz7CQdDUvZ2+iV8whS1sIpEoY2Q==","signatures":[{"sig":"MEUCIQC5Qm+wrHD0aPkAkLcvPV1Bi4IH9jaYH7SF40S4coewVwIgfZAUPtaAtsFZsyqi/vXuzujGcaaa59bIaK2rWMlk2Cg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":553313},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"b6102a971abab7a3d7da0f3d2c7bf065177b107d","scripts":{"test":"node -e \"console.log('No dedicated test suite yet. See CI job steps (entry point, schema, and start/stop lifecycle checks) for automated plugin validation.')\""},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management"},"_npmUser":{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"10.9.7","description":"SignalK Stowage Management: organize items into containers and storage spaces, and locate them on an SVG floorplan.","directories":{},"_nodeVersion":"22.22.2","dependencies":{},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.8.4_1783870917876_0.06334165969444538","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.8.6":{"name":"signalk-stowage-mgmt","version":"0.8.6","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"Apache-2.0","_id":"signalk-stowage-mgmt@0.8.6","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"cc9035bce679bcb7af0a0a554202e17ce2c6a4d7","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.8.6.tgz","fileCount":45,"integrity":"sha512-2UFU9EhkRG7+gnnW0bJeQZ5wx1p0Nhx5A8MjYY4HVxIP428r6tmL4xw4jzoquZe4I2mvPbLU9r/Aobnaa9ELUA==","signatures":[{"sig":"MEQCIHzqUbyKFPlr6mGJco493UvCSvtiy4fCh8vIX+srPeBPAiBUnihzLeDLghLFxQ/k9UPRRv1V1nQy3M9TRqGopObuFA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":561865},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"133c26272773238a5621bf586c3c40d36351ca73","scripts":{"test":"node -e \"console.log('No dedicated test suite yet. See CI job steps (entry point, schema, and start/stop lifecycle checks) for automated plugin validation.')\""},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management"},"_npmUser":{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"10.9.7","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"22.22.2","dependencies":{},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.8.6_1783969428996_0.9153045016340171","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.8.7":{"name":"signalk-stowage-mgmt","version":"0.8.7","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"Apache-2.0","_id":"signalk-stowage-mgmt@0.8.7","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"ba3ab1be149b516c57257d8a73048f96f58c626b","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.8.7.tgz","fileCount":45,"integrity":"sha512-TbBAONDr80AXgMuMIfkKB/mwwJ+O9NojTeyPoQYioHpPseHf2Y2NLAUBR+Bv0K+VaCUaaVwMH0VrvWUF/AIsSw==","signatures":[{"sig":"MEYCIQDYRlEAgT/ZJ8HxEab2ipJyPE71Dy6lEgtUIz1uF5KTNgIhAKa+uTrn2QlQLH3eb0327Zah68sDAd+MUJyMJfdFmGop","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/signalk-stowage-mgmt@0.8.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":565642},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"e942933ed9f42fe16cbbe62a6a0012abc5eb81a4","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7315ff1d-3a4b-4f4c-bdd3-6bb518975678"}},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"11.16.0","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.8.7_1783979895886_0.36289384534953295","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.8.8":{"name":"signalk-stowage-mgmt","version":"0.8.8","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"Apache-2.0","_id":"signalk-stowage-mgmt@0.8.8","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"bc565bd560d43a2749da858cc24d50c825eb80ac","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.8.8.tgz","fileCount":44,"integrity":"sha512-FhgkUK9qdnD+YWWSh6G6i2J7zaOua6l31x6LoiUWqdmqlA4fWX7lslLks9viz1pdSX/rt7+UtSR96/ntui7zbw==","signatures":[{"sig":"MEYCIQDC6sRsFBbA47uLyn11iqs2AfBPIqzEtrkJ8bTP5fZd1QIhAKCCpiW+5O/RF3pDXlseQ+jpFsED8QrkcnDS60t9Ck/B","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":571965},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"76fd93ab995a73908bafa19250baf5965dea2690","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management"},"_npmUser":{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"10.9.7","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.8.8_1784031089730_0.9013393276093085","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.8.9":{"name":"signalk-stowage-mgmt","version":"0.8.9","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"Apache-2.0","_id":"signalk-stowage-mgmt@0.8.9","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"270c2bab8ebb500a916f2d2cbc427eeded2b68a8","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.8.9.tgz","fileCount":45,"integrity":"sha512-8IfclkXm6euIZyCJY74Q1D96WkuDx9HE2U0yIRyhHxIIRiF8Y8Y2wfmViqrYGTn8PrNT3i/VArdjR/3pE9VJOQ==","signatures":[{"sig":"MEUCIHbS9WHbRUhzONaBVYuSGZgRBsmfwwyy9bgEhPQo1hKxAiEAmTHVGJQO1eX2a9+t06q9NTbJMCKERBeDek4wNLUHFB4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":588485},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"f871002f9fb9f7c43bcfe35f08a72ece1c9987b3","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management"},"_npmUser":{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"10.9.7","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.8.9_1784041437227_0.39028488583600174","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.8.10":{"name":"signalk-stowage-mgmt","version":"0.8.10","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"Apache-2.0","_id":"signalk-stowage-mgmt@0.8.10","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"5b3a19de3fe2f420da98a19c3701b2d8704d10eb","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.8.10.tgz","fileCount":51,"integrity":"sha512-6CHV88cOE4Y62M9Um/XNX1pkbn8a9lMTbwP1SkyfV/Ei93i3GtaB4dsx1WFFQJDMjhK9LYv3yTvrklmEKjKtTg==","signatures":[{"sig":"MEQCIGxmSB0JrqyRMnlK/dBXer7LMqWBOHngTBoBnCj7G6PfAiAHNYwOfSdlzVIJjR9XH7PUNoSQF1oD8Yvyw5gdNXW8Zw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1083962},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"0cfaa724aa6f71d72e1bac9cc4276eb5ffc79ee2","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management","screenshots":["./docs/screenshots/inventory.png","./docs/screenshots/floorplan.png","./docs/screenshots/overview.png","./docs/screenshots/categories.png","./docs/screenshots/stock-alerts.png","./docs/screenshots/store-log.png"]},"_npmUser":{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"10.9.7","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.8.10_1784114791013_0.7233924035238382","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.8.12":{"name":"signalk-stowage-mgmt","version":"0.8.12","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"Apache-2.0","_id":"signalk-stowage-mgmt@0.8.12","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"09bd009b3ec30bf223910cb4cab2bbecc5fbe3ac","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.8.12.tgz","fileCount":51,"integrity":"sha512-HCRr2uZUdDC1ZYCGxVHiM1QumOkMBZbk/kKouOmROrHgyIBAblcwY+G5/z/FOvZtN0B2z5A9MKY/f6M2QPaBZA==","signatures":[{"sig":"MEQCIEpmnorGXnLlTYF7I5qjbVkZDTwyaUjjOu6C7DddkzWwAiBss53uG/SfTAZJo8Fj1iVL1rqhnofIsTAfvlYLSbeTug==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/signalk-stowage-mgmt@0.8.12","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1089130},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"4352b5ca9c04a55d5c26162fca758c12c50d83e1","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management","screenshots":["./docs/screenshots/inventory.png","./docs/screenshots/floorplan.png","./docs/screenshots/overview.png","./docs/screenshots/categories.png","./docs/screenshots/stock-alerts.png","./docs/screenshots/store-log.png"]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9c81df52-25f6-4cfc-be1e-dc0572f4eca9"}},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"11.16.0","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.8.12_1784304441142_0.4768120219776162","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.8.13":{"name":"signalk-stowage-mgmt","version":"0.8.13","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"Apache-2.0","_id":"signalk-stowage-mgmt@0.8.13","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"1f3f261fe2a9c3e2f43b0bf0672c8b4425196a96","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.8.13.tgz","fileCount":52,"integrity":"sha512-1xE8F0ic9ecoO4gC13LdxXbWOMTlhEEevNztrj9yQvAa3Sc5gUKZcGWbM4IjSfkmJus9+eV009DfLmYE8pPNRw==","signatures":[{"sig":"MEQCIGOxgboJJ+n2Fp1s5zNPF0qpCgdfZMvOA1E3qG9v/SL+AiBlH//gHuAGD5IsyDvPgQGsaLxGzTl+VLRPxniX8ZGnqg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1096491},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"04879d91f98052bfe4f150321641cf6698e7744f","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management","screenshots":["./docs/screenshots/inventory.png","./docs/screenshots/floorplan.png","./docs/screenshots/overview.png","./docs/screenshots/categories.png","./docs/screenshots/stock-alerts.png","./docs/screenshots/store-log.png"]},"_npmUser":{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"11.18.0","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.8.13_1784653007567_0.4494633890963935","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.8.14":{"name":"signalk-stowage-mgmt","version":"0.8.14","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"Apache-2.0","_id":"signalk-stowage-mgmt@0.8.14","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"97bb964f6844a74615080c2c734e121ea52a7774","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.8.14.tgz","fileCount":52,"integrity":"sha512-cd0+CQrBXB/rFfm8QvSx3GALSnwPThstWFYqqjuDlpCM+Hq+VCiGe1e+ZzldZITryDnQhOVPiUmpqseSYqHeng==","signatures":[{"sig":"MEUCIQCHfkqmW+ETl/kvADUfBOVpB4HszgTLx7gXWf4+wFHLOAIgfPYnFgp+FOzVxclZF1wBc62fx2J0s2ra/XmxklQqrNk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1098687},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"75a6f538cf50f68fa95f591b68d9082b1677a379","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management","screenshots":["./docs/screenshots/inventory.png","./docs/screenshots/floorplan.png","./docs/screenshots/overview.png","./docs/screenshots/categories.png","./docs/screenshots/stock-alerts.png","./docs/screenshots/store-log.png"]},"_npmUser":{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"10.9.7","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.8.14_1785103081703_0.9072846395808023","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.9.2":{"name":"signalk-stowage-mgmt","version":"0.9.2","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"Apache-2.0","_id":"signalk-stowage-mgmt@0.9.2","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"568c7b33f84ec7cdac6f1c7cf1fa3768137d9b1c","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.9.2.tgz","fileCount":53,"integrity":"sha512-qSdSWcoSwB1nhYohkIR5SXXEvmPoZzeGdv5Eq1Ve0po9shKCPSoCUb20w8iMBBT83J1Yt4P8CL2vkUkjXxKC3g==","signatures":[{"sig":"MEYCIQC0thfsWml2mDNSBDmkP65GSherydWlsPtxo+2XLdx8vwIhAOfV9VSBB9li90zK/ydITsyKVP0WMC8h3y0MQk0U2HNL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1210284},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"cb1851e62de279d547079ed0d88d443598f97fde","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management","screenshots":["./docs/screenshots/inventory.png","./docs/screenshots/floorplan.png","./docs/screenshots/overview.png","./docs/screenshots/overview-touch.png","./docs/screenshots/categories.png","./docs/screenshots/stock-alerts.png","./docs/screenshots/store-log.png"]},"_npmUser":{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"11.18.0","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.9.2_1785137696533_0.37615127447408114","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.9.3":{"name":"signalk-stowage-mgmt","version":"0.9.3","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"Apache-2.0","_id":"signalk-stowage-mgmt@0.9.3","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"a326072c1718ed733b2d60331737a6fc3ab3e8ba","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.9.3.tgz","fileCount":53,"integrity":"sha512-twRQnhcjLHQZbHeCqlf7Ue81l+oboQjHBmG2YCro1Rg1qBT+699iH5qqYEHZgurkJdKyZeL1odJILlD/oKBNuA==","signatures":[{"sig":"MEUCIQDBte8nUTwey3l8SnEP0gsKk5hJawHHK+Wf7RgEJ0/L/gIgSvy3uPBBpOjtW7N2989M+JMf588slZBFOdMlqMjKB7k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1217564},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"7a3fa7ddc2c5501590dccdfb6279e649ea250c4d","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management","screenshots":["./docs/screenshots/inventory.png","./docs/screenshots/floorplan.png","./docs/screenshots/overview.png","./docs/screenshots/overview-touch.png","./docs/screenshots/categories.png","./docs/screenshots/stock-alerts.png","./docs/screenshots/store-log.png"]},"_npmUser":{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"11.18.0","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.9.3_1785253461978_0.11687934471782802","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.9.4":{"name":"signalk-stowage-mgmt","version":"0.9.4","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"MIT","_id":"signalk-stowage-mgmt@0.9.4","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"f39167bec89a99ac0fe40c34f3b359808ea262a5","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.9.4.tgz","fileCount":57,"integrity":"sha512-m6fTIlCcgzrxM6nqdobR742C9J5E92oi8ejM0bsTn6u5jRdoiHP65nBFQIlFBp2sLlaeOYn+4mlGWiEc3njPWA==","signatures":[{"sig":"MEUCIQDLw/DJQNsfEnqw8XJy5ijwN/s4Tiu6FOu8XuNmUxXp0gIgKtAw1+YmoFZuVwGLgSzTF5T1bCC1jxbeW6mtj/oEvUY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/signalk-stowage-mgmt@0.9.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1226767},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"69873a5238f048342e79ef50e22ef54b3349b385","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management","screenshots":["./docs/screenshots/inventory.png","./docs/screenshots/floorplan.png","./docs/screenshots/overview.png","./docs/screenshots/overview-touch.png","./docs/screenshots/categories.png","./docs/screenshots/stock-alerts.png","./docs/screenshots/store-log.png"]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9c81df52-25f6-4cfc-be1e-dc0572f4eca9"}},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"11.16.0","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.9.4_1785433168515_0.2885852636287054","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.9.5":{"name":"signalk-stowage-mgmt","version":"0.9.5","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"MIT","_id":"signalk-stowage-mgmt@0.9.5","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"6990e49192deb0822547978f543fa83196dfde30","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.9.5.tgz","fileCount":56,"integrity":"sha512-TTxmFqzM8tU/cKaXPxheqiMi6/xM3f3MAHVHzZtw0gpnLvw5CqLiAbd04pAcxl56AxvKPNSRcOTkHlqE2X/1HA==","signatures":[{"sig":"MEYCIQCyh6iAx4a8MXgRl9QoPLMrV3QoRWY3+mf02BVjk3woygIhAPjwF/sT8/n3fvYeYnmu+1WoSTTf+m6b4ZW4f7Ldpmom","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/signalk-stowage-mgmt@0.9.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1228719},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"bd22476687cb784497da309c9c7c78db31109329","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management","screenshots":["./docs/screenshots/inventory.png","./docs/screenshots/floorplan.png","./docs/screenshots/overview.png","./docs/screenshots/overview-touch.png","./docs/screenshots/categories.png","./docs/screenshots/stock-alerts.png","./docs/screenshots/store-log.png"]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7dc07a34-cb2f-4b0e-afeb-8d77acef0595"}},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"11.16.0","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.9.5_1785435059496_0.10431762623969165","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.9.6":{"name":"signalk-stowage-mgmt","version":"0.9.6","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"MIT","_id":"signalk-stowage-mgmt@0.9.6","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"48ee24b979bae8060b98bdf2e48baf6602549e90","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.9.6.tgz","fileCount":64,"integrity":"sha512-6To9pWU6BzDuyLdXEu6JQ2VZZK/9LKPZXA21303vyhuvKg7Np2Ed5Z0dRr7RF2XXMGT6Wdh/4u5/f1OXUZKEVg==","signatures":[{"sig":"MEUCICQrQ4TnWZEwwtQv2jJz9EzENVb/dj3l75fKYuhZCPP4AiEA8sxXmmGF+gLPauAWge3rkmY4Ow68+FTaqUvl8C0YeOk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/signalk-stowage-mgmt@0.9.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1329127},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"a28bc336fe76574dc04d15b9680d7111d471891c","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management","screenshots":["./docs/screenshots/inventory.png","./docs/screenshots/floorplan.png","./docs/screenshots/overview.png","./docs/screenshots/overview-touch.png","./docs/screenshots/categories.png","./docs/screenshots/stock-alerts.png","./docs/screenshots/store-log.png"]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7dc07a34-cb2f-4b0e-afeb-8d77acef0595"}},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"11.16.0","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.9.6_1785571792614_0.7362641880486933","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.9.7":{"name":"signalk-stowage-mgmt","version":"0.9.7","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"MIT","_id":"signalk-stowage-mgmt@0.9.7","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"095ded659edb1a939db55757b82b796eeaff554d","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.9.7.tgz","fileCount":66,"integrity":"sha512-GCwyHvB59cxs8qIBUKs0PL39Au03c3UQtpuRN1eq7RBZOEFqd21mHjow4L+8WlhyH0xdulecCggHXk3vygC5nQ==","signatures":[{"sig":"MEUCIGYWtNz5WgkvTnMNW24eYyJIY5PTvRekImNzzInsCYHEAiEApbPLgkyMW0Wsg4z3AD6wdB/xLZ1wAxPw8yyAesgv9GM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/signalk-stowage-mgmt@0.9.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1390803},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"741aa1ee0e96c4fa4c972ce0ddc1f50391aff515","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management","screenshots":["./docs/screenshots/inventory.png","./docs/screenshots/floorplan.png","./docs/screenshots/overview.png","./docs/screenshots/overview-touch.png","./docs/screenshots/categories.png","./docs/screenshots/stock-alerts.png","./docs/screenshots/store-log.png"]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7dc07a34-cb2f-4b0e-afeb-8d77acef0595"}},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"11.16.0","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.9.7_1785610090758_0.7899558117724641","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.9.8":{"name":"signalk-stowage-mgmt","version":"0.9.8","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"MIT","_id":"signalk-stowage-mgmt@0.9.8","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"957f07458d149366fbef7cd4adf29da5fefec501","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.9.8.tgz","fileCount":66,"integrity":"sha512-eF5qlomxt4G9QE4QX+nubzxYHKpXyCOOkK6sy3YXFHGxB2iue9h8AARB95KAdvleIikJMNx9tiezFdXpUQiUNA==","signatures":[{"sig":"MEQCIGy9/mNSwaED8OQEO2BWYhMxErYwSfnzvx0oLbLjppBpAiA4NBRJOG1evHm7qGa1/cvUmejfIlC7iWTeyqXt5bpQFg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/signalk-stowage-mgmt@0.9.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1394673},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"fa3f60be683f4c8632db8120e4cc86ff9a70c313","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management","screenshots":["./docs/screenshots/inventory.png","./docs/screenshots/floorplan.png","./docs/screenshots/overview.png","./docs/screenshots/overview-touch.png","./docs/screenshots/categories.png","./docs/screenshots/stock-alerts.png","./docs/screenshots/store-log.png"]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7dc07a34-cb2f-4b0e-afeb-8d77acef0595"}},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"11.16.0","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.9.8_1785614924038_0.5377351754810706","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"0.9.9":{"name":"signalk-stowage-mgmt","version":"0.9.9","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"MIT","_id":"signalk-stowage-mgmt@0.9.9","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"bb46d8512ea092298f87464f591d31de54d2426d","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-0.9.9.tgz","fileCount":66,"integrity":"sha512-SrKScOwt+yxcBtj6GGZ4HiVlITWPV/lVRtK3Af8NrTAKU6RELGc27tcUtVqcJAJce3Y/eFF0bNpQvoTQ06XZDQ==","signatures":[{"sig":"MEQCIGB+fUbx9VaKKVeKOEmOpM2xpQuOXaoSYM2o430lW4DiAiBpxkhXs/XgF3tlzEKwEzSTppHbW1R2wyX7cYEH6xa7Yw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/signalk-stowage-mgmt@0.9.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1397993},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"e6e60390f57cd1f9b41630db82f622aaf980b8d9","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management","screenshots":["./docs/screenshots/inventory.png","./docs/screenshots/floorplan.png","./docs/screenshots/overview.png","./docs/screenshots/overview-touch.png","./docs/screenshots/categories.png","./docs/screenshots/stock-alerts.png","./docs/screenshots/store-log.png"]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7dc07a34-cb2f-4b0e-afeb-8d77acef0595"}},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"11.16.0","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_0.9.9_1785694227101_0.7716967109314319","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"1.0.0":{"name":"signalk-stowage-mgmt","version":"1.0.0","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"MIT","_id":"signalk-stowage-mgmt@1.0.0","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"0ed1a30cb49fd3e2107b1f39902a3113d73892f4","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-1.0.0.tgz","fileCount":67,"integrity":"sha512-U4dq8M6yyec8O9T5JunEspNQW3Abeg1T52rj/R/8vHvLfz1RSZAb2mIjSmtAO6D2i2rLA7ZpHuylBVyMom4PTg==","signatures":[{"sig":"MEQCIAa1qJvENYSgox/+6stufRu9toNe7XPUvyG+Rp2X04asAiAfnt8k6VdNv5b+tNjcjqnveZHBvriPFpwyFposdaLQHA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/signalk-stowage-mgmt@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1401927},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"28c4b8c0b84094a51aac448deb4d8328cc373d51","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management","screenshots":["./docs/screenshots/inventory.png","./docs/screenshots/floorplan.png","./docs/screenshots/overview.png","./docs/screenshots/overview-touch.png","./docs/screenshots/categories.png","./docs/screenshots/stock-alerts.png","./docs/screenshots/store-log.png"]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7dc07a34-cb2f-4b0e-afeb-8d77acef0595"}},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"11.16.0","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_1.0.0_1785745962593_0.06331649084936974","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"1.0.1":{"name":"signalk-stowage-mgmt","version":"1.0.1","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"MIT","_id":"signalk-stowage-mgmt@1.0.1","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"ea368e027b7833a13ea54f4ae1ccf33fd2dcc6da","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-1.0.1.tgz","fileCount":67,"integrity":"sha512-TcD3BPYDFsm5SHB973Bf9b/o1nnhTUEfpi8sp7IWAFvHv7axddwMIlztB4KkXfvY3XBPGO+QN6bO+O6DQxaHUQ==","signatures":[{"sig":"MEYCIQDGXtewMKbnvN1gfbYZXc7JXCP3xOLn2/BrYrvMfSO5+gIhAO2k7eXt1KYM/YGSSbtdN0J3uMVVxcMR+MiIxsNO7cm3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/signalk-stowage-mgmt@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1406614},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"c9e7c83b7d60c6aaa3d2ff64fb8b6d908e65f5a0","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management","screenshots":["./docs/screenshots/inventory.png","./docs/screenshots/floorplan.png","./docs/screenshots/overview.png","./docs/screenshots/overview-touch.png","./docs/screenshots/categories.png","./docs/screenshots/stock-alerts.png","./docs/screenshots/store-log.png"]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7dc07a34-cb2f-4b0e-afeb-8d77acef0595"}},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"11.16.0","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_1.0.1_1786090097249_0.9500571908722402","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"1.1.0":{"name":"signalk-stowage-mgmt","version":"1.1.0","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"MIT","_id":"signalk-stowage-mgmt@1.1.0","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"959fd5a755ac4b36435fef3235b3674ec18f8f36","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-1.1.0.tgz","fileCount":68,"integrity":"sha512-vi/g+gYsUggQV0FBwCXt9zM2XOST+7vjo5jKO+PcfEEhuShWF/1vaenB7aqkYtdRpbSeGC2xAzCblA5kTvi5YA==","signatures":[{"sig":"MEYCIQDJ6+l5SJsk3W4grVXp+n0Cr/iODOyDEnufI0sfwmemLQIhAIuwCSIh3GFnXXrwNZ0HLTsIttf1hmNA1Hk9DNJLFGPz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/signalk-stowage-mgmt@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1324954},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"6f5be45af63fc28fb8dc2c1cfe9cc9ca41edb252","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management","screenshots":["./docs/screenshots/inventory.png","./docs/screenshots/floorplan.png","./docs/screenshots/overview.png","./docs/screenshots/overview-touch.png","./docs/screenshots/categories.png","./docs/screenshots/stock-alerts.png","./docs/screenshots/store-log.png"]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7dc07a34-cb2f-4b0e-afeb-8d77acef0595"}},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"11.16.0","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_1.1.0_1786215262199_0.4201124152406357","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"1.1.1":{"name":"signalk-stowage-mgmt","version":"1.1.1","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"MIT","_id":"signalk-stowage-mgmt@1.1.1","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"6ba9cce9d2d1bfc15c3ee8cb5bef07b1d41cf173","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-1.1.1.tgz","fileCount":68,"integrity":"sha512-X3P5KY2xOfPFr9dLLRMOPIq0T9mnP0OnEEZ7xBd+dFxGvKPTBUK/xYJeqBSXQD++sm0Wnrjrj8ZcYcOrBvC8BA==","signatures":[{"sig":"MEUCIHZJ9g7MM3AO287VZP7mHsXqFYfc9RM3dOAb2txXqOZjAiEAnLYKXheIgOEVDEb8a+SXaY/OKl7zFyl/7F6+kdRGaZg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/signalk-stowage-mgmt@1.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1328980},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"bf0286a5dbb3621e1eb0dbd08d834ae721d25e95","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management","screenshots":["./docs/screenshots/inventory.png","./docs/screenshots/floorplan.png","./docs/screenshots/overview.png","./docs/screenshots/overview-touch.png","./docs/screenshots/categories.png","./docs/screenshots/stock-alerts.png","./docs/screenshots/store-log.png"]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7dc07a34-cb2f-4b0e-afeb-8d77acef0595"}},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"11.16.0","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_1.1.1_1786533562810_0.7013622935052868","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"1.1.2":{"name":"signalk-stowage-mgmt","version":"1.1.2","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"MIT","_id":"signalk-stowage-mgmt@1.1.2","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"2960ade646c60a562d0dcb06fc404f4b7378dc88","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-1.1.2.tgz","fileCount":68,"integrity":"sha512-VxaMArF9qtdsfj+mb/rj+trF4r7alRXk9ZvQDEPtcvb0QfzlQ7eHW5DXyZNyizVqmnVtUBnheuccgIEtqhjetA==","signatures":[{"sig":"MEQCIFg1hvI4dCJN6P2TNRIjBsKkMhnAKK4aEMAojat1BLShAiBoaXRbKCTCXxUy9wQdqVFWppvov5PI0xqvZm86SA2q1g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1330086},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"2cd54a2aceb0800505092e70b3077f3bf111c3bc","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management","screenshots":["./docs/screenshots/inventory.png","./docs/screenshots/floorplan.png","./docs/screenshots/overview.png","./docs/screenshots/overview-touch.png","./docs/screenshots/categories.png","./docs/screenshots/stock-alerts.png","./docs/screenshots/store-log.png"]},"_npmUser":{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"11.18.0","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_1.1.2_1787212693490_0.5703461889310959","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"1.2.0":{"name":"signalk-stowage-mgmt","version":"1.2.0","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"MIT","_id":"signalk-stowage-mgmt@1.2.0","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"6d0325097da870140da0f764996ce612458c95fb","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-1.2.0.tgz","fileCount":70,"integrity":"sha512-aIPd77rXtS68oVgf9C56rbj5KomMHUKa4TpBev1UUq+C1EETh3SKtDGKiB3EIv/XuRlz3XfsH7XsM6cIPNt+4g==","signatures":[{"sig":"MEQCIAkdG4WXaty5SUCN+tRJJBgEcLkCluid5t6cs+LwRtI+AiA90Pv4MNjEUukEhlN2K5nuAxKSIfIaI4clCOSEpXmXYA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCmY1EkKpQ4CM/r8+b/ZcKmFyA0oUphge8InU7DbQJJFwIgGjMeBhKpg/RneDVuE1wHv+VEOuZYrCKgWNeL9zra3g4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/signalk-stowage-mgmt@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1350117},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"26115a5f731835338dccc28a3a5f1559a4e709e0","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management","screenshots":["./docs/screenshots/inventory.png","./docs/screenshots/floorplan.png","./docs/screenshots/overview.png","./docs/screenshots/overview-touch.png","./docs/screenshots/categories.png","./docs/screenshots/stock-alerts.png","./docs/screenshots/store-log.png"]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7dc07a34-cb2f-4b0e-afeb-8d77acef0595"}},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"11.19.0","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_1.2.0_1789463308768_0.23956186553827807","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"1.2.1":{"name":"signalk-stowage-mgmt","version":"1.2.1","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"author":{"name":"Tobias Rosenstock"},"license":"MIT","_id":"signalk-stowage-mgmt@1.2.1","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"feb253ff299d692fc44f8bb9d4dbb6e5043672ac","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-1.2.1.tgz","fileCount":70,"integrity":"sha512-so7iaQPuU+4wyb1RtgfH1ppyl172+p+yI+J/HG6wiZnUrNjwokjJcLbJoqOBguBJInaJo4QPAJNXvAMRpdrN4A==","signatures":[{"sig":"MEYCIQCKwaDIqBvTznJ4HGrtB473T02q0yiNdnmcmJhVVoFwTgIhAMqVRKMxFp4wllPs6mo3CbWPelvGUqGc2NnBTPyf39Te","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIEHjSFhb3dbC9055SUmxsthC6mX9cgUZF8ACWm0dUGQpAiEAyNbq3zzfrFAnX3q17am7KbKC90X4U6YFaqYsSiCQRUo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/signalk-stowage-mgmt@1.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1366847},"main":"plugin/index.js","engines":{"node":">=22.5.0"},"gitHead":"f3c6665a7654c3f0740713ac5e1bf5d1e0c9195a","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker"],"displayName":"Stowage Management","screenshots":["./docs/screenshots/inventory.png","./docs/screenshots/floorplan.png","./docs/screenshots/overview.png","./docs/screenshots/overview-touch.png","./docs/screenshots/categories.png","./docs/screenshots/stock-alerts.png","./docs/screenshots/store-log.png"]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7dc07a34-cb2f-4b0e-afeb-8d77acef0595"}},"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"11.19.0","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"tmp":"tmp/signalk-stowage-mgmt_1.2.1_1789587349710_0.5740417859020384","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"1.3.0":{"_id":"signalk-stowage-mgmt@1.3.0","bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"dist":{"shasum":"c2fcd58b79f59d9c7b7a73e777d49dbee8025980","tarball":"https://registry.npmjs.org/signalk-stowage-mgmt/-/signalk-stowage-mgmt-1.3.0.tgz","fileCount":70,"integrity":"sha512-5jsMS6v6lhIlmbRcgr6M48UD2sXCGbT4K9k2MsfjJ6zLpRtvIRFAgMWrAR5D5yagfegB/DSOH9blPlx1mcr6xw==","signatures":[{"sig":"MEUCIQCwseF8jKIKOaWA7SDzgwaJNMBUMXEoyHkyK3h1Q3/GgwIgGduUuJYF8XWTwrqoxrztv67/rcbb3JYoVga4lGTLv08=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHgmV1CYpSDisplfAD/lr4molsM+y4j3qzAhsrjOe6JCAiEAnsb3q1T37pvBcYirZrdRx1ZBu2YN9WH1O+uXMpccgH4="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/signalk-stowage-mgmt@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1376057},"main":"plugin/index.js","name":"signalk-stowage-mgmt","author":{"name":"Tobias Rosenstock"},"engines":{"node":">=22.5.0"},"gitHead":"209181fed67f3869c83db07c20e734a46e2d1040","license":"MIT","scripts":{"test":"node --test"},"signalk":{"appIcon":"./assets/icons/icon-512.png","recommends":["signalk-maintenance-tracker","@meri-imperiumi/signalk-status-tiles"],"displayName":"Stowage Management","screenshots":["./docs/screenshots/inventory.png","./docs/screenshots/floorplan.png","./docs/screenshots/overview.png","./docs/screenshots/overview-touch.png","./docs/screenshots/categories.png","./docs/screenshots/stock-alerts.png","./docs/screenshots/store-log.png"]},"version":"1.3.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7dc07a34-cb2f-4b0e-afeb-8d77acef0595"}},"homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"_npmVersion":"11.19.0","description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","directories":{},"maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"express":"^5.2.1"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/signalk-stowage-mgmt_1.3.0_1789650524495_0.10874545264806468"},"signalk-plugin-enabled-by-default":false}},"time":{"created":"2026-07-08T08:13:05.804Z","modified":"2026-09-17T13:08:44.912Z","0.2.3":"2026-07-06T23:06:06.387Z","0.2.4":"2026-07-06T23:20:21.394Z","0.3.2":"2026-07-08T08:13:06.023Z","0.3.3":"2026-07-08T08:52:17.411Z","0.3.6":"2026-07-09T06:06:36.301Z","0.5.0":"2026-07-09T06:59:16.498Z","0.5.4":"2026-07-09T09:18:53.713Z","0.6.0":"2026-07-09T21:03:58.898Z","0.6.1":"2026-07-09T21:15:31.467Z","0.7.2":"2026-07-10T15:22:24.071Z","0.8.1":"2026-07-11T09:59:31.409Z","0.8.2":"2026-07-12T09:36:13.212Z","0.8.4":"2026-07-12T15:41:58.079Z","0.8.6":"2026-07-13T19:03:49.150Z","0.8.7":"2026-07-13T21:58:16.062Z","0.8.8":"2026-07-14T12:11:29.985Z","0.8.9":"2026-07-14T15:03:57.509Z","0.8.10":"2026-07-15T11:26:31.189Z","0.8.12":"2026-07-17T16:07:21.369Z","0.8.13":"2026-07-21T16:56:47.725Z","0.8.14":"2026-07-26T21:58:01.885Z","0.9.2":"2026-07-27T07:34:56.737Z","0.9.3":"2026-07-28T15:44:22.171Z","0.9.4":"2026-07-30T17:39:28.697Z","0.9.5":"2026-07-30T18:10:59.725Z","0.9.6":"2026-08-01T08:09:52.849Z","0.9.7":"2026-08-01T18:48:11.001Z","0.9.8":"2026-08-01T20:08:44.270Z","0.9.9":"2026-08-02T18:10:27.250Z","1.0.0":"2026-08-03T08:32:42.767Z","1.0.1":"2026-08-07T08:08:17.412Z","1.1.0":"2026-08-08T18:54:22.375Z","1.1.1":"2026-08-12T11:19:22.976Z","1.1.2":"2026-08-20T07:58:13.701Z","1.2.0":"2026-09-15T09:08:28.911Z","1.2.1":"2026-09-16T19:35:49.808Z","1.3.0":"2026-09-17T13:08:44.588Z"},"bugs":{"url":"https://github.com/BoatHacks/signalk-stowage-mgmt/issues"},"author":{"name":"Tobias Rosenstock"},"license":"MIT","homepage":"https://github.com/BoatHacks/signalk-stowage-mgmt#readme","keywords":["signalk-node-server-plugin","signalk-webapp","signalk-category-utility"],"repository":{"url":"git+https://github.com/BoatHacks/signalk-stowage-mgmt.git","type":"git"},"description":"Organize items into containers and storage spaces, locate them, track item consumption, and lots more.","maintainers":[{"name":"humppafreak","email":"tr+npmjs@air-discordia.org"}],"readme":"# SignalK Stowage Management\n\n> ⚠️ **Warning:** this is 100% vibecoded AI slop, install and use at your own risk, and always remember: only you can prevent grey goo! never release nanobot assemblers without replication limiting code.\n\nInventory manager for Signal K Server. Organize items into containers and\nstorage spaces (nested to any depth), track actual vs. target quantities,\nattach photos and markdown notes, upload an SVG floorplan of your boat, map\nareas on the floorplan to storage spaces, and make the matching area blink\n(or pop open a contents list) when you search for an item.\n\n## Installation\n\n**Requires Node.js 22.5.0 or newer** (uses the built-in `node:sqlite` module —\nno native dependencies to compile, so installation is simple on any platform,\nincluding the Signal K App Store's script-free install process).\n\n**Not compatible with Victron Cerbo GX / Venus OS**, at least as of this\nwriting — those ship Node.js 20, which predates `node:sqlite`. This plugin\nwon't run there until Venus OS bundles a newer Node.js version.\n\n**Via the Signal K App Store (recommended):** open the Signal K Admin UI,\ngo to **Server → App Store**, search for \"Stowage Management\", and click\n**Install**. Restart the server when prompted, then enable the plugin under\n**Server → Plugin Config**.\n\n**Manual installation**, if you'd rather not use the App Store:\n\n1. Copy the folder into your Signal K directory, e.g.\n   `$HOME/.signalk/node_modules/signalk-stowage-mgmt` — or develop locally and\n   link it in with `npm link` (see the Signal K plugin docs).\n2. Install dependencies:\n   ```\n   cd signalk-stowage-mgmt\n   npm install\n   ```\n3. Restart the Signal K server.\n4. In the Admin UI, enable the plugin under **Server → Plugin Config**\n   (\"Stowage Management\").\n5. The webapp is then available at:\n   `http://{skserver}:3000/signalk-stowage-mgmt/`\n   (also linked from the Webapps list in the Admin UI, as \"Stowage\n   Management\").\n\n## Configuration\n\nSet in the plugin's config page in the SignalK Admin UI\n(Server → Plugin Config → Stowage Management):\n\n- **Automatically switch light/dark theme based on sun position**\n  (off by default). When on, the webapp's theme follows\n  `vessels.self.environment.sun` (preferred — one of dawn, sunrise, day,\n  sunset, dusk, or night; published by a plugin like\n  `signalk-derived-data`) or, if that's not available,\n  `vessels.self.environment.mode` (a simpler day/night fallback some\n  setups use instead). Everything except \"day\" is treated as dark, to\n  protect night vision from dusk through dawn rather than only once it's\n  fully dark. Overrides the manual light/dark toggle in the header (see\n  \"Header controls\" below) while it's on; if neither path has a\n  recognized value yet, the manual/OS-preference theme is left alone.\n\n- **Dynamic +/- scale for touch interface** (off by default). When on,\n  the Overview tab's Touch view shows up to four quick-adjust buttons per\n  chip instead of two: a coarse step and a fine step on each side (e.g.\n  −1000 / −100 / +100 / +1000 for a quantity in the thousands), scaled to\n  the quantity being adjusted based on digit count (so a round number\n  like 5000 doesn't get an oversized step just for being round). For\n  single-digit quantities the coarse and fine steps are the same, so only\n  one +/- pair is shown. Useful once you're tracking bulk goods by weight\n  or volume (e.g. grams) rather than by piece.\n\n- **Server URL for QR labels** (blank by default). The absolute base URL\n  (e.g. `http://192.168.1.50:3000`) a printed location QR label's link\n  points at. Signal K plugins can't reliably auto-detect the right LAN\n  address/hostname, so the Print Labels UI pre-fills a working guess from\n  the browser's own address when you open it — only set this if that\n  guess would be wrong (e.g. labels generated from a device other than\n  the boat's own display).\n\n- **Item detail page sections** (all five shown, in this order, by\n  default: Placements, Floorplan, History, Properties, Attachments).\n  Remove a section from the list to hide it on the item detail page, or\n  reorder the list to change where it appears. Removing all five still\n  leaves the page's header (name, photo, quantity). When Floorplan is\n  hidden, Placements shows a \"Locate on floorplan\" button instead.\n\n- **Publish stock alert status to Signal K** (on by default). Publishes\n  the three `notifications.stowage.*` paths described in \"Signal K\n  paths\" below. Turn off to keep stowage data entirely out of the SK\n  bus/alarm system.\n\n- **Consumption forecast window / runway warning / runway critical /\n  inventory staleness / expiring-soon window** (days; default 30 / 7 / 2\n  / 7 / 14). Thresholds behind the notifications below — see that\n  section for what each one controls.\n\n## Usage\n\n**Header controls (present on every tab):** a search box (see \"Search\"\nbelow); an **Edit mode** toggle; and a light/dark theme toggle (see\n\"Configuration\" above for automatically switching this based on sun\nposition instead).\n\nEdit mode is off by default. While it's off, each item/container/storage-\nspace chip's action buttons (edit, photo, split, move, delete, add\ncategory — or add-storage-space/add-container/add-item/rename/delete/\nmove for a location) are collapsed behind a single \"...\" button, to keep\nthe tree uncluttered — click it to temporarily reveal that one chip's\nbuttons (only one chip's menu stays open at a time; opening another one,\nor flipping the global toggle, collapses it back). Turning Edit mode on\nshows every chip's buttons everywhere, all the time, with no \"...\" at\nall. This is unrelated to the Floorplan tab's own \"Edit\"/\"Save\" toggle\n(for assigning floorplan areas — see below); the two don't interact.\n\n**Inventory (tab):**\n\n![Inventory tab](docs/screenshots/inventory.png)\n\n- \"+ Storage Space\" (toolbar) creates a new top-level storage space (e.g.\n  \"Lazarette\"). Every node also has its own \"+ Storage Space\", for nesting\n  one inside another (e.g. \"Port Locker\" inside \"Aft Cabin\") — storage\n  spaces can be mapped to a floorplan area at any depth, not just at the\n  top level.\n- Every node (storage space or container, at any depth) is collapsible\n  (expanded by default) — click the ▾/▸ arrow next to the name to fold it\n  up. Collapsed, it shows a summary instead of its contents: \"*n* spaces,\n  *n* containers, *n* items\" (nested storage spaces/containers at any\n  depth, and items anywhere in the subtree — a split item counts once\n  even if only some of its placements fall inside). \"Collapse All\"/\n  \"Expand All\" in the toolbar toggles every node at once.\n- Per node: \"+ Container\" (nestable to any depth), \"+ Item\", plus icon\n  buttons on each item: edit (properties), photo, split, move, delete,\n  add category (collapsed behind \"...\" unless Edit mode is on — see\n  \"Header controls\" above).\n- Containers can be dragged directly onto another container or storage\n  space to move them (or dragged onto the floating \"Not Stored\" panel to\n  detach them to the top level). Items can likewise be dragged onto any\n  storage space/container, or dragged straight onto an assigned floorplan\n  area to stow them there. Storage spaces aren't draggable — once placed,\n  re-parenting one takes deleting and recreating it under the new parent.\n- Items show actual quantity (click to edit inline, with +/- steppers) and\n  target quantity, if set, as \"×3 / 6\".\n- \"Export as Markdown\" renders the whole inventory tree — every storage\n  space and container (marked `*S*`/`*C*` after its name, so the type\n  survives being flattened into plain headings), including empty ones,\n  nested to any depth, with items with quantities/targets, plus a \"Not\n  Stored\" section for orphans — into a copyable markdown document. Doesn't\n  include categories, notes, expiration dates, photos, or attachments;\n  use \"Export to JSON\" for a complete, lossless snapshot instead.\n- \"Export to JSON\" downloads a full snapshot (see the API table below for\n  exactly what's in it). \"Import from JSON\" **replaces** the current\n  inventory with a previously exported file, after a confirmation dialog —\n  it's a restore, not a merge, so export a fresh backup first if you're\n  not sure. \"Merge from JSON\" instead **adds** the file's contents\n  alongside what's already there, without deleting anything — useful for\n  combining inventories from two sources, or bulk-adding via a\n  hand-edited/externally-generated JSON file. See `POST /import`'s\n  `mode` field in the API table below for the id/name-collision policy it\n  applies.\n- \"Print Labels\" (toolbar) opens a page to select any storage space or\n  container (any depth) — or \"Select All\"/\"Select None\" to toggle every\n  one at once — and print a QR-coded label for each. Scanning one opens\n  this webapp with that location expanded in the Inventory tab, so a\n  locker/bin can carry a label that jumps straight to what's supposed to\n  be inside it. Each node also has its own single-label \"Print QR label\"\n  action, for printing just one without the batch page. See \"Server URL\n  for QR labels\" under Configuration if labels end up\n  pointing at the wrong address.\n- The floating \"Not Stored\" panel (bottom/top-right of the screen,\n  depending on context) lists any containers with no parent and any items\n  with no location — normally hidden, it appears automatically whenever\n  something is orphaned or while a drag is in progress, and doubles as a\n  drop target to detach things.\n- **Splitting an item's stock across locations:** click \"Split\" on any\n  item chip (works whether the item is already split or not), choose a\n  destination and quantity, and it appears at both places. A split item\n  renders as one chip per location, each showing that location's own\n  quantity — editable inline just like a normal item's (setting it to 0\n  removes that placement; if only one location is left, the item\n  automatically reverts to being a plain, unsplit item); drag a specific\n  chip to move just that portion; use \"Split\" again to redistribute\n  further. The item's overall quantity is always the sum of its\n  placements, and is read-only in the Item Properties dialog (and on the\n  Understocked page, since there's no single location to attribute a\n  change to) — edit it via a placement chip or the Split dialog instead;\n  name, notes, target quantity, photo, and categories stay item-level and\n  editable as normal regardless. While dragging any item, a floating\n  \"Drop here to split\" panel appears (alongside \"Not Stored\") — dropping\n  onto it opens the Split dialog for whatever you were carrying,\n  defaulting the source to wherever it was just dragged from. Searching\n  for or locating a split item blinks every one of its mapped areas on\n  the floorplan at once.\n\n**Item properties (edit icon on any item):**\n- Name, actual quantity, target quantity (leave blank for \"no target\").\n- **Default Storage Location** (split items only, optional): pick one of\n  the item's current placement locations — listed by full breadcrumb path\n  (e.g. \"Aft Cabin → Locker\"), not just the bare name, since nested\n  storage spaces can share a name at different depths — e.g. beans mostly\n  live in the galley, but there are a few extra cans in the bilge too, so\n  \"Galley\" is\n  the default. The quick +/− quantity editors elsewhere (Overview,\n  Categories, the Touch view's big buttons) act on the stock at this\n  location specifically, showing its quantity rather than the total\n  across all locations (a tooltip on the quantity gives the total).\n  Without a default set, those quick editors stay disabled for a split\n  item — same as always, use Split instead. Automatically cleared if that\n  placement is later fully drained, merged into a different location via\n  a move, or the item collapses back to a single (plain) location\n  entirely — the \"use Split instead\" quick editors just go back to being\n  disabled in that case, nothing is lost.\n- Notes: a small dependency-free markdown editor with **Show** (rendered\n  preview, default) and **Edit** (raw markdown) tabs. Supports headings,\n  **bold**, _italic_, `code`, links, and lists.\n- Photo (separate camera icon): upload an image, drag to pan and use the\n  slider to zoom, then save a square-cropped thumbnail. Shown on the item\n  row, the Overview table, and the Stock Alerts tab.\n- Attachments: upload any file (manuals, spec sheets, receipts — no size\n  limit or type restriction). Click one to open/download it via the\n  browser's native handling. Stored on disk, not in the database.\n\n**Floorplan (tab):**\n\n![Floorplan tab](docs/screenshots/floorplan.png)\n\n- Don't have an SVG floorplan of your boat yet? [ClearShip's free Boat\n  Floor Plan Editor](https://clearship.app/tools/floor-plan) is a nice\n  way to make one — draw your layout in the browser with predefined\n  hull/berth/galley/engine symbols, or trace over a photo of your\n  manual's deck plan, then export straight to SVG. No signup, nothing\n  leaves your browser, and the exported file drops right into the\n  upload step below.\n- Only the single most recently uploaded SVG is shown. Uploading a new one\n  replaces it. If the new SVG has elements with the **same id** as ones your\n  storage spaces were already mapped to, those assignments carry over\n  automatically — no need to re-map anything just because you touched up\n  the file in your SVG editor. Only storage spaces whose matching area is\n  genuinely gone (a different or removed id) will lose their assignment,\n  and you'll get a confirmation warning naming exactly those, since that\n  part can't be undone.\n- **Important:** only SVG elements (`path`, `polygon`, `rect`, `circle`,\n  `ellipse`) that already have a **custom** `id` attribute in the SVG\n  source can be clicked and assigned. Auto-generated IDs from your SVG\n  editor (e.g. Inkscape's default `path10340`, `rect4821-3`, etc.) are\n  ignored, so tracing a floorplan without renaming anything won't turn\n  every single shape into a storage area. Give the shapes you want to use\n  a custom ID, e.g. in Inkscape's \"Object Properties\" panel, or by editing\n  the SVG source directly.\n- **Display mode** (default): click an area to pop open a panel showing\n  everything stored in the matching storage space (fully interactive —\n  same container/item rendering as the Inventory tab).\n- **Edit mode** (toggle via the \"Edit\"/\"Save\" button): unassigned areas are\n  highlighted light blue. Click an area to open the assignment dialog,\n  where you can pick an existing storage space, or type a name and click\n  \"+ Storage\" to create a new one on the spot and assign it in one step —\n  the field is pre-filled with a name guessed from the area's SVG id\n  (e.g. `area-navtable` → \"Navtable\"), which clears on first click so you\n  can type your own. Existing storage spaces are listed by their full path\n  (e.g. \"Aft Cabin → Port Locker\"), not just their bare name, since nested\n  storage spaces can share a name at different depths (e.g. a \"Port\n  Locker\" under both Aft Cabin and Fwd Cabin).\n- If two areas visually overlap on the floorplan (e.g. a locker drawn\n  above a berth, with storage space behind/below it), only the topmost one\n  is clickable. For the one underneath, use the **\"ID\"** button on\n  that storage space (in the Inventory tree) to type its SVG element id\n  directly instead — no click required. Leave the field blank to remove\n  the mapping.\n\n**Categories (tab):**\n\n![Categories tab](docs/screenshots/categories.png)\n\n- \"+ Category\" creates a new category. Four defaults are seeded on first\n  start: \"food\", \"spare part\", \"equipment\", \"tools\".\n- Each category is a collapsible fold-down; click its header to expand and\n  see every item that carries it (with location and the full item row,\n  fully interactive). Rename or delete from the header; the count shown is\n  how many items currently carry that category. Clicking an item (its\n  location text or thumbnail/name — not one of its own action buttons)\n  jumps to the Floorplan tab and makes the matching area blink, same as\n  clicking a row on the Overview tab or picking a search result.\n- Deleting a category removes it from every item that had it — the items\n  themselves are untouched.\n\n**On each item:**\n- Category badges are shown under the item; click the \"×\" on a badge to\n  remove that category, or use the category dialog to toggle several at\n  once by clicking chips (green = assigned).\n- An item can carry any number of categories at once.\n\n**Overview (tab):**\n\n![Overview tab](docs/screenshots/overview.png)\n\n- Table of all items with thumbnail, actual quantity (click to edit\n  inline, same as everywhere else — except for a split item, which shows\n  a tooltip pointing you at Split instead), target quantity, direct\n  location, full path (e.g. \"Lazarette → Tool box\"), categories, and\n  whether the location is mapped on the floorplan.\n- Click column headers to sort, use the text field to filter by item name,\n  direct location, and path.\n- Clicking a row jumps to the Floorplan tab and makes the area blink, same\n  as search (if it's mapped).\n- **Touch view** (toggle next to \"Table\" in the toolbar):\n\n  ![Overview tab, Touch view](docs/screenshots/overview-touch.png)\n\n  A touchscreen-friendly alternative — every item as a big square chip\n  (thumbnail, name, direct location) with its own always-visible −/+\n  buttons for quick stock adjustment, no click-to-reveal step (a split\n  item's buttons are disabled, same \"use Split instead\" reasoning as the\n  table view). Sort by **Recent Activity** (default — items with the most\n  actual-quantity changes in the last 30 days first, ties broken\n  alphabetically) or **Alphabetical**. A location dropdown filters to only\n  items stored at or below a chosen storage space/container, at any\n  depth. Tapping a chip's body (not its −/+ buttons) locates it on the\n  floorplan, same as the table view.\n\n**Stock Alerts (tab):**\n\n![Stock Alerts tab](docs/screenshots/stock-alerts.png)\n\n- Lists every item that's understocked (target quantity set and actual\n  below it), expiring (already expired, or expiring within 14 days — a\n  fixed window for now), or both — most urgent first (expiring items\n  soonest/most-overdue first, then understocked-only items alphabetically).\n  Each shown as a large-thumbnail chip with name, an \"Understocked\" and/or\n  \"Expiring\" badge, editable actual quantity, target quantity, and an edit\n  button.\n- Set an optional expiration date on an item via the Item Properties\n  dialog. One date per item — if you buy the same thing at different\n  times with different expiration dates, there's currently no way to\n  track those as separate batches on a single item (create separate items\n  if you need that today; see `ROADMAP.md`).\n- Its \"Export as Markdown\" button produces a shopping list grouped by\n  shop, covering both understocked and expiring items — an expiring item\n  is treated as if it had 0 in stock (so it's listed at its full target\n  quantity, or its current on-hand quantity if no target is set), with\n  an \"expires \\<date\\>\" note appended. To assign an item to a shop, put a\n  line reading `source: <shop name>` anywhere in that item's notes (e.g.\n  `source: West Marine`) — it can be on its own line alongside other\n  notes text, and matching is case-insensitive. Items without a `source:`\n  line are grouped under \"No Shop Specified\". Within each shop's group,\n  items are sorted by category.\n- Expiration status isn't tracked in the Store Log.\n\n**Store Log (tab):**\n\n![Store Log tab](docs/screenshots/store-log.png)\n\n- An audit trail of item creation, actual/target quantity changes,\n  deletion, and splits — useful for questions like \"how many rolls of\n  toilet paper did we use last month?\" Moving an item (or one placement\n  of a split item) between locations is not logged.\n- Preset buttons (Last Week/Month/Quarter/6 Months/Year) or manual date\n  pickers set the range shown, shared across all five sections below.\n- **Individual Movements**: one row per movement event (item creation,\n  quantity increase/decrease, or deletion), newest first — item, Added or\n  Used amount, the location it was added to or used from (the specific\n  placement's location for a split item; blank for events before this\n  was added), timestamp, and note.\n- **Aggregate Movements**: Added/Used totals per item across the whole\n  date range, sorted by Used, descending. No location column — it's a\n  per-item summary, not a per-event one.\n- **Target Adjustments**: a plain chronological list (target quantity is a\n  goal, not a consumed resource, so it isn't aggregated) — From, To, date,\n  and the note if one was left.\n- **Splits**: a chronological list of split actions — Item, From, To,\n  Quantity, date, and the note if one was left. Ordinary moves (including\n  moving a single placement of a split item) aren't split actions and\n  don't appear here.\n- **Predicted Runway**: for items with at least 3 separate consumption\n  events within the selected date range, projects a consumption rate\n  (total consumed ÷ days in range) and estimates days remaining and an\n  approximate run-out date from the item's current stock. Items with\n  fewer than 3 qualifying events in the range aren't shown — not enough\n  data to estimate a rate. Sorted soonest-to-run-out first. Restocking\n  doesn't affect the rate, only the current-stock starting point.\n- Adding a note to a quantity change: only available from the Item\n  Properties dialog's Save action, not the quick inline quantity editor.\n- Each section has its own \"Export as Markdown\" button, producing just\n  that section's table as its own document.\n\n**Search:**\n- Type into the search box at the top; it does two things at once:\n  - Live-filters the Inventory tab's tree and the Overview tab's table/\n    touch rows down to matching items as you type (matching either the\n    item's name/notes, or the name of a location — a location match\n    reveals its whole contents, not just the matching item). Clearing the\n    box restores the full view. Overview no longer has its own separate\n    filter field — this one box drives both tabs.\n  - Shows a dropdown of matching results (name/notes match, with a short\n    snippet of surrounding text when the match is only in notes);\n    clicking one opens that item's detail page (see \"Item detail page\"\n    below).\n\n**Item detail page:**\n- Opened by clicking a search result, an item chip's \"View details\"\n  action, or an Overview row/chip.\n- Shows the item's placements (with large +/- quantity editors), the\n  mapped floorplan area(s) inline (blinking, the same way search used to\n  jump to the Floorplan tab and blink — or, if that Floorplan section is\n  hidden via config, a \"Locate on floorplan\" button in Placements does the\n  jump instead), its log history, properties (photo, categories,\n  expiration, notes), and attachments — each section independently\n  configurable, see \"Configuration\" above.\n- Deep-linkable: `<server-url>/signalk-stowage-mgmt/?item=<item-id>`\n  opens the page directly, the same way a QR label's `?location=<id>` link\n  opens the Inventory tab (see \"Known external consumers\" below). Note this\n  is the webapp's own static mount (the plugin's package name, served at\n  the server root) — not `/plugins/signalk-stowage-mgmt/`, which is the\n  separate JSON API mount and has no page to serve at `/`.\n\n## Data model\n\nSQLite database stored under the Signal K data directory (`inventory.db`).\nAll primary keys are UUIDs (`TEXT`), all tables have `created_at` (or\n`uploaded_at`) defaulting to the current timestamp.\n\n**`floorplans`**\n\n| Column | Type | Notes |\n|---|---|---|\n| `id` | TEXT, PK | |\n| `name` | TEXT | Filename the SVG was uploaded as (extension stripped) |\n| `svg_content` | TEXT | Raw SVG markup, stored as-is |\n| `uploaded_at` | TEXT | Used to determine \"most recent\" for display |\n\nOnly the most recently uploaded floorplan is ever shown in the UI; older\nrows are deleted (after their area mappings are cleared) when a new one is\nuploaded, so in practice this table normally holds at most one row.\n\n**`locations`** — storage spaces and containers share one table\n\n| Column | Type | Notes |\n|---|---|---|\n| `id` | TEXT, PK | |\n| `name` | TEXT | |\n| `type` | TEXT | `storage_space` or `container` (CHECK constraint) |\n| `parent_id` | TEXT, FK → `locations.id` | `ON DELETE SET NULL`. Nesting: containers can nest inside containers or storage spaces to any depth; storage spaces can likewise nest inside another storage space or container to any depth (or have `parent_id = NULL` for top-level) — a storage space maps to a floorplan area independently of its own nesting depth |\n| `floorplan_id` | TEXT, FK → `floorplans.id` | `ON DELETE SET NULL`. Only meaningful on `storage_space` rows |\n| `svg_element_id` | TEXT | The `id` attribute of the matched SVG shape. Only meaningful on `storage_space` rows |\n\n**`items`**\n\n| Column | Type | Notes |\n|---|---|---|\n| `id` | TEXT, PK | |\n| `name` | TEXT | |\n| `actual_quantity` | INTEGER, default 1 | How many you actually have. For a split item (see `item_placements` below), this is the sum of its placements' quantities and can only change via `POST /items/:id/split` (reallocating between locations) or `PATCH /items/:id/placements/:placementId` (changing one placement's quantity directly) |\n| `target_quantity` | INTEGER, nullable | Desired stock level; `NULL` means \"no target set\" and excludes the item from the Stock Alerts tab's understocked check regardless of `actual_quantity` |\n| `notes` | TEXT, nullable | Free-text, rendered as markdown in the UI. (Earlier versions had a separate `description` column; it was merged into `notes` and dropped.) |\n| `location_id` | TEXT, FK → `locations.id` | `ON DELETE SET NULL`. `NULL` means \"not stored anywhere\" **or** \"this item is split across locations\" — check `item_placements` to tell which |\n| `thumbnail` | TEXT, nullable | Square-cropped photo as a `data:` URI (JPEG), or `NULL` |\n| `expires_at` | TEXT, nullable | Optional expiration date (`YYYY-MM-DD`). Not tracked in `item_log` |\n| `default_location_id` | TEXT, FK → `locations.id`, nullable | `ON DELETE SET NULL`. Only meaningful for a split item — must match one of its current `item_placements`' `location_id` (enforced on write). The quick +/− quantity editors (Overview, Categories, the Touch view) act on this placement's quantity when set, instead of staying disabled. Automatically cleared back to `NULL` whenever that placement is drained to 0, merged elsewhere via a move, or the item collapses back to a single (plain) location |\n\n**`item_placements`**\n\n| Column | Type | Notes |\n|---|---|---|\n| `id` | TEXT, PK | |\n| `item_id` | TEXT, FK → `items.id` | `ON DELETE CASCADE` |\n| `location_id` | TEXT, FK → `locations.id`, nullable | `ON DELETE SET NULL`. `NULL` means this portion is unassigned (\"no location\") |\n| `quantity` | INTEGER | |\n\nAn item has **no** rows here in the normal case — its stock lives entirely\nin `items.location_id`/`actual_quantity`. Rows only appear once an item has\nbeen split across two or more locations via `POST /items/:id/split`, at\nwhich point `items.location_id` becomes `NULL` and `items.actual_quantity`\ntracks the sum. If a split later collapses back down to a single location\n(e.g. moving everything back together), the placement rows are removed and\nthe item reverts to the plain representation automatically.\n\n**`item_log`**\n\n| Column | Type | Notes |\n|---|---|---|\n| `id` | TEXT, PK | |\n| `item_id` | TEXT | Not a foreign key — rows survive item deletion |\n| `item_name` | TEXT | Snapshotted at the time of the event, so history reads correctly after renames |\n| `event` | TEXT | `created`, `actual_quantity`, `target_quantity`, `deleted`, or `split` |\n| `old_value` / `new_value` | INTEGER, nullable | The quantity before/after. `NULL` for a target quantity that was unset, or for a `split` event (see `from_location_id` etc. below instead) |\n| `delta` | INTEGER | `new_value - old_value`. Always `0` for a `split` event, since splitting reallocates existing stock rather than adding or removing it |\n| `note` | TEXT, nullable | Optional, set via the Item Properties dialog (quantity changes) or the Split dialog (splits) |\n| `from_location_id` / `from_location_name` | TEXT, nullable | The location for a \"used from\" movement: the `from` side of a `split` event, or the item's (or specific placement's) location for an `actual_quantity` decrease or a `deleted` event. `NULL` for an `actual_quantity` increase, a `created` event, an unlocated item, or a row written before this was added. Deleting a *split* item sets `from_location_name` to a descriptive `\"Split (N locations)\"` with `from_location_id` left `NULL`, since there's no single location to point at. Name is snapshotted, same reasoning as `item_name` |\n| `to_location_id` / `to_location_name` | TEXT, nullable | The location for an \"added to\" movement: the `to` side of a `split` event, or the item's (or specific placement's) location for an `actual_quantity` increase or a `created` event. Same nullability/snapshotting conventions as `from_location_id` |\n| `quantity` | INTEGER, nullable | Set only for `split` events — how many units moved |\n| `created_at` | TEXT | |\n\nA row is written whenever an item is created, its `actual_quantity` or\n`target_quantity` changes, it's deleted (logged as using up whatever\nquantity remained), or its stock is split across locations via\n`POST /items/:id/split`. Moving an item (or one placement of a split item)\nbetween locations is **not** logged — only the act of splitting is.\n\n\n**`categories`**\n\n| Column | Type | Notes |\n|---|---|---|\n| `id` | TEXT, PK | |\n| `name` | TEXT, UNIQUE | |\n\n**`item_categories`** — many-to-many join table\n\n| Column | Type | Notes |\n|---|---|---|\n| `item_id` | TEXT, FK → `items.id` | `ON DELETE CASCADE` |\n| `category_id` | TEXT, FK → `categories.id` | `ON DELETE CASCADE` |\n\nComposite primary key `(item_id, category_id)`.\n\n**`item_attachments`**\n\n| Column | Type | Notes |\n|---|---|---|\n| `id` | TEXT, PK | Also used as the on-disk filename |\n| `item_id` | TEXT, FK → `items.id` | `ON DELETE CASCADE` |\n| `filename` | TEXT | Original filename as uploaded — display-only, never used to build a filesystem path |\n| `mime_type` | TEXT | From the upload's `Content-Type` header |\n| `size` | INTEGER | Bytes |\n| `uploaded_at` | TEXT | |\n\nUnlike `thumbnail` (a small `data:` URI stored inline), attachment files are\nunbounded in size and count, so they're **not** stored in SQLite — only\nthis metadata row is. The file itself lives on disk at\n`<dataDir>/attachments/<item_id>/<attachment_id>`, deleted individually via\n`DELETE /items/:id/attachments/:attachmentId` or all at once (best-effort)\nwhen the item itself is deleted.\n\nIndexes exist on `locations.parent_id`, `locations.floorplan_id`,\n`items.location_id`, `item_categories.category_id`, and\n`item_attachments.item_id`.\n\n## Signal K paths\n\nThree notifications, recomputed after every write that can change stock or\nexpiration status, plus an hourly timer to catch pure calendar drift (a\nforecast's days-remaining shrinking, or an item crossing into the expiring\nwindow with no new write at all). Each is `{state, method: [], message}`,\n`state` one of `normal`/`warn`/`alarm`. Disable entirely via \"Publish stock\nalert status to Signal K\" above.\n\n- **`notifications.stowage.stock`** — `alarm` if any item is out of stock\n  (`actual_quantity <= 0`), or forecasted to run out within the runway\n  critical threshold; `warn` if any item is understocked\n  (`actual_quantity < target_quantity`), forecasted to run low within the\n  runway warning threshold, or there's been no inventory activity\n  (`item_log`) in the staleness threshold. The forecast is a per-item\n  consumption rate over the trailing forecast window (same idea as the\n  Store Log tab's Predicted Runway column, requiring 3+ consumption events\n  in the window before trusting a rate).\n- **`notifications.stowage.expiring`** — `alarm` if any item is already\n  past its expiration date; `warn` if any item expires within the\n  expiring-soon window and none are already expired.\n- **`notifications.stowage.overall`** — the worse of the two states above,\n  one path for a single glance at stores health.\n\nFor [signalk-status-tiles](https://github.com/meri-imperiumi/signalk-status-tiles)\nusers: the plugin ships ready-made tiles for all three paths via a\n`statusTileExamples` resource provider — open the tiles screen's \"+\"\nbutton to add them.\n\n## API (under `/plugins/signalk-stowage-mgmt`)\n\nAlso published as an OpenAPI 3.0 spec (`openApi.json`), which renders in\nthe Signal K Admin UI under **Documentation → OpenAPI** once the plugin is\nenabled.\n\nAll request/response bodies are JSON. Errors are `{ \"error\": \"...\" }` with\nan appropriate HTTP status code.\n\n**Known external consumers**\n\n`signalk-maintenance-tracker`'s `inventory-interaction` feature calls this\nAPI directly — the first (and so far only) external consumer. It depends on:\n\n- `GET /items` — called same-origin, straight from its browser frontend\n  (parts picker, stock badges), not proxied through its own backend.\n- `GET /items/:id` — backend lookup before decrementing stock.\n- `PATCH /items/:id` — decrements `actual_quantity` for non-split items.\n- `PATCH /items/:id/placements/:placementId` — same, per-placement, for\n  split items.\n- The `Item` shape's `id`, `name`, `actual_quantity`, `target_quantity`,\n  and `placements` (each `{ id, location_id, quantity }`).\n- The `{ \"error\": \"...\" }` error shape, to distinguish \"no such item\" from\n  \"route doesn't exist\" on `GET /items/:id`'s 404.\n- The `?item=<item-id>` deep link (see \"Item detail page\" above) — the\n  intended way for `signalk-maintenance-tracker` to link straight into\n  this plugin's item detail page, e.g. from its own parts-picker UI.\n\n**A note on auth for this integration:** every route above lives under\n`/plugins/signalk-stowage-mgmt/*`, the same prefix every SignalK plugin's\nroutes are mounted under — and, like any other plugin route, it's covered\nby Signal K's own security layer, not by anything this plugin adds itself.\nWith security **disabled** (the common case for a private, on-boat\nserver), all of the above works with no auth from any origin. With\nsecurity **enabled**, a same-origin browser call from another plugin's\nfrontend — such as `signalk-maintenance-tracker`'s `GET /items` and\n`PATCH /items/:id` above — needs a session already authenticated with\nsufficient permission, exactly as if it were calling any of this plugin's\nown admin-UI-driven routes. There's no separate read-only/anonymous access\ntier for this API the way there is for Signal K's own resource-provider\nendpoints (which stay readable under `allow_readonly` regardless of the\nsecurity setting) — with security on and no authenticated session, callers\nget a 401/403, not degraded read-only access. Keep this in mind before\nrelying on a same-origin fetch from another plugin's frontend on a\nsecurity-enabled server.\n\nThere's no version negotiation between the two plugins, so a breaking\nchange to any of the above won't fail loudly on either side — it'll just\nsilently break the integration. **Call this out explicitly in the\nCHANGELOG** when it happens, even if the change doesn't touch this\nplugin's own frontend at all. (See issue #18 for the fuller discussion —\nno versioning/deprecation process beyond this is planned for now.)\n\n**Locations** (storage spaces & containers)\n\n| Method & path | Purpose |\n|---|---|\n| `GET /locations` | List all locations |\n| `POST /locations` | Create. Body: `{ name, type, parent_id? }` (`type` is `storage_space` or `container`) |\n| `PATCH /locations/:id` | Rename. Body: `{ name }` |\n| `PATCH /locations/:id/move` | Re-parent. Body: `{ parent_id }` (omit/null for top-level). Rejects cycles |\n| `PATCH /locations/:id/svg-mapping` | Assign/clear a floorplan area. Body: `{ floorplan_id, svg_element_id }` (storage spaces only) |\n| `DELETE /locations/:id` | Delete (only if it has no child locations or items) |\n\n**Items**\n\n| Method & path | Purpose |\n|---|---|\n| `GET /items` | List all items, each with a `categories` array (`[{ id, name }]`) and a `placements` array (empty unless split — see below). Optional `?q=<text>` filters to items whose **name** contains the text (case-insensitive substring match; notes aren't searched). Returns every match, unbounded |\n| `GET /items/:id` | Get a single item, same shape as an entry in the list above |\n| `POST /items` | Create. Body: `{ name, actual_quantity?, target_quantity?, notes?, location_id?, category_ids?, note?, expires_at? }`. `note` is recorded in the item log for the initial quantity, not stored on the item itself |\n| `PATCH /items/:id` | Partial update. Body: any of `{ name, actual_quantity, target_quantity, notes, note, expires_at, default_location_id }`. `target_quantity`/`notes`/`expires_at`/`default_location_id` support explicit `null` to clear them (distinct from omitting the key, which leaves them unchanged). `note` is logged against whichever of `actual_quantity`/`target_quantity` changed in this request (both, if both changed) — it isn't a field on the item itself. `expires_at` and `default_location_id` changes are not logged. **`actual_quantity` is rejected with 400 if the item is split** — use `PATCH /items/:id/placements/:placementId` (change one placement's quantity) or `POST /items/:id/split` (reallocate between locations) instead. **`default_location_id` is rejected with 400 unless it's `null`/omitted or matches one of the item's current placement locations** |\n| `PATCH /items/:id/thumbnail` | Set/clear the photo. Body: `{ thumbnail }` — a `data:` URI string, or `null`/omitted to remove it |\n| `PATCH /items/:id/move` | Move a whole (unsplit) item to a different location. Body: `{ location_id }` (omit/null to unassign). Not logged. **Rejected with 400 if the item is split** — move a specific placement via the endpoint below instead |\n| `GET /items/:id/placements` | List an item's placements (`[{ id, location_id, location_name, quantity }]`). Empty array means it isn't split |\n| `PATCH /items/:id/placements/:placementId/move` | Move one placement of a split item to a different location. Body: `{ location_id }` (omit/null for \"no location\"). Not logged, same as an ordinary move |\n| `PATCH /items/:id/placements/:placementId` | Set one placement's quantity directly — the split-item equivalent of editing `actual_quantity`. Body: `{ quantity, note? }`. Logged as an ordinary `actual_quantity` event (not `split`), since this is a real stock change, not a reallocation. Setting a placement to `0` removes it; if that leaves only one placement, the item automatically reverts to the plain (unsplit) representation |\n| `POST /items/:id/split` | Move `quantity` units of an item from `from_location_id` to `to_location_id` (both nullable, for \"no location\"), splitting the item across locations if it wasn't already. If not yet split, `from_location_id` must match the item's current `location_id`. If a split collapses everything back into one location, the item automatically reverts to the plain (unsplit) representation. Body: `{ from_location_id?, to_location_id?, quantity, note? }`. Always logged as a `split` event |\n| `POST /items/:id/categories` | Add a category. Body: `{ category_id }` |\n| `DELETE /items/:id/categories/:categoryId` | Remove a category |\n| `DELETE /items/:id` | Delete the item. Logs a `deleted` event using up whatever quantity remained |\n| `GET /items/:id/locate` | For a normal item: walks the parent chain upward until it finds a mapped storage space; returns `{ item_id, path, floorplan_id, svg_element_id, storage_space }`, or 404 with the (unmapped) `path` if none is found. For a **split** item: returns `{ item_id, split: true, matches: [...] }` — one entry per placement that resolves to a mapped storage space (placements with no mapped area are silently skipped; 404 only if none resolve) |\n| `GET /items/:id/attachments` | List an item's attachments (`[{ id, item_id, filename, mime_type, size, uploaded_at }]`) |\n| `POST /items/:id/attachments` | Upload a file. **Body is the raw file bytes**, not JSON — set `Content-Type` to the file's MIME type, and pass the original filename URI-encoded in the `X-Filename` header. No size limit, no file-type restriction |\n| `GET /items/:id/attachments/:attachmentId` | Download/view the raw file, with its original `Content-Type` and a `Content-Disposition` set from `filename` — the browser handles it natively (inline for PDFs/images, download for anything else) |\n| `DELETE /items/:id/attachments/:attachmentId` | Delete an attachment (row + file on disk) |\n\n**Item Log**\n\n| Method & path | Purpose |\n|---|---|\n| `GET /item-log` | List log entries, oldest first. Optional `?start=` / `?end=` query params (inclusive dates, e.g. `2026-06-01`) filter the range; optional `?item_id=` scopes to one item (used by the item detail page's History section); omit all three for the full history |\n\n**Categories**\n\n| Method & path | Purpose |\n|---|---|\n| `GET /categories` | List all categories |\n| `POST /categories` | Create. Body: `{ name }` (409 if the name already exists) |\n| `PATCH /categories/:id` | Rename. Body: `{ name }` (409 on name clash) |\n| `DELETE /categories/:id` | Delete (also removes it from every item that had it, via `ON DELETE CASCADE`) |\n\n**Floorplans**\n\n| Method & path | Purpose |\n|---|---|\n| `GET /floorplans` | List floorplans (id/name/uploaded_at only), newest first |\n| `GET /floorplans/:id` | Get one floorplan including its full `svg_content` |\n| `POST /floorplans` | Upload. Body: `{ name, svg_content }` (raw SVG markup as text) |\n| `DELETE /floorplans/:id` | Delete (400 if any storage space is still mapped to it — clear those mappings first) |\n\n**Backup / restore**\n\n| Method & path | Purpose |\n|---|---|\n| `GET /export` | Full inventory snapshot as JSON: categories, locations (with hierarchy and floorplan mappings), items (with their categories, placements, and attachment *metadata*), and the `id`/`name`/`svg_content` of every floorplan actually referenced by a location mapping. Deliberately excludes attachment file contents and Store Log history — see below |\n| `POST /import` | Restores or merges the given snapshot (same shape `GET /export` returns), controlled by an optional `mode` field: `\"replace\"` (default) or `\"merge\"`. Floorplans (including any in the snapshot) are never created or modified by import, nor are attachment files or Store Log history. Returns `{ mode, restored: { categories, locations, items } }` (`mode: \"replace\"`) or `{ mode, added: { categories, locations, items }, categories_matched_existing, locations_renamed }` (`mode: \"merge\"`), plus `dropped_floorplan_mappings`/`remapped_floorplan_mappings` in both cases |\n\nImport never creates or overwrites a floorplan itself — it only tries to\nreconnect each location's floorplan *mapping* (`floorplan_id` +\n`svg_element_id`) to a floorplan already sitting in the target database,\nfirst by matching `floorplan_id` directly (the same-instance restore case),\nthen, if that id isn't present, by an exact `svg_content` match against the\nfloorplan data the snapshot carries (the cross-instance migration case —\nupload the same floorplan SVG to the new server yourself first, then\nimport; the mapping finds its way back to the newly-uploaded floorplan's\nid even though the id itself differs from the export, and this is counted\nin `remapped_floorplan_mappings`). A mapping that matches neither way is\nsilently dropped (not a fatal error) and counted in\n`dropped_floorplan_mappings`.\n\n`mode: \"replace\"` is a full replace of everything in scope — original ids\nare preserved, so anything depending on stable item/location ids (see\n\"Known external consumers\" above) keeps working after a restore.\n\n`mode: \"merge\"` (#26) instead adds the snapshot's rows alongside whatever\nis already in the target database:\n- An id from the snapshot is kept as-is unless it collides with a row\n  already in the target, in which case a fresh one is generated and every\n  reference to the old id (`item.location_id`, `item.category_ids`,\n  `placement.location_id`, `location.parent_id`) is remapped to match —\n  ids are *not* unconditionally regenerated, so a hand-built import (e.g.\n  from an external floorplan-SVG generator) can use ids that intentionally\n  match `svg_element_id` mappings or a previous export.\n- A category is matched to an existing one by exact name and merged into\n  it rather than duplicated (categories are globally unique by name — see\n  `POST /categories`'s 409).\n- A location name colliding with an existing sibling under the same parent\n  is disambiguated with a `\" (2)\"`, `\" (3)\"`, ... suffix rather than\n  silently creating a same-named sibling.\n- A location's `parent_id` (and an item's or placement's `location_id`)\n  may reference a row already in the target database instead of one\n  included in the snapshot, so a hand-built import can add new\n  items/locations into an existing tree without resending its ancestors.\n\n**Config**\n\n| Method & path | Purpose |\n|---|---|\n| `GET /webapp-config` | `{ autoTheme, themeRecommendation, dynamicQuantityScale, qrLabelBaseUrl, detailPageSections }` — the current value of the \"Automatically switch light/dark theme\" plugin option, the theme it currently recommends (\"light\", \"dark\", or `null` if the option is off or neither `environment.sun` nor `environment.mode` has a recognized value yet), the current value of the \"Dynamic +/- scale for touch interface\" plugin option, the configured \"Server URL for QR labels\" (empty string if unset), and the ordered list of item detail page sections to show (`[\"placements\",\"floorplan\",\"history\",\"properties\",\"attachments\"]` by default; see \"Configuration\" above). Polled by the webapp alongside its regular data refresh. (Named `/webapp-config` rather than `/config` to avoid colliding with signalk-server's own reserved `GET /plugins/{id}/config` endpoint.) |\n\n## Known limitations / possible next steps\n\n- No multi-user permissions; relies on Signal K's built-in security if\n  enabled.\n- No undo for deletions.\n- SVG upload only does a superficial check (`<svg` in the text) — no\n  server-side sanitizing. Fine for private, on-boat use; worth hardening\n  if the server is exposed publicly.\n- The markdown renderer for notes is a small hand-rolled subset (headings,\n  bold/italic, inline code, links, lists) — not a full CommonMark\n  implementation.\n","readmeFilename":"README.md"}