## Summary Gives external integrations (command palettes, plugin launchers, alternate dashboard shells) a supported way to **discover the host UI** — instead of hardcoding the dashboard's view ids, labels and settings search terms and hand-syncing them on every release. This is the read-only metadata slice of the "constrained by a stable host context and API client" idea in `docs/proposals/2026-07-01-dashboard-theme-plugin-system.md`, and the follow-on to #2415 (theme tokens + overlay layering). Two additions, both inert unless called: | Endpoint | Returns | |---|---| | `GET /api/views` | Every registered built-in view id, in dashboard order — `id`, English `label`, plus optional i18n `labelKey`, legacy `aliases` and `internal` flag. | | `GET /api/settings/sections` | Selectable Settings sections — `id`, `label`, `labelKey`, `scope`, `group`, `keywords`, `searchableKeys`, `advanced`. | Both are read-only, return static project-independent metadata, take no project id, and are mounted inside `createApiRoutes` so they sit behind exactly the same `/api` authentication as every other dashboard route — no more, no less. ## What actually changed — one source of truth The endpoints are the small part. The core of the diff is **collapsing duplicated UI metadata into two shared registries that now drive both the dashboard UI and the API**: - `packages/dashboard/src/shared/dashboard-views.ts` — canonical view ids + English labels + i18n keys + legacy aliases. - `packages/dashboard/src/shared/settings-sections.ts` — canonical settings sections + scope/group/search metadata, with `group` and `advanced` derived from the list's own structure. `LeftSidebarNav`, `SettingsModal` and `useViewState` were rewritten to consume those registries instead of carrying their own copies (net **−230 lines** in `SettingsModal` alone). Edit the registry and the rendered UI and the API move together. ## Drift protection Being precise about what each test can and cannot catch, because "no-drift" claims are easy to overstate: - `left-sidebar-nav-registry-parity.test.tsx` — the one test that catches drift the registry does not already determine. It **renders** the sidebar with a recording `t()` spy and pins each entry's translation key and English fallback to the registry (the sidebar still hardcodes its keys). It also asserts the rendered destination count equals the enrolled id list, so a newly added sidebar view fails until it is enrolled. - `ui-metadata-sync.test.ts` — pins the Settings navigation list, advanced-visibility set, persisted view list, reset-key registry and both endpoint payloads to the registries. Since those consumers are now *derived* from the registries, these assertions mainly guard against a future consumer **re-hardcoding** its own copy. Two of them do stand on their own: each section's served `group` is pinned to the group header it actually renders under, and no published `labelKey` may resolve to a non-leaf i18n node. - `register-ui-metadata-routes.test.ts` — drives the real Express router and asserts each endpoint serves the registry payload verbatim, with no filtering or reshaping. - Exactly two **existing** tests are updated, both for the same reason: they asserted that `SettingsModal.tsx`'s *source text* contains a section literal that now lives in the registry. `VoiceInputSection.modal-visibility.test.tsx` now asserts Voice Input's Basic-mode contract against `SETTINGS_SECTION_METADATA`, and `mcp-documentation.test.ts` reads the registry for the two MCP section ids. No other existing test in the package changes. ## Design notes / decisions for review - **`GET /api/views` returns the full registry, not the live menu.** It includes flag-gated / experimental ids and `internal` (non-navigable) destinations; reachability depends on flags and plugins this endpoint does not evaluate. Documented as "known view ids", not "visible nav entries". - **`labelKey` is optional and best-effort; `label` is the guarantee.** A `labelKey` is published only where the dashboard itself renders that view's title through it. `graph` (labelled from a plugin manifest) and the internal `task-detail` carry none rather than advertise a key that resolves to nothing — and `task-detail` in particular must not point at `taskDetail.title`, which is an occupied i18n *namespace* whose lookup returns an object rather than falling through to a default. A guard test now enforces that. Separately, a few published keys (`nav.ideation`, `nav.importTasks`, `nav.automations`, `pr.view.title`) are the dashboard's real keys but aren't in the shipped catalogs yet because the host supplies their English inline; the docs say plainly that consumers must fall back to `label`. - **`keywords` / `searchableKeys` are explicitly non-contractual.** `searchableKeys` exposes the raw i18n translation-key strings backing a section's searchable copy; values, ordering and presence may change between releases. Documented as best-effort search hints, never stable identifiers. - **Migration is deliberately partial.** The desktop sidebar, Settings navigation and persisted view list now come from the registries; `Header.tsx` and the mobile More sheet still hardcode a few of the same labels. They can still drift from what `GET /api/views` reports; converting them is left to a follow-up so this diff stays reviewable. - **No project scoping, deliberately.** The proposal doc rightly pushes plugin traffic through a project-scoped client — these two endpoints are the exception that proves the rule: they return static registry metadata that is identical for every project, so threading a `projectId` would imply a scoping guarantee that does not exist here. They never touch `getScopedStore` / `TaskStore`. - **Two endpoints rather than one `/api/ui-metadata` envelope.** Views and Settings sections are independent registries with different consumers, and `/settings/sections` sits naturally beside the existing `/settings/*` routes. A consumer that only needs navigation doesn't pay for settings metadata. - **The registry extraction ships with the endpoints rather than as a separate PR.** The registries *are* the mechanism that keeps the API honest — split apart, the first half is a refactor with no observable effect and the second can't land without it. - **Placement:** `packages/dashboard/src/shared/` is a new directory, and these are the first *production* `app/ → src/` imports in the package (today the only one is in `ProviderIcon.test.tsx`). They sit under `src/` because `src/`'s tsconfig cannot import `app/`, so a module both sides consume has nowhere else to go; both registries are dependency-free data leaves, and `vite build` plus `check-no-node-only-core-imports-in-dashboard` confirm the client bundle is unaffected. The considered alternative was `packages/core/src` behind the `dashboard-browser-safe-core-modules.json` allowlist, where `mobile-nav-primary-items.ts` keeps a destination→labelKey table — these stayed out of `core` because they are dashboard-owned UI ids, and because the two tables describe different surfaces (core mirrors the mobile nav's `nav.skills`/`nav.settings`; this registry mirrors the desktop sidebar's `header.skillsView`/`header.settings`). - Ships a `@runfusion/fusion` **minor** changeset (`category: feature`). Happy to adjust any of the above — shape, placement, or dropping `searchableKeys` — if you'd rather it landed differently. ## Verification - Rebased onto `main@26dcccb7c`. Two conflicts, both resolved by absorbing upstream's work rather than reverting it: - `SettingsModal.tsx` — upstream's `voice-input` section (and the `FNXC:VoiceInput` decision comment explaining it stays out of the advanced-only set) moved into the registry. The registry's section list is byte-identical to `main`'s `SETTINGS_SECTIONS` (45/45 entries, all fields), and the registry-derived `ADVANCED_SETTINGS_SECTION_IDS` is identical to `main`'s hardcoded set (19/19, same order) — both verified mechanically, not by eye. Upstream's `RUNTIME_*` hide-uninstalled-runtimes sets are untouched. - `routes/README.md` — the `mount-sequence` list regenerated from `CREATE_API_ROUTES_REGISTRAR_MOUNT_SEQUENCE`, so `registerVoiceRoutes` and `registerUiMetadataRoutes` are both in place and the contract test passes. - `DASHBOARD_VIEWS` covers exactly `main`'s `BuiltInTaskView` union, aliases included, and `BUILT_IN_TASK_VIEWS` reproduces `main`'s 27-entry array in order (`devserver` still preceding `dev-server` for the migration path). - Every one of the 20 sidebar labels the refactor rewrote was checked to be byte-identical to `main`'s hardcoded fallback, and every `FNXC:` decision comment displaced by the move was accounted for — all 75 in `SettingsModal.tsx` and all 11 in `useViewState.ts` survive, relocated onto the registry entries they document. - The full `dashboard-app` + `dashboard-api` suites were run at this commit (**20,706 passing**) and again on unmodified `main@26dcccb7c`, and the failing-file sets compared: **every file that fails here also fails on `main`** — nothing regresses. The overlap is environment-driven (Postgres-backed `*.pg.test.ts`, tests needing built `dist` artifacts, and `SettingsModalNodeRouting.test.tsx`'s `No "fetchSystemInfo" export is defined on the "../../api" mock`), none of it touched by this change. - `tsc --noEmit` clean for both dashboard projects, `eslint` clean on every changed file, and `vite build` of the client bundle succeeds (the two pre-existing `@fusion-plugin-examples/claude-runtime` / `playwright-core` module-resolution errors reproduce on unmodified `main`). - Repo gate scripts pass: `check-changeset-format`, `check-routes-modular`, `check-no-node-only-core-imports-in-dashboard`, `check-no-cwd-relative-dashboard-test-reads`, `check-mock-completeness`. - The three new assertions were mutation-tested rather than assumed load-bearing: breaking the registry's `group` derivation, dropping an enrolled sidebar id, and re-pointing `task-detail` at the `taskDetail.title` namespace each make their test fail. - Local CodeRabbit review over two passes: 3 minor findings, all addressed (parity projection missing `group`; route tests asserting partial instead of exact payloads; the `labelKey` guard not covering the settings registry). <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added authenticated, read-only APIs for discovering dashboard views and selectable Settings sections. * Added dashboard view metadata, including labels, aliases, internal status, and translation keys. * Added Settings metadata with grouping, scope, advanced status, and search-related information. * Updated navigation and Settings UI labels to use shared metadata. * **Documentation** * Documented the new metadata endpoints and integration guidance. * **Bug Fixes** * Added safeguards and automated checks to keep UI navigation and API metadata synchronized. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Co-authored-by: Claude <noreply@anthropic.com>
Fusion
From rough idea to production code — automatically.
🏭 A software factory, run by a multi-agent orchestrator.
Describe what you want — a team of AI agents plans, builds, reviews, and ships it for you. Fusion is your software factory: an assembly line for code that runs across tasks, agents, missions, git, files, and worktrees, with any model, local or cloud.
runfusion.ai → · Docs · GitHub · npm · Discord
English · 简体中文 · 繁體中文 · Français · Español · 한국어
Your entire dev environment. On a single pane of glass.
Describe a task in plain language. A planning agent reads your project, understands context, and writes a full PROMPT.md plan — steps, file scope, acceptance criteria. Then Fusion plans, reviews, executes, and reviews again, in an isolated git worktree, with a human approval gate wherever you want one.
One board. Controlled from anywhere. Laptop, Mac mini, Linux server, cloud VM, phone — all connected.
Like Trello, but your tasks get specified, executed, and delivered by AI. Built on the great work of dustinbyrne/kb.
Quick start
Zero install, straight from npm:
npx runfusion.ai
That launches the dashboard. Subcommands forward through: npx runfusion.ai task create "fix X", npx runfusion.ai --help, etc. (Or verbosely: npx @runfusion/fusion dashboard.)
One-line installer (macOS & Linux — auto-picks Homebrew, falls back to npm):
curl -fsSL https://runfusion.ai/install.sh | sh
fusion dashboard
Homebrew (macOS & Linux):
brew install runfusion/fusion/fusion
fusion dashboard # or: fn dashboard
Fully-qualified install auto-taps and, on Homebrew 6.0+, trusts only the Fusion formula. If you already ran brew tap runfusion/fusion and short-name install fails with “untrusted tap”, run brew trust --formula runfusion/fusion/fusion then brew install fusion.
npm global:
npm install -g @runfusion/fusion
fn dashboard # or: fusion dashboard
From a clone (for development):
pnpm dev dashboard
Then click the Open: URL printed in the terminal. It embeds a bearer token
(http://localhost:4040/?token=fn_...) that the browser captures to
localStorage on first visit and reuses automatically thereafter. On the
server side, Fusion now persists the dashboard/daemon token in
~/.fusion/settings.json on first authenticated run and reuses it on later
starts unless you override it (--token, FUSION_DASHBOARD_TOKEN,
FUSION_DAEMON_TOKEN) or disable auth with --no-auth. See
CLI reference → fn dashboard → Authentication
for full precedence and reset/revocation options.
First-run setup
On first launch, Fusion opens the onboarding wizard with three guided steps:
- AI Setup — Use a simplified quick-start provider list (recommended providers plus any already-connected providers), then expand Advanced provider settings only if you need additional providers or setup details. You only need one provider to get started. Deprecated Google Gemini CLI / Antigravity provider entries are intentionally hidden; Google/Gemini API key, Google Generative AI, Vertex, and Cloud Code paths remain supported.
- GitHub (Optional) — Connect GitHub for issue import and PR management
- First Task — Create your first task or import from GitHub (if no project is active, onboarding first prompts you to register/select a project directory)
The wizard is dismissible and non-blocking — click Skip for now to use the dashboard immediately. Re-trigger it later from Settings → Authentication → Reopen onboarding guide.
Mobile
For Capacitor + PWA workflow, see MOBILE.md.
The flow
① Describe ② Planning ③ The board ④ Isolated worktree
───────────── ───────────── ───────────── ─────────────────────
"Add dark mode → Agent writes → Plan → Review → → fusion/FN-123 branch
toggle to PROMPT.md Execute → Review concurrent, zero
settings panel" (steps, scope, (per step, until file conflicts
acceptance) done)
See every step, before the merge
Every task shows its plan, its reviews, its diffs, and its file changes in real time. Jump into an active task and nudge direction, tighten constraints, pause, or re-prompt.
What makes it different
| 🧠 AI planning | Describe a task in plain language. Planning agents turn it into a PROMPT.md plan with steps, file scope, and acceptance criteria. |
| 🔁 Selectable workflows | Built-ins cover coding, quick fixes, review-heavy work, stepwise execution, plugin-gated Compound Engineering, and PR lifecycle fragments. Pick a workflow per task or author custom ones in the Workflow Editor. |
| 🛡️ Planner oversight | Per-task or per-workflow oversight level (off / observe / steer / autonomous) governs how closely a planner overseer watches and intervenes — merge/PR and destructive actions always require explicit human confirmation. See Settings Reference and Dashboard Guide. |
| 🌳 Worktree isolation | Each task runs in its own branch and worktree (fusion/{task-id}). Parallel tasks. Zero conflicts. Optional worktrunk delegation via worktrunk.enabled (see WorktreeBackend abstraction). |
| 🗄️ PostgreSQL by default | Fusion uses zero-config embedded PostgreSQL for local runtime metadata. Legacy SQLite files are one-time migration inputs only; use a shared external database for multi-project and multi-node setups. (Storage) |
| ⚡ Smart merge controls | Passing every gate? Fusion squash-merges and moves on. Opt into manual approval anywhere, inherit the live global auto-merge default, or set explicit per-task auto/manual overrides. |
| 🛰️ Multi-node mesh | Laptop, Mac mini, Linux server, cloud VM, phone — all synced. Desktop, mobile, web. |
| 🧩 Any model | Anthropic, OpenAI, Ollama, Google Generative AI, Z.ai, Kimi K3, local runtimes, and user-defined custom providers. Local and cloud coexist, with workflow model/fallback lanes configurable per project. |
| 🏢 Agent companies | Import pre-built teams — 440+ agents across 16 companies — and run them autonomously for weeks. |
| 📬 Inter-agent messaging | Built-in mailbox between agents. Delegate, clarify, coordinate; engineer-role agents can opt into backlog auto-claim when you want implementation help beyond executor-only pickup. |
| 🗨️ Agent chat | Direct chat, task chat that proactively narrates step progress, failures, and review outcomes, attachments, in-chat question cards, resumable streams, and experimental multi-agent Chat Rooms where mentioned members respond directly and ambient members can join up to a cap. (Chat docs) |
| 🗺️ Missions | Hierarchical planning (Mission → Milestone → Slice → Feature → Task) with autopilot and validation contracts. |
| 🔬 Research | Bounded research runs with web search, GitHub, local docs, and LLM synthesis (plus runtime builtin WebSearch/WebFetch support in planning + synthesis flows when available). Turn findings into tasks. (Docs) |
| 🧪 Self-improvement | Agents reflect on their own output and update their prompts as they learn your codebase. |
| 🔓 Open source. MIT. | No vendor lock-in. Run it on your own hardware. Shipping weekly. |
See it in action
The newest surfaces in Fusion, at a glance — the live board, your agent team, mission control, visual workflows, agent chat, multi-agent rooms, and inter-agent mail.
📋 The board & your agent team — live, from a real fleet
Every task, every column, every step — live. Cards carry GitHub links, step counts, review levels, and promote/move/archive actions. Switch to the Graph view to see task dependencies as an interactive node graph:
![]() Board — kanban columns |
![]() Graph — dependency map |
Here is the same fleet re-skinned into the Ember theme (dark graphite with an orange accent), alongside the Agents roster:
![]() Board — Ember |
![]() Agents — Tokyo Night |
Import a team and every agent shows up here — role, reports-to chain, heartbeat, and token share. Each agent card's heartbeat dropdown shows Disabled when scheduling is persisted off; choose Disabled to pause heartbeats while retaining its cadence, or select an interval to re-enable them. The Agents roster in Ember:
🛰️ Command Center — mission control for your agent fleet
One screen for everything your agents are doing. Tune live scheduler capacity, watch token spend by model in real time, and prove the value with hard numbers. The Overview tab opens with live gauges and charts:
Every tab is a different lens on the same live fleet:
Tokens · Tools · Activity · Productivity · Team · Ecosystem · GitHub · Signals · System · Reliability · Mission Control — every tab is a different lens on the same live fleet.
The same fleet, your way — Command Center (and the whole dashboard) re-skins live across 70+ color themes, including Cobalt, Clay, and Moss. Here it is in Shadcn Light, Shadcn Dark Gray, and Ember:
![]() Shadcn Light |
![]() Shadcn Dark Gray |
![]() Ember |
🔁 Selectable workflows, authored visually
A task's journey from idea to merge is a workflow — and it's yours to choose and shape. Pick a built-in (Coding, Quick fix, Review-heavy, Stepwise, PR lifecycle, Compound engineering, and more), inspect its graph, then duplicate and customize columns, gates, model lanes, and review policy in the visual Workflow Editor. No engine fork required.
Here's the Stepwise coding graph — plan, execute, and review every step before the next — explored node-by-node in Shadcn Light, Dark Gray, and Ember:
![]() Shadcn Light |
![]() Shadcn Dark Gray |
![]() Ember |
🗨️ Agent chat — talk to your agents, mid-flight
Direct chat and per-task chat with any agent, on any model. Ask why a task failed, steer an approach, drop attachments, answer in-chat question cards, and resume streams where you left off — full markdown and code rendering throughout.
![]() Shadcn Light |
![]() Shadcn Dark Gray |
👥 Multi-agent chat rooms
Put multiple agents in a room and let them coordinate. Mention a member and it responds directly; ambient members can join the conversation up to a cap. Here the CEO, Product Manager, and CTO agents align on task ownership in #leads — no human in the loop. (Chat docs)
![]() Shadcn Light |
![]() Shadcn Dark Gray |
![]() Ember |
📬 Agent mail — an inbox between your agents
A built-in mailbox for delegation, clarification, and hand-offs. Agents file triage summaries, request approvals, and coordinate work across the fleet — with Inbox, Outbox, Agents, and Approvals views, so you can audit every exchange.
![]() Shadcn Light |
![]() Shadcn Dark Gray |
![]() Ember |
📱 Fusion is an AI factory in your pocket
The full board, Command Center, missions, agents, and chat travel with you — native iOS and Android apps (Capacitor) plus an installable PWA. Start a run on your laptop, steer it from your phone.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
See MOBILE.md for the Capacitor + PWA workflow.
How it works
graph TD
H((You)) -->|rough idea| T["Planning<br/><i>auto-planning</i>"]
T --> TD["Todo<br/><i>scheduled for execution</i>"]
TD --> IP["In Progress<br/><i>for each step:<br/>plan, review, execute, review</i>"]
subgraph IP["In Progress"]
direction TD
NS([Begin step]) --> P[Plan]
P --> R1{Review}
R1 -->|revise| P
R1 -->|approve| E[Execute]
E --> R2{Review}
R2 -->|revise| E
R2 -->|next step| NS
R2 -->|rethink| P
end
R2 -->|done| IR["In Review<br/><i>ready to merge,<br/>or auto-complete</i>"]
IR -->|direct squash merge<br/>or merged PR| D["Done"]
style H fill:#161b22,stroke:#8b949e,color:#e6edf3
style T fill:#2d2006,stroke:#d29922,color:#d29922
style TD fill:#0d2044,stroke:#58a6ff,color:#58a6ff
style IP fill:#1a0d2e,stroke:#bc8cff,color:#bc8cff
style P fill:#1a0d2e,stroke:#bc8cff,color:#e6edf3
style R1 fill:#1a0d2e,stroke:#bc8cff,color:#e6edf3
style E fill:#1a0d2e,stroke:#bc8cff,color:#e6edf3
style R2 fill:#1a0d2e,stroke:#bc8cff,color:#e6edf3
style NS fill:#1a0d2e,stroke:#bc8cff,color:#bc8cff
style IR fill:#0d2d16,stroke:#3fb950,color:#3fb950
style D fill:#1a1a1a,stroke:#8b949e,color:#8b949e
Tasks with dependencies are processed sequentially. Independent tasks run in parallel. Optionally require manual approval before tasks move from Planning to Todo (requirePlanApproval setting).
Workflow overview
Fusion workflows define how a task moves from idea to delivery. The default coding path is still the familiar Plan/Triage → Execute → Workflow steps → Review → Merge loop, but the policy now lives in a selectable workflow rather than being only hard-coded engine behavior.
- Select per task: choose a workflow from the dashboard task/board workflow controls, or assign one through
fn_workflow_select/workflow_idwhen creating tasks. - Built-in catalog: Coding (
builtin:coding), Quick fix (builtin:quick-fix), Review-heavy (builtin:review-heavy), Compound engineering (builtin:compound-engineering, plugin-gated), Stepwise coding (builtin:stepwise-coding), and the PR lifecycle (builtin:pr-workflow, a reusable PR graph fragment). - Customize safely: inspect built-ins, duplicate them, or author custom workflows in the visual Workflow Editor. Workflow-specific settings cover model lanes, review/approval policy, step execution knobs, task fields, and columns.
Read Workflow Steps for runtime semantics, built-in workflow behavior, and workflow-step templates; read Workflow Editor for the dashboard authoring guide.
Planner oversight
Each workflow (and optionally each task) can set a planner oversight level — off, observe, steer, or autonomous (default) — controlling how closely a planner overseer watches and intervenes in that task's execution. Even at autonomous, merge/PR progression and any destructive or external-service side effect always require an explicit, recorded human confirmation before they run. Notification verbosity is controlled separately. Set the default in the Workflow Editor → Values tab, or override per task from the New Task dialog / Task Detail edit form. Read Settings Reference for the full setting semantics and Dashboard Guide for the UI controls.
Multi-node. One board. Every platform.
Laptop, Mac mini, Linux server, cloud VM, phone — every node is a peer. Your task state, agents, logs, and diffs stay synchronized across the mesh. The same Fusion ships as:
- 🖥️ Desktop app — Electron for macOS (Intel + Apple Silicon), Windows 10/11, and Linux
- 📱 Mobile app — Capacitor for iOS/iPadOS and Android (MOBILE.md)
- 🌐 Web dashboard — any modern browser, served from the
fn dashboarddaemon - 🔌 CLI —
fnbinary + extension for terminal-first workflows
Start the daemon on any node, connect your other devices, and the board follows you everywhere.
Run an agent company
Import a team. Run it autonomously for weeks. 440+ agents across 16 companies, wired for missions, mailboxes, and inter-agent delegation.
npx companies.sh add paperclipai/companies/gstack
Compatible with the tools you already use.
Fusion integrates with the tools you love. Hermes, Paperclip, and OpenClaw all ship as first-class plugins — route any workspace to whichever runtime fits the task. And any Paperclip agent-company imports with a single command.
Hermes experimental
Nous Research
The open-source autonomous agent from Nous Research. Install the Hermes plugin and run agents through Hermes for long-running, context-growing work — route any Fusion workspace to it.
OpenClaw experimental
OpenClaw runtime support is available as an experimental plugin (fusion-plugin-openclaw-runtime) for runtime discovery/configuration parity. Configure agents with runtimeConfig.runtimeHint: "openclaw" after installing the plugin.
Paperclip experimental
paperclip.ing
The human control plane for AI labor. Install the Paperclip plugin to run agents through Paperclip inside Fusion.
Fusion also natively supports the companies.sh agent-company standard: import a prebuilt team — 440+ agents across 16 companies — and let them coordinate over Fusion's mailbox, missions, and workflow gates for weeks of autonomous work. Same company format, same agents, same skills as Paperclip.
npx companies.sh add paperclipai/companies/gstack
Hermes, Paperclip, and OpenClaw are experimental runtime plugins — APIs and wire formats may shift between minor releases.
Documentation
| Guide | What it covers |
|---|---|
| Getting Started | Installation, onboarding, first task, and workflow-selection basics |
| Dashboard Guide | Board/list views, chat, workflow editor, git manager, settings, and UI tools |
| Task Management | Task lifecycle, prompt specs, comments, archiving, and GitHub integration |
| CLI Reference | Full fn command and daemon reference |
| Settings Reference | Global/project settings, model hierarchy, workflow settings, and custom providers |
| Workflow Steps | Workflow runtime, built-in workflows, gates, templates, and phases |
| Workflow Editor | Visual authoring, importing/exporting, custom fields/columns/settings, and mobile editor |
| Research | Bounded research runs, findings, exports, and task integration |
| Agents | Agent management, spawning, heartbeat, and mailbox workflows |
| Missions | Mission hierarchy, planning, autopilot, and validation contracts |
| Plugin Management | Discovering, installing, enabling, configuring, and troubleshooting plugins |
| Plugin Authoring | Building plugins with lifecycle hooks, routes, tools, runtimes, and dashboard surfaces |
| Remote Access | Tokenized remote dashboard access, Tailscale/Cloudflare setup, and troubleshooting |
| Multi-Project | Central registry, isolation modes, and migration paths |
| Storage | PostgreSQL runtime storage, migration compatibility, and file-backed payloads |
| Docker | Container deployment |
Core features
- AI Planning — Planning agent generates detailed
PROMPT.mdwith steps, file scope, and acceptance criteria - Step-by-step Execution — Plan → Review → Execute → Review cycle for each task step, with graph-mode workflows able to model per-step parse/execute/review/rework explicitly
- Git Worktree Isolation — Each task runs in its own worktree (
fusion/{task-id}branch) - Selectable workflows — Pick Coding, Quick fix, Review-heavy, Stepwise coding, plugin-gated Compound Engineering, custom workflows, or PR lifecycle fragments where appropriate (overview; Workflow Steps)
- Visual Workflow Editor — Inspect read-only built-ins, duplicate/customize workflows, and edit graph nodes, columns, task fields, typed settings, and per-project values (Workflow Editor)
- Workflow Steps — Configurable quality gates (pre-merge: blocks merge; post-merge: informational), plus workflow-declared optional steps such as opt-in Browser Verification
- Workflow-native policy — Fast-mode planning (
leanPlanning/autoApproveSpec), typed triage thresholds, review/approval, step execution, and model/fallback lanes are workflow settings, not hard-coded engine constants (Settings Reference; workflow settings) - Planner oversight — Workflow-native
plannerOversightLevel(off/observe/steer/autonomous), with an optional per-task override and a separate notification-verbosity setting; merge/PR progression and destructive actions always require explicit human confirmation, even atautonomous(overview; Settings Reference) - GitHub + PR lifecycle — Import issues with optional translation and screenshot attachments, skip previously imported issues even after edits or repository casing changes, create PRs, display real-time PR/issue badges, and use workflow-mode PR lifecycle graph fragments where enabled
- Dashboard — Real-time kanban/list/graph views, a project Overview with local codebase token estimate and on-disk size, agent management, terminal, git manager, mission planner, chat, workflow editor, custom provider setup, and one-click update action
- Missions — Hierarchical planning (Mission → Milestone → Slice → Feature → Task) with autopilot, validation contracts, fix-feature retries, mission-goal linking, and blocked-handoff semantics
- Multi-Project — Manage multiple projects from a single installation with project isolation
- Custom Providers — Add OpenAI-compatible, OpenAI Responses, Anthropic-compatible, or Google Generative AI providers; saved models appear in Project Models and workflow model dropdowns (Dashboard Guide; settings shape)
- Smart merge controls — Global auto-merge stays live for default tasks, while explicit per-task overrides can force auto/manual behavior (Settings Reference)
- Inter-Agent Messaging — Built-in messaging for coordination between agents and users; engineer-role agents can opt into backlog auto-claim for implementation tasks (Settings Reference)
- Agent Chat + Chat Rooms — Direct/task chat supports attachments, resumable streams, question response cards, and renameable conversations; experimental rooms route mentioned members as direct responders with optional ambient replies (Dashboard Guide → Chat View)
Provider authentication
Fusion supports OAuth-based authentication for AI providers configured via Settings → Authentication. For most OAuth providers, when the dashboard is accessed via a non-localhost host (remote node, LAN host/IP, or reverse proxy), provider login URLs are rewritten to route OAuth callbacks through a bridge endpoint (/api/auth/oauth-callback) so redirects reach the active browser session.
- Anthropic (Claude) — Uses a pasted authorization-code flow in Settings/onboarding: sign in, then paste the final redirect URL (or code) back into Fusion to complete login
- OpenAI Codex — Uses the same pasted authorization-code flow with secure state validation
- Factory AI — via Droid CLI (optional) — requires local Droid CLI install +
droid auth login; detection follows the effective runtime binary path (defaultdroid, or plugindroidBinaryPathwhen configured), then enable in Settings → Authentication and restart Fusion - llama.cpp — via HTTP server (optional) — configure your llama.cpp server URL (default
http://127.0.0.1:8080) and optional API key, then enable in Settings → Authentication - Other providers — Authenticate via API key entry in Settings (including Google/Gemini API key, Google Generative AI, Vertex, and Cloud Code aliases)
- Custom providers — Add user-defined OpenAI-compatible, OpenAI Responses, Anthropic-compatible, or Google Generative AI endpoints from Settings → Authentication → Custom Providers; saved model IDs become selectable in project and workflow model lanes (Dashboard Guide)
Model system
Fusion uses a dual-scope model hierarchy with independent lanes. Global settings define baseline defaults; project settings provide per-project overrides.
| Lane | Purpose | Global Baseline Keys | Project Override Keys |
|---|---|---|---|
| Executor | Task execution agent | executionGlobalProvider + executionGlobalModelId |
executionProvider + executionModelId |
| Planning | Task planning agent | planningGlobalProvider + planningGlobalModelId |
planningProvider + planningModelId |
| Validator | Plan/code reviewer | validatorGlobalProvider + validatorGlobalModelId |
validatorProvider + validatorModelId |
| Merger | Merge conflict / clean-room merge agent | mergerGlobalProvider + mergerGlobalModelId |
mergerProvider + mergerModelId |
| Title Summarization | Auto-title generation | titleSummarizerGlobalProvider + titleSummarizerGlobalModelId |
titleSummarizerProvider + titleSummarizerModelId |
| Workflow Step Refinement | AI prompt refinement | (uses defaultProvider/defaultModelId) |
(uses modelProvider/modelId on WorkflowStep) |
Workflow lanes: The default workflow exposes Plan/Triage, Executor, Reviewer, and fallback model lanes in Settings → Project Models, and advanced workflow settings can declare additional typed model/policy values (Settings Reference).
Per-Task Overrides: Quick Add and Inline Create let tasks override the planning, executor, validator, and merger lanes; planning, validator, and merger selections also support task-specific thinking levels. (modelProvider/modelId, validatorModelProvider/validatorModelId, planningModelProvider/planningModelId, and merger model/thinking overrides.)
Precedence: Per-task → Project override → Global lane → defaultProvider/defaultModelId → Automatic resolution.
For full settings documentation, see Settings Reference.
Scheduled tasks / automations
Fusion supports scheduled task automation via the /api/automations endpoints. Automations can run shell commands or multi-step workflows on a configurable schedule.
Scheduling scope
Automations and routines can run in two scopes:
- Global — Runs across all projects. Use this for cross-project maintenance, backups, or unified reporting.
- Project — Runs only within a specific project. Use this for project-specific CI, testing, or deployment tasks.
When you create a schedule without choosing a scope, Fusion defaults to project scope with the default project ID for backward compatibility.
To explicitly target a scope:
- In the dashboard Scheduled Tasks modal, use the Global / Project toggle.
- Via the API, pass
?scope=globalor?scope=project&projectId=<id>on automation/routine endpoints.
Scope resolution rules:
scope=globalalways resolves to the global automation/routine lane, independent of the active project.scope=projectrequires aprojectId. If omitted, it falls back to"default".- CRUD, run, toggle, and webhook operations are strictly scope-isolated: a global schedule cannot be mutated from a project-scoped request, and vice versa.
Operational guidance for multi-project setups:
- Prefer global schedules for shared infrastructure (e.g., nightly backups, memory insight extraction).
- Prefer project schedules for per-repository automation (e.g., per-project test runners, deployment hooks).
- Global and project lanes are polled independently by the engine, so due runs in one lane do not block the other.
Automations
| Endpoint | Method | Description |
|---|---|---|
/api/automations |
GET | List all automations (filtered by scope if specified) |
/api/automations |
POST | Create automation (scope defaults to project) |
/api/automations/:id |
GET | Get automation by ID |
/api/automations/:id |
PATCH | Update automation |
/api/automations/:id |
DELETE | Delete automation |
/api/automations/:id/run |
POST | Trigger manual run |
/api/automations/:id/toggle |
POST | Toggle enabled/disabled |
/api/automations/:id/steps/reorder |
POST | Reorder automation steps |
Routines
Routines are AI agent tasks triggered by cron schedules, webhooks, or manual execution. Routines share the same global/project scope model as automations.
| Endpoint | Method | Description |
|---|---|---|
/api/routines |
GET | List all routines (filtered by scope if specified) |
/api/routines |
POST | Create routine (scope defaults to project) |
/api/routines/:id |
GET | Get routine by ID |
/api/routines/:id |
PATCH | Update routine |
/api/routines/:id |
DELETE | Delete routine |
/api/routines/:id/run |
POST | Manual trigger |
/api/routines/:id/trigger |
POST | Canonical manual trigger |
/api/routines/:id/runs |
GET | Get execution history |
/api/routines/:id/webhook |
POST | Webhook trigger (signature verification supported) |
CLI quick examples
fn task create "Fix the login bug" # Quick entry → planning
fn task plan "Build auth system" # AI-guided planning
fn task import owner/repo --labels bug # Import GitHub issues
fn task show FN-001 # View task details
fn task logs FN-001 --follow # Stream execution logs
fn task steer FN-001 "Use TypeScript" # Guide the agent mid-execution
fn project add my-app /path/to/app # Register a project
fn project list # List all projects
fn settings set maxConcurrent 4 # Configure settings
fn settings export # Export configuration
fn mission create "Auth System" "Build auth" # Create mission
fn mission activate-slice <slice-id> # Activate a slice
fn skills search react # Search skills.sh
fn skills install firebase/agent-skills # Install agent skills
Packages
| Package | Description |
|---|---|
@fusion/core |
Domain model — tasks, board columns, PostgreSQL stores |
@fusion/dashboard |
Web UI — Express server + kanban board with SSE |
@fusion/engine |
AI engine — planning, execution, scheduling, workflow steps |
@runfusion/fusion |
CLI + extension — published to npm |
Development
pnpm install # Install dependencies
pnpm local # Start local dashboard/API + AI engine on a non-4040 port
pnpm local --no-engine # Start local dashboard/API only
pnpm build # Build default workspace packages (excludes desktop/mobile)
pnpm build:all # Build all packages (including desktop/mobile)
pnpm dev dashboard # Run dashboard + AI engine
pnpm dev:ui # Dashboard only (no AI engine)
pnpm lint # Lint all packages
pnpm typecheck # Type-check all packages
pnpm test # Run all tests
Build a standalone executable
Build a single self-contained fn binary using Bun:
pnpm build:exe # Build for current platform
pnpm build:exe:all # Cross-compile for all platforms
License
MIT — open source, no vendor lock-in. See LICENSE.








































