A personal collection of Foxglove extensions, organized as an npm workspaces monorepo.
Each extension is a self-contained package under extensions/ built with the @foxglove/extension SDK and scaffolded via the official create-foxglove-extension generator.
foxglove-extensions/
├── package.json # workspaces root
└── extensions/
└── form-publish-panel/ # form-driven JSON publisher
- Node.js 24+ (see
.nvmrc) - Foxglove desktop (for
local-installverification)
npm installcd extensions
npm init foxglove-extension@latest <extension-name>
cd ..
npm installThe root npm install re-links workspaces so the new extension is picked up. Then add the new workspace name to the CI fan-out matrix in .circleci/config.yml (workflows.all.jobs.build-ext.matrix.parameters.ext) so the new extension is linted, built, and tested on every push.
Run from the repo root to fan out across every extension, or from a single extension's directory to target just that one.
| Command | What it does |
|---|---|
npm run build |
Compile each extension's dist/extension.js. |
npm run local-install |
Build and copy each extension to ~/.foxglove-studio/extensions/. Restart Foxglove to see changes. |
npm run package |
Produce a distributable .foxe per extension. |
npm run lint / npm run lint:fix |
Lint across all extensions. |
npm run clean |
Remove each extension's build output. |
CircleCI config lives in .circleci/config.yml. Two workflows:
all— the default. Runs on every push and fans out a parallel job per extension (lint + build + test + package). The fan-out uses a matrix listing extension workspace names. When you add a new extension, append its workspace name to the matrix underworkflows.all.jobs.build-ext.matrix.parameters.extin.circleci/config.yml.one— runs only when the pipeline is triggered with anextensionparameter, scoping the same checks to a single workspace.
Each job produces the extension's .foxe package and uploads it as a CircleCI artifact under the foxe/ prefix. These artifacts are the files you would submit to the Foxglove extension registry — download them from the pipeline's Artifacts tab.
Via the CircleCI UI: click Trigger Pipeline and set parameter extension to the workspace name (e.g., form-publish-panel).
Via the API:
curl -X POST https://circleci.com/api/v2/project/gh/<org>/<repo>/pipeline \
-H "Circle-Token: $CIRCLE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"parameters": {"extension": "form-publish-panel"}}'Locally, scope any root script to one workspace with npm's --workspace flag:
npm --workspace form-publish-panel run build
npm --workspace form-publish-panel run lint