|
| 1 | +# Plugin-tagged issues — disposition |
| 2 | + |
| 3 | +A pass over JSS's `plugin`-labelled backlog, asking of each: *can the public |
| 4 | +plugin api do this today, and if not, what's missing?* This repo is the |
| 5 | +evidence. Legend: |
| 6 | + |
| 7 | +- ✅ **built here** — a working plugin in this repo, tested |
| 8 | +- 🧩 **plugin-able, not yet built** — no blocker, just unbuilt |
| 9 | +- 🔩 **needs a seam** — a plugin *can't* do it until the api grows (the seam |
| 10 | + is named; a consumer here proves the need) |
| 11 | +- 🏛️ **core, not a plugin** — pipeline-modifying or infrastructural; belongs |
| 12 | + in `src/` (this is a *finding*, not a gap) |
| 13 | +- 🗺️ **product/design** — a large feature or an open design question, beyond |
| 14 | + a single plugin |
| 15 | + |
| 16 | +## Built as plugins here ✅ |
| 17 | + |
| 18 | +| Issue | Plugin | Note | |
| 19 | +|---|---|---| |
| 20 | +| #445 | `nip05/` | NIP-05 discovery from pods' public keys | |
| 21 | +| #382 / #379 | `corsproxy/` | CORS forward proxy, fail-closed SSRF defense | |
| 22 | +| #506 | `capability/` | scoped, time-bound, revocable capability URLs | |
| 23 | +| #507 | `webdav/` | mount a pod in Finder/Nautilus/Windows | |
| 24 | +| #509 | `sparql/` | read-time SPARQL over pod JSON-LD (write-index → 🔩 `api.events`) | |
| 25 | +| #322 | `gitscratch/` | ephemeral Solid-authed git remotes (git-http-backend CGI) | |
| 26 | +| #515 / #516 | `mastodon/` | Mastodon-API shim — a client can log into its own pod | |
| 27 | +| #505 | `otp/` | one-time-password session flow (account *recovery* → 🔩 core auth) | |
| 28 | + |
| 29 | +Plus six **ports of bundled features** proving the migration path for #564 / |
| 30 | +#164: `relay/` `webrtc/` `terminal/` `tunnel/` `notifications/`, and `pay/` |
| 31 | +(the wall-report — it can't be a plugin, which is the point). |
| 32 | + |
| 33 | +## Shipped upstream this line of work 🚢 |
| 34 | + |
| 35 | +| Issue | Where | |
| 36 | +|---|---| |
| 37 | +| #206 | the loader — `createServer({ plugins })`, merged, v0.0.215 | |
| 38 | +| #582 | `appPaths` WAC exemption, v0.0.213 | |
| 39 | +| #584 | `api.auth.getAgent`, v0.0.214 | |
| 40 | +| #588 | `api.ws.route` WebSocket routing, v0.0.215 | |
| 41 | +| #564 | the core/plugin line — answered empirically in [NOTES.md](./NOTES.md) | |
| 42 | + |
| 43 | +## Plugin-able, not yet built 🧩 |
| 44 | + |
| 45 | +| Issue | Shape | |
| 46 | +|---|---| |
| 47 | +| #211 | Bluesky / AT-Protocol shim — same shape as `mastodon/`, different wire format | |
| 48 | +| #157 | CardDAV — contact sync, same loopback-bridge shape as `webdav/` | |
| 49 | +| #527 | Tunnel client mode — extends `tunnel/` to dial *out* to a relay | |
| 50 | +| #277 | MongoDB-backed relay — `relay/` with a Mongo store (needs the infra) | |
| 51 | + |
| 52 | +## Needs a seam the api doesn't have yet 🔩 |
| 53 | + |
| 54 | +Each names the seam and the consumer that proves it. Ranked in |
| 55 | +[NOTES.md](./NOTES.md). |
| 56 | + |
| 57 | +| Issue(s) | Missing seam | |
| 58 | +|---|---| |
| 59 | +| #509 (write-index), #501 | `api.events.onResourceChange` — react to pod writes | |
| 60 | +| #382 (per-pod ACL), #506 (pod grants) | `api.authorize(request, path, mode)` — ask the host's WAC | |
| 61 | +| #495 #496 #500 #501 | `api.mcp.registerTool` — MCP has no plugin-tool seam; all four MCP issues want new tools a plugin can't add today | |
| 62 | +| #463 #464 | app-registry primitive — surfacing installed plugins as Solid resources | |
| 63 | + |
| 64 | +## Core, not a plugin 🏛️ (a finding, not a gap) |
| 65 | + |
| 66 | +Pipeline-modifying or infrastructural — they *are* the pod, or they change |
| 67 | +every request: |
| 68 | + |
| 69 | +| Issue | Why core | |
| 70 | +|---|---| |
| 71 | +| #185 | token-based storage quota — gates the LDP write path | |
| 72 | +| #476, #271 | git auto-init header, git-mark post-receive — inside the core git handler | |
| 73 | +| #236 | SFTP/SSH — a separate server protocol, not a Fastify route | |
| 74 | +| #154 | SQLite `db` backend — a storage driver | |
| 75 | +| #133 | OIDC-provider replacement — the auth core itself | |
| 76 | + |
| 77 | +## Product / design 🗺️ |
| 78 | + |
| 79 | +Large features or open questions beyond one plugin: #200 (marketplace), |
| 80 | +#199 #198 (agent containers), #194 #184 (pane store), #183 (skill |
| 81 | +provenance), #163 (remoteStorage follow-ups), #134 (WebID/AP URI unification), |
| 82 | +#164 (WebFinger/OAuth extraction — partially met by `mastodon/`'s OAuth |
| 83 | +bridge). Several become tractable *on top of* the plugin system now that it |
| 84 | +exists. |
| 85 | + |
| 86 | +## Tally |
| 87 | + |
| 88 | +Of ~40 plugin-tagged issues: **8 built as plugins here**, **6 ported**, **5 |
| 89 | +shipped upstream**, **4 more plugin-able with no blocker**, **4 clusters |
| 90 | +blocked on a named seam** (each with a proof-of-need consumer), the rest |
| 91 | +core-by-nature or product-scale. The plugin api reaches most of the backlog |
| 92 | +today; the two seams that would unlock the most next are `api.authorize` and |
| 93 | +`api.events`. |
0 commit comments