diff --git a/docs/compare/compare.css b/docs/compare/compare.css new file mode 100644 index 00000000..f895c7f2 --- /dev/null +++ b/docs/compare/compare.css @@ -0,0 +1,117 @@ +/* TaskYou /compare — shared styles, extracted from index.html so the + comparison section matches the landing page exactly. */ +:root{ + --bg:#0e0b16; --panel:#15111f; --panel2:#1b1628; --line:#241e38; --line2:#2e2746; + --text:#f3eaff; --muted:#9b93bd; --dim:#6f6790; + --orange:#ff7a3c; --orange-d:#c9432a; --green:#7cf6b0; --yellow:#ffd23f; --red:#ff5f57; +} +*{box-sizing:border-box; margin:0; padding:0;} +html{scroll-behavior:smooth;} +body{ + font-family:'Space Grotesk',system-ui,-apple-system,sans-serif; background:var(--bg); color:var(--text); + line-height:1.6; -webkit-font-smoothing:antialiased; overflow-x:hidden; +} +/* CRT scanlines */ +body::before{ + content:""; position:fixed; inset:0; pointer-events:none; z-index:9999; opacity:.5; + background:repeating-linear-gradient(0deg, rgba(255,255,255,.022) 0 1px, transparent 1px 3px); +} +.grid-bg{ + position:fixed; inset:0; z-index:-1; pointer-events:none; + background-image:linear-gradient(rgba(255,255,255,.025) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.025) 1px,transparent 1px); + background-size:26px 26px; + -webkit-mask-image:radial-gradient(120% 90% at 50% 0%, #000 0%, transparent 75%); + mask-image:radial-gradient(120% 90% at 50% 0%, #000 0%, transparent 75%); +} +.wrap{max-width:1080px; margin:0 auto; padding:0 1.5rem;} +.prose{max-width:820px;} +a{color:inherit; text-decoration:none;} +.mono{font-family:'JetBrains Mono',monospace;} + +/* NAV */ +nav{position:sticky; top:0; z-index:100; backdrop-filter:blur(10px); -webkit-backdrop-filter:blur(10px); background:rgba(14,11,22,.72); border-bottom:1px solid var(--line);} +nav .wrap{display:flex; align-items:center; justify-content:space-between; height:60px;} +.brand{display:flex; align-items:center; gap:.55rem; font-weight:700; font-size:1.05rem;} +.brand img{height:26px; width:auto; image-rendering:pixelated;} +.navlinks{display:flex; align-items:center; gap:1.4rem; font-family:'JetBrains Mono',monospace; font-size:.8rem; color:var(--muted);} +.navlinks a:hover{color:var(--text);} +.navlinks a.active{color:var(--orange);} +.navlinks .desktop-only{display:inline;} +@media(max-width:640px){.navlinks .desktop-only{display:none;}} +.btn{display:inline-flex; align-items:center; gap:.5rem; font-family:'JetBrains Mono',monospace; font-weight:700; font-size:.8rem; padding:.5rem .9rem; border-radius:8px; transition:transform .12s ease;} +.btn:hover{transform:translateY(-1px);} +.btn-primary{background:var(--orange); color:#1a1320; box-shadow:0 4px 0 var(--orange-d);} +.btn-primary:active{transform:translateY(3px); box-shadow:0 1px 0 var(--orange-d);} + +/* HERO / PAGE HEAD */ +header.phead{padding:3.5rem 0 1.5rem; position:relative;} +.eyebrow{font-family:'JetBrains Mono',monospace; font-size:.72rem; letter-spacing:.14em; text-transform:uppercase; color:var(--orange); margin-bottom:.8rem;} +h1.headline{font-weight:700; font-size:clamp(2.1rem,4.6vw,3.1rem); line-height:1.04; letter-spacing:-.02em; margin-bottom:.8rem;} +h1.headline .t{color:var(--orange);} +.oneline{font-family:'JetBrains Mono',monospace; font-size:1rem; color:var(--green); line-height:1.55; max-width:70ch; border-left:2px solid var(--line2); padding-left:1rem;} +.oneline b{color:var(--text); font-weight:600;} + +/* CONTENT */ +section.body{padding:2rem 0 3rem;} +.body h2{font-weight:700; font-size:clamp(1.4rem,2.6vw,1.8rem); letter-spacing:-.01em; margin:2.4rem 0 .9rem;} +.body h3{font-weight:600; font-size:1.12rem; margin:1.6rem 0 .5rem; color:var(--text);} +.body p{color:var(--muted); margin:.7rem 0; max-width:78ch;} +.body p strong, .body li strong{color:var(--text); font-weight:600;} +.body em{color:var(--text); font-style:italic;} +.body a{color:var(--green); text-decoration:none; border-bottom:1px solid rgba(124,246,176,.3);} +.body a:hover{border-bottom-color:var(--green);} +.body ul, .body ol{color:var(--muted); margin:.7rem 0 .7rem 1.2rem; max-width:78ch;} +.body li{margin:.4rem 0;} +.body code{font-family:'JetBrains Mono',monospace; font-size:.85em; background:#0a0812; border:1px solid var(--line2); border-radius:5px; padding:.08rem .35rem; color:var(--green);} +.body pre{font-family:'JetBrains Mono',monospace; font-size:.8rem; background:#0a0812; border:1px solid var(--line2); border-radius:10px; padding:1rem 1.1rem; overflow-x:auto; margin:1rem 0; color:var(--muted); line-height:1.5;} +.body pre code{background:none; border:none; padding:0; color:inherit;} +.body blockquote{border-left:3px solid var(--orange); background:var(--panel); border-radius:0 10px 10px 0; padding:.9rem 1.2rem; margin:1.2rem 0; color:var(--text);} +.body blockquote p{color:var(--text); margin:.3rem 0;} +.body hr{border:none; border-top:1px solid var(--line); margin:2.5rem 0;} +.note{font-size:.86rem; color:var(--dim); font-style:italic; margin-top:2rem;} + +/* TABLES */ +.tablewrap{overflow-x:auto; margin:1.3rem 0; border:1px solid var(--line2); border-radius:12px;} +table{border-collapse:collapse; width:100%; font-size:.9rem; min-width:520px;} +thead th{background:#181426; color:var(--text); font-weight:600; text-align:left; padding:.7rem .9rem; border-bottom:1px solid var(--line2); font-family:'JetBrains Mono',monospace; font-size:.78rem;} +tbody td{padding:.7rem .9rem; border-bottom:1px solid var(--line); color:var(--muted); vertical-align:middle;} +tbody td:first-child{vertical-align:middle;} +tbody tr:last-child td{border-bottom:none;} +tbody tr:nth-child(even){background:rgba(255,255,255,.012);} +td.c, th.c{text-align:center;} +td strong, td b{color:var(--text);} +/* status marks — crisp monospace glyphs, theme-colored, never OS emoji */ +.mark{font-family:'JetBrains Mono',monospace; font-size:1rem; font-weight:700; line-height:1; font-variant-emoji:text;} +.yes{color:var(--green);} +.no{color:var(--dim);} +.partial{color:var(--yellow);} +/* value cells: centered glyph, annotation as a small caption beneath it so + glyphs line up in a tidy grid regardless of annotation length */ +td.val{text-align:center; vertical-align:middle;} +td.val .mark{display:block; font-size:1.05rem;} +td.val .anno{display:block; max-width:24ch; margin:.22rem auto 0; font-size:.78rem; line-height:1.35; color:var(--muted);} +td.val .anno.plain{margin:0; font-size:.88rem;} +td.val .anno code{font-size:.76rem;} +.legend{font-family:'JetBrains Mono',monospace; font-size:.74rem; color:var(--dim); margin-top:.7rem;} + +/* CARD GRID (compare index) */ +.cards{display:grid; grid-template-columns:1fr 1fr; gap:1rem; margin:1.5rem 0;} +@media(max-width:680px){.cards{grid-template-columns:1fr;}} +.card{background:var(--panel); border:1px solid var(--line); border-radius:14px; padding:1.3rem; transition:border-color .15s ease, transform .15s ease; display:block;} +.card:hover{border-color:var(--orange); transform:translateY(-2px);} +.card h3{font-size:1.1rem; margin-bottom:.3rem; color:var(--text); border:none;} +.card p{color:var(--muted); font-size:.9rem; margin:.3rem 0 0;} +.card .arrow{color:var(--orange); font-family:'JetBrains Mono',monospace; font-size:.78rem; margin-top:.8rem; display:inline-block;} + +/* back / pager */ +.pager{display:flex; flex-wrap:wrap; gap:.8rem; margin-top:2.5rem; padding-top:1.5rem; border-top:1px solid var(--line);} +.pager a{font-family:'JetBrains Mono',monospace; font-size:.8rem; color:var(--muted); border:1px solid var(--line2); border-radius:8px; padding:.5rem .8rem;} +.pager a:hover{border-color:var(--orange); color:var(--text);} + +/* FOOTER */ +footer{border-top:1px solid var(--line); padding:2.5rem 0 3.5rem; color:var(--dim); margin-top:2rem;} +footer .wrap{display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between; gap:1rem;} +footer .fbrand{display:flex; align-items:center; gap:.5rem; color:var(--muted); font-weight:600;} +footer .fbrand img{height:22px; width:auto; image-rendering:pixelated;} +footer .flinks{display:flex; gap:1.3rem; font-family:'JetBrains Mono',monospace; font-size:.78rem;} +footer .flinks a:hover{color:var(--text);} diff --git a/docs/compare/index.html b/docs/compare/index.html new file mode 100644 index 00000000..339fc7da --- /dev/null +++ b/docs/compare/index.html @@ -0,0 +1,63 @@ + + +
+ + +TaskYou is an autonomy-first task orchestrator for coding agents. You drop a task on a board, an agent picks it up and works in its own isolated git worktree in the background, and the card tracks all the way to a merged PR. One agent per task. A worktree per agent.
+That's a different job from a terminal multiplexer, a process dashboard, or a worktree-diff tool. This page lays the whole landscape on one grid, then links to a detailed page for each contender. We try to be fair: where a tool genuinely beats us at its job, we say so.
++The short version: most of these tools help you watch and drive agents you launch by
hand. TaskYou helps you queue outcomes and walk away. If your mental model is "panes I'm
babysitting," you want a multiplexer. If it's "a backlog that clears itself," you want TaskYou.
| Capability | TaskYou | tmux / Zellij | cmux / Warp | Conductor / Emdash / Superset |
|---|---|---|---|---|
| Unit of work is a task / outcome (not a pane) | ✓︎ | ✕︎ | ✕︎ | ✓︎ |
| Queue + background execution (stack work, walk away) | ✓︎ | ✕︎ | ✕︎ | ◐︎ |
| Kanban board (Backlog / In Progress / Blocked / Done) | ✓︎ | ✕︎ | ✕︎ | ◐︎ |
| Worktree-per-task isolation, automatic | ✓︎ | ✕︎ | ◐︎ | ✓︎ |
| PR-aware completion (task state follows the PR to merge) | ✓︎ | ✕︎ | ✕︎ | ◐︎ |
| Pluggable executors (Claude, Codex, Gemini, Pi, OpenClaw, OpenCode) | ✓︎ | n/a | ✕︎ | ◐︎ |
| Routines — scheduled unattended runs that feed the queue | ✓︎ | ✕︎ | ✕︎ | ✕︎ |
| Live executor panes to watch/drive an agent | ✓︎ | ✓︎ | ✓︎ | ◐︎ |
| Runs over SSH (board from anywhere) | ✓︎ | ✓︎ | ✕︎ | ✕︎ |
| Web UI (same board in a browser) | ✓︎ | ✕︎ | ✕︎ | ◐︎ |
| Desktop app (macOS / Linux) | ✓︎ | ✕︎ | ✓︎ | ✓︎ |
| Email control (create + unblock tasks from your phone) | ✓︎ | ✕︎ | ✕︎ | ✕︎ |
| Fully scriptable CLI / agent API | ✓︎ | ◐︎ | ◐︎ | ◐︎ |
| Open source | ✓︎MIT | ✓︎ | ◐︎ | ◐︎ |
✓︎ first-class · ◐︎ partial / possible-but-not-the-point · ✕︎ no · n/a not applicable (◐︎ and ✕︎ for other tools reflect their stated positioning as of mid-2026; correct us with a PR if a tool has shipped past this.)
One line: cmux and Warp are polished apps for running agents on your machine; TaskYou is the same job as a board that runs anywhere — terminal, browser, desktop, email, and over SSH — and is built to queue work and walk away.
+cmux (a Mac terminal app for agents) and Warp (an agentic development platform / terminal) both bet on a beautiful, local, GUI-forward experience. TaskYou bets on autonomy and reach: file an outcome, let an agent run it in the background in an isolated worktree, and pick up the result from whatever device you have.
+features; cmux is a focused Mac app for driving agents. If you want a beautiful local cockpit, this is the camp.
+SSH server to think about.
+If you primarily work on one Mac and want the most polished local agent experience, these are strong, and TaskYou doesn't try to out-pretty them.
+| TaskYou | cmux / Warp | |
|---|---|---|
| Center of gravity | A task board + queue | A polished terminal/app you drive |
| Queue + background execution | ✓︎stack work, walk away | ✕︎you drive sessions live |
| Worktree-per-task isolation | ✓︎automatic | ◐︎varies |
| PR-aware completion | ✓︎ | ✕︎ |
| Pluggable executors (6) | ✓︎per task | ◐︎tied to the app's agent(s) |
| Routines (scheduled unattended runs) | ✓︎ | ✕︎ |
| Runs on a headless server / over SSH | ✓︎taskd | ✕︎desktop-bound (cmux); ◐︎ (Warp) |
| Same board on web + email + Chrome | ✓︎ | ✕︎ |
| Open source | ✓︎MIT | ◐︎ |
Two differences matter most:
+work: queue a column, walk away, come back to diffs. The board, the worktrees, and the PR-aware lifecycle exist so you don't have to sit in the loop.
+in your terminal, your browser (ty serve), a desktop app, over SSH (taskd, so it can live on a remote box or a cloud VM), via email (create and unblock tasks from your phone with the ty-email extension), and through a Chrome extension for annotate-and-fix loops. You can kick off work from a VM you SSH into and review it from your phone.
Pick cmux / Warp when:
+Pick TaskYou when:
+including your phone, by email.
+They can coexist: TaskYou can run on a server and own the queue and worktrees while you use a slick local terminal (Warp, cmux, or anything else) as the place you drop in to take the wheel on a single task.
+Accuracy note: TaskYou capabilities are documented in the README and the extensions/ty-* READMEs. cmux/Warp entries reflect their general positioning as desktop/terminal agent apps; ◐︎ marks places their scope varies or we haven't individually verified a feature. This is a category comparison, not a feature audit. PRs welcome to correct anything.
One line: Conductor, Emdash, and Superset isolate a worktree per branch and help you review the diff; TaskYou does that and runs the work in the background on a queue, across six executors, on whatever surface you happen to be holding.
+This is the comparison closest to TaskYou's own job. These tools share TaskYou's core insight — give every agent its own isolated git worktree — so the differences are about everything around the worktree: the queue, the lifecycle, the executor choice, and where you can drive it from.
+Conductor, Emdash, and Superset are worktree-orchestration tools for coding agents. Like TaskYou, they:
+If the terminal-multiplexer tools are one camp, this is the "worktree orchestrator" camp — and TaskYou lives here too. So we'll be precise about the differences instead of hand-waving.
+| TaskYou | Conductor / Emdash / Superset | |
|---|---|---|
| Worktree-per-task isolation | ✓︎ | ✓︎(the shared idea) |
| Diff / PR review flow | ✓︎+ PR-aware completion lifecycle | ✓︎ |
| Kanban board as the home surface | ✓︎Backlog / In Progress / Blocked / Done | ◐︎varies; often a list or per-agent view |
| Queue + background execution | ✓︎stack a column, walk away | ◐︎varies by tool |
| Pluggable executors | ✓︎Claude, Codex, Gemini, Pi, OpenClaw, OpenCode — per task | ◐︎usually one or two |
| Routines — scheduled unattended runs feeding the queue | ✓︎ | ✕︎ |
PR-aware completion (task auto-done on merge/close) | ✓︎ | ◐︎ |
| Multi-surface (TUI · web · desktop · email · SSH · Chrome) | ✓︎ | ◐︎usually one app (often desktop or web) |
| Fully scriptable CLI + MCP for agents to drive the queue | ✓︎ | ◐︎ |
| Open source | ✓︎MIT | ◐︎varies |
The pattern: this camp tends to ship one polished surface (a desktop app or a web app), one or two agents, and a worktree-plus-diff flow. TaskYou matches the worktree-plus-diff flow, then adds the things that make it an orchestrator rather than a launcher:
+background — you're not launching agents one at a time.
+Gemini or Pi or OpenClaw or OpenCode for whatever fits — on the same board.
+blocked for human review, then ispromoted to done automatically when the PR merges or closes. The board mirrors your repo.
file tasks into your queue. Your backlog can fill itself.
+and over SSH. Most tools in this camp are a single app.
+Pick Conductor / Emdash / Superset when:
+no extra surfaces.
+Pick TaskYou when:
+Accuracy note: TaskYou capabilities are documented in the README and the extensions/ty-* READMEs. The competitor column is deliberately marked ◐︎ where these tools differ in scope or have shipped features we haven't individually verified — this page describes the category difference (launcher vs orchestrator), not a feature-by-feature audit of each product. Corrections welcome via PR.
One line: tmux and Zellij multiplex terminals; TaskYou multiplexes tasks — and since TaskYou is built on tmux under the hood, you get the panes anyway.
+This is the friendliest comparison on the list, because it isn't really a competition. tmux and Zellij are terminal multiplexers — they keep sessions alive and tile panes. TaskYou is an autonomy-first task orchestrator that uses a multiplexer as plumbing. The question isn't "which one" — it's "what sits on top."
+A Kanban board for coding agents. You drop a task in a column, an agent picks it up in its own isolated git worktree, runs in the background, and the card tracks itself to a merged PR. One agent per task, a worktree per agent.
+Under the hood, each executor runs in a tmux window inside a daemon session:
+task-daemon-{PID} (tmux session)
+├── _placeholder (keeps the session alive)
+├── task-123 (window for task 123)
+│ ├── pane 0: executor (Claude / Codex / … output)
+│ └── pane 1: shell (workdir access)
+├── task-124 (window for task 124)
+└── ...
+So TaskYou doesn't replace tmux — it programs it. The difference is everything that wraps those panes: a board, a queue, worktree isolation, PR tracking, and a database that remembers what every task is doing.
+What they don't do — by design, because they're general-purpose terminal tools — is understand your work. A pane is a pane. tmux doesn't know that window 3 is an agent, that it's blocked waiting on you, that it's working in an isolated worktree, or that it just opened a PR.
+| TaskYou | tmux / Zellij | |
|---|---|---|
| Persistent sessions | ✓︎(via the daemon) | ✓︎ |
| Tiled panes | ✓︎(executor + shell per task) | ✓︎ |
| Knows a pane is an agent | ✓︎ | ✕︎ |
| Kanban board of work | ✓︎ | ✕︎ |
| Queue + background execution | ✓︎ | ✕︎— you launch every process by hand |
| Worktree-per-task isolation | ✓︎automatic | ✕︎— you git worktree add yourself |
| PR-aware completion | ✓︎ | ✕︎ |
| Pluggable AI executors | ✓︎6 of them | ✕︎— not its job |
| Task database + history | ✓︎SQLite | ✕︎— panes are ephemeral state |
| Routines (scheduled unattended runs) | ✓︎ | ✕︎ |
| Web / desktop / email / SSH surfaces | ✓︎ | terminal only |
The honest way to say it: you could build a poor man's TaskYou out of tmux — a session per task, a git worktree add for each, a shell loop to launch agents, and a wall of sticky notes to track which is which. TaskYou is what you get when someone builds that properly and adds a board, a queue, worktree lifecycle, PR tracking, and a database so nothing gets lost.
Reach for tmux / Zellij when:
+Reach for TaskYou when:
+it together yourself.
+terminal.
+You're already using both. TaskYou runs on tmux. If you live in tmux today, TaskYou is the task layer that sits on top of it — and you can still tmux attach to the daemon session and poke at any task's panes by hand whenever you want to take the wheel.
Accuracy note: the tmux architecture shown above is TaskYou's actual executor model, documented in the README under "How Task Executors Work." Zellij/tmux capabilities are their standard documented features.
+ +{html.escape(spans[int(m.group(1))], quote=False)}", text)
+ # Map status emoji to crisp text glyphs (U+FE0E forces text, not emoji,
+ # presentation) so they match the terminal aesthetic instead of bolting on
+ # OS color emoji. Applied globally so table cells AND the legend line agree.
+ text = text.replace("✅", '✓︎')
+ text = text.replace("◐", '◐︎')
+ text = text.replace("❌", '✕︎')
+ return text
+
+
+def style_cell(cell):
+ return inline(cell.strip())
+
+
+def value_cell(cell):
+ """Format a comparison-column cell as a centered status glyph with the
+ annotation (if any) as a small caption beneath it. Keeps every glyph on a
+ consistent baseline so rows don't read ragged when annotations vary in
+ length. Cells with no leading glyph (prose like 'A task board + queue',
+ 'n/a') render as a plain centered caption."""
+ h = inline(cell.strip())
+ m = re.match(r'^([^<]*)\s*(.*)$', h)
+ if m:
+ mark, rest = m.group(1), m.group(2).strip()
+ return mark + (f'{rest}' if rest else "")
+ if not h:
+ return ""
+ return f'{h}'
+
+
+def convert(md):
+ lines = md.split("\n")
+ out, i, n = [], 0, len(md.split("\n"))
+ while i < n:
+ line = lines[i]
+ if line.startswith("```"):
+ buf = []
+ i += 1
+ while i < n and not lines[i].startswith("```"):
+ buf.append(html.escape(lines[i], quote=False))
+ i += 1
+ i += 1
+ out.append("" + "\n".join(buf) + "")
+ continue
+ if re.match(r"^---+\s*$", line):
+ out.append("" + "".join(f"") + continue + if re.match(r"^\s*[-*]\s+", line): + buf = [] + while i < n and re.match(r"^\s*[-*]\s+", lines[i]): + buf.append(inline(re.sub(r"^\s*[-*]\s+", "", lines[i]))) + i += 1 + out.append("{inline(b)}
" for b in buf if b) + "
{para}
") + return "\n".join(out) + + +NAV = '''''' + +FOOTER = '''''' + +TEMPLATE = ''' + + + + +