Mission control for your coding agents โ spin up, watch, and steer a fleet of AI coding agents from your terminal.
Project description
๐ tide
Mission control for your coding agents.
Spin up, watch, and steer a fleet of AI coding agents โ each in its own isolated workspace โ from one delightful terminal cockpit.
Running coding agents today means babysitting: open a sandbox, set it up, launch the agent, repeat, then juggle a dozen terminals trying to remember which one is doing what. tide turns that into a single command and a calm dashboard.
- ๐ Launch in one keystroke. Define an agent profile once โ repo, task, model, MCP servers, environment โ then cast off as many agents as you need.
- ๐งญ Each agent in its own lane. Every run gets an isolated git worktree on its own branch, so agents never step on each other (or your working tree).
- ๐ See what needs you. The dashboard ranks agents by who needs your attention โ failed and finished-with-changes float to the top; the calm ones stay out of your way.
- ๐ชต Live logs & diffs. Tail any agent's output and review its changes without leaving the terminal.
- ๐ Bring your own agent. Defaults to Claude Code, but a profile can launch any command, so tide works with whatever you run.
- ๐ฅ๏ธ Terminal or browser. A keyboard-driven TUI and a polished web cockpit, both over the same shared state.
- ๐๏ธ Event-driven. Point a Wiz / PagerDuty / Sentry / GitHub webhook at tide and a matching alert auto-launches an agent โ at the autonomy you choose (propose โ it waits for your approval ยท auto โ it runs immediately).
- ๐๏ธ Across your org. Register repos by name and launch into any โ or fan one task out across many at once, an isolated agent (and PR) per repo.
- ๐ง Planner. Hand tide one instruction and it works out which of your repos it touches and what each should change โ you review, then it dispatches.
- ๐ Env once. Reusable env sets (optionally synced from GitHub) attach to profiles.
- ๐งฉ Any provider. Claude Code, Codex, Gemini, Cursor, Aider โ or any command.
- ๐งฑ Real isolation, when you want it. Run an agent on the host worktree, or
inside a container built from the repo's
.devcontainerโ just setworkspace = "devcontainer"on its profile.
tide is local-first and zero-ops: no cloud account, no daemon, no infrastructure. It orchestrates
gitand your agent CLI on your machine.
Install
uv tool install tide # recommended โ installs as an isolated tool
# or
pipx install tide
# or
pip install tide
Prefer source? uv tool install git+https://github.com/gauthierpiarrette/tide,
or clone the repo and run uv tool install ..
Requires Python 3.11+ and git. To launch Claude Code agents, install the
Claude Code CLI (claude).
Quickstart
# 1. open the cockpit (run this inside a git repo)
tide
# 2. ...or launch an agent straight from the shell
tide up "add retry logic to the upload client"
# 3. see your fleet
tide ls
The first time you run tide up, a starter profile is created for you. Press
n in the TUI to launch a new agent, enter to open one, s to stop it, and
? for the full keymap.
Web cockpit
Prefer a browser? tide web opens a full GUI on localhost with a rich
composer โ multi-line prompts, pasted context, and drag-&-drop file
attachments โ plus the live fleet, streaming output, and diff review.
Everything the CLI does, easier. It shares the same state, so agents launched in
the browser show up in the terminal and vice-versa.
tide web # opens http://127.0.0.1:8765
Across many repos
Registered repos aren't just one-at-a-time targets โ fan a single task out across several and tide launches one isolated agent (and one PR) per repo:
tide up "bump the logging lib to v2 and fix the call sites" -r api -r web -r workers
Each agent works in its own worktree on its own branch, so the changes โ and the PRs โ stay independent. Agents that find nothing to do finish quietly with no PR, so you only get a pull request where the change actually applied. In the web cockpit, the composer's repo picker selects several the same way.
Planner โ one instruction, the right repos
Not sure which repos a change belongs in? Let tide plan it. tide plan surveys
your registered repos (a quick code search for the terms in your instruction) and
proposes which repos are in scope and a tailored prompt for each, with shared
cross-repo context threaded through every one.
tide plan new "rename BillingAccount.tier to plan and update everything that reads it"
# โ surveys repos, prints a per-repo plan (which repos ยท what each will change)
tide plan apply <id> # dispatch the selected repos โ one agent & PR each
The plan is a proposal you review โ deselect a repo before applying, or pass
--apply to dispatch immediately. Planning uses your configured Claude CLI by
default (override with TIDE_PLANNER_BIN).
Profiles
A profile is a reusable recipe for spinning up an agent. Profiles live in
~/.config/tide/config.toml (global) or .tide/config.toml (per-project).
[profiles.default]
description = "Claude Code on the current repo"
command = 'claude -p "{task}"' # {task} is filled in at launch
base_branch = "main" # branch each worktree forks from
[profiles.review]
description = "Read-only reviewer with the GitHub MCP server"
command = 'claude -p "{task}"'
model = "claude-opus-4-8"
env = { CLAUDE_PERMISSION_MODE = "plan" }
[profiles.review.mcp_servers.github]
command = "npx"
args = ["-y", "@modelcontextprotocol/server-github"]
When a profile defines mcp_servers, tide writes a .mcp.json into that
agent's worktree before launch โ so each agent gets exactly the tools you chose.
To run a profile's agents inside a container (real dependency/OS isolation), set
workspace = "devcontainer" (or tide profile add <name> --workspace devcontainer).
tide bind-mounts the worktree into the container, so diffs still flow back to the
host. Requires Docker and the Dev Containers CLI (npm i -g @devcontainers/cli).
How it works
tide up "task"
โ
โโโโโโโโโโโผโโโโโโโโโโโ
โ FleetManager โ tracks every agent, persists state
โโโโโโโโโโโฌโโโโโโโโโโโ
โ creates
โโโโโโโโโโโผโโโโโโโโโโโ
โ WorktreeRuntime โ git worktree + branch โ isolated lane
โโโโโโโโโโโฌโโโโโโโโโโโ
โ runs your profile's command (cwd = worktree)
โโโโโโโโโโโผโโโโโโโโโโโ
โ your agent CLI โ e.g. `claude -p "..."`
โโโโโโโโโโโโโโโโโโโโโโ
Each agent is a real OS process running your command inside a dedicated git worktree. tide records its branch, status, runtime, and diff, and surfaces the ones that need you. Stopping an agent terminates its process group; removing one cleans up its worktree.
Commands
| Command | What it does |
|---|---|
tide |
Open the TUI cockpit |
tide web |
Open the web cockpit in your browser |
tide up "<task>" [-p profile] [-r repo โฆ] |
Launch an agent โ repeat -r to fan out across repos |
tide ls |
List the fleet |
tide logs <id> |
Stream an agent's output |
tide follow <id> "<msg>" |
Send a follow-up turn into the agent's worktree |
tide stop <id> |
Stop a running agent |
tide done <id> |
Mark a finished agent reviewed (clears it from the inbox) |
tide rm <id> |
Remove an agent and clean up its worktree |
tide profile ls |
List profiles |
tide profile add <name> |
Create/update a profile (provider/workspace) |
tide approve <id> |
Approve a trigger-proposed agent |
tide repo add/ls/rm |
Manage the org repo registry |
tide plan new "<instruction>" |
Survey repos & propose a per-repo plan |
tide plan apply <id> |
Dispatch a plan's selected repos (one agent & PR each) |
tide plan ls/show/rm |
List, inspect, or delete plans |
tide env set/ls/sync-github |
Manage reusable env sets |
tide trigger add/ls/rm/toggle |
Manage event triggers (sensors) |
tide trigger webhook-url |
Print the inbound webhook URL |
Sensors & triggers
Turn events into agents. Create a trigger, point an alert source at tide's webhook, and matching events launch an agent automatically โ gated by the autonomy level you chose.
tide trigger add wiz-high -p investigate -m severity=high -a propose
tide trigger webhook-url # โ point Wiz / PagerDuty / Sentry / GitHub here
A high-severity alert then auto-proposes an investigator agent built from the
payload; you approve it (tide approve <id> or the web button) and it runs in
its own isolated worktree. Schedule triggers (--every <seconds>) run on a timer.
Roadmap
- Remote & cloud workspaces โ run agents on a remote Docker host or a cloud sandbox, beyond the local devcontainer backend.
- Routing flywheel โ use the recorded outcomes to send each task to the provider/profile that has historically succeeded at it.
- Team plane โ shared profiles, secrets, and triggers; audit and cost.
- Parallel exploration โ launch the same task N ways, keep the best.
- Planner in the cockpit โ a visual plan-review UI (the planner ships CLI-first today).
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tide-0.3.3.tar.gz.
File metadata
- Download URL: tide-0.3.3.tar.gz
- Upload date:
- Size: 199.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a0661fa0c378a8b45e04436f6b5855e8d7c8896d6431725d02e6c496646984a3
|
|
| MD5 |
ea61974b007bebe131e86865e4a446db
|
|
| BLAKE2b-256 |
5c7d4b12b859ac75206b5f852573a8c575f1f25e5e9e0ba6e5de6d3380c66ad8
|
Provenance
The following attestation bundles were made for tide-0.3.3.tar.gz:
Publisher:
publish.yml on gauthierpiarrette/tide
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tide-0.3.3.tar.gz -
Subject digest:
a0661fa0c378a8b45e04436f6b5855e8d7c8896d6431725d02e6c496646984a3 - Sigstore transparency entry: 1736574050
- Sigstore integration time:
-
Permalink:
gauthierpiarrette/tide@37b1c8816e5e8544b582f9b0ba88c17b57eb7e64 -
Branch / Tag:
refs/tags/v0.3.3 - Owner: https://github.com/gauthierpiarrette
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@37b1c8816e5e8544b582f9b0ba88c17b57eb7e64 -
Trigger Event:
release
-
Statement type:
File details
Details for the file tide-0.3.3-py3-none-any.whl.
File metadata
- Download URL: tide-0.3.3-py3-none-any.whl
- Upload date:
- Size: 83.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e0b3e110c3b8affeaae2a444a6ba443524d9815cc05ecaab93131cd69d6c9092
|
|
| MD5 |
40630ef2f68f0c31947aa914665e8ff6
|
|
| BLAKE2b-256 |
8c51035c22c70b8723465eeb7d41271ec6cf022f4c7d0ef23b210d381a7c8bb8
|
Provenance
The following attestation bundles were made for tide-0.3.3-py3-none-any.whl:
Publisher:
publish.yml on gauthierpiarrette/tide
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tide-0.3.3-py3-none-any.whl -
Subject digest:
e0b3e110c3b8affeaae2a444a6ba443524d9815cc05ecaab93131cd69d6c9092 - Sigstore transparency entry: 1736574117
- Sigstore integration time:
-
Permalink:
gauthierpiarrette/tide@37b1c8816e5e8544b582f9b0ba88c17b57eb7e64 -
Branch / Tag:
refs/tags/v0.3.3 - Owner: https://github.com/gauthierpiarrette
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@37b1c8816e5e8544b582f9b0ba88c17b57eb7e64 -
Trigger Event:
release
-
Statement type: