Engines in TangleClaw represent AI coding agents. TangleClaw abstracts engine differences so you can switch between Claude Code, Codex, Aider, or any custom engine without reconfiguring your projects.
Each engine is a JSON profile that tells TangleClaw:
- How to detect if the engine is installed
- How to launch the engine in a tmux session
- What config file format the engine expects (so TangleClaw can translate methodology rules)
- What slash commands the engine supports (shown as pills in the command bar)
- What capabilities the engine has (prime prompt support, co-author format, etc.)
Engine profiles live in ~/.tangleclaw/engines/. TangleClaw ships with five built-in profiles, copied there on first run.
- Command:
claude - Interaction model: Session-based (spawns in tmux)
- Config file:
CLAUDE.md(Markdown) - Slash commands:
/compact(compress context),/clear(clear conversation),/review(review changes) - Capabilities: Slash commands, prime prompt, config file, co-author
- Command:
codex - Interaction model: Session-based
- Config file:
.codex.yaml(YAML) - Slash commands: None
- Capabilities: Prime prompt, config file, co-author
- Command:
aider - Interaction model: Session-based
- Config file:
.aider.conf.yml(YAML) - Slash commands:
/add(add file to context),/drop(remove file),/undo(undo last change) - Capabilities: Slash commands, prime prompt, config file, co-author
- Command:
gemini - Interaction model: Session-based (spawns in tmux)
- Config file:
.gemini/GEMINI.md(Markdown, in.gemini/subdirectory) - Slash commands: None
- Capabilities: Prime prompt, config file, co-author
OpenClaw is a self-hosted AI agent platform running in Docker on remote machines. Unlike other engines, OpenClaw connections are registered independently of projects in TangleClaw's connection registry.
- Command:
ssh(SSH mode) or none (Web UI mode) - Interaction model: Session-based (SSH) or iframe-based (Web UI)
- Config file: None (OpenClaw manages its own configuration)
- Slash commands: None
- Capabilities: Remote sessions, two connection modes (SSH terminal, Web UI iframe), automatic SSH tunnel management, sidecar process visibility via ClawBridge
OpenClaw engines appear in the engine dropdown when a connection has "Available as Engine" enabled. The engine ID is openclaw:<connection-id>. See the OpenClaw Setup Guide for connection configuration.
Connection modes:
- SSH mode — TangleClaw spawns an SSH session in tmux, connecting to the OpenClaw CLI on the remote host. Works like any other tmux-based engine session.
- Web UI mode — TangleClaw establishes an SSH tunnel, then loads the OpenClaw Control UI in an iframe via a reverse proxy. No tmux involved — the browser talks directly to the OpenClaw gateway through the tunnel.
TangleClaw checks if each engine is available by running which <command>. The landing page shows an availability badge on each engine option:
- Available — the binary was found in PATH
- Not found — the binary is not in PATH
Detection happens when engines are listed via the API, not at startup.
Create a JSON file at ~/.tangleclaw/engines/<engine-id>.json:
{
"id": "my-engine",
"name": "My Engine",
"command": "my-engine-cli",
"interactionModel": "session",
"configFormat": {
"filename": null,
"syntax": null,
"generator": null
},
"coAuthorFormat": "Co-Authored-By: {name} <{email}>",
"commands": [
{
"label": "Help",
"input": "/help",
"description": "Show help"
}
],
"detection": {
"strategy": "which",
"target": "my-engine-cli"
},
"launch": {
"shellCommand": "my-engine-cli",
"args": ["--some-flag"],
"env": {
"MY_ENGINE_MODE": "interactive"
}
},
"persistent": null,
"capabilities": {
"supportsSlashCommands": true,
"supportsPrimePrompt": true,
"supportsConfigFile": true,
"supportsCoAuthor": true
}
}The configFormat above is set to null because config file generation requires a built-in generator. The available generators are claude-md, codex-yaml, aider-conf, and gemini-md. If your engine doesn't use a TangleClaw-generated config file, set all three fields to null. To add a new generator, you'd need to add a handler in lib/engines.js.
| Field | Type | Required | Description |
|---|---|---|---|
id |
string | yes | Unique identifier |
name |
string | yes | Display name |
command |
string|null | yes | CLI command to launch (null for persistent engines) |
interactionModel |
string | yes | "session" or "persistent" |
configFormat |
object | yes | Engine-specific config file details |
coAuthorFormat |
string|null | yes | Git co-author pattern (null if unsupported) |
commands |
array | yes | Slash commands (shown as pills in command bar) |
detection |
object | yes | How to detect if installed |
launch |
object|null | yes | Launch parameters (null for persistent engines) |
persistent |
object|null | yes | Persistent engine config (null for session engines) |
capabilities |
object | yes | Feature flags |
| Field | Description |
|---|---|
filename |
Config file name written to project root (e.g., CLAUDE.md) |
syntax |
File syntax: "markdown", "yaml", or null |
generator |
Config generator to use: "claude-md", "codex-yaml", "aider-conf", "gemini-md", or null |
| Strategy | Target | Description |
|---|---|---|
"which" |
binary name | Run which <target> to check PATH |
"custom" |
null | No auto-detection (persistent engines) |
| Flag | Description |
|---|---|
supportsSlashCommands |
Engine has slash command input |
supportsPrimePrompt |
Engine accepts injected prime prompts |
supportsConfigFile |
Engine reads a config file from the project root |
supportsCoAuthor |
Engine supports git co-author attribution |
When a session launches, TangleClaw generates the engine-specific config file in the project root. This file is built from:
- Core rules (CHANGELOG updates, JSDoc, testing, session wrap protocol, PortHub registration)
- Extension rules (identity sentry, docs parity, decision framework, etc.)
- PortHub guide (port management API reference, when PortHub registration is enabled)
- Methodology template name and description
All engines with supportsConfigFile: true receive the same rule content, translated into each engine's native format:
| Engine | Config File | How Rules Are Included |
|---|---|---|
| Claude Code | CLAUDE.md |
Markdown sections with bullet-point rules, full PortHub guide, methodology info |
| Codex | .codex.yaml |
instructions: multiline YAML field containing markdown-formatted rules and PortHub guide |
| Aider | .aider.conf.yml |
YAML comments with rules and PortHub reference, plus functional config settings |
| Gemini CLI | .gemini/GEMINI.md |
Markdown sections (same format as CLAUDE.md), written to .gemini/ subdirectory |
This translation is automatic — methodology authors write rules once, and TangleClaw handles the format conversion. A parity test suite verifies that all engines receive core rules, PortHub references, and methodology info.
Every engine with supportsConfigFile: true must pass parity validation. Use engines.validateParity() programmatically or run the parity test suite (node --test test/engines.test.js).
When adding a new engine, verify that its generated config includes all of the following:
- Core rules — all five default rules: CHANGELOG updates, JSDoc comments, unit tests, session wrap protocol, PortHub registration
- Extension rules — active extension rules (identitySentry, docsParity, decisionFramework, etc.) translated into the engine's format
- PortHub guide or reference — full Port Management guide (for markdown-based engines) or API reference comment (for YAML-based engines)
- Global rules — content from
~/.tangleclaw/global-rules.mdinjected into the config - Methodology info — methodology name and description when a template is provided
- Generator switch case — a
caseentry ingenerateConfig()for the new generator name - Profile
configFormat.generator— must exactly match the switch case string -
_getRulesContent()used — the generator function must call_getRulesContent()to get the canonical rule set (do not duplicate rule logic) - Status page config — set
statusPagein the engine profile JSON to the upstream status API config (adapter, url, component info), ornullif the engine has no known status page
- Create the engine profile JSON in
data/engines/<id>.jsonwithsupportsConfigFile: trueand a uniqueconfigFormat.generatorvalue - Add a generator function
_generate<Format>()inlib/engines.jsthat calls_getRulesContent()and translates rules into the engine's native format - Add the corresponding
casein thegenerateConfig()switch statement - Run
engines.validateParity()— it must return{ valid: true } - Run
engines.validateStatusParity()— it must return{ valid: true }(ensuresstatusPagefield is present) - Add engine-specific tests in
test/engines.test.js
You can change a project's engine at any time from the project settings on the landing page or the session settings modal. The change takes effect on the next session launch — TangleClaw regenerates the config file in the new engine's format.
No data is lost when switching engines. Session history, learnings, and methodology state are all engine-independent.
TangleClaw monitors the upstream service status for engines with known status pages. The engine badge on project cards reflects real-time operational status:
- Green left border — Operational
- Amber left border — Degraded performance
- Orange left border — Partial outage
- Red left border — Major outage
- Muted left border — Unknown (no status page or fetch failed)
Status is polled every 2 minutes from official status pages. Hover over the engine badge for details.
| Engine | Status Page | Adapter |
|---|---|---|
| Claude Code | status.claude.com | Atlassian Statuspage |
| Codex | status.openai.com | Atlassian Statuspage |
| Gemini CLI | status.cloud.google.com | Google Incidents |
| Aider | None (upstream-dependent) | — |
| Genesis | None (placeholder) | — |
Each engine profile includes a statusPage field (object or null):
"statusPage": {
"adapter": "atlassian",
"url": "https://status.example.com/api/v2/summary.json",
"componentId": "abc123",
"componentName": "My Service"
}adapter— Parser type:"atlassian"(Atlassian Statuspage) or"google-incidents"(Google Cloud)url— JSON API endpoint to pollcomponentId/componentName— For Atlassian: identifies the specific component to monitorproductName— For Google: product name to filter incidents by
Set to null for engines without a known upstream status page.