Skip to content

docs: Add Plotter Extensions API specification (proposed)#2773

Open
joelkoz wants to merge 3 commits into
SignalK:masterfrom
joelkoz:plotterext-api-spec
Open

docs: Add Plotter Extensions API specification (proposed)#2773
joelkoz wants to merge 3 commits into
SignalK:masterfrom
joelkoz:plotterext-api-spec

Conversation

@joelkoz

@joelkoz joelkoz commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

What & why

Chartplotter web apps (Freeboard-SK and others) cannot be extended with plugin-specific UI without forking the application, which fragments the ecosystem. This proposes a host-agnostic Plotter Extensions API: a plotterExtensions resource type through which any server plugin can offer optional widgets, panels, toolbar buttons, resource filters and background runtimes to chartplotter applications. Contributions are discovered at runtime from the resource provider and run sandboxed in iframes over a small JSON-RPC-over-postMessage bus, so no chartplotter needs to know about any specific plugin.

This PR

Docs only — adds the draft specification under docs/develop/rest-api/proposed/ and registers it in the proposed-API index. No code or version changes.

Reference implementations

Opening as a draft for early feedback on the approach before the host PR lands.

Overview

This PR adds documentation-only, host-agnostic specifications for a proposed Plotter Extensions API. The specification enables chartplotter server plugins to expose optional UI components—widgets, panels, toolbar buttons, resource filters, and background runtimes—to chartplotter web apps without requiring host-specific UI integration.

Changes

  • docs/develop/rest-api/proposed/README.md

    • Adds a “Plotter Extensions” navigation entry and extends the Proposed APIs table with a “Plotter Extensions” row that maps server plugin contributions (widgets, panels, buttons, and resource filters) to the resources/plotterExtensions endpoint.
  • docs/develop/rest-api/proposed/plotter-extensions-api.md (new)

    • Introduces the Plotter Extensions API (apiVersion 1) and defines a new plotterExtensions resource type, including runtime host discovery via /signalk/v2/api/resources/plotterExtensions.
    • Defines the extension manifest schema, capability negotiation (requires/optional), and contribution sections for widgets, panels, background runtimes, and toolbar buttons.
    • Specifies widget placement/layout rules (host-defined 2x2 grid areas plus user-controlled cell placement), per-placement instance IDs passed via handshake context, and configuration panel behavior (including ui.openConfigPanel/ui.toggleConfigPanel) and removal affordances.
    • Specifies background runtime behavior as headless iframe contexts gated by background.iframe, including allowed host API access and topic-driven triggering using events.subscribe, plus button publishing semantics.
    • Defines toolbar button JSON shapes (togglePanel, openPanel, sendMessage) and semantics including subscription-gated forwarding and topic-namespacing conventions.
    • Documents interop as JSON-RPC 2.0 over postMessage using a plotterExt/1 routing envelope (calls with request IDs and events as notifications), including readiness/handshake (bus.readybus.handshake) and call vs event semantics with subscription-gated forwarding of host-delivered events.
    • Specifies the Host API (v1) method set and host event contracts, including events.subscribe/unsubscribe, state.get/set, signalk.subscribe/unsubscribe/put, units.get, resources.list plus resources.setFilter/clearFilter, and related map/panel controls, along with host-emitted events such as state.changed, sk.<path>, filters.changed, and bus.*.
    • Documents filter operator semantics, storage-scope behavior for state.* (instance vs extension), and unit preference vocabulary/behavior.
    • Describes how plugins register extensions via read-only plotterExtensions resource registration and how they serve publicly readable (non-admin-gated) asset routes.
    • Covers App Store recommendation metadata for inter-plugin relationships.
    • States security/trust assumptions (iframe sandbox fault containment) and explicit non-goals (for example, manifest-declared filter chains and host→runtime callRuntime).
    • References separate implementation repositories: signalk-plotterext-bus, signalk-instrument-widgets, and signalk-poi-search (with a Freeboard-SK host reference noted as forthcoming).
  • docs/develop/plugins/README.md

    • Adds plotter_extension_provider_plugins.md to the sidebar under the Plugins documentation section.
  • docs/develop/plugins/plotter_extension_provider_plugins.md (new)

    • Documents Plotter Extension Provider plugins and clarifies host vs plugin responsibilities, including iframe-based guest integration, publish/subscribe bus usage, optional headless background runtimes, and the plotterExtensions resource.
    • Specifies minimal provider/manifest requirements and the host-side responsibilities to:
      • register the plugin manifest as a single read-only plotterExtensions resource (with defined listResources/getResource behavior and rejection of setResource/deleteResource), and
      • serve plugin iframe UI assets from an Express static route mounted under a namespaced public base URL referenced by manifest URLs (avoiding /plugins/* and omitting signalk-webapp auto-mount behavior).
    • Documents the client-side iframe integration model using signalk-plotterext-bus/extension, including example widget variants, config-panel behavior, a panel that performs resource queries and drives filters/map, and background runtime concepts.
    • Lists reference implementations and shows how to declare companion-plugin relationships via App Store signalk.recommends.

Scope

This PR remains documentation-only: it introduces no runtime code, no version updates, and no changes to the main server behavior, and it targets early feedback before host implementation.

@coderabbitai

coderabbitai Bot commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds comprehensive documentation for a new Plotter Extensions API: a plotterExtensions discovery resource, manifest schema with contribution types (widgets, panels, backgrounds, toolbar buttons), a postMessage JSON-RPC protocol with Host API methods/events, and provider plugin implementation guidance with practical examples.

Changes

Plotter Extensions API Documentation

Layer / File(s) Summary
Documentation index and API overview
docs/develop/rest-api/proposed/README.md, docs/develop/plugins/README.md, docs/develop/rest-api/proposed/plotter-extensions-api.md (intro)
Updates REST API and plugins sidebar navigation; introduces draft Plotter Extensions API version 1 and resources/plotterExtensions discovery endpoint with design principles for host-agnostic integration.
API specification: manifest and contribution types
docs/develop/rest-api/proposed/plotter-extensions-api.md (lines 57–320)
Defines manifest discovery/negotiation model with apiVersion, capability requires/optional fields, and open-ended capability naming conventions; specifies contribution types for widgets (host-defined 2x2 grid layout, user-controlled placement, per-instance IDs, config panel behavior), panels (iframe-based lifecycle options: onOpen, keepAlive, whileEnabled), background runtimes (headless iframe contexts gated by background.iframe, topic-driven triggering), and toolbar buttons (JSON action forms: togglePanel, openPanel, sendMessage with subscription-gated semantics).
Wire protocol and Host API surface
docs/develop/rest-api/proposed/plotter-extensions-api.md (lines 320–523)
Specifies plotterExt/1 JSON-RPC 2.0 envelope over postMessage, call/event semantics, bus handshake flow using bus.readybus.handshake, Host API method set (events.subscribe/unsubscribe, state.get/set, signalk.subscribe/unsubscribe/put, units.get, resources.list, resources.setFilter/clearFilter, map/panel controls), host event contracts (state.changed, sk.<path>, filters.changed, bus.* notifications), filter operators and symbol-reference tolerance rules, state.* storage scopes (instance vs extension), and unit preference vocabulary.
Provider plugin implementation and guidance
docs/develop/plugins/plotter_extension_provider_plugins.md, docs/develop/rest-api/proposed/plotter-extensions-api.md (lines 524–615)
Explains provider plugin concept and host-vs-plugin responsibility boundaries; documents server-side setup: manifest registration as read-only plotterExtensions resource with explicit listResources/getResource behavior and rejection of setResource/deleteResource, asset serving via namespaced public Express routes while avoiding /plugins/* and signalk-webapp auto-mounts; documents client-side iframe integration using signalk-plotterext-bus/extension with connection/handshake flow and capability checking; provides practical end-to-end examples: display-value widget with per-instance config and long-press panels, filter-aware keepAlive panel with resource queries and optional map control, background runtime patterns with message-driven triggering; lists reference implementations and companion-plugin relationships via App Store signalk.recommends; covers security/trust assumptions (iframe sandbox as fault containment, manifest visibility implies prior plugin trust) and non-goals (manifest-declared filter chains and host→runtime callRuntime).

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Suggested labels

doc

A chartplotter blooms with widgets bright,
Extensions tap the host with JSON light,
Plugins serve iframes, manifests in tow,
PostMessage buses let messages flow,
🐰 Hops through the docs — a joyful show!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically describes the main change: adding Plotter Extensions API specification documentation under the proposed REST API docs.
Description check ✅ Passed The PR description addresses the template's required sections: it explains the problem solved (extending chartplotters without forking), how it was tested (reference implementations provided), and clarifies that this is docs-only with no code changes.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/develop/rest-api/proposed/README.md (1)

5-15: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Re-run Prettier before merge.

CI is already failing on Markdown formatting in this file, so the new nav entry/table row needs a format pass before this lands.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/develop/rest-api/proposed/README.md` around lines 5 - 15, Re-run
Prettier (or your project's Markdown formatter) on
docs/develop/rest-api/proposed/README.md to fix the Markdown formatting CI
error; specifically reformat the newly added table row/entry for "Plotter
Extensions" (the link text plotter-extensions-api.md and the Endpoint
`resources/plotterExtensions`) so the table columns and code inline formatting
match the project's Markdown style, then save and push the formatted file.

Source: Pipeline failures

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/develop/rest-api/proposed/plotter-extensions-api.md`:
- Around line 502-553: The section currently mixes contract-level spec with
implementation guidance; extract the Express mounting recipe and route warnings
(the examples referencing app.registerResourceProvider with type
'plotterExtensions', the ASSET_BASE mounting example, the warnings about
'/plugins/*' and the 'signalk-webapp' keyword and registerWithRouter) plus the
planned filter-chain/future-roadmap notes into a separate how-to or reference
document, and replace this part of the spec with a concise, version-stable
contract statement describing only the required behaviors (e.g., that providers
must register the 'plotterExtensions' resource and that manifest URLs are
server-relative and must be publicly reachable), leaving implementation details
and roadmap material out of the spec.
- Around line 401-403: The phrase "see Connection establishment" is a stale
reference; update the text in the sentence that mentions connection-level
notifications to point to the correct existing section title "Connection" (or
remove the parenthetical entirely), so replace "see Connection establishment"
with "see Connection" (or delete the parenthetical) in the sentence handling
connection-level notifications (`bus.ready` and `bus.handshake`) so the document
no longer references a non-existent section.

---

Outside diff comments:
In `@docs/develop/rest-api/proposed/README.md`:
- Around line 5-15: Re-run Prettier (or your project's Markdown formatter) on
docs/develop/rest-api/proposed/README.md to fix the Markdown formatting CI
error; specifically reformat the newly added table row/entry for "Plotter
Extensions" (the link text plotter-extensions-api.md and the Endpoint
`resources/plotterExtensions`) so the table columns and code inline formatting
match the project's Markdown style, then save and push the formatted file.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 2b07f88e-2436-441a-8fa9-bca038349853

📥 Commits

Reviewing files that changed from the base of the PR and between 27787e2 and d9a2e8a.

📒 Files selected for processing (2)
  • docs/develop/rest-api/proposed/README.md
  • docs/develop/rest-api/proposed/plotter-extensions-api.md

Comment thread docs/develop/rest-api/proposed/plotter-extensions-api.md
Comment thread docs/develop/rest-api/proposed/plotter-extensions-api.md
@joelkoz joelkoz force-pushed the plotterext-api-spec branch from d9a2e8a to bbb8260 Compare June 13, 2026 03:34

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/develop/plugins/plotter_extension_provider_plugins.md`:
- Around line 70-87: The docs currently describe `app` as a plain Express
instance and show mounting with `app.use`, which is misleading because the
plugin startup surface exposes a server API with `registerResourceProvider`;
update the text to state that plugins receive the server API (not raw Express),
explain that you should call the server API's `registerResourceProvider` to
serve static assets, and keep the ASSET_BASE and PUBLIC_DIR identifiers as the
example asset path and directory while replacing the `app.use` reference with a
brief note pointing readers to use `registerResourceProvider` (or the server's
equivalent) to mount `${ASSET_BASE}` for the plugin manifest URLs.

In `@docs/develop/rest-api/proposed/README.md`:
- Around line 12-15: The index table in docs/develop/rest-api/proposed/README.md
omits "headless background runtimes" as a first-class contribution type; update
the Proposed API table so the Overview row for contributions includes headless
background runtimes (either by adding a new row labeled "Headless Background
Runtimes" or by appending "and headless background runtimes" to the Description
cell for the existing relevant entry such as _[`Plotter
Extensions`](plotter-extensions-api.md)_), and include a concise Endpoint value
or placeholder to match the other rows so the index reflects the spec and PR
summary.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 46334976-897f-467e-81af-2e2e5fa35df7

📥 Commits

Reviewing files that changed from the base of the PR and between d9a2e8a and bbb8260.

📒 Files selected for processing (4)
  • docs/develop/plugins/README.md
  • docs/develop/plugins/plotter_extension_provider_plugins.md
  • docs/develop/rest-api/proposed/README.md
  • docs/develop/rest-api/proposed/plotter-extensions-api.md

Comment thread docs/develop/plugins/plotter_extension_provider_plugins.md
Comment thread docs/develop/rest-api/proposed/README.md Outdated
@joelkoz joelkoz force-pushed the plotterext-api-spec branch from bbb8260 to 88e8d8d Compare June 13, 2026 03:48

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (1)
docs/develop/rest-api/proposed/plotter-extensions-api.md (1)

412-414: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Update the section reference to match the actual heading.

Line 413 references "the Connection section," but the section is titled "## Communication" (line 337). This is a stale reference that will confuse readers. As per coding guidelines, leftover crumbs from intermediate commits should be removed.

✏️ Suggested fix
- connection-level notifications `bus.ready` and `bus.handshake` (see the Connection section) are the only other host/extension events and are
+ connection-level notifications `bus.ready` and `bus.handshake` (see Communication) are the only other host/extension events and are
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/develop/rest-api/proposed/plotter-extensions-api.md` around lines 412 -
414, The reference "the Connection section" is stale and should be updated to
the actual heading; change the mention in the sentence that lists
connection-level notifications `bus.ready` and `bus.handshake` to reference "the
Communication section" (or update to a matching anchor/title if you use anchors)
so it correctly points readers to the "## Communication" section; locate the
sentence containing `bus.ready` and `bus.handshake` and replace "the Connection
section" with "the Communication section" (or the proper section anchor).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In `@docs/develop/rest-api/proposed/plotter-extensions-api.md`:
- Around line 412-414: The reference "the Connection section" is stale and
should be updated to the actual heading; change the mention in the sentence that
lists connection-level notifications `bus.ready` and `bus.handshake` to
reference "the Communication section" (or update to a matching anchor/title if
you use anchors) so it correctly points readers to the "## Communication"
section; locate the sentence containing `bus.ready` and `bus.handshake` and
replace "the Connection section" with "the Communication section" (or the proper
section anchor).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 98a2fad7-45e2-4ad0-a53e-8c098aa672a2

📥 Commits

Reviewing files that changed from the base of the PR and between bbb8260 and 88e8d8d.

📒 Files selected for processing (4)
  • docs/develop/plugins/README.md
  • docs/develop/plugins/plotter_extension_provider_plugins.md
  • docs/develop/rest-api/proposed/README.md
  • docs/develop/rest-api/proposed/plotter-extensions-api.md

@joelkoz joelkoz changed the title Add Plotter Extensions API specification (proposed) docs: Add Plotter Extensions API specification (proposed) Jun 13, 2026
@joelkoz joelkoz force-pushed the plotterext-api-spec branch from 88e8d8d to 00bbd9e Compare June 13, 2026 04:03
daniel-freiermuth added a commit to daniel-freiermuth/winga-chart-plotter that referenced this pull request Jun 14, 2026
@panaaj

panaaj commented Jun 15, 2026

Copy link
Copy Markdown
Member

I'll preface the following with these are my initial thoughts after a first cold read.

There is quite a lot to digest here, but on first read it appears this is "instrument panel" on steroids.
My first reaction was "this seems overly complex for allowing iframes to be displayed?".

I get what this is trying to achieve and I think it has a lot of merit, so to ensure adoption (and make sure it doesn't end up being a FSK only kind of thing) some examples of what constitutes a good candidate use case and what may not be an appropriate use case would be beneficial.

There are a lot of new terms to come to grips with and it wasn't abundantly clear to me the:

  • minimum plugin needs to deliver
  • minimum the host app needs to support
  • what the plugin controls and
  • what the host needs to implement.

I think the manifest attributes deserve a more detailed description than they get, my measure is "can I build a working solution from the documentation" and I'm not sure I could.

Am I correct in thinking that it also prescribes how the client should layout widgets.... why would we specify that?

I will continue to review and will update accoringly as the penny drops a little further.

@joelkoz

joelkoz commented Jun 15, 2026

Copy link
Copy Markdown
Contributor Author

@panaaj -

Thanks for taking the time to engage. Yes, there is a lot to the spec (and the associated PRs), but I think it is well worth it.

First and foremost - this is way more than just "complex iframes". Hidden in the lowest layer of the spec is a message broker like feature built on simple postMessage() that gives MQTT like publish/subscribe to all of the iframes and the "host" (aka Freeboard). While it is currently used as the transport layer for the API calls to the host layer, it enables both the ability for individual panels and widgets to communicate with each other, even if they come from different plugins. It also enables an event system where the host app announces events like "new route created" or "waypoint added", where the panels could respond. One of the iframe types is a "background" process that is headless, allowing it to listen and respond to such events. Expand this with a few more host API calls (like "create route", and "add waypoint to route" and you get the ability to implement stand alone functionality like a route optimizer as requested in SignalK/freeboard-sk#396

The other thing it does is is allow someone to create an entirely new type of resource and all of the supporting functionality around it. This all started with my desire to have a "dive site log" where I could mark various scuba spots and rate them by difficulty and depth. With the extension mechanism in place, I could make a single plugin that:

  1. Is a "dive site/log" resource provider
  2. Publishes a set of colorized dive flag symbols as notes to visually mark the locations
  3. Create a custom panel that allows me to search for nearby sites based on difficulty and depth to accommodate the skill level of my passengers. The search could be a simple "find sites that I am near that I can get to in the next 3 hours and build me a route". It could do its own internal search, then display the filtered list on the map, complete with route from my current destination.
  4. I could even create a widget that runs a dive timer for the person on the surface to track who is in the water and how long they have been there.

This would be a VERY niche plugin that some would find awesome, and others would find useless. Install it if you want. Un-install it if you don't like it. No special version of Freeboard required.

With so many users now able to use AI agents, a well thought out system I think would be a huge unlock for the community without bloating the host (Freeboard).

I actually am already about to submit a PR to @NearlCrews Binnacle project (just finishing it up now), so I can already prove it works well in two different chart plotters. That should overcome the "it only works in Freeboard".

I can easily generate more documentation. I just need to find out where it should go (I've been asking around Discord, but there aren't a lot of pre-existing places to park it). This spec had more implementation examples, and Code Rabbit complained that the spec was not an appropriate place for it.

To be frank, in the age of AI agents, I think it is a lot more effective to have a good CLAUDE.md or AGENTS.md that simply says "look at the spec as well as the source from these two reference projects to use as a guide to do X". That is how I've been using it.

To get a real feel for what it can do, spin up a dev server and apply my "unified" PR to it: joelkoz/freeboard-sk#2 . Or you can just clone that branch https://github.com/joelkoz/freeboard-sk/tree/plotter-ext-unified . Then install the following plugins from the app store:

signalk-symbol-manager
signalk-instrument-widgets
signalk-poi-search

and the already existing

signalk-activecaptain so you have a large set of POI to search.

The first three plugins serve as the reference code that Claude or Codex can take and run with to make a new one.

I would love to get a larger discussion started re: what kinds of events and API calls would be the most valuable for the host to supply.

To answer your questions directly:

  • The host (Freeboard) needs to implement at least the comm layer, version 1 of the API, and at least one of the UI elements to be useful. My PR implements them all.
  • A client plugin can provide as little or as much as it wants. There are basically two new resource providers: symbols and plotter extensions.
  • Unless there is a special need, the signal-symbol-manager is probably all that is required to enable adding new symbols to the system. There is no need to create any other plugin unless the creator has a desire to.
  • A plugin could be a simple as a single widget, or as complex as a background process to manage state and broker special resources with the actual SK server, one or more panels to provide interactive UIs, one or more buttons to add new actions to the toolbar (as a way to open the panels), and multiple widgets to provide information.

Re: the layout: the spec calls for the HOST to specify where it wants to park its widgets. The "clients" are the widgets themselves. They have no control over where they can be positioned. In the Freeboard PR, the end user gets to pick from one of five areas (three of the four corners, and the center top and bottom).

@joelkoz

joelkoz commented Jun 18, 2026

Copy link
Copy Markdown
Contributor Author

@panaaj -

Based on our conversation above, I rewrote the user documentation to be a lot more informative. The second commit completely re-writes docs/develop/plugins/plotter_extension_provider_plugins.md. The spec document remains untouched.

@joelkoz joelkoz force-pushed the plotterext-api-spec branch from 743cde7 to 5b46775 Compare June 18, 2026 01:08
@panaaj

panaaj commented Jun 26, 2026

Copy link
Copy Markdown
Member

I think this is much improved. I found it a lot clearer..

Add the `routes` capability throughout both documents:
- Capability table entry and handshake example
- 8 route.* host API methods (list/create/show/hide/delete/get/replace/save)
- 4 route lifecycle/mutation events (visible/dirty/saved/hidden)
- Background runtimes: add route.* to callable host API list
- New "Live routes" narrative section covering the visible-set model,
  opaque routeId handles, saved/dirty state machine, editing semantics,
  and per-error codes
- Provider guide: add routes capability to capability table, update
  good-candidates list, add "Example: editing a route" worked example

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants