From 85fb3d44aebcafbdecf1727ab7f607d47afdafa7 Mon Sep 17 00:00:00 2001 From: Bharath Mohan <2254476+bharathm03@users.noreply.github.com> Date: Thu, 3 Sep 2026 12:19:47 +0530 Subject: [PATCH 1/4] Site: draw the mockup's window chrome for the reader's own OS The shared AppWindow bar only ever drew the Windows caption block, but the app does not: paintsWindowControls is Windows-only, and macOS keeps the real NSWindow traffic lights on the left with a title-bar inset reserved for them. A mac reader was being shown a window they will never see. Both spellings now ship in the markup and a data-os attribute, set pre-paint by an inline script in the head, reveals one. Apple UAs (macOS, iOS, iPadOS in desktop mode) get the traffic lights; everything else, including Android and any no-JS render such as the OG screenshot, keeps the Windows controls. --- site/src/components/shell/AppWindow.astro | 29 +++++++++++++++++------ site/src/layouts/Base.astro | 20 ++++++++++++++++ site/src/styles/global.css | 18 ++++++++++++++ 3 files changed, 60 insertions(+), 7 deletions(-) diff --git a/site/src/components/shell/AppWindow.astro b/site/src/components/shell/AppWindow.astro index c82a3d4f..3f79ae04 100644 --- a/site/src/components/shell/AppWindow.astro +++ b/site/src/components/shell/AppWindow.astro @@ -6,14 +6,20 @@ import Mark from "../ui/Mark.astro"; // their own frame. Two spellings of the frame is how two scenes end up reading // as two different products. // -// This bar is the app's own, not a generic window: Antgrid draws its own title -// bar (no OS one exists), so the mac traffic lights this used to carry were a -// stock "screenshot" signal for a product that has never looked like that. The -// order below — mark, sidebar toggle, history, centred session search, the -// Remote pill, the panel toggle, then hand-drawn window controls — is the order -// the app ships. Changing it here without changing it there sells a window the +// This bar is the app's own, not a generic window: Antgrid hides the OS title +// bar and draws its own. The order below — mark, sidebar toggle, history, +// centred session search, the Remote pill, the panel toggle — is the order the +// app ships. Changing it here without changing it there sells a window the // reader will not find. // +// What flanks that row is the one part that is NOT the same everywhere, so both +// spellings ship and `data-os` (set in Base.astro) picks one: Windows paints its +// own minus/square/x at the right, macOS keeps the real NSWindow traffic lights +// at the left and paints nothing at the right. That is not a stylistic choice +// here — it mirrors `paintsWindowControls` in app/lib/window/ +// window_capabilities.dart, and a reader on either OS should recognise the +// window they are about to download. +// // Everything inside a scene is painted from the `ab-` tokens (global.css), // which mirror app/lib/design/ab_colors.dart. A scene that reaches for // --color-panel or --color-chrome has quietly turned the window back into a @@ -33,6 +39,15 @@ const { panes = 2, remote = true, class: cls = "" } = Astro.props; so it is hidden from assistive tech rather than announced as a toolbar of dead buttons. The scenes below it carry the readable content. */} -

- {/* inline-block per sentence, here and in the headline below, so a line can - only ever break BETWEEN sentences. Both are short-sentence copy at large - type, where the default wrap strands a two-word tail ("stuck since 2am.", - "machine.") on its own line at some widths and not others. A hard
- fixes the one width you tested and makes narrow viewports worse. */} - - Claude Code on your laptop, Codex on your workstation, another on a cloud box.{" "} - One's been stuck since 2am. - - {/* This deliberately takes the overview claim BACK from Fleet.astro, which - was handed it while the headline carried the evidence gate. The gate is - not entitled to a headline: Handler is opt-in and it is on Pro, so "make - it prove it" was false on every free machine until someone armed it — - the one promise a stranger is asked to believe has to be true on a bare - install. This one is. Fleet.astro keeps the PROOF; the hero takes back - the CLAIM, and the ProofCard below still shows the gate doing its job. */} - - Your machines.{" "} - Your agents.{" "} - One control plane. - + {/* inline-block per sentence so a line can only ever break BETWEEN + sentences. This is short-sentence copy at display size, where the default + wrap strands a two-word tail ("machine.") on its own line at some widths + and not others. A hard
fixes the one width you tested and makes + narrow viewports worse. */} + {/* This deliberately takes the overview claim BACK from Fleet.astro, which + was handed it while the headline carried the evidence gate. The gate is + not entitled to a headline: Handler is opt-in and it is on Pro, so "make + it prove it" was false on every free machine until someone armed it — + the one promise a stranger is asked to believe has to be true on a bare + install. This one is. Fleet.astro keeps the PROOF; the hero takes back + the CLAIM, and the ProofCard below still shows the gate doing its job. */} +

+ Your machines.{" "} + Your agents.{" "} + One control plane.

{/* Argument left, action right. The two columns are sized to sit adjacent rather than pinned to the shell's edges — pushed apart, the buttons read as stranded rather than as a deliberate second column. */}
- {/* Two beats, and their order is the argument. The first is true on a free - install with nothing configured, which is what earns it the space next - to the headline. The second names the paid feature with a VERB — you arm - it — because a reader who takes the gate for a default will find it - missing and conclude we lied. It links rather than explains: Phases.astro - is two sections down and makes the whole case there. */} + {/* Two beats, and their order is the argument. The first opens on the + reader's own week before it claims anything, which is what lets a + stranger agree before being sold to; it closes on ownership because + this is the only place the site says the agents run on your accounts, + not ours. It resolves in different words than the headline on purpose + — "control everything from one app" there would be the h1 restated in + a weaker voice. The second names the paid feature with a VERB — you + arm it — because a reader who takes the gate for a default will find + it missing and conclude we lied. It links rather than explains: + Phases.astro is two sections down and makes the whole case there. */} + {/* No inline-block on the sentences here, unlike the headline: at lede + size in a 35rem column they run three lines anyway, and forbidding a + mid-sentence break only strands a short second line. */} {/* One grid child, not two paragraphs: the grid has exactly two columns and a loose second

becomes a third item, which pushes the CTA column out of row one and strands the buttons under the copy. */}

- Every agent you're running, on every machine you own — your repos, your branches, your existing subscriptions. Nothing rented from us, nothing to provision. + Claude Code on your laptop, Codex on your workstation, another on a cloud box. One's been stuck since 2am. All of them in one app — your repos, your subscriptions, nothing rented from us.

Arm Handler when you want a phase held until the evidence is there. From 9a10e5470884e83a511b0f9c498f08730f48a7f5 Mon Sep 17 00:00:00 2001 From: Bharath Mohan <2254476+bharathm03@users.noreply.github.com> Date: Thu, 3 Sep 2026 19:28:36 +0530 Subject: [PATCH 3/4] Site: OS-matched download flow, per-platform confirmation page, nav rework The hero and closing band now offer Windows/macOS/Linux download buttons that reveal the reader's own build via data-os (Base.astro's OS sniff now also detects Linux), all routed through a new /download/started confirmation page that fires the actual artifact download and orients the reader (setup guide, star-the-repo ask), keyed on the ?platform= it was asked for rather than the visitor's own OS. get-started.astro gained anchor ids so the confirmation page's step cards land on the right instruction; the sitemap excludes both og-card and download/started since neither is meant to be indexed. Nav: dropped Sign in and Features (both stay reachable from the footer), renamed the CTA from Start free to Download free (the free plan's pricing-card CTA deliberately keeps Start free), added Escape-to-close and current-page indication, and unified the desktop/mobile item lists into one array. Footer gained the mark+wordmark lockup (previously wordmark-only) and a bare GitHub link. Eyebrow labels dropped their accent rule for a neutral terminal-cursor mark that blinks once on arrival. Tests updated to match; get-started.spec.ts's coverage folded into contracts.spec.ts. --- site/astro.config.mjs | 8 +- site/src/components/Footer.astro | 20 +- site/src/components/Nav.astro | 114 ++++++++-- site/src/components/sections/ClosingCta.astro | 61 +++--- site/src/components/sections/Compat.astro | 2 +- site/src/components/sections/CrossAgent.astro | 43 ++-- site/src/components/sections/Hero.astro | 30 ++- site/src/components/ui/Eyebrow.astro | 28 ++- site/src/config.ts | 29 +++ site/src/layouts/Base.astro | 39 +++- site/src/layouts/Legal.astro | 9 + site/src/pages/download/started.astro | 205 ++++++++++++++++++ site/src/pages/get-started.astro | 22 +- site/src/styles/global.css | 67 +++++- site/tests/contracts.spec.ts | 195 ++++++++++++----- site/tests/get-started.spec.ts | 18 -- site/tests/home.spec.ts | 78 +------ site/tests/nav.spec.ts | 59 ++++- site/tests/pricing.spec.ts | 96 +++----- site/tests/security.spec.ts | 31 +-- 20 files changed, 826 insertions(+), 328 deletions(-) create mode 100644 site/src/pages/download/started.astro delete mode 100644 site/tests/get-started.spec.ts diff --git a/site/astro.config.mjs b/site/astro.config.mjs index 39dd662d..6f8d1373 100644 --- a/site/astro.config.mjs +++ b/site/astro.config.mjs @@ -100,6 +100,12 @@ export default defineConfig({ ], }, }), - sitemap({ filter: (page) => !page.includes("/og-card") }), + // Both exclusions are pages that carry robots=noindex, and a sitemap that + // submits a noindex URL is a conflict Search Console reports rather than + // ignores. og-card is the screenshot source for the social card; + // download/started only means anything with a ?platform= the sitemap + // cannot carry, so an indexed copy would rank as a thank-you for a + // download the visitor never started. + sitemap({ filter: (page) => !page.includes("/og-card") && !page.includes("/download/started") }), ], }); diff --git a/site/src/components/Footer.astro b/site/src/components/Footer.astro index dfc5ce15..25df5a3b 100644 --- a/site/src/components/Footer.astro +++ b/site/src/components/Footer.astro @@ -1,13 +1,21 @@ --- import { Icon } from "astro-icon/components"; import { links } from "../config"; +import Mark from "./ui/Mark.astro"; import Wordmark from "./ui/Wordmark.astro"; ---