← BranchaCONTENT HISTORYWHAT CHANGED · RULE-BASED ANALYSIS
Update to Brancha
Snapshot Sep 30, 2026 · 23:13 UTC · version 0.2.0
Collection source: not recorded for this historical snapshot.
First saved snapshot
No earlier snapshot is available to establish a change.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"name": "brancha",
"description": "Tree canvas that grows one idea into many. The agent creates several distinct versions as real HTML, Markdown, SVG, image, video, or audio artifacts, shows them side by side on a branching canvas, and continues from whichever version the user picks — nothing gets overwritten. Operated through the CLI, HTTP API, SQLite, or direct file editing; runs on the user's machine with no model inside and no API key. Use when users ask for multiple versions, compare creative directions, create landing pages, demos, posters, documents, logos, or media, or mention Brancha, branching ideation, or tree-based creation.",
"included_files": [
{
"relative_path": "THIRD_PARTY_NOTICES.md",
"size_in_bytes": 3404
},
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 352
},
{
"relative_path": "app/dist/public/assets/index-CIo_lAEQ.css",
"size_in_bytes": 30985
},
{
"relative_path": "app/dist/public/assets/index-Dn0ONOh4.js",
"size_in_bytes": 282593
},
{
"relative_path": "app/dist/public/index.html",
"size_in_bytes": 869
},
{
"relative_path": "app/dist/server.mjs",
"size_in_bytes": 103871
},
{
"relative_path": "app/package-lock.json",
"size_in_bytes": 89733
},
{
"relative_path": "app/package.json",
"size_in_bytes": 1727
},
{
"relative_path": "app/src/server/app.ts",
"size_in_bytes": 2793
},
{
"relative_path": "app/src/server/artifacts/artifact.store.ts",
"size_in_bytes": 5652
},
{
"relative_path": "app/src/server/artifacts/render.test.ts",
"size_in_bytes": 1463
},
{
"relative_path": "app/src/server/artifacts/render.ts",
"size_in_bytes": 4401
},
{
"relative_path": "app/src/server/data-directory.ts",
"size_in_bytes": 633
},
{
"relative_path": "app/src/server/db/connection.ts",
"size_in_bytes": 585
},
{
"relative_path": "app/src/server/db/schema.ts",
"size_in_bytes": 1221
},
{
"relative_path": "app/src/server/http/body.ts",
"size_in_bytes": 1032
},
{
"relative_path": "app/src/server/http/errors.ts",
"size_in_bytes": 217
},
{
"relative_path": "app/src/server/http/response.ts",
"size_in_bytes": 1034
},
{
"relative_path": "app/src/server/http/router.test.ts",
"size_in_bytes": 943
},
{
"relative_path": "app/src/server/http/router.ts",
"size_in_bytes": 2196
},
{
"relative_path": "app/src/server/http/security.test.ts",
"size_in_bytes": 1106
},
{
"relative_path": "app/src/server/http/security.ts",
"size_in_bytes": 2014
},
{
"relative_path": "app/src/server/http/static.ts",
"size_in_bytes": 1958
},
{
"relative_path": "app/src/server/index.ts",
"size_in_bytes": 393
},
{
"relative_path": "app/src/server/nodes/node.repository.ts",
"size_in_bytes": 5007
},
{
"relative_path": "app/src/server/nodes/node.routes.ts",
"size_in_bytes": 2634
},
{
"relative_path": "app/src/server/nodes/node.service.test.ts",
"size_in_bytes": 6131
},
{
"relative_path": "app/src/server/nodes/node.service.ts",
"size_in_bytes": 13666
},
{
"relative_path": "app/src/server/nodes/node.types.ts",
"size_in_bytes": 349
},
{
"relative_path": "app/src/server/projects/project.repository.ts",
"size_in_bytes": 2299
},
{
"relative_path": "app/src/server/projects/project.routes.ts",
"size_in_bytes": 928
},
{
"relative_path": "app/src/server/projects/project.service.ts",
"size_in_bytes": 2931
},
{
"relative_path": "app/src/server/projects/project.types.ts",
"size_in_bytes": 249
},
{
"relative_path": "app/src/server/realtime/change-watcher.ts",
"size_in_bytes": 1663
},
{
"relative_path": "app/src/server/realtime/events.ts",
"size_in_bytes": 1814
},
{
"relative_path": "app/src/server/settings/settings.routes.ts",
"size_in_bytes": 1312
},
{
"relative_path": "app/src/server/settings/settings.store.test.ts",
"size_in_bytes": 1323
},
{
"relative_path": "app/src/server/settings/settings.store.ts",
"size_in_bytes": 1268
},
{
"relative_path": "app/src/shared/types.ts",
"size_in_bytes": 1009
},
{
"relative_path": "app/src/ui/api.ts",
"size_in_bytes": 1756
},
{
"relative_path": "app/src/ui/components/BrandMark.tsx",
"size_in_bytes": 626
},
{
"relative_path": "app/src/ui/components/Flora.tsx",
"size_in_bytes": 4650
},
{
"relative_path": "app/src/ui/components/I18nProvider.tsx",
"size_in_bytes": 1140
},
{
"relative_path": "app/src/ui/components/Minimap.tsx",
"size_in_bytes": 2977
},
{
"relative_path": "app/src/ui/components/NodeCard.tsx",
"size_in_bytes": 5433
},
{
"relative_path": "app/src/ui/components/Plants.ts",
"size_in_bytes": 8949
},
{
"relative_path": "app/src/ui/components/canvas/PreviewPanel.tsx",
"size_in_bytes": 4671
},
{
"relative_path": "app/src/ui/components/home/EmptyProjectState.tsx",
"size_in_bytes": 1183
},
{
"relative_path": "app/src/ui/components/home/HomeHeader.tsx",
"size_in_bytes": 990
},
{
"relative_path": "app/src/ui/components/home/HowToDialog.tsx",
"size_in_bytes": 1302
},
{
"relative_path": "app/src/ui/components/home/ProjectCard.tsx",
"size_in_bytes": 1961
},
{
"relative_path": "app/src/ui/hooks/useCanvasViewport.ts",
"size_in_bytes": 4108
},
{
"relative_path": "app/src/ui/hooks/useProjectTree.ts",
"size_in_bytes": 623
},
{
"relative_path": "app/src/ui/hooks/useProjects.ts",
"size_in_bytes": 682
},
{
"relative_path": "app/src/ui/hooks/useThemeSync.ts",
"size_in_bytes": 1498
},
{
"relative_path": "app/src/ui/index.html",
"size_in_bytes": 769
},
{
"relative_path": "app/src/ui/lib/api.test.ts",
"size_in_bytes": 364
},
{
"relative_path": "app/src/ui/lib/i18n.test.ts",
"size_in_bytes": 618
},
{
"relative_path": "app/src/ui/lib/i18n/de.ts",
"size_in_bytes": 3597
},
{
"relative_path": "app/src/ui/lib/i18n/en.ts",
"size_in_bytes": 3286
},
{
"relative_path": "app/src/ui/lib/i18n/es.ts",
"size_in_bytes": 3488
},
{
"relative_path": "app/src/ui/lib/i18n/index.ts",
"size_in_bytes": 742
},
{
"relative_path": "app/src/ui/lib/i18n/ja.ts",
"size_in_bytes": 3979
},
{
"relative_path": "app/src/ui/lib/i18n/types.ts",
"size_in_bytes": 133
},
{
"relative_path": "app/src/ui/lib/i18n/zh-CN.ts",
"size_in_bytes": 3154
},
{
"relative_path": "app/src/ui/lib/layout.test.ts",
"size_in_bytes": 791
},
{
"relative_path": "app/src/ui/lib/layout.ts",
"size_in_bytes": 2355
},
{
"relative_path": "app/src/ui/lib/theme.test.ts",
"size_in_bytes": 396
},
{
"relative_path": "app/src/ui/lib/theme.ts",
"size_in_bytes": 309
},
{
"relative_path": "app/src/ui/main.tsx",
"size_in_bytes": 959
},
{
"relative_path": "app/src/ui/pages/Canvas.tsx",
"size_in_bytes": 9780
},
{
"relative_path": "app/src/ui/pages/ProjectList.tsx",
"size_in_bytes": 2615
},
{
"relative_path": "app/src/ui/styles/components/NodeCard.css",
"size_in_bytes": 9211
},
{
"relative_path": "app/src/ui/styles/components/home/EmptyProjectState.css",
"size_in_bytes": 2711
},
{
"relative_path": "app/src/ui/styles/components/home/HomeHeader.css",
"size_in_bytes": 630
},
{
"relative_path": "app/src/ui/styles/components/home/HowToDialog.css",
"size_in_bytes": 2138
},
{
"relative_path": "app/src/ui/styles/components/home/ProjectCard.css",
"size_in_bytes": 2939
},
{
"relative_path": "app/src/ui/styles/globals.css",
"size_in_bytes": 10276
},
{
"relative_path": "app/src/ui/styles/pages/Canvas.css",
"size_in_bytes": 7616
},
{
"relative_path": "app/src/ui/styles/pages/ProjectList.css",
"size_in_bytes": 2161
},
{
"relative_path": "app/src/ui/types.ts",
"size_in_bytes": 705
},
{
"relative_path": "app/tsconfig.json",
"size_in_bytes": 325
},
{
"relative_path": "app/vite.config.ts",
"size_in_bytes": 296
},
{
"relative_path": "assets/icon.png",
"size_in_bytes": 52553
},
{
"relative_path": "assets/logo.png",
"size_in_bytes": 52553
},
{
"relative_path": "references/api.md",
"size_in_bytes": 3541
},
{
"relative_path": "references/artifacts.md",
"size_in_bytes": 1533
},
{
"relative_path": "references/data-model.md",
"size_in_bytes": 3250
},
{
"relative_path": "references/workflow.md",
"size_in_bytes": 5410
},
{
"relative_path": "scripts/brancha.mjs",
"size_in_bytes": 16711
},
{
"relative_path": "scripts/check-licenses.mjs",
"size_in_bytes": 1570
}
],
"skill_md_contents": "---\nname: brancha\ndescription: Tree canvas that grows one idea into many. The agent creates several distinct versions as real HTML, Markdown, SVG, image, video, or audio artifacts, shows them side by side on a branching canvas, and continues from whichever version the user picks — nothing gets overwritten. Operated through the CLI, HTTP API, SQLite, or direct file editing; runs on the user's machine with no model inside and no API key. Use when users ask for multiple versions, compare creative directions, create landing pages, demos, posters, documents, logos, or media, or mention Brancha, branching ideation, or tree-based creation.\n---\n\n# Brancha\n\nAct as the creator. Use Brancha only as the local presentation and versioning surface; it contains no model and requires no API key.\n\n## Start\n\nRun the bundled runtime without installing dependencies:\n\n```bash\nnode \"<skill-directory>/scripts/brancha.mjs\" start\n```\n\nUse the returned URL, normally `http://127.0.0.1:9519`. If startup fails, run `node \"<skill-directory>/scripts/brancha.mjs\" doctor` and report the concrete missing requirement.\n\nGive the URL to the user immediately. When browser control is available, open it in either an external browser or the built-in browser. Minimize time to the first visible result: start Brancha and create the project skeleton before long-running generation, then populate nodes incrementally while the user can already view the canvas.\n\nMatch the canvas to the user's viewing preference when requested. The setting persists and updates open pages immediately:\n\n```bash\nnode \"<skill-directory>/scripts/brancha.mjs\" theme dark\nnode \"<skill-directory>/scripts/brancha.mjs\" theme light\nnode \"<skill-directory>/scripts/brancha.mjs\" theme system\n```\n\nSwitch the complete Brancha interface language when the user asks. The setting persists and updates open pages immediately. Choose the language from the user's explicit request; otherwise keep the current setting and do not infer a change from artifact content:\n\n```bash\nnode \"<skill-directory>/scripts/brancha.mjs\" language zh-CN\nnode \"<skill-directory>/scripts/brancha.mjs\" language en\nnode \"<skill-directory>/scripts/brancha.mjs\" language ja\nnode \"<skill-directory>/scripts/brancha.mjs\" language es\nnode \"<skill-directory>/scripts/brancha.mjs\" language de\n```\n\nKeep the default loopback binding. Do not expose Brancha to a public network.\n\n## Create\n\nRead [references/workflow.md](references/workflow.md), then choose the fastest available surface: CLI for common operations, API for integrations, SQLite for bulk tree edits, and direct artifact file editing for creation and revision.\n\n1. Create a project from the user's request.\n2. Plan distinct directions and create titled nodes plus artifact placeholders in one batch.\n Keep the tree visually balanced: avoid large flat sibling sets, and introduce meaningful category or round nodes when one parent would become crowded. Follow the grouping guidance in [references/workflow.md](references/workflow.md).\n3. Use `--file` or `--stdin` for artifact content; never pass large HTML as a shell argument.\n4. Author every artifact yourself and update each placeholder as soon as it is ready.\n5. Give the user the focused project link as soon as the project exists; do not wait for every artifact to finish.\n\nAfter writes, run `project tree <id> --compact` and use node ids for durable references. For large structural changes, use one SQLite transaction. Artifact files have stable paths and may be edited directly; Brancha watches database and file changes.\n\nRead [references/data-model.md](references/data-model.md) for direct SQL and file operations. Read [references/artifacts.md](references/artifacts.md) before authoring artifacts and [references/api.md](references/api.md) when integrating the local API.\n\nWhen the user specifically wants Claude or Codex to create content, consider installing the Claude Agent SDK or Codex SDK and reusing the user's existing subscription-authenticated session before asking for a separate API key. Keep all SDK login and subscription credentials outside Brancha; use direct API credentials only when the user chooses that route or the subscription-backed path is unavailable.\n\nFor image, video, or audio generation, use credentials only in the user's Agent environment. Never send or store API keys in Brancha. Put only the generated HTTPS URL, matching `data:` URI, or loopback result URL into the media node.\n\n## Revise\n\nResolve references such as `#4 标题 (node:xxxx)` through the node id.\n\nArchive first. Adjustments worth comparing — a different tone, a layout change, a reworked section — default to a new child node under the source work, so the original stays on the canvas and the versions compare side by side. Do not overcorrect: trivial point edits such as fixing one piece of text or changing one color value belong directly in the source file, as do explicit overwrite requests and defects in work you produced in the current turn. When unsure whether the user wants a comparable variant, derive.\n\nProduce small revisions by copy-then-edit, not re-authoring: copy the source artifact file, apply targeted local edits to the copy, and complete the new node with it. Unchanged content stays byte-identical and regressions stay confined to the edit. Rewrite from scratch only when the revision genuinely replaces most of the artifact. Follow the revision flow in [references/workflow.md](references/workflow.md).\n\nWhen a later request asks for another batch of alternatives, preserve the iteration hierarchy. Do not append the new artifacts as more siblings beside the previous batch. Create one title-only round node first, then attach that round's alternatives as leaf children: `source → round → variants`. Put a project-wide round under the root; put a revision round under the specific node being revised. A single alternative may remain a direct child.\n\nNever leave failed work in the generating state. Mark it with `node error`.\n"
}SHA-256: b5ba48be415c8181984584ab17d5d97bd5eb15dd2a11e8eb2e84f2b1cf6ad504