From 26e6bb333d26e296c93be1ba3a3e18a4307b5ee1 Mon Sep 17 00:00:00 2001 From: istos Date: Fri, 31 Jul 2026 16:04:03 +0200 Subject: [PATCH] site: point the landing page at the reader's problem, not the mechanics MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The hero explained the architecture before saying why anyone would care: 'task files in stage directories', 'stdlib-only', 'narrates' are words that mean something once you already use bench. Every line now maps to something the audience has actually hit — agents outrunning the person supposed to be tracking them. - Hero: 'Run a team of coding agents. Stay in control.' The old headline keeps its job as the brand line, in the footer of every layout. - A new section between hero and doors: three sentences a reader has said out loud, each answered by a mechanism rather than a promise. Deliberately unboxed — the doors below are the page's one grid of cards, and repeating that shape would make the eye work twice. - The six doors lead with the outcome and keep one mechanism as the evidence for it, which is the inversion of what they did before. - Title and description follow, since a pasted url is the same pitch in another form. Two lines that were quietly false are fixed too: the strip's comment still said this site counts nothing (Fathom counts pageviews now), and 'no per-seat pricing' would have tripped the fiction guard in tests/test_site_landing.py, which forbids the word outright. --- site/pages.json | 6 +-- site/static/site.css | 31 +++++++++++++ site/templates/article.html | 1 + site/templates/home.html | 89 ++++++++++++++++++++++++------------ site/templates/notfound.html | 1 + 5 files changed, 95 insertions(+), 33 deletions(-) diff --git a/site/pages.json b/site/pages.json index a3ee4a5..500da5a 100644 --- a/site/pages.json +++ b/site/pages.json @@ -2,7 +2,7 @@ "site": { "title": "bench", "tagline": "docs", - "description": "A live kanban for coding-agent work: task files in stage directories are the only source of truth.", + "description": "Run a team of coding agents without losing track of what they are doing.", "base_url": "https://bench.12vectors.com", "repo_url": "https://github.com/12vectors/bench", "issues_url": "https://github.com/12vectors/bench/issues", @@ -15,10 +15,10 @@ "pages": [ { "path": "/", - "title": "bench — a live kanban for coding-agent work", + "title": "bench — run a team of coding agents, stay in control", "layout": "home", "section": null, - "description": "Task files in stage directories are the only source of truth. A stdlib-only board narrates what happens to them — agents working in git worktrees, PRs opening on review, CI on the cards — and never merges anything itself.", + "description": "Your agents ship faster than you can keep track. Every task is a card, every agent gets its own worktree, every change waits as a PR. Nothing merges without you.", "source": null }, { diff --git a/site/static/site.css b/site/static/site.css index 05a1e6d..c24f36f 100644 --- a/site/static/site.css +++ b/site/static/site.css @@ -114,6 +114,10 @@ a:hover{color:var(--text);text-decoration:underline} .footer-mark{margin:0;font:9.5px/1.25 var(--mono);color:var(--muted)} .footer-id{display:flex;flex-direction:column;gap:4px} .footer-name{font:600 15px/1 var(--display);color:var(--canvas)} +/* The line that used to be the h1. It says what bench is about in the + register the product speaks in; the h1 above now says what it does + for you. */ +.footer-line{font-size:var(--t-ui);color:var(--ink-muted)} .footer-id .mono,.footer-repo{font-size:11px} .footer-repo{color:#a9c4c9} @@ -301,6 +305,29 @@ a:hover{color:var(--text);text-decoration:underline} .t-muted{color:var(--ink-muted)} .t-dim{color:var(--ink-dim)} +/* The three sentences between the hero and the doors. Quiet on purpose: + no cards, no borders, no colour — the doors below are the page's one + grid of boxes, and repeating that shape here would make the reader + look twice at the same thing. The said-out-loud line takes the + display face; its answer is body copy. */ +.snags{padding:8px 44px 30px} +.snags-title{ + margin:0 0 20px;font:600 var(--t-h2)/1.3 var(--display); + letter-spacing:-.01em;color:var(--text); +} +.snag-list{ + display:grid;grid-template-columns:repeat(3,1fr);gap:22px; +} +.snag{display:flex;flex-direction:column;gap:6px} +.snag-said{ + font:600 var(--t-h3)/1.4 var(--display);color:var(--text); + text-wrap:pretty; +} +.snag-answer{ + font-size:var(--t-ui);line-height:1.6;color:var(--muted); + text-wrap:pretty; +} + /* Every door is a link to a page this site builds — the whole card is the target, so the hover is the card's border rather than an underline under three words of it. */ @@ -416,6 +443,8 @@ a:hover{color:var(--text);text-decoration:underline} .menu-contents{display:block} .hero{grid-template-columns:minmax(0,1fr);gap:28px;padding:32px 24px} .doors{grid-template-columns:repeat(2,minmax(0,1fr));padding:0 24px 28px} + .snags{padding:8px 24px 26px} + .snag-list{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px} .strip{padding:18px 24px} /* Only a code block or a table may scroll sideways, so a token that @@ -460,6 +489,7 @@ a:hover{color:var(--text);text-decoration:underline} .menu{display:block} .page-article .prose{padding:24px 20px 36px} .doors{grid-template-columns:minmax(0,1fr)} + .snag-list{grid-template-columns:minmax(0,1fr);gap:18px} .masthead{padding:12px 18px;gap:12px;flex-wrap:wrap} .crumbs{flex-wrap:wrap} .footer{flex-wrap:wrap;gap:16px 20px;padding:20px 18px} @@ -500,6 +530,7 @@ a:hover{color:var(--text);text-decoration:underline} .hero-actions{gap:8px} .hero-actions .button{width:100%} .doors{padding:0 16px 24px} + .snags{padding:8px 16px 22px} .strip{padding:16px} .page-article .prose{padding:20px 16px 32px} .menu-summary{padding:9px 14px} diff --git a/site/templates/article.html b/site/templates/article.html index 24d45db..43ce0d7 100644 --- a/site/templates/article.html +++ b/site/templates/article.html @@ -114,6 +114,7 @@ $toc || || diff --git a/site/templates/home.html b/site/templates/home.html index aaea0c0..6451630 100644 --- a/site/templates/home.html +++ b/site/templates/home.html @@ -65,13 +65,14 @@ $nav
Documentation -

Put the agents
on the bench.

-

Task files in stage directories are the only source of - truth. A stdlib-only board narrates what happens to them — agents - working in git worktrees, PRs opening on review, CI on the cards — - and never merges anything itself.

+

Run a team of coding agents.
Stay in control.

+

Your agents can ship faster than you can keep track. + bench turns your repo into mission control: every task is a card, + every agent works in its own isolated worktree, every change waits + as a PR for your review. You see everything. Nothing merges + without you.

no account, no service, no database. it is @@ -105,51 +106,78 @@ Task board for ~/your-repo/.task-manager/tasks
+ +
+

You've got agents. Now you've got a coordination problem.

+
+
+ “Which tab was that in?” + Every agent's task, branch and status on one + board — not scattered across chat sessions that forget everything. +
+
+ “They keep stepping on each other.” + Each agent works in its own git worktree. + Parallel work, zero collisions. +
+
+ “Did something just merge?” + Never. bench opens PRs and puts CI on the + card — the merge button is yours alone. +
+
+
+
01 - Install and first run - Untar it into .task-manager/, - run start.sh, answer three questions. - Port 26071, pinned. + Running in two minutes + Drop it into any repo, run one script, open the + board. No account, no config sprawl — it untars into + .task-manager/ and serves on port 26071. 02 - The five stages - backlog → to-do → in-progress → review → done. - The directory a file sits in is its status. + Always know what every agent is doing + Backlog to done at a glance. The board cannot + drift from reality, because tasks are files in your repo: the + directory a card sits in is its status. 03 - Agents on the board - ▸ start work makes a worktree and a branch, runs - the agent headless, and moves the card when it exits. + Parallel agents, zero collisions + Every agent gets its own git worktree and branch. + Run five at once without them overwriting each other. 04 - PRs & review - A card entering review gets a PR opened for it. - Then ◔ review PR, ⚑ copilot, ↻ act on PR — until it settles. + Nothing ships without you + Finished work arrives as a PR with CI status on + the card. bench never merges — you stay the gate, without being the + bottleneck. 05 - Team mode - BOARD_SYNC=1 makes - origin/main the truth. Moves commit and push themselves; boards pull - on a beat. + One board for the whole team + Synced through git itself + (BOARD_SYNC=1) — no shared server, no + per-seat billing, no “who updated the ticket?” 06 - The three-layer law - Core knows tasks, worktrees, PRs and events. - Drivers know apps, adapters know vendors, local/ knows your - project. + Swap agents without rewiring + Vendors are adapters. Change your coding agent, + or run several, without changing your workflow.
- +
Version $version @@ -168,6 +196,7 @@ Task board for ~/your-repo/.task-manager/tasks || || diff --git a/site/templates/notfound.html b/site/templates/notfound.html index 3fcc623..9da19cb 100644 --- a/site/templates/notfound.html +++ b/site/templates/notfound.html @@ -66,6 +66,7 @@ $nav || ||