AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
An open-source, local-first AI-native SDLC orchestration platform.
Translation pending
Developer toolsJavaScript · CSSGitHub @Jason-VaughanOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
An open-source, local-first AI-native SDLC orchestration platform
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
An open-source, local-first AI-native SDLC orchestration platform
Persistent memory · Agent-to-Agent Switchboard · Fleet Governance · Multi-Engine Management
macOS only (launchd required for service management)
As you scale up AI-assisted development, you quickly hit a wall: isolated AI agents lose context, step on each other's toes, and require constant human babysitting.Read the full README ↗Release candidate: v5.45.0, “Project settings that cannot corrupt” (status and release scope). The Release badge above continues to show the latest published release until this candidate is approved and published.
One AI coding agent is easy. Five are not. They forget what the last session decided, edit the same files, fight over the same ports, and wait silently for an answer you did not know they needed. You end up watching terminals.
TangleClaw is the layer above the agents that deals with that. It runs on your own Mac, starts and supervises each agent session, and keeps the things a session cannot keep for itself.
It works with Claude Code, Codex, Antigravity and Aider locally, and with OpenClaw sessions on a remote host. You write your instructions once and TangleClaw produces each engine's own configuration.
npm install, no bundler.TangleClaw is developed with TangleClaw. Its own Builder, Project Manager and review sessions plan, write, review and merge its changes, with a human directing the work and approving every release. The live roadmap and the issue tracker are that fleet's working backlog, which is why the issue count is high: it is the plan, in public.
# macOS. What the installer does, and what you need first: Quick Start, below
git clone --branch v5.47.1 https://github.com/Jason-Vaughan/TangleClaw.git
cd TangleClaw && ./deploy/install.sh
Then open the dashboard, finish the short first-run setup, and launch a session on any project folder. More at tangleclaw.com.
launchModes. The selected mode is appended to the engine's launch args and recorded in the session DB; OpenClaw sessions propagate it through ClawBridge's permissionModelocalhost link), the Project Rules store and its approval gate, the learnings loop, the Medusa switchboard, and PortHub — so a brand-new session needs no tutorial to work with the platform<project>/.tangleclaw/continuity/: a curated index.md hot tier (rewritten each wrap, read back as the next session's resume), an append-only changelog.md, per-session 8-section wrap summaries, and a self-maintaining ## Map of the project's featuressessions/<sid>/transcript.jsonl) with no hooks required, and secret-scanned (types flagged, values never stored).tangleclaw/memories/ with a MEMORY.md index, injected into every engine config so all engines follow the same conventionCLAUDE.md, .codex.yaml, AGENTS.md, .aider.conf.yml generated automatically from your rules, regenerated on every server boot so changes land without a relaunch. Where the file is a shared convention another tool also writes (Antigravity's AGENTS.md), TangleClaw splices a marked block and leaves the rest of the file untouched~/.tangleclaw/orchestration-profiles.json): the engine launches with the profile's base URL, model, and key injected via environment (never argv). Unbound projects launch exactly as before.tangleclaw/project-version.txt → CHANGELOG.md → version.json → package.json) and shows on the project card and session bannerscripts/ingress-cutover.js, that fronts the dashboard, terminals, and APIs with TLS — including an auto-provisioned HTTPS site on your Tailscale tailnet. Fail-closed cutover with validation and health checks; full guide in deploy/INGRESS.mdscripts/reset-admin.js --store resets or re-enables an account and scripts/gate-fallback.js puts Caddy's password back in front if the login itself breaks (docs/recovery.md)basic_auth stands in front of TangleClaw only until the first account exists (an install upgraded from the older Caddy-only gate) or during a fallback; while it does, global settings → Caddy password can change itnode:test cases, zero test dependencies, green as a merge gateTangleClaw provides the infrastructure for an entire AI-driven Software Development Life Cycle (SDLC). To achieve this, TangleClaw is building out configurable base templates for specific organizational roles. These foundational templates map directly to SDLC departments, giving you a coordinated engineering organization out of the box.
Today the Project Master is the one role that ships as a product feature. A Project Manager, an Architect and a Builder are ordinary sessions that take their role from the rules and instructions you give their projects; no role template can be selected yet.
The ground set of foundational agent templates we are rolling out first:
aider, claude code, antigravity) that write the code, run tests, and ship features.TangleClaw's features and roadmap align directly with these core SDLC departments:
Most importantly, TangleClaw enforces strict safety boundaries, ensuring that while the agents do the heavy lifting, the human developer retains absolute control over deployments, destructive actions, and architectural decisions.
git clone --branch v5.47.1 https://github.com/Jason-Vaughan/TangleClaw.git
cd TangleClaw
./deploy/install.sh
Before that first line works, you need git — and a brand-new Mac does not have it. Running
git clone on a machine that has never had developer tools installed prints
xcode-select: note: No developer tools were found, requesting install. and stops. On a desktop
Mac a dialog appears: click Install, wait for it (it is a large download — budget 15–30
minutes), then run the clone again. Over SSH with no desktop session, install them first with
xcode-select --install. This is the one prerequisite the installer cannot handle for you, because
you need it to get the installer.
The install script:
Access the landing page at http://localhost:3102. That is where setup starts, and where the dashboard stays if you opt out of the login gate.
Once setup has installed the login gate — the default — the address changes to
https://localhost:8443. Caddy takes over the front door on its own port; 3102 stays bound to
the loopback interface behind it and is not the address to use or share. https://localhost:3102
does not work in that mode and never will: TangleClaw serves plain HTTP there and Caddy terminates
the TLS. Setup tells you the address it landed on — trust that over this paragraph, since it knows
which mode you chose.
If you opted out of the gate and enabled HTTPS directly, https://localhost:3102 is correct. Port
3102 serves one protocol at a time; opening the HTTP URL after HTTPS is enabled produces empty responses and can look like a dashboard refresh loop. See Troubleshooting to verify the protocol or return a localhost-only install to HTTP. (The installed launchd service uses port 3102; running node server.js by hand instead listens on the code default, 3101.) On first launch, a setup wizard walks you through configuration — including choosing your projects directory. This is a single folder where all your managed projects live (e.g., ~/Projects). TangleClaw scans this directory, detects existing repos and engines, and lets you attach them as managed projects.
You install these two:
xcode-select --install if you have no desktop sessiondeploy/install.sh installs the rest — listed so you know what lands on your machine, not as
work to do first:
node:sqlite and node:testYou also need at least one AI CLI engine, which TangleClaw does not install — it drives whichever you already use, with your own account: Claude Code, Codex, Antigravity, or Aider. TangleClaw installs and runs without one; you just cannot launch a session until an engine is present.
Optional integrations:
Quick answers, with links into the full docs:
| I want to… | Read this |
|---|---|
| Install TangleClaw and get it running | Quick Start above, or the User Guide — Getting Started |
| Use it from my phone | User Guide — PWA Installation and Mobile Tips |
| Bring my existing projects in | User Guide — Attaching Existing Projects |
| Launch an AI session and pick a permission mode | User Guide — Launching a Session |
| End a session properly (and why wraps matter) | User Guide — Wrapping a Session |
| Find what a past session did, or search old transcripts | User Guide — Session History |
| Put TLS in front and reach it from other devices | Ingress Guide |
| Change the password you sign in with | User Guide — Changing your login |
| Get back in: a forgotten password, a disabled account, a broken login |
TangleClaw can carry messages between the operator's Discord channel and the fleet: the Project Master session routes what the operator sends and decides what is posted back. It shipped in v5.31.0 and is off by default. Only the operator can enable it, from the dashboard's global settings, and enabling it is a cutover each install makes for itself.
TangleClaw runs a local server with browser-based terminal access, so reaching the dashboard means running shell commands as you. It therefore listens on 127.0.0.1 only unless you tell it otherwise — a fresh install is reachable from the machine it runs on, and nowhere else. The terminal listener (ttyd) is pinned to loopback on every install, new or upgraded. The deletePassword config option protects destructive operations only; it is not a login.
Upgrading from a version before this changed? Your dashboard binding is left as it was, deliberately — narrowing it would take away remote access you may be relying on before there is a password to put in its place. TangleClaw says so on every start and on the dashboard until you resolve it, either by turning on the login below (recommended — it keeps remote access) or by setting "bindAllInterfaces": false to close it entirely.
A fresh install sets a login during setup. The wizard asks for a username and password and creates your TangleClaw account from them, so the login is the default outcome of installing, not something you go and turn on afterwards — with or without Caddy. There is no default credential. The wizard then shows the account's one-time recovery codes, once; keep them apart from the device you sign in on: one resets a forgotten password from the sign-in page. The login step also lets you finish without a login, saying plainly that anyone who can reach the address is then in; TangleClaw records that choice, offers it only while the dashboard is not reachable from other machines, and global settings → Your account → Add a login reverses it at any time.
The login is TangleClaw's own, enforced by the server on the dashboard, the terminals, the APIs
and the proxied gateway, on every ingress mode. Local tools on this machine that are not browsers —
the tc CLI, PortHub, the switchboard — are outside it; the optional service-token gate covers them.
Caddy's basic_auth password pop-up appears only while TangleClaw's login cannot guard the door by
itself: before an install's first account exists, or during a terminal fallback. Upgrading an install
that has only Caddy's password? Close every other TangleClaw tab first, sign in with it as before,
create your account on the page that follows, then run node scripts/ingress-cutover.js --to caddy to take Caddy's password out of a
Caddyfile TangleClaw generated (a hand-maintained one is yours to edit). Locked out, or the login
itself broke? Getting back into TangleClaw covers every case.
To reach TangleClaw from another device, pick one of two things — never neither:
scripts/ingress-cutover.js is the manual path for upgrades and recovery. See deploy/INGRESS.md."bindAllInterfaces": true in ~/.tangleclaw/config.json (or Settings → Network Exposure): accept connections from every interface directly, with no TLS — and with no password unless TangleClaw's login is on. Only sensible on a network you fully control. Requires a restart.Recommendations:
Internet exposure is unsupported — not merely discouraged. The login is a password with no second factor, no per-address lockout, and no per-user permissions, sitting in front of arbitrary code execution. Supported perimeters are loopback, a private tunnel (Tailscale/WireGuard), or a trusted LAN behind the gate. The reasoning is recorded in ADR 0009.
TangleClaw checks for newer releases automatically (a git ls-remote --tags against your origin, ~60 seconds after server start and periodically after — see updateCheckIntervalMs). That timer is only the floor for an install nobody has open: the dashboard re-checks when you open it and whenever you return to its tab, and every open session re-checks on its own poll, so a release published between timer ticks is noticed within minutes of it existing rather than whenever the timer next happens to fire. Those page-driven checks are throttled and coalesced server-side, so the cost is the same whether you have one tab open or twenty.
To check on demand, click the version number in the header. It reports the result inline and never as more than it measured: up to date, an update available, that the check could not be made, that nothing has been checked yet, or — when the running server predates the on-demand check and only its cache can answer — that the answer is cached and was not re-checked. Those distinctions matter: an install that cannot reach origin is not the same as one that is current, and before #716 both rendered identically as "no pill". The same honesty applies to the running process itself: when TangleClaw cannot read its own git state it says "cannot tell whether this server is up to date" instead of implying all-clear.
When a newer tag exists, the serpent logo announces it — on the dashboard and inside every session, from one surface. A notice pops naming the version, fades after a few seconds, and leaves a red dot on the logo that stays until the update is applied; clicking the dot re-opens the notice. Click through to the release notes, or press Update now to have TangleClaw fetch the release, check it out with fail-closed guards, and restart itself.
A fork
originfreezes detection. GitHub copies tags into a fork only at creation, so a clone whoseoriginpoints at your own fork will report "up to date" indefinitely no matter how often it checks. Pointoriginat the upstream repo, or fetch tags from upstream yourself. Tracked as #711.
Manual upgrade path:
cd <your-TangleClaw-clone>
node scripts/apply-update.js # same guarded applier as the button
# result JSON on stdout, logs on stderr, exit 1 if refused
launchctl kickstart -k gui/$(id -u)/com.tangleclaw.server
node scripts/apply-update.js --help prints the script's usage and changes nothing. The update runs only with no arguments or with --discard-tc-files: any other argument is refused with exit 2, the reason on stderr and nothing on stdout, before the updater is called.
Run ./deploy/install.sh only when a release changed a launchd plist or another deploy asset. It restarts the server itself, so it replaces the kickstart above rather than following it. It works in both ingress modes:
~/.tmux.conf and dependencies, and reloads both agents.node scripts/ingress-cutover.js --to caddy. The server restarts twice, and each restart is confirmed healthy. A login stays in front the whole time, so the dashboard is briefly down, never open. Which login it is follows the cutover's rule: while TangleClaw's own login is armed it is the gate, and Caddy's password is left out (a Caddy password set earlier is removed); otherwise Caddy's password is the gate. install.sh prints which gate remains, even if the final health check times out, and the preflight says beforehand if the refresh will remove a Caddy password. A hand-written gate (a forward_auth or import) makes the Caddyfile hand-edited, so the preflight refuses and nothing changes.Use the script rather than git pull. A successful update leaves the checkout detached at the release tag, which is the intended state — pulling a branch on top of that moves you to an unreleased commit, and the updater then refuses to run again because HEAD no longer sits on a tag. The script fetches and checks out the release tag itself, and fails closed on a dirty tree or a branch that isn't meant to be updated.
Note: if your clone predates the 4.0 rename, the repository was previously named
TangleClaw-v3. GitHub redirects the old URL, but updating your remote is cleaner:git remote set-url origin https://github.com/Jason-Vaughan/TangleClaw.git
Global config lives at ~/.tangleclaw/config.json (auto-created on first run).
Key settings:
serverPort — landing page server port (code default: 3101, launchd override: 3102)ttydPort — ttyd terminal port (3100; in caddy ingress mode ttyd binds a Unix socket instead of a TCP port)projectsDir — root directory for managed projectsdefaultEngine — preferred engine for new projects; used when installed, otherwise TangleClaw falls back to the first installed engine (see the configuration reference)deletePassword — optional password for destructive operationshttpsEnabled / httpsCertPath / httpsKeyPath — direct-mode TLSingressMode / caddyHttpsPort / caddyHttpPort / publicDomain — Caddy ingress (guide)Engine profiles: ~/.tangleclaw/engines/*.json · Orchestration profiles: ~/.tangleclaw/orchestration-profiles.json
See the Configuration Reference for all fields, types, and defaults.
node --test 'test/*.test.js'
[default] launchd (com.tangleclaw.caddy) ← ingress mode, provisioned by setup
└─ caddy: TLS + basic_auth gate
└─ reverse proxy → TangleClaw server
launchd (com.tangleclaw.server)
└─ node server.js
├─ Landing page HTTP(S) server (:3102)
├─ API endpoints (/api/*)
├─ Reverse proxy /terminal/* → ttyd (:3100)
├─ Reverse proxy /openclaw/* → SSH tunnel → OpenClaw gateway
├─ WebSocket upgrade (ttyd + OpenClaw)
└─ Session wrapper + OpenClaw viewer HTML serving
launchd (com.tangleclaw.ttyd)
└─ ttyd --port 3100 tmux attach (PTY-leak watchdog supervised)
└─ WebSocket terminal access
tmux sessions (spawned on demand)
├─ One per active project session (AI engine process)
└─ tangleclaw-master (reserved) — the Project Master session
SSH tunnels (spawned on demand)
└─ One per active OpenClaw connection
├─ Gateway port forward
└─ ClawBridge port forward (sidecar)
For a maintained map of features → source files, see FEATURES.md. Durable design decisions live in docs/adr/.
Reference hooks are provided in hooks/. To install:
cp hooks/pre-commit hooks/commit-msg hooks/post-commit .git/hooks/
chmod +x .git/hooks/pre-commit .git/hooks/commit-msg .git/hooks/post-commit
version.json on the main branch# Restart server (launchd auto-restarts via KeepAlive)
launchctl kill SIGTERM gui/$(id -u)/com.tangleclaw.server
# Stop services
launchctl unload ~/Library/LaunchAgents/com.tangleclaw.server.plist
launchctl unload ~/Library/LaunchAgents/com.tangleclaw.ttyd.plist
# View logs
tail -f ~/.tangleclaw/logs/tangleclaw.log
# Health check (use https:// and curl -k when HTTPS is enabled)
curl -s http://localhost:3102/api/health | python3 -m json.tool
View the live release-first roadmap →
It is generated from the canonical release plan and current public GitHub issue status. Release targets are forecasts and update automatically.
We pledge to make participation in our community a harassment-free experience for everyone. Please review our Code of Conduct.
MIT — see LICENSE.
localhost link convention, the Project Rules store and how to propose to it, the learnings loop, the Medusa switchboard, and PortHub — so a brand-new session on a brand-new project works with the platform out of the box instead of needing a tutorialenv:/file: indirection, never keys in argv.md files on session launchPROJECT-MAP.md, FEATURES.md) refreshed at wrap time on every engine and, on engines that deliver a hidden prime, pointed at from the session prime so agents stop hunting for where things live/api/medusa/deliveriesGET …/medusa/peers/<workspace-id>tc message status <workspace-id>| Recovery |
| Let my sessions message each other (Medusa switchboard) | User Guide — Session Switchboard |
| Share docs between related projects | User Guide — Project Groups and Shared Documents |
| Connect a remote OpenClaw machine | OpenClaw Setup |
| Point a project's sessions at local models (LiteLLM/Ollama) | Orchestration profiles — edit ~/.tangleclaw/orchestration-profiles.json, then bind the project in its settings |
| Let the AI improve its own session rules (safely) | Session Rules & Self-Improvement |
| Add a custom engine | Engine Guide |
| Cut a release, or work out why one never reached installs | Release Process |
| Handle a Dependabot dependency-bump PR (never merged — audited and reconstructed) | Dependency Bump Audit |
| Change any config setting | Configuration Reference |
| Fix something that's broken | User Guide — Troubleshooting, or Service Management below |
| Set it up safely, or get back in when locked out | Setup Guide |