The first-party plugins for Rocketflare.
These are not npm packages. A Rocketflare plugin is a git repository copied into your app — exactly like the kit itself — so its code lands as ordinary source you can read, debug and edit, translated into your app's own vocabulary on the way in. The price is that an upgrade is a patch rather than a version bump, which the kit's tooling already knows how to do.
Each plugin has its own README with what it adds, requirements, install and first-run steps, who sees what and its known gaps. They are also published at rocketflare.dev/plugins.
| Plugin | What it adds | Needs |
|---|---|---|
| analytics | Dashboards, tenant-scoped drizzle-cube cubes at /cubejs-api and /mcp, an hourly fact table, CLI, and four analytics-* agent skills. Installed by the kit's bootstrap |
kit 0.17.1 |
| web-knowledge | web_search and fetch_page tools for agents and chat on each organisation's own key (Tavily, Brave, Exa, Serper, Firecrawl), Settings → Web search |
kit 0.9.0 |
| connectors | Organisation connections: admin consent once, then directory and calendar sync every 15 minutes; Settings → Connections, My calendar, CLI and the connectors setup skill |
kit 0.13.0 and a provider |
| m365 | Microsoft 365 as a connectors provider: Entra admin consent, app-only Graph delta sync of users, groups and calendars |
kit 0.12.0 and connectors |
| issue-reports | Ideas & issues: anyone talks a bug or an idea through with an agent that asks until it is clear, checks for a duplicate, and logs it as a GitHub issue (or a comment) once they approve the draft | kit 0.21.0 and a GitHub token |
| inbox | Inbound email through Cloudflare Email Routing: per-organisation address and sender allow-list, SPF/DKIM/DMARC checks, parsed bodies and attachments, Gmail/Proton forwarding-confirmation codes, an Inbox page, CLI, read-only agent tools, and an inbox:consumers extension other plugins build on |
kit 0.22.0 and Email Routing on the domain |
| freeagent | FreeAgent (UK accounting) per organisation: OAuth connection, a 30-minute incremental mirror of bank transactions, explanations, categories, contacts, bills and invoices, Settings → FreeAgent and a FreeAgent page, read tools plus approval-gated write tools for agents, analytics cubes, CLI, a service API and a freeagent:sync-listeners extension for plugins built on top |
kit 0.21.0 and a FreeAgent app |
# Read the plan first — it always prints and stops.
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.1 --subdir plugins/analytics
# Then install it.
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.1 --subdir plugins/analytics --apply
# The HOST generates the migration. Always.
pnpm db:generate --name plugin-analytics-<version> && pnpm db:migrate--subdir is what tells pnpm plugin add which plugin in this repository you mean; each plugin
also records its own subdirectory in its rocketflare-plugin.json, so pnpm plugin upgrade <id> later needs no flag.
Installing a plugin gives it full Worker and database access — it is as trusting as merging a pull
request — which is why every command prints its plan and waits for --apply.
rocketflare-plugins/
package.json the ONE version for the whole repository
CHANGELOG.md the human index; the porting notes live per plugin
scripts/ the kit's release tooling, ONE copy (see below)
.github/workflows/ci.yml one job per plugin, calling the kit's reusable workflow
plugins/<id>/
rocketflare-plugin.json what makes a directory a plugin
apps/web/src/plugins/<id>/** }
packages/shared/src/plugins/<id>/** } mirrors the host tree exactly
apps/cli/src/plugins/<id>/** }
docs/upgrades/*.md one porting note per release
Each plugins/<id>/ mirrors the host tree exactly, because that is what the kit's installer
expects: classifyPluginFile refuses any path outside apps/web/src/plugins/<id>/,
packages/shared/src/plugins/<id>/, apps/cli/src/plugins/<id>/ and docs/plugins/<id>/ once the
subdir prefix has been stripped. A plugin ships no migration, no wrangler toml and no
package.json — those three are the host's, always.
A plugin's release notes live in plugins/<id>/docs/upgrades/ and nowhere else. pnpm plugin add
copies them to the host's docs/plugins/<id>/upgrades/, and pnpm plugin export copies that host
directory back verbatim. After an export, delete plugins/<id>/docs/plugins/
(find plugins -path '*docs/plugins*' should print nothing): that copy duplicates the notes at the
same host path, and it is how 3.6.0 shipped two of them.
A plugin's compatibility with a kit is observed, not declared. pnpm plugin export derives the
manifest's uses block from the plugin's actual imports, and pnpm plugin add checks it against
the kit's surface ledger (docs/plugin-api.md in the kit) before copying anything. The one
declared number is the top-level minKit, the oldest kit release the plugin may be installed into.
requires.kit and requires.pluginApi are gone and are refused by name.
Every plugin here ships at the repository's version and is tagged plain X.Y.Z — no tag prefixes,
no per-plugin version namespacing. A release cuts every plugin at once, whether or not its own
files changed.
The trade is deliberate. Independent versions would mean prefixed tags (analytics-v1.3.0), a
resolver to match them, and a matrix of which plugin versions have ever been proved against each
other. Lockstep costs an occasional no-op version bump and buys one answer to "which release am I
on" and one CI run that proves the whole set against a kit ref.
scripts/ holds the kit's release machinery — release.mjs, release-check.mjs and the five
lib/*.mjs they import — in one copy, at the repository root.
That location is load-bearing. It sits outside every plugins/<id>/ directory, so
classifyPluginFile never sees these files and they cannot leak into a host app by construction —
where before, each plugin repository vendored its own copy and nothing kept the copies in step.
They are maintained in the kit (rocketflare-dev/rocketflare, scripts/) and copied here; when
the kit's move, copy them again rather than editing them in place.
Every plugin ships at one version, so a release covers all of plugins/*, on a branch:
-
Give every plugin a non-empty
docs/upgrades/unreleased.md. A plugin with no change of its own gets a "version stamps only" note (plugins/<id>/docs/upgrades/3.7.0.mdis the pattern);release.mjsrefuses an empty one. -
Run the kit's release script with every plugin named. Without
--pluginit finds no manifest at the root and exits 1:args=(); for p in plugins/*/; do args+=(--plugin "${p%/}"); done node scripts/release.mjs X.Y.Z "${args[@]}"
It folds each
unreleased.mdintoX.Y.Z.md, stamps everyrocketflare-plugin.json, its anchorplugin.jsonand the rootpackage.json, and prepends theCHANGELOG.mdsection. -
Move the
rocketflare-plugins.git@<previous>install refs inREADME.mdandplugins/*/README.mdto@X.Y.Z; the script does not touch them. -
node scripts/release-check.mjs --tag X.Y.Zmust reportrelease-check ok. -
Commit
Release X.Y.Z, open a PR, and once it merges tag the merge commitX.Y.Zand push the tag.
Released history is never rewritten. Every app pins a commit of this repository; a force-push to a released tag orphans them.
.github/workflows/ci.yml calls the kit's reusable plugin-ci.yml once for the whole
repository, passing plugin_subdirs. For each plugin it reads that plugin's minKit and
the newest kit release, and for each of the two clones that kit,
installs this checkout into it, generates and applies the migrations the host owns, and runs the
kit's whole gate, off one include-matrix: the floor an adopter may still be on, and the ceiling
the kit has just reached.
The kit also dispatches kit-released here on every tag it cuts, and ci.yml listens for it: that
run proves the plugins against the ref just released rather than re-resolving the same range, so a
kit that moves under a plugin is discovered on the day rather than whenever somebody next pushes.
Failing at the FLOOR means the plugin has started using something the kit only gained later —
raise minKit and release. Failing at the CEILING means the kit has moved under it: port the
plugin.
Create plugins/<id>/ with a rocketflare-plugin.json and a README.md (the site publishes it) (id, version, repo pointing here,
subdir: "plugins/<id>", minKit), mirror the host tree beneath it, add a row to the table
above and a line to the plugin_subdirs array in ci.yml. Namespace everything with the id — tables <id>_*, job types
<id>.x, query-key roots <id>:…, the API prefix /api/<id> — because two plugins have to be
able to live in one app.
analytics was released from rocketflare-dev/rocketflare-plugin-analytics up to and including
1.0.2. That repository is unchanged and its tags still install; this one continues from there.
MIT, the same as the kit. See LICENSE.