Repository navigation
feat(app): plugins that aren't built in can be browsed and installed from settings - #53
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
…from settings Settings → Plugins has a Browse group: the plugins listed on the public site, each with Install, Update or Installed. Installing puts a plugin in ~/.berth/plugins and never turns it on; the consent dialog still does, and an update is asked about again. - site/plugins/ is the listing, built and committed by `pnpm -C app build:marketplace` from every plugins/<id>/ that says "marketplace": true. hello-ports is the first. - The laptop agent reads it (GET /v1/marketplace), since the app's page may talk only to the agent: https only, each file checked against the listing's size and SHA-256, written only inside the plugin's own folder, and swapped into place whole. It installs over a folder it didn't install only when asked, and removes only what it installed. - Mock mode lists three synthetic plugins, one per state a row has. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
sean-brydon
force-pushed
the
feat/plugin-marketplace
branch
from
October 11, 2026 21:33
b434d72 to
d5c6442
Compare
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What you get
Settings → Plugins has a Browse group: plugins that are not built into the app, read from a listing on the site, each with Install, Update or Installed. An installed plugin shows under Installed, off, and the existing consent dialog is still what turns it on. Plugins installed this way can be removed from the same page.
hello-portsis the first listing.How it works
site/plugins/index.jsonplus each plugin's built files undersite/plugins/<id>/<version>/, written bypnpm -C app build:marketplacefrom anyplugins/<id>/whose manifest says"marketplace": true, and committed like the demo.pnpm -C app check:marketplacefails when it is stale.internal/agent/marketplace.go), because the app's CSP only lets the window talk to the agent:GET /v1/marketplace,POST /v1/marketplace/{id}/install,DELETE /v1/marketplace/{id}.BERTH_PLUGIN_REGISTRYpoints it at another listing.plugins/and swaps with rollback. It never enables a plugin. A folder you made by hand is replaced only after you confirm.Before this is useful
The real app's Browse says it can't reach the listing until
site/is deployed with this change, sinceberthd.app/plugins/index.jsondoes not exist yet.How it was checked
By the agent that built it:
go vet ./... && go test -race ./...,cargo check, thepnpmchain inapp,npx tsc -p e2e, the docs build,marketplace.spec.ts40 passes over 5 repeats, and an end-to-end run of the builtberth agentwith a throwaway home againstsite/served locally (install, consent, load, remove).Re-run by me before pushing:
go vetand the marketplace Go tests,typecheck:plugins,check:marketplace,pnpm build, andmarketplace.spec.ts(8 pass). I read the install and fetch code.Known:
settings-boxesina11y.spec.tsfails here as it does onmain(a list-markup violation in Settings → Boxes).Next
A listing entry will gain a box-side helper for plugins that need one. Unknown listing fields are already ignored, and the same-host rule for file URLs will need loosening if a helper is hosted elsewhere.
🤖 Generated with Claude Code