UNPKG

signalk-server

Version:

An implementation of a [Signal K](http://signalk.org) server for boats.

82 lines (76 loc) 22.7 kB
<!DOCTYPE html><html class="default" lang="en" data-base="../../"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Publishing to The AppStore | Signal K</title><meta name="description" content="Documentation for Signal K"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../../assets/style.css?cache=1783009712609"/><link rel="stylesheet" href="../../assets/highlight.css?cache=1783009712609"/><script defer src="../../assets/main.js?cache=1783009712609"></script><script async src="../../assets/icons.js?cache=1783009712609" id="tsd-icons-script"></script><script async src="../../assets/search.js?cache=1783009712609" id="tsd-search-script"></script><script async src="../../assets/navigation.js?cache=1783009712609" id="tsd-nav-script"></script><script async src="../../assets/hierarchy.js?cache=1783009712609" id="tsd-hierarchy-script"></script><link rel="stylesheet" href="../../assets/theme.css"/><script>if(window.self!==window.top){document.documentElement.classList.add('embedded')}</script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="../../index.html" class="title"><img class="title-logo" src="../../assets/logo.svg" alt="Signal K"/><svg class="title-home-icon" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-label="Documentation home"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><polyline points="9 22 9 12 15 12 15 22"></polyline></svg></a><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../../assets/icons.svg#icon-search"></use></svg><span class="visible@s">Search</span></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><div id="tsd-toolbar-links"><a href="https://discord.gg/uuZrwz4dCS" target="_blank" rel="noopener" class="toolbar-icon visible@s" aria-label="Discord"><svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path d="M524.5 69.8a1.5 1.5 0 0 0 -.8-.7A485.1 485.1 0 0 0 404.1 32a1.8 1.8 0 0 0 -1.9 .9 337.5 337.5 0 0 0 -14.9 30.6 447.8 447.8 0 0 0 -134.4 0 309.5 309.5 0 0 0 -15.1-30.6 1.9 1.9 0 0 0 -1.9-.9A483.7 483.7 0 0 0 116.1 69.1a1.7 1.7 0 0 0 -.8 .7C39.1 183.7 18.2 294.7 28.4 404.4a2 2 0 0 0 .8 1.4A487.7 487.7 0 0 0 176 479.9a1.9 1.9 0 0 0 2.1-.7A348.2 348.2 0 0 0 208.1 430.4a1.9 1.9 0 0 0 -1-2.6 321.2 321.2 0 0 1 -45.9-21.9 1.9 1.9 0 0 1 -.2-3.1c3.1-2.3 6.2-4.7 9.1-7.1a1.8 1.8 0 0 1 1.9-.3c96.2 43.9 200.4 43.9 295.5 0a1.8 1.8 0 0 1 1.9 .2c2.9 2.4 6 4.9 9.1 7.2a1.9 1.9 0 0 1 -.2 3.1 301.4 301.4 0 0 1 -45.9 21.8 1.9 1.9 0 0 0 -1 2.6 391.1 391.1 0 0 0 30 48.8 1.9 1.9 0 0 0 2.1 .7A486 486 0 0 0 610.7 405.7a1.9 1.9 0 0 0 .8-1.4C623.7 277.6 590.9 167.5 524.5 69.8zM222.5 337.6c-29 0-52.8-26.6-52.8-59.2S193.1 219.1 222.5 219.1c29.7 0 53.3 26.8 52.8 59.2C275.3 311 251.9 337.6 222.5 337.6zm195.4 0c-29 0-52.8-26.6-52.8-59.2S388.4 219.1 417.9 219.1c29.7 0 53.3 26.8 52.8 59.2C470.7 311 447.5 337.6 417.9 337.6z"></path></svg></a><a href="https://github.com/SignalK/signalk-server" target="_blank" rel="noopener" class="toolbar-icon visible@s" aria-label="Discord"><svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3 .3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5 .3-6.2 2.3zm44.2-1.7c-2.9 .7-4.9 2.6-4.6 4.9 .3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3 .7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3 .3 2.9 2.3 3.9 1.6 1 3.6 .7 4.3-.7 .7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3 .7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3 .7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path></svg></a><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb" aria-label="Breadcrumb"><li><a href="../../Developing.html">Developing</a></li><li><a href="../Plugins.html">Plugins</a></li><li><a href="" aria-current="page">Publishing to The AppStore</a></li></ul></div><div class="tsd-panel tsd-typography"><h1 id="publishing-to-the-appstore" class="tsd-anchor-link">Publishing to The AppStore<a href="#publishing-to-the-appstore" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h1> <p>Plugins and WebApps are available in the AppStore when they have been published to the <a href="https://www.npmjs.com/">npm registry</a> with one or more of the following keywords in <code>package.json</code>:</p> <ul> <li><code>signalk-node-server-plugin</code></li> <li><code>signalk-webapp</code></li> </ul> <p>Additionally you can have your plugin appear within one or more AppStore categories by also adding the following keyword(s):</p> <ul> <li><code>signalk-category-chart-plotters</code></li> <li><code>signalk-category-nmea-2000</code></li> <li><code>signalk-category-nmea-0183</code></li> <li><code>signalk-category-instruments</code></li> <li><code>signalk-category-hardware</code></li> <li><code>signalk-category-ais</code></li> <li><code>signalk-category-notifications</code></li> <li><code>signalk-category-digital-switching</code></li> <li><code>signalk-category-utility</code></li> <li><code>signalk-category-cloud</code></li> <li><code>signalk-category-weather</code></li> <li><code>signalk-category-database</code></li> <li><code>signalk-category-deprecated</code></li> </ul> <p>To have your plugin start automatically after being installed, without requiring any configuration via the <strong>Plugin Config</strong> screen add the following key to the <code>package.json</code> file:</p> <pre><code class="JSON"><span class="hl-4">&quot;signalk-plugin-enabled-by-default&quot;</span><span class="hl-0">: </span><span class="hl-2">true</span> </code><button type="button">Copy</button></pre> <p>To control the way your plugin or WebApp is displayed in the AppStore, add a <code>signalk</code> key to your <code>package.json</code>. All fields are optional:</p> <pre><code class="JSON"><span class="hl-0"> </span><span class="hl-4">&quot;signalk&quot;</span><span class="hl-0">: {</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;displayName&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;My SK App&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;appIcon&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;./img/icon-128.png&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;screenshots&quot;</span><span class="hl-0">: [</span><br/><span class="hl-0"> </span><span class="hl-4">&quot;./docs/screenshots/main.png&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-4">&quot;./docs/screenshots/config.png&quot;</span><br/><span class="hl-0"> ],</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;requires&quot;</span><span class="hl-0">: [</span><span class="hl-4">&quot;signalk-charts-plugin&quot;</span><span class="hl-0">],</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;recommends&quot;</span><span class="hl-0">: [</span><span class="hl-4">&quot;@signalk/freeboard-sk&quot;</span><span class="hl-0">]</span><br/><span class="hl-0"> }</span> </code><button type="button">Copy</button></pre> <h2 id="_" class="tsd-anchor-link"><code>displayName</code><a href="#_" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h2> <p>A human-friendly name shown in the AppStore. Can contain spaces and capitals. Good: <code>&quot;KIP&quot;</code>, <code>&quot;Freeboard-SK&quot;</code>, <code>&quot;Anchor Alarm&quot;</code>. If omitted, the npm package name is used.</p> <h2 id="author" class="tsd-anchor-link">Author<a href="#author" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h2> <p>The AppStore shows an author name on each plugin card. It is resolved in this order, picking the first non-empty value:</p> <ol> <li>The top-level <code>author</code> field in your <code>package.json</code> — either a string (<code>&quot;Dirk Wahrheit &lt;dirkwahrheit@gmail.com&gt;&quot;</code>) or an object (<code>{ &quot;name&quot;: &quot;Dirk Wahrheit&quot;, ... }</code>).</li> <li>The npm <code>publisher</code> of the published version — <em>unless</em> that publisher is <code>GitHub Actions</code>, which is the deploy identity used by <a href="https://docs.npmjs.com/trusted-publishers">npm trusted publishing (OIDC)</a> and not a human.</li> <li>The first npm <code>maintainer</code> of the package.</li> </ol> <p>Set <code>author</code> in <code>package.json</code> so the AppStore shows your name even when you publish via OIDC. Without it, OIDC-published plugins fall back to the maintainer username.</p> <h2 id="_-1" class="tsd-anchor-link"><code>appIcon</code><a href="#_-1" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h2> <p>Package-relative path to an icon image (PNG or SVG), at least 128×128 px square. If omitted, the AppStore generates a monogram fallback from your plugin name.</p> <h2 id="_-2" class="tsd-anchor-link"><code>screenshots</code><a href="#_-2" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h2> <p>Ordered list of package-relative paths to screenshots (PNG or JPG). Recommended 1280×800 (16:10); keep each file under ~500 KB. Up to <strong>6</strong> are shown — additional entries are ignored. The first screenshot becomes the hero image on the detail page, so put your best shot first.</p> <p>Files must be published to npm — check your <code>files</code> field and <code>.npmignore</code>. Before releasing, verify with:</p> <pre><code class="shell"><span class="hl-5">npm</span><span class="hl-0"> </span><span class="hl-4">pack</span><span class="hl-0"> </span><span class="hl-2">--dry-run</span><span class="hl-0"> </span><span class="hl-1">|</span><span class="hl-0"> </span><span class="hl-5">grep</span><span class="hl-0"> </span><span class="hl-2">-E</span><span class="hl-0"> </span><span class="hl-4">&#39;(screenshots|icon)&#39;</span> </code><button type="button">Copy</button></pre> <p>If the command prints nothing, the listed assets are not in the tarball — adjust your <code>files</code> field or <code>.npmignore</code>.</p> <p>Use package-relative paths. Relative images in your <code>README.md</code> (<code>![caption](./docs/foo.png)</code>) render inline on the AppStore detail page.</p> <p>If no screenshots are declared, the detail page omits the hero image and shows a polite note. The card and list views degrade silently.</p> <h2 id="and" class="tsd-anchor-link"><code>requires</code> and <code>recommends</code><a href="#and" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h2> <p>Declare other AppStore plugins your plugin relies on:</p> <ul> <li><strong><code>requires</code></strong> — mandatory companion plugins. The AppStore lists them on the detail page; if any are missing when a user installs, an <strong>Install required plugins</strong> button queues your plugin plus the missing required plugins in one go.</li> <li><strong><code>recommends</code></strong> — suggested companions. Listed on the detail page as click-through cards, advisory only.</li> </ul> <p>These are <em>AppStore-only</em> semantics — they're not npm dependencies, so npm won't auto-install them. Use them for cross-plugin composition that isn't bundled in a tarball (e.g. a plotter plugin that pairs with a chart-provider plugin).</p> <p>Entries must be published npm package names exactly as they appear in the AppStore. Plugins that aren't available in the AppStore will still render as a link on the detail page but marked &quot;Not installed&quot;.</p> <p><strong>Don't use <code>peerDependencies</code> for companion plugins.</strong> Use <code>signalk.requires</code> / <code>signalk.recommends</code> to express companion-plugin relationships. The AppStore's <code>requires</code> mechanism gives the user a clean <strong>Install required plugins</strong> flow without involving npm's resolver, which interacts badly with optional peers under Signal K's plugin tree.</p> <h2 id="deprecation" class="tsd-anchor-link">Deprecation<a href="#deprecation" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h2> <p>If your plugin is superseded or no longer maintained, either add the <code>signalk-deprecated</code> keyword or set <code>signalk.deprecated: true</code>. The AppStore will hide deprecated plugins from general browsing but continue to show them to users who already have them installed (with a red banner on the detail page). Users can opt in to seeing all deprecated plugins via a filter toggle.</p> <h2 id="what-shows-on-the-detail-page" class="tsd-anchor-link">What shows on the detail page<a href="#what-shows-on-the-detail-page" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h2> <p>Every plugin gets a per-plugin detail page in the App Store admin with README, Changelog, and Indicators tabs. Keep your README scannable — most users will read it before installing — and maintain a <code>CHANGELOG.md</code> with version headers (<code>## 1.2.0</code>) or publish GitHub Releases so the Changelog tab has content to show.</p> <h2 id="ci-test-results-in-the-app-store" class="tsd-anchor-link">CI test results in the App Store<a href="#ci-test-results-in-the-app-store" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h2> <p>If your plugin's repository runs the reusable <a href="https://github.com/SignalK/signalk-server/blob/master/.github/workflows/plugin-ci.yml">SignalK plugin-ci workflow</a>, the App Store Indicators tab shows the resulting per-platform pass/fail matrix for the published version — green for success, red for failure, grey for skipped or disabled platforms.</p> <p>To opt in, add a small workflow on your repo that calls the reusable plugin-ci. The current usage line (job inputs, supported platforms, Node versions) is documented at the top of the canonical <a href="https://github.com/SignalK/signalk-server/blob/master/.github/workflows/plugin-ci.yml"><code>plugin-ci.yml</code></a> — follow that file rather than copy-pasting examples that may drift over time.</p> <p><em>Example: package.json</em></p> <pre><code class="JSON"><span class="hl-0">{</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;name&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;my-signalk-plugin-app&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;version&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;1.0.0&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;description&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;My great signalk plugin-app&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;keywords&quot;</span><span class="hl-0">: [</span><br/><span class="hl-0"> </span><span class="hl-4">&quot;signalk-node-server-plugin&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-4">&quot;signalk-webapp&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-4">&quot;signalk-category-ais&quot;</span><br/><span class="hl-0"> ],</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;signalk-plugin-enabled-by-default&quot;</span><span class="hl-0">: </span><span class="hl-2">true</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;signalk&quot;</span><span class="hl-0">: {</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;appIcon&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;./assets/icons/icon-72x72.png&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;displayName&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;My Great WebApp&quot;</span><br/><span class="hl-0"> },</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;main&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;plugin/index.js&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;scripts&quot;</span><span class="hl-0">: {</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;test&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;echo </span><span class="hl-1">\&quot;</span><span class="hl-4">Error: no test specified</span><span class="hl-1">\&quot;</span><span class="hl-4"> &amp;&amp; exit 1&quot;</span><br/><span class="hl-0"> },</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;author&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;Jane Sailor &lt;jane@example.com&gt;&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;license&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;ISC&quot;</span><br/><span class="hl-0">}</span> </code><button type="button">Copy</button></pre> <h2 id="important-avoid-install-time-scripts" class="tsd-anchor-link">Important: Avoid install-time scripts<a href="#important-avoid-install-time-scripts" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h2> <p>For security reasons, the Signal K AppStore does not execute install-time lifecycle scripts when installing plugins — <code>preinstall</code>, <code>install</code>, and <code>postinstall</code> scripts in your plugin's <code>package.json</code> will not run when users install through the App Store.</p> <p>Ensure your published package is ready to use without requiring install-time scripts. If you need build steps, use <code>prepublishOnly</code> instead — it runs before you publish to npm, so the published tarball already contains everything it needs.</p> <h2 id="publishing-your-plugin" class="tsd-anchor-link">Publishing your Plugin<a href="#publishing-your-plugin" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h2> <p>Once you have developed and tested your Plugin / WebApp you can publish it to make it visible in the AppStore. To do this, in a terminal session from within the folder containing <code>package.json</code>:</p> <pre><code class="shell"><span class="hl-5">npm</span><span class="hl-0"> </span><span class="hl-4">publish</span> </code><button type="button">Copy</button></pre> </div></div><div class="col-sidebar"><div class="page-menu"><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../../assets/icons.svg#icon-chevronDown"></use></svg><h3>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#_"><span></span></a><a href="#author"><span>Author</span></a><a href="#_-1"><span></span></a><a href="#_-2"><span></span></a><a href="#and"><span> and </span></a><a href="#deprecation"><span>Deprecation</span></a><a href="#what-shows-on-the-detail-page"><span>What shows on the detail page</span></a><a href="#ci-test-results-in-the-app-store"><span>CI test results in the <wbr/>App <wbr/>Store</span></a><a href="#important-avoid-install-time-scripts"><span>Important: <wbr/>Avoid install-<wbr/>time scripts</span></a><a href="#publishing-your-plugin"><span>Publishing your <wbr/>Plugin</span></a></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../../modules.html">Signal K</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>