A portable, theme-able harness you implant once and use everywhere to grow a disciplined AI coding agent.
Why ยท Setup ยท Web & TUI ยท What you get
Geneseed distils an agent operating system into a generic harness built around a single AGENT.md. Point your tool at it and the agent inherits a set of operating rules, a roster of capability agents, native skills, a memory convention, and โ on OpenCode โ 7 plugins that auto-load your project's docs, capture durable memory, enforce the safety laws, run saved workflows, ping you when a long run finishes, hold a minimal-code mode when you ask for one, and stream what each session is doing to the web console. One source builds it; it follows you into every repo.
This page is the overview. Four parts: why it exists, how to set it up, the two ways to drive it (web & TUI), and what you get. For every install path, configuration knob, and troubleshooting step, read the full Setup guide.
The name comes from Warhammer 40,000. In the lore, gene-seed is a Space Marine Chapter's genetic legacy: implanted once into an aspirant, it rebuilds them from within, and every successor Chapter is founded from the gene-seed of its parent. That is exactly this project's model. The harness began life as a personal, Obsidian-vault-grown agent operating system; this repo is the genetic material distilled out of it โ implant it once into your tool, and a disciplined agent grows around it, carrying the same inherited rules, agents, skills, and memory into every repo it touches.
The lineage is also why an imperial theme ships alongside the neutral one: it is the voice of the parent system the harness was extracted from. But the genetics are theme-independent โ the name is a nod to the origin, not a commitment to Space Marines.
One canonical source in src/ renders, via a tiny dependency-free generator (build.py, stdlib only), into a ready-to-use bundle. A theme controls only voice โ how the AI responds and how the prose inside the docs reads (tagline, greeting, descriptions). Structure is theme-independent: section names (Rules, Agents, Skills, Memoryโฆ) and folder names (laws/, agents/, skills/, memory/, notebook/) are always plain English, so the scaffolding stays tool-friendly while the flavour lives in the words.
python build.py # default theme (neutral)
python build.py --theme imperial # Warhammer 40k voice, identical structureOne command, nothing cloned, no Python on the install path. The only prerequisite is Node โฅ 22.3. (Three things still involve Python and none of them is this command โ named below.)
npx geneseed setup # the guided wizardThe wizard asks for a theme (each one previewed live โ tagline, sigil, voice) and an install mode โ OpenCode global (recommended; every repo inherits it), per-repo .opencode/, or plain bundle for any AGENT.md tool โ then builds and offers a health check. It works the same on macOS, Linux and Windows (cmd, PowerShell, or a POSIX shell).
Keeping it around is the same command with npm:
npm install -g geneseed # then plain `geneseed <command>` from any directory
npm install -g geneseed@latest # โฆand that is also the updateQUICKSTART.md walks this in 5 minutes. Every other route (Claude Code, plain AGENT.md, per-repo installs, MCP servers, troubleshooting) lives in the full Setup guide.
Cloning still works and is what you want if you intend to change the harness rather than use it. It needs git and Python 3 (stdlib-only, nothing to pip install) and gives you the full-screen TUI as well.
git clone https://github.com/Arylmera/Geneseed.git
cd Geneseed
./geneseed setup # the wizard โ or bare `./geneseed` for the main menuWindows โ native, no bash, WSL, curl, or unzip; works from cmd or PowerShell:
git clone https://github.com/Arylmera/Geneseed.git
cd Geneseed
.\geneseed.cmd setup # the wizard โ or bare .\geneseed.cmd for the main menu
# PowerShell-native twin: .\geneseed.ps1 [setup]The launcher finds Python on its own (the py launcher, else python on PATH); if python3 is missing on macOS, xcode-select --install or Homebrew provides it. The full-screen TUI needs a VT-capable console โ Windows Terminal, or Windows 10 1809+ conhost โ via a stdlib-only ANSI backend; an older console degrades gracefully to the same wizard as plain text prompts.
Already installed from a clone? geneseed migrate moves every install you have onto the npm shape in one pass, all-or-nothing, without touching hooks or login items it did not write. Your old clone keeps working for a full release โ there is no cliff. See Migrate an existing install.
25 of the 25 subcommands run from Node, along with all four hooks, every web-console endpoint and both generators โ producing byte-identical output, gated on every commit across every theme ร host ร footprint. So an npx install is Python-free for the harness itself, with exactly three exceptions. None is on the install path; all three are named here rather than discovered later.
- 0 commands have no Node twin: 25 of the 25 subcommands, and all four hook verbs, answer from the Node entry points. What is still Python is a SCREEN, not a command: the full-screen browse panel that
geneseed tuiandgeneseed menuopen on a terminal. From Node both refuse the panel by name and print the command list instead โ the panel itself ispython rituals/harness.py tui(ormenu), from a checkout. Off a terminal, which is how scripts and CI run them, the two runtimes print the same bytes and exit the same way. - One Python script rides inside the harness you install โ and two more skills shell out to
python3without shipping one. Thetoken-reportskill is a script, not prose, so every bundle carries exactly one file that needs an interpreter:src/skills/token-report/scripts/token_report.py. It runs only when the agent invokes that one skill. On top of it,daydreamrunspython3 -cfor weighted random sampling andherdrrunspython3 -ctwice to pull a field out of JSON โ neither ships a Python file of its own, but both needpython3on PATH the moment they're used. No other file in a bundle is Python, and no other skill shells out to it, on any host, theme or footprint โ a test freezes both. upgrade/update/sync-self/bootstrapare for a git checkout. Theygit pullthe install's own origin. From an npm install they stop before touching anything and namenpm install -g geneseed@latestas the update instead.
One more honest edge, in the web console rather than the CLI: the "browseโฆ" folder picker opens an OS-native dialog, which only the Python server can do. On the Node server the button reports that it is unavailable and the field beside it stays editable โ type or paste the path.
- Verify โ open your agent in any repo: the first reply starts with the readiness sigil and your project's docs are already in context.
geneseed doctorshould printok. - Run it from anywhere โ a global
npm install -g geneseedalready does this. From a checkout,./geneseed linkwrites a launcher shim into~/.local/bin;.\geneseed.cmd linkwrites a shim into%LOCALAPPDATA%\Geneseed\binand adds it to your user PATH (open a new terminal). - Everything else โ other tools (Claude Code, plain
AGENT.md), per-repo installs, MCP servers, environment knobs, troubleshooting: SETUP.md.
Two front-ends over the same deployed harness โ the same actions either way. Reach for the web console when you want to read and browse; reach for the TUI when you live in the terminal.
geneseed web opens a local browser console in a dashboard-first layout, with rendered markdown and clickable cross-links.
geneseed web # serve on http://127.0.0.1:4747 and open the browser
geneseed web --port 8080 # pick a port
geneseed web --no-browser # serve without auto-opening
geneseed web start # run as a background daemon (doesn't block the terminal)
geneseed web restart # restart the daemon โ pick up a rebuilt UI or changed theme
geneseed web stop # stop the daemon
geneseed web status # is it running, and whereThe left rail mirrors the harness's own shape:
| Group | What's there |
|---|---|
| ๐งฌ Harness | Dashboard โ live readout of what's deployed (voice, capabilities, drift, recent jobs) ยท Library โ browse Laws, Agents, Skills, Memory, Notebook ยท Graph โ cross-link constellation across the whole harness |
| ๐ Learn | Docs โ rendered markdown + concept pages + CLI reference + glossary, grouped into Get started / Core concepts / How-to / MCP servers / Plugins / Reference / Deeper ยท Specs โ dated implementation specs with design rationale |
| ๐ง Maintain | Changes โ diff between the deployed harness and the source, export an improvements.md back-port ยท Doctor โ health check across themes, links, parity, and authoring gates |
| ๐จ Configure | Themes โ preview and switch the deployed voice live ยท Settings โ MCP servers, server controls |
| โน๏ธ About | project + creator credits, source link |
It binds to 127.0.0.1 only and runs entirely offline โ no npm needed at runtime; the UI build ships in web/dist/. Mutating actions run in the background and report back as toasts (fire-and-notify), guarded by a per-session token so other sites can't trigger them. A global Spotlight search in the topbar jumps to any agent, skill, law, doc, or spec. Rebuild the UI after changing anything under web/src/ with cd web && npm install && npm run build. If web/dist/ is missing (fresh clone, never built), geneseed web offers to run that build for you โ answer Y and it installs, builds, and starts the server; in non-interactive shells it prints the manual recipe instead.
Full reference โ every view, the launch/daemon/PWA surface, the security model: docs/web-ui.md.
Same actions, no browser. Bare geneseed opens the main menu โ browse, review local edits, refresh/set up, update, rebuild, memory, status, and Settings (MCP servers, run-from-anywhere, uninstall โ global or per-repo). geneseed setup jumps straight to the install wizard; geneseed tui opens the browse panel directly. The whole thing is a stdlib-only, dependency-free full-screen UI that also degrades to plain text prompts on older consoles โ see Setup above for the wizard walkthrough.
The harness ships as a small set of layers, mirrored one-for-one in the web console's Library rail (Laws ยท Agents ยท Skills ยท Memory ยท Notebook):
| Layer | What it is |
|---|---|
๐ก๏ธ Rules (laws/) |
37 universal laws the agent obeys โ secrets, scope, verify-before-assert, surface-failures, context economy, load-the-docs, tool-discovery, non-interactive-shell, untrusted-content, least-privilege, external-gate, root-cause, idempotency, calibrated-honesty, source-over-surface, restart-is-not-reload, total-teardown, cover-and-verifyโฆ |
| ๐ค Agents (17) | capability specialists: reviewer, tester, architect, docs, security, explorer, developer โ plus a debate council the council skill convenes: advocate, skeptic, pragmatist, steward, visionary, user-advocate, framer, empiricist, operator, historian |
| ๐ Skills (47) | repeatable workflows: brainstorm ยท clarify ยท plan ยท codebase-design ยท domain-modeling ยท wayfinder ยท tickets ยท tdd ยท develop ยท debug ยท prototype ยท refactor ยท ponytail ยท forge-mcp ยท geneseed-code-review ยท fresh-eyes ยท review-response ยท commit ยท ship ยท release ยท migrate ยท git-archaeology ยท git-rescue ยท repo-map ยท document-project ยท frontend-design ยท prose ยท ingest ยท research ยท learning-path ยท gap-detector ยท feynman ยท crash-course ยท drill ยท decode ยท handoff ยท roast-me ยท council ยท parallel-agents ยท workflow ยท wiki ยท geneseed ยท rule ยท profile ยท opencode-theme ยท herdr ยท pipeline |
| ๐ Plugins (OpenCode) | geneseed-context injects project docs and your machine wiki every session (and across compaction); geneseed-learn distils memory at session end; geneseed-guard enforces the safety Laws and protected wiki folders at the tool boundary; geneseed-workflow registers the workflow tool that runs saved orchestration scripts; geneseed-notify sends a native OS notification when a long run finishes; geneseed-ponytail holds a minimal-code mode (/ponytail lite|full|ultra|off), opt-in, injecting the laziest-that-works ruleset every turn so it doesn't drift; geneseed-activity streams what each session is doing to the web console's Activity view |
๐ง Memory (memory/) |
one-fact-per-file durable knowledge, indexed by MEMORY.md (git-ignored, personal) |
๐ Notebook (notebook/) |
the agent's sovereign space โ any medium (code, tools, data, notes), self-ruled via a seed-once charter, always git-ignored; only its .gitignore is build-asserted |
๐ Wiki (wiki.jsonc) |
your own machine-wide knowledge base โ typically an Obsidian vault โ declared once per machine: entry notes load eager/lazy, the agent reads and writes it under the vault's own conventions, with an inbox fallback and guard-enforced protected folders |
| ๐งญ Context | the project's own docs โ auto-discovered on OpenCode, or via a context.json manifest |
Fourteen themes ship โ each a single JSON file in themes/ carrying voice tokens only, so adding your own is a copy-and-edit away.
| Theme | Voice |
|---|---|
| ๐ข neutral | clear, plain, professional English |
| โซ imperial | Warhammer 40k โ rules read as Dictates, agents as Adepts, skills as Rites |
| ๐ช military | crisp military comms |
| ๐ดโโ ๏ธ pirate | salty seafaring patter |
| ๐ง wizard | high-fantasy magical idiom |
| ๐ cyberpunk | neon-dystopia voice |
| ๐ฎ gamer | gaming/streamer cadence |
| ๐๏ธ sports | play-by-play commentary |
| ๐ biker ยท ๐ค commentator ยท ๐ joker ยท ๐ค marvin ยท ๐ค mean ยท ๐ verstappen | community-added voices for fun |
Pick with --theme NAME or via the TUI wizard. The theme is remembered in a .geneseed-theme marker, so later upgrades preserve it. doctor checks every theme defines the same keys, so flavour drift is impossible. Adding a new voice token to themes/_TEMPLATE.json? Run python build.py --sync-themes to fill it into every theme (template's placeholder value, reported for restyling) before doctor is expected to pass again.
A second per-install dial, footprint, sets how much of the Rules AGENT.md carries inline every turn โ a token-cost knob, not a change to which Rules apply (every Rule is always in force).
| Footprint | Section 1 of AGENT.md |
Trade-off |
|---|---|---|
| lean (default) | each Rule's heading + the rule line, then a pointer to the full law file | ~40% smaller; rationale is one on-demand read away |
| full | every Rule's complete text and rationale, inlined | maximum guidance density; largest per-turn token cost |
Lean still ships the complete laws/universal.md beside AGENT.md and points the agent there before acting on secrets, deletion, git history, scope, or untrusted content โ so it's a context/token optimization, not a rules cut. Lean is the default: the rationale is one read away and the context it frees is paid back on every turn. Switch to full when token cost is a non-issue or you run a smaller model, which leans harder on always-present rationale. Set it with --footprint lean|full, the Settings toggle, the per-harness dropdown in the Harnesses tab, or the TUI wizard. It's remembered in a .geneseed-footprint marker and preserved across rebuilds, on every host (OpenCode, Claude Code, Bob, Copilot).
Either way the harness is otherwise identical โ same files, Rules, capabilities, and guards; lean only relocates each Rule's reasoning to on-demand (and adds the standalone laws file to global/Claude/Bob installs). The one behavioural edge: with the rationale always in context, full applies a rule's nuance more reliably on subtle edge cases โ or with a weaker model that may not reach for the pointer โ which is why it stays the default.
Want to check a build before it touches anything real? python build.py --validate-only --theme NAME --emit MODE --out TARGET renders and validates into a throwaway sandbox โ nothing under --out/--root is written โ and exits non-zero on any problem. Details: SETUP.md.
One source, five emit targets. Geneseed builds into whichever host you point it
at โ each with a per-repo and a global (-global) variant โ plus a portable
files bundle any AGENT.md-aware tool can read. OpenCode runs its own
engine (JS plugins, colour themes, LSP); Claude Code, Bob, and
Copilot share one Claude-shaped engine that diverges only by host dialect.
The harness โ its Rules, Agents, Skills, Memory convention, and preamble voice โ is identical on every host. What differs is how much of it the host can automate for you (via plugins or hooks) versus carry as preamble discipline.
| Capability | OpenCode | Claude Code | Bob | Copilot |
|---|---|---|---|---|
| Instructions file | AGENT.md + opencode.json |
CLAUDE.md |
AGENTS.md + rules/geneseed.md |
AGENTS.md / copilot-instructions.md |
| Agents (capability specialists) | โ native | โ | โ | โ
.agent.md |
| Skills (byte-identical) | โ | โ | โ | โ |
| Memory & Notebook | โ | โ | โ | โ |
| Context injection (Rule XVIII) | โ๏ธ plugin | ๐ช hook | ๐ช hookยน | ๐ preamble |
| Memory write-back (learn) | โ๏ธ plugin | ๐ช hook | ๐ช hookยน | ๐ preamble |
| Git-gate consent (Rule XX) | โ๏ธ plugin | ๐ช hook | ๐ช hookยน | ๐ preamble |
| Rule-gate consent (Rule VI) | โ๏ธ pluginยฒ | ๐ช hook | ๐ช hookยน | ๐ preamble |
| Sovereign-repo excludes | โ๏ธ plugin | โ
claudeMdExcludes |
โ rules-shadow | โ none |
| MCP server wiring | โ
mcp |
โ
mcpServers |
โ
mcpServers |
โ
mcp-config.json |
| Colour themes | โ full palette | โ | โ | โ |
LSP ยท workflow runner ยท primary-agent ยท /-commands |
โ | โ | โ | โ |
โ
native support ยท โ๏ธ OpenCode plugin ยท ๐ช settings.json hook ยท ๐ carried by preamble prose only ยท โ no host mechanism (harness discipline still applies) ยท ยน Bob honours Claude-dialect hooks best-effort โ inert if unsupported, harness still holds via the preamble. ยท ยฒ OpenCode's tool.execute.before can only allow or throw, with no "ask the user" tier, so the rule gate is a one-shot speed bump there rather than a prompt.
Reading the matrix. Everything above the divider is at full parity โ no host drops an Agent, Skill, or the memory convention. The asymmetry is entirely in automation mechanism: OpenCode's plugin surface and Claude/Bob's hook surface enforce a few Rules for you, where Copilot (no hook mechanism) enforces them through preamble discipline instead. The OpenCode-only extras (themes, LSP, workflow runner, primary-agent) have no analogue on a Claude-shaped host.
Per-host wiring in depth: OpenCode ยท Claude Code ยท Bob ยท Copilot. Token cost per host: docs/token-footprint.md.
Geneseed/
โโโ package.json the npm package: three commands, zero dependencies
โโโ bin/ the Node entry points โ geneseed-cli.mjs (the CLI), geneseed-hook.mjs
โ (the four hook verbs), geneseed.mjs (the generator driver)
โโโ js/ the Node harness โ generator, hooks, web server, doctor, installs
โโโ cli.json the argument parser as data; both runtimes read it
โโโ build.py generator (stdlib only)
โโโ geneseed launcher (bash): bare `./geneseed` = interactive main menu; + subcommands
โ (`./geneseed link` puts it on PATH so `geneseed` runs from anywhere)
โโโ geneseed.cmd native Windows launcher (cmd.exe) โ same subcommands, no bash
โโโ geneseed.ps1 native Windows launcher (PowerShell) โ same subcommands, no bash
โโโ bootstrap one-shot: update everything (sync + upgrade), then run setup
โโโ harness.config.json default theme + metadata (the one owner of the version)
โโโ src/ canonical source โ edit here
โ โโโ AGENT.md.tmpl the entrypoint, rendered to AGENT.md
โ โโโ laws/ governance rules
โ โโโ agents/ capability specialists
โ โโโ skills/ repeatable workflows
โ โโโ memory/ memory convention + index
โ โโโ notebook/ the agent's own freeform space โ convention + index
โโโ themes/ voice token maps (14 themes shipped)
โโโ rituals/harness.py the Python CLI: build ยท doctor ยท diff ยท rebuild-all ยท status ยท version ยท
โ theme ยท prompt ยท exclude ยท setup ยท web ยท migrate ยท link/unlink ยท
โ uninstall ยท upgrade/update ยท sync-self ยท bootstrap ยท context ยท learn ยท
โ git-gate ยท rule-gate ยท home ยท tui ยท menu
โโโ rituals/web.py local web UI server (stdlib HTTP) behind `geneseed web`
โโโ web/ Vite + React UI source; the committed web/dist/ build is what ships
โโโ tests/ stdlib unit tests, three cell harnesses, Node test suites
โโโ docs/ guides (web-ui, wiki, โฆ) + docs/web/ (the console's Docs pages);
โ specs/, reviews/, superpowers/ are local working docs โ git-ignored
โโโ adapters/ per-host glue (opencode/, claude-code/, bob/, copilot/)
โโโ .github/workflows/ ci.yml (doctor + tests) ยท publish.yml (npm, OIDC, manual only)
python rituals/harness.py doctor # every theme + parity + authoring + drift
node bin/geneseed-cli.mjs doctor # โฆand the same checks from the Node side
python -m unittest discover -s tests -p "test_*.py" # generator + CLI unit tests (no deps)
node --test "tests/**/*.test.mjs" # Node suites (node expands the glob)doctor checks each theme for unresolved tokens, dead/non-hermetic links, theme-key parity, author-time gates (every spec has a purpose line, the plugins parse, the learn-prompt literal stays extractable), and that a committed bundle still matches a fresh render of src/. CI (.github/workflows/ci.yml) runs all four on every push and PR, on both Linux and Windows. Publishing is a separate, manually-triggered workflow (.github/workflows/publish.yml) โ see Contributing.
Installed from npm โ one command, and it rebuilds every active install for you:
npm install -g geneseed@latest
geneseed rebuild-all # re-render every registered install in its own theme + modeInstalled from a clone โ the git pull route, which also refreshes the launchers:
./geneseed update # everything in one: refresh the scripts + content, then rebuild
./geneseed bootstrap # update everything, then drop into the setup wizard
./geneseed upgrade # just the content refresh (remembers theme + emit mode)Moving from a clone to npm โ geneseed migrate re-emits every install you already have onto the npm shape, all-or-nothing, and reports (never rewrites) the hooks and login items it did not write. --dry-run prints the plan first. See Migrate an existing install.
Local edits survive. The self-improvement loops let the agent refine its deployed agent/skill files in place. Before setup, re-theme, or upgrade overwrites them, any drift is auto-exported to a markdown improvements file under improvements/ inside the deployed harness dir (e.g. ~/.config/opencode/improvements/ for the global install) โ beside the install it describes, untouched by rebuilds and uninstall. Hand it to an agent in this repo to back-port the changes into src/. On demand: ./geneseed diff --out FILE, or e in the TUI's Review local edits view.
Details and precedence rules: SETUP.md โ Upgrade.
| Page | Read it whenโฆ |
|---|---|
| SETUP.md | Installing โ every path, configuration knob, env var, verify, troubleshooting |
| DESIGN.md | Changing structure โ the spec and the decisions behind it |
| SHIPPED.md | What's in the harness today โ capabilities โ the spec behind each |
| docs/web-ui.md | The web console โ every view, the launch/daemon/PWA surface, security model |
| docs/wiki.md | The machine wiki โ your personal knowledge base, setup and writing model |
| docs/token-footprint.md | What the harness costs in context-window tokens, per host |
| docs/opencode-plugin-setup.md | Installing the OpenCode plugins โ the one-time wiring they all share |
| CHANGELOG.md | What changed between versions |
| adapters/opencode/ | Wiring OpenCode in depth โ plugins, native mapping |
| โคท GLOBAL-HARNESS-SPEC.md | The global-emit contract |
| โคท HOW-OPENCODE-LOADS.md | Why a file shows up twice; plugin loading |
| adapters/claude-code/ | The Claude Code hook adapter |
| adapters/bob/ | The IBM Bob adapter โ Claude-shaped, rules-file preamble |
| adapters/copilot/ | The GitHub Copilot adapter โ reduced host, no hooks |
| src/memory/README.md | The memory convention |
| src/notebook/README.md | The agent's own freeform-space convention |
Issues and PRs welcome at github.com/Arylmera/Geneseed. The CI is dependency-free and runs on every push โ keep doctor green on both binaries and the test suites passing. Adding a new theme is one JSON file in themes/ with the same voice-token keys; doctor will tell you if any are missing.
Three things that bite when you don't know them:
rituals/harness.pyandcli.jsonchange together. The argument parser is data now:cli.jsoncarries it,bin/geneseed-cli.mjscannot parse a single verb without it, anddoctorcompares a sha256 ofrituals/harness.pyagainst the digest inside the file. Edit the parser, then runpython tests/gen_cli_reference.py(it exits non-zero when it changed the file, so it doubles as a drift check) and commit both. A mismatch is a loud doctor problem on both binaries โ which is the intended failure, not a surprise.- The version has one owner:
harness.config.json.package.jsonmirrors it and a test fails the fork. Nevernpm versionโ it edits one of the two. - Publishing is deliberate and manual.
.github/workflows/publish.ymluses npm trusted publishing (OIDC); there is noNPM_TOKENin this repository and there must not be one. It runs only from Actions โ publish โ Run workflow, and the npm-side trusted publisher is keyed on that workflow's filename โ renaming the file breaks publishing with no local symptom, which is why the file names itself in its own header and a test asserts the two agree.