site: rebuild the landing page, add docs/compare/blog, move to burrow.computer - #357
Merged
Conversation
Ground-up rewrite of docs/index.html around a tighter structure: a floating pill nav, a centered hero (logo, headline, single CTA, install snippet with copy, meta line, framed product shot), a bordered tool grid covering all seven surfaces, an alternating screenshot run for the features worth seeing, a three-card trust row, a bordered install grid, and a sticky-aside FAQ. Keeps the house palette and type (charcoal + peach, Cal Sans headings, self-hosted Geist) and keeps the WN:BEGIN/WN:END contract intact, so scripts/site-release.py still owns the What's New block — verified with a regeneration that reports no change. Copy is tightened throughout. The upstream-engine disclaimer, the telemetry disclosure links, and the analytics hooks are preserved. Collapsed FAQ panels carry inert so they stay out of the tab order.
releases.html and roadmap.html render from SHARED_CSS/page_html in scripts/site-release.py, so they kept the old segmented topbar after the landing page moved to the floating pill. Restyle the shared scaffold to match: pill nav with centered links, a GitHub icon, an Apple-marked download button, and the same minimal footer with the engine attribution. Nav gains Tools and Install links back to the homepage so the subpages aren't a dead end. index.html is untouched — the What's New block regenerates clean.
Hero gains an 'Already downloaded N times' line between DL:BEGIN/DL:END, filled from the GitHub releases API by site-release.py --downloads. The refresh is opt-in rather than automatic so --check in CI never trips over a number that moves on its own, and the count is baked at release time instead of fetched from every visitor's browser — the page already self-hosts its fonts to avoid exactly that. Removes upstream engine attribution from the site: the hero disclaimer block, the footer fine print (landing page and generated scaffold), the CLI-comparison FAQ entry (replaced with what-does-it-delete), and the per-tool command labels, which become capability tags. Historical changelog entries in releases.json keep their meaning but refer to 'the engine' rather than naming it. Also fixes the hero version patcher, which was still matching the old brandline markup and silently doing nothing.
… and blog The page still claimed five tools and four MCP tools. The app ships fourteen tools plus History and an MCP server with twenty-six tools, so the grid is rebuilt from Tool.swift with each surface's real jewel colour and a capability tag in place of a command name. Hero: new headline and subhead, the eyebrow pill and signing claim removed, the icon is now the bare mark on a shadow rather than a card, and the type scale comes down a step. Download buttons point at a new install page instead of the GitHub releases redirect. The download line reads 'Already downloaded by N people'. New pages, all generated from JSON through the shared scaffold: install.html Homebrew, direct download, Windows preview, from source compare.html feature matrix against the four tools Burrow overlaps blog/ 10 posts on the disk, performance, and agent queries sitemap.xml plus robots.txt, and Article/Blog JSON-LD per page page_html gains a base-path argument so pages can live in a subdirectory and still resolve fonts, icons, and nav links. GitHub stars now render in the top bar beside the mark, filled by the same --stats pass that refreshes the download count (renamed from --downloads). Both are baked at build time rather than fetched from the visitor's browser. Install cards drop the 'recommended' tag, and direct download is a link to the latest release rather than a copyable command. FAQ moves to the centered single-column accordion. Em dashes are gone from every page, the JSON sources, and the generator. Strategy for the blog is in plans/burrow-seo-geo-strategy-2026-08-07.md (BUR-93, BUR-13).
The top bar was hand-written in index.html and separately in the page scaffold, so only the landing page showed star counts and the two were drifting. render_nav() is now the single source: index.html carries NAV:BEGIN/NAV:END markers and every generated page calls the same function, so all seven pages get identical chrome including the star count. Generated pages also move to the landing page's 1080px width so the pill lines up site-wide. Counts move to docs/stats.json, read on every run and rewritten only by --stats. That makes every render deterministic, which is what let the star count reach the generated pages without breaking --check. Install page links straight at the release assets rather than bouncing through the releases page. URLs are pinned per release from the version in releases.json (verified 200 for both), with the zip size shown. The Windows card now names 0.10.0 explicitly, since the Windows build trails the Mac release and the last one shipped four versions ago. Hero: the app icon is back as itself, brown rounded square and all, at 112px with a drop shadow and no CSS card behind it. The subhead now says what kind of app this is before listing what it does. Dropped the 'real app on a real Mac' line above the screenshots.
The previous version was a four-cell method grid I wrote without looking at the reference. Rebuilt to match it: centered hero, a 'pick your platform' lede, three cards each with a glyph, platform name, file kind, and a full-width pill button wired straight to the release asset, then the download count and a line pointing at all releases. macOS and Windows download directly. Homebrew keeps its command as a click-to-copy pill in the same slot the other two use for their button. The Windows card carries a beta tag naming 0.10.0 so the version gap is visible rather than implied. Build-from-source drops to a one-line pointer at the README instead of taking a quarter of the page.
The wording was fixed in index.html but render_downloads() still emitted the old phrasing, so the next regeneration put it back. Fixed at the source; both pages now read the same.
The top bar markup was already shared through render_nav(), but the CSS for it existed twice, inline in index.html and again in SHARED_CSS, and the two had drifted: the generated copy was missing the .nav-stars rule and the gap on .nav-github entirely, so the star count rendered in the body font and jammed against the icon on every page except the landing page. docs/assets/chrome.css is now generated from a single constant and linked by every page. It owns the top bar, brand, nav, star count, buttons, and footer, with literal values so it does not depend on which page's token names are in scope. Both stylesheets drop their copies. Verified by screenshotting the bar on the landing page and a generated page: identical apart from the active-link highlight.
The landing page's install section was a bespoke three-cell grid while the install page had platform cards, so the two told different stories about how to get the app. render_platforms() now produces the cards once and both surfaces render it: the install page composes it directly, the landing page carries PICK:BEGIN/PICK:END markers. Card styles join the rest of the shared chrome in chrome.css. The landing section's trailing note stopped repeating what the Windows card already says and now points at the install page for checksums and older versions. Install page footer: main had 24px of bottom padding, so the footer crowded the last line. Bumped to 72px, and the scaffold now uses a flex column with min-height so short pages push the footer to the bottom of the viewport instead of leaving it mid-screen.
Adds docs.html, a single-page reference with a sticky contents rail, generated from docs/docs.json: what each of the fourteen tools touches, the four safety rules, the MCP surface split into read-only and gated, privacy, and troubleshooting. Nav and sitemap pick it up. Roadmap gains the feature-shaped work that is safe to publish: the single-interface redesign (building), uninstall resolution by cask token (planned), and deeper Analyze navigation and caching (considering). The security-labelled work stays off the public board until its fix ships. SEO and GEO: FAQPage schema generated from the eight questions actually on the page, SoftwareApplication on the landing, docs, compare, and install pages, canonical and og:site_name and twitter meta on every page, and an LCP preload for the hero icon. FAQPage is the highest-value item here because answer engines lift those pairs directly. Analytics: the event map had gone stale, so every button added since the rebuild fired nothing. Rewritten to cover all twelve keys, with the shared platform picker taking a placement argument so a download from the landing page is distinguishable from one on the install page. Verified no key in markup is unmapped.
Pinning the footer with a flex column on body had a side effect I missed: a flex item with an auto cross-axis margin stops stretching and becomes shrink-to-fit. Every .page element then sized itself to its own content instead of to the 1080px shell, so the hero sized to its headline while main sized to its widest table. Measured at 1440px, the hero box sat at 349 while main sat at 173 on docs, 219 on roadmap and changelog, and 268 on compare. Restoring width:100% on the direct children of body brings back the block-flow behaviour, so max-width and margin:auto centre them as before. All four pages now measure identically: containers at 173, content at 197, matching the top bar.
Domain. SITE and SITE_HOST now point at burrow.computer, which flows through every canonical, og:url, sitemap entry, JSON-LD id, and the README roadmap block. robots.txt is generated from SITE rather than hand-written so it cannot drift again, and it now explicitly welcomes GPTBot, ClaudeBot, and PerplexityBot, since being quotable by answer engines is the point of the blog. worker/index.js 301s burrow.henryzh.dev (and www) to burrow.computer path for path, so every inbound link the project has keeps its value. 301 rather than 302 is deliberate. The worker is otherwise a pass-through to static assets. Both hostnames stay attached as routes. Verified the redirect preserves deep paths including blog posts and sitemap.xml. analytics.js accepted only the old hostname, so it would have gone silent the moment the site moved. It now allows both during the transition. Top bar drew a hand-built SVG approximation of the mark instead of the app icon; it uses burrow-icon.png now, like the hero does. SEO: Organization plus WebSite schema on every page so the entity is declared rather than inferred, lastmod on every sitemap entry, and a breadcrumb helper ready for the blog. All JSON-LD validated as parseable.
The hero glow is positioned with a negative top inset so it fades in from above, but .hero had overflow:hidden, which sliced it flat at the hero's top edge. The result was a visible rectangle of lighter background starting exactly where the hero began. Measured as a 9.9 average-channel step at y=68 by sampling row means down the left gutter. Dropped the clip and constrained the pseudo-element to bleed upward only; the original -10% horizontal inset had been relying on that clip and pushed the document 143px wider than the viewport once it was gone. Also stopped fading gradients to the keyword, which interpolates through transparent black and greys the falloff. They now fade to the same hue at zero alpha. Verified: no average-channel step above 3 anywhere in the top 800px, and scrollWidth equals clientWidth.
Workflow name and comments still referenced the old host, and worker/ was not in the path filter, so a change to the redirect handler would not have triggered a deploy. Verified with a dry-run: 59 assets staged, the ASSETS binding resolves, and the worker compiles. Both CLOUDFLARE_API_TOKEN and POSTHOG_API_KEY are present as repo secrets, so a push to main is all the deploy needs.
…y plan NSHumanReadableCopyright in Info.plist and project.yml now carries only Burrow's own MIT notice. The upstream engine's LICENSE still ships inside Burrow.app: macos/scripts/bundle-engine.sh copies it alongside the binaries, so the notice continues to travel with the code it covers. Removes plans/mole-parity-prd-2026-06-25.md.
The interaction and markup assertions encoded the previous page: a pricing section that no longer exists, a nav button that pointed at GitHub rather than the install page, and install-card copy keys that the shared platform picker replaced. Updated to the keys the page actually carries and moved the harness hostname to burrow.computer. Every privacy assertion is untouched: cookieless mode, no person profiles, DNT, autocapture off, session recording off, URL query and fragment stripping, and the guard that an unmapped key captures nothing.
caezium
force-pushed
the
site/landing-redesign
branch
from
August 7, 2026 17:41
c95f771 to
cfb2aa2
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Rebuilds the marketing site and moves it to its own domain.
Pages
docs.html(single-page reference with sticky contents),compare.html(feature matrix against the four tools Burrow overlaps),install.html(platform picker linking straight at release assets), andblog/with ten posts.Domain
SITEmoves to burrow.computer, flowing through canonicals, og:url, sitemap, JSON-LD ids, and the README roadmap block.worker/index.js301s burrow.henryzh.dev and www path-for-path so inbound links keep their value.analytics.jsaccepted only the old hostname and would have gone silent on the move; it now allows both.Shared chrome
render_nav()and onedocs/assets/chrome.cssfor the top bar, buttons, and footer, so the pages cannot drift apart again. Same for the platform picker viarender_platforms().SEO/GEO
Counts refresh with
python3 scripts/site-release.py --stats.--checkstays green without network.