tide · orchestration machine

Stop re-explaining
your work every
single time.

Context dies between sessions. Plumbing eats the one scarce thing — your attention. Work scatters across chats and is lost. tide is a synchronous, human-driven orchestration machine: pure CLI + markdown, no autonomy. You steer in plain words; the state lives in files you can read.

Surface pure CLI + markdown
Model synchronous · no daemon
Runtime Python ≥ 3.12 · stdlib-only
License open source
§ 01

Three ways the work leaks away.

You're not slow. The tools are leaking the work faster than you can do it. Three leaks, every project, every week.

01 / amnesia
Context dies between sessions
You open a fresh chat and re-explain the whole project from scratch — where things are, what you decided, why. The thread you built yesterday is gone. You pay the briefing tax again, and again.
02 / plumbing
Plumbing eats your attention
Spawning terminals, tracking what's open, remembering to merge notes — the coordination overhead consumes the one thing that's actually scarce: your judgment. You babysit the machine instead of steering it.
03 / scatter
Work never becomes truth
Decisions live in chat scrollback. A finished task leaves no durable trace. Two weeks later nobody — not you, not an agent — can answer "what is true about this project right now?" It scattered and it's gone.
tide's answer
State lives in files, not in a chat. Everything is plain markdown under .tide/cat, grep, diff it. A session starts empty and re-hydrates by reading. The thread is never lost.
Your judgment is spent only where it's irreplaceable. The machine runs the commands, tracks the state, and merges the notes. You make the calls — sign the contract, accept the work — and nothing else.
Every unit of work lands as durable truth. Work folds into the canon — one readable markdown file that is the project's living "what is true." Closing a unit is the one moment truth gets reconciled.
§ 02

One real run, end to end.

No diagrams of an imagined system — these are the actual commands the session runs on your behalf, and what you actually see. You steer in prose; tide does the rest.

1
Launch

A clean, seeded session — right in your terminal

tide terminal drops you into a clean, logged-in, scoped Claude session in your standard terminal — no new window, works in plain macOS Terminal. Seeded with the right context, ready to go.

2
Orient

Oriented in seconds, not re-briefed

The session lands and states where everything is — the work stream, your role, and any drift. You don't explain the project to it; it explains the project to you.

You're oriented. What to read, what's live, what's waiting on a human — computed from the files, shown on entry.

3
Open an arc

Begin a real unit of work — a signed contract

You say what you want in plain words. The session carves an arc — one bounded unit — and binds a contract: your goal plus hard criteria. You sign once. A worker subagent builds into the arc, never touching anything else.

4
Hand off

The thread isn't lost — it's carried

The session gets heavy. You say "handoff." tide handoff distils the chat into the arc's workspace and forks a fresh terminal that starts already working — on the focus, not on a pile of scrollback.

Carried, not re-briefed. The new session opens on the work, with the distilled thread already in its workspace.

5
Land

Close the arc — it folds into the canon

The fresh session finishes the work. You review the report and proof, accept, and land it. tide arc land merges the arc's delta into CANON.md — the single serialization point. You look back and see it: documented, criteria passed, durable.

terminal A──╮
     ╰─ distil ─╮
terminal B ─ land ─→ CANON.md

The thread crossed two terminals and landed as durable truth. Nothing was re-explained. Nothing scattered. The project knows what it is — in a file you can read.

§ 03

What the one binary gives you.

Namespaced subcommands that compose the way git <verb> does. Honest and concrete — every one is real.

tide roster ls
Roster of projects
One control-home leads every project you run. They live anywhere on disk; the roster just holds the thread.
tide status --all
The STREAM board
Per-project or roster-wide: the numbered work stream, flagging unmerged deltas and drift on open arcs.
tide arc · contract
Arcs as contracts
Each unit of work is a bounded arc bound to a contract — goal plus hard criteria you sign off on.
tide handoff
Warm handoff
Distil a heavy chat into the arc workspace and fork a fresh terminal that starts already working.
tide canon merge
Canon + drift gate
Durable markdown truth. The merge into CANON.md is the single serialization point; drift is flagged, never silent.
tide readme
README from canon
Generate the user-door README.md as a projection of canon — with a --check drift gate.
tide verify --portable
tool ⊥ instance
A bright line: the shipped tool carries none of your paths, identity, or projects. The gate scans and fails loud.
tide self-update
Gated self-update
Keep one tide current on any machine. A regression gate (portable + suite) must be green before it reinstalls.
terminal_adapter
Pluggable adapters
Sessions launch through a swappable terminal adapter — orca by default, tmux as fallback.
§ 04

Built like a small UNIX tool, on purpose.

One binary tide arc …, tide canon …, tide contract … — namespaced verbs that compose like git. No platform to host, just the point you lead from.
Plain text is the DB Everything is markdown under <project>/.tide/. No daemon, no server, no lock file. cat, grep, diff and git all just work on your state.
Synchronous Exit codes, no hidden background magic. The human steers; the agent runs the module CLI. You never type the inner verbs by hand.
Least privilege Role is carried in one env var, TIDE_ROLE. Orchestrator-only ops — canon merge, contract close — refuse to run as a worker.
Dogfooded tide is led as a tide project, in its own .tide/. The machine runs itself.
§ 05

Install in under a minute.

Requires Python ≥ 3.12. Runtime is stdlib-only — no click, no web deps.

Homebrew
Tap and install — the formula pins the immutable release sdist.
From source
Puts tide on your PATH under a 3.12 interpreter. Idempotent.

Then unfold a control-home: mkdir ~/control && cd ~/controltide init --name controltide roster add myapp ~/code/myapp → run tide and start steering. The full command tree lives in tide help.

≈ ≈ ≈

The thread doesn't break.
The truth doesn't scatter.

tide doesn't ask you to be more disciplined about context, plumbing, or notes. It removes the work that required the discipline.

State lives in files. Your judgment is spent only where it's irreplaceable. Every unit of work lands as durable truth you can read.