Skip to content

site: rebuild the landing page, add docs/compare/blog, move to burrow.computer - #357

Merged
caezium merged 17 commits into
mainfrom
site/landing-redesign
Aug 7, 2026
Merged

site: rebuild the landing page, add docs/compare/blog, move to burrow.computer#357
caezium merged 17 commits into
mainfrom
site/landing-redesign

Conversation

@caezium

@caezium caezium commented Aug 7, 2026

Copy link
Copy Markdown
Owner

Rebuilds the marketing site and moves it to its own domain.

Pages

  • Landing page rebuilt around the real product surface: fourteen tools plus History and the MCP server, not the stale "five tools" claim.
  • New 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), and blog/ with ten posts.
  • Roadmap gains the feature-shaped work that is safe to publish; nothing security-labelled.

Domain

  • SITE moves to burrow.computer, flowing through canonicals, og:url, sitemap, JSON-LD ids, and the README roadmap block.
  • worker/index.js 301s burrow.henryzh.dev and www path-for-path so inbound links keep their value.
  • analytics.js accepted only the old hostname and would have gone silent on the move; it now allows both.

Shared chrome

  • One render_nav() and one docs/assets/chrome.css for the top bar, buttons, and footer, so the pages cannot drift apart again. Same for the platform picker via render_platforms().

SEO/GEO

  • FAQPage schema generated from the questions actually on the page, SoftwareApplication on the product pages, Organization + WebSite everywhere, sitemap lastmod, robots.txt generated from SITE.
  • PostHog event map rewritten: it had gone stale and most download buttons fired nothing.

Counts refresh with python3 scripts/site-release.py --stats. --check stays green without network.

caezium added 17 commits August 6, 2026 23:23
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
caezium force-pushed the site/landing-redesign branch from c95f771 to cfb2aa2 Compare August 7, 2026 17:41
@caezium
caezium merged commit b909163 into main Aug 7, 2026
4 checks passed
@caezium
caezium deleted the site/landing-redesign branch August 7, 2026 17:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant