The registry for the BB Community plugin marketplace, which BB registers
under the reserved name bb-community. Merges to main
publish https://getbb.app/marketplace/v1/marketplace.json, which every BB
installation refreshes.
entries/<plugin-id>.json— one marketplace entry per plugin. The filename must equal the entryid. One file per plugin keeps submission pull requests conflict-free.icons/— optional icon files referenced relatively from entries.marketplace.base.json— marketplace identity (name, display name).schema/marketplace.schema.json— the entry contract. Canonical URL: https://getbb.app/schemas/marketplace.schema.json.scripts/build.mjs— validates everything and composesdist/marketplace.jsondeterministically.scripts/build-stats.mjs— composesdist/stats.json, the install-count sidecar, from BB'splugin_installedtelemetry.
- Fork this repository.
- Add
entries/<your-plugin-id>.json. Theidmust match the plugin id that your plugin package manifest derives. Pointsourceat your public git repository (with an optionalsubdirfor multi-plugin repositories) or your npm package. - Open a pull request. CI validates the entry; a maintainer reviews the plugin itself, including its source and behavior.
Approval covers the listing. With a semver range source you release
updates by tagging your own repository; changing the entry itself (source
location, name, or branding) needs a new reviewed pull request.
The account that opens the listing pull request is recorded as the owner in
author.github and gates later entry changes.
BB installs nothing automatically: a catalog refresh only surfaces
bb plugin outdated, and applying an update is a manual, staged,
rollback-protected action.
https://getbb.app/marketplace/v1/stats.json publishes how many distinct BB
installations reported installing each public plugin. BB fetches it beside the
manifest on every catalog refresh and shows the number on the store card, the
mobile browse row, and bb plugin search.
{
"schemaVersion": 1,
"generatedAt": "2026-08-21T06:17:00.000Z",
"plugins": { "thread-hover-cards": { "installs": 4210 } }
}- The counts come from the
plugin_installedevent that BB servers already send to PostHog. Telemetry is opt-out and only reports from production builds, so a count is "installs BB heard about", not a true total. - It is a separate document, not a field in
marketplace.json. That schema is strict, so an unknown field there rejects the whole catalog on an older desktop, and the numbers move daily while the manifest sits unchanged behind a 304. - Bundled BB plugins appear here too, even though they have no entry in
entries/: BB looks their counts up in this same document. - Only this marketplace publishes counts. BB ignores a
stats.jsonbeside a third-party manifest, because the number is BB's measurement, not the publisher's claim. .github/workflows/stats.ymlrebuilds and uploads it daily. It needs thePOSTHOG_API_KEYsecret (a personal API key with project read access) and thePOSTHOG_PROJECT_IDvariable, alongside the Cloudflare credentials the manifest publish already uses. SetPOSTHOG_HOSTwhen the project is not on US cloud.- A run that finds no counts fails without uploading, so an outage or a rotated key leaves the last published sidecar in place instead of zeroing every counter in the store.
Print the document without publishing it:
POSTHOG_API_KEY=… POSTHOG_PROJECT_ID=… node scripts/build-stats.mjs --printnpm ci
npm run build # validate + compose dist/marketplace.json
npm run check # also verify sources exist (git ls-remote / npm view)