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 agents into any of them.
- ๐ 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
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] |
Launch an agent |
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 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.
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.2.2.tar.gz.
File metadata
- Download URL: tide-0.2.2.tar.gz
- Upload date:
- Size: 173.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d9f5a52cdb663dd572d32a64431d37c5ae4f91212eb6075db6429ec548c200a6
|
|
| MD5 |
bb8a6978dc6d4a56189344c52a0546c5
|
|
| BLAKE2b-256 |
1095a2fafcc91d2161f07aeb2743612bb4fbf38b58ea43f07886530e43d3ef1e
|
Provenance
The following attestation bundles were made for tide-0.2.2.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.2.2.tar.gz -
Subject digest:
d9f5a52cdb663dd572d32a64431d37c5ae4f91212eb6075db6429ec548c200a6 - Sigstore transparency entry: 1733558861
- Sigstore integration time:
-
Permalink:
gauthierpiarrette/tide@2ff8d709873339182cc643552b44f929b581950a -
Branch / Tag:
refs/heads/main - Owner: https://github.com/gauthierpiarrette
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2ff8d709873339182cc643552b44f929b581950a -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file tide-0.2.2-py3-none-any.whl.
File metadata
- Download URL: tide-0.2.2-py3-none-any.whl
- Upload date:
- Size: 66.9 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 |
2c54087dc3cf95571c6c57c5fb05937098e31d134cf4fbdc999b87768aa3aca6
|
|
| MD5 |
6ffbc2fd6e32c3427e72a729de23f5a1
|
|
| BLAKE2b-256 |
8cdb7d2c37f1ae0431f78708ad7b1b207a386fa7fcc28b006a0a8698d5d6f699
|
Provenance
The following attestation bundles were made for tide-0.2.2-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.2.2-py3-none-any.whl -
Subject digest:
2c54087dc3cf95571c6c57c5fb05937098e31d134cf4fbdc999b87768aa3aca6 - Sigstore transparency entry: 1733559234
- Sigstore integration time:
-
Permalink:
gauthierpiarrette/tide@2ff8d709873339182cc643552b44f929b581950a -
Branch / Tag:
refs/heads/main - Owner: https://github.com/gauthierpiarrette
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2ff8d709873339182cc643552b44f929b581950a -
Trigger Event:
workflow_dispatch
-
Statement type: