The sidebar and the homepage disagreed. index.md's "Where to start" already led with connecting an agent, but the left rail read Install (brew) -> Quickstart (bdrive login, bdrive init) -> ... -> Connect an agent, three groups down. Anyone following the rail met the CLI first and the skill last — the opposite of how the product is meant to be adopted. The agent page was also filed under guides/, which this repo defines as agent-workflow docs rather than setup. Sidebar order is now the recommended path, and that path is agent-first: Start here what it is -> set up with your agent -> your first hour Working with agents shared memory, artifacts, read heat, scoping Manual setup (opt) install the CLI, set up by hand, skills and hooks Self-hosting / Reference / Concepts unchanged - start/setup (was guides/connect-an-agent): rewritten as the front door. Claude Code's plugin, then the one-paste for Codex/Gemini/Hermes, then what the agent just installed and how to check it. - start/first-hour (new): the page that was missing — ask for a doc, get a link back, share it, a teammate's agent picks it up. What success looks like without a command you have to type. - manual/skills-and-hooks (new): the mechanics lifted out of the old onboarding page — per-platform paths, hook events, idempotency, project-level vs per-user — so the Start page can stay conversational. - manual/install and manual/setup-by-hand (were start/*): both now open by saying you probably don't need them, and link back to the agent path. - index.md leads with "You don't install it — you ask your agent to"; the CLI and hub sentence moves below it. No `brew install` appears anywhere in Start here. Reference -> CLI stays exactly where it was: the people most likely to self-host are CLI-first, and burying it would read as condescending. Three public URLs moved, so astro.config.mjs declares redirects. Static builds emit meta-refresh only, so README carries copy-paste 301 rules for the host — Firebase Hosting and a Cloud Storage + load balancer URL map. Verified: 18 pages build, zero broken internal links across the built output, all three redirects resolve. CLAUDE.md and the docs README record the rule so this doesn't quietly revert. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
docs.beardrive.ai
The public product documentation: CLI, sync model, self-hosting. Astro + Starlight, static output, Pagefind search.
npm install
npm run dev # http://localhost:4321
npm run build # -> dist/
npm run preview
Why this is a standalone site
Unlike the hub frontend (internal/webapp/static) and the cloud landing page
(cloud/internal/landing/dist), this is not embedded into a Go binary:
- Docs change far more often than the binary. Embedding them would mean a Go rebuild and redeploy to fix a typo.
- A Pagefind search index has no business shipping inside every self-hoster's install.
It lives in the OSS repo because that is what it documents. "Edit this page" resolves to something an outside contributor can open a PR against.
Design tokens
scripts/tokens.mjs reads the @theme block in
internal/webapp/frontend/src/tw.css — the source of truth for the BearDrive
palette — and emits src/styles/tokens.gen.css. That file is generated,
gitignored, and regenerated by npm run dev and npm run build, so the palette
cannot drift. src/styles/custom.css maps Starlight's --sl-color-* variables
onto it and invents no colors of its own.
(The cloud landing page can't do this — it sits in a different Go module and
keeps a copy of the tokens, policed by its own check-tokens.mjs.)
Adding a page
Drop a .md file under src/content/docs/<section>/ with title and
description frontmatter, then add its slug to the sidebar in
astro.config.mjs. Sidebar order is explicit, not alphabetical.
Write description for every page: it is the meta description, the search
result snippet, and what llms.txt shows.
llms.txt
starlight-llms-txt generates /llms.txt, /llms-small.txt, and
/llms-full.txt at build time.
Convention puts llms.txt at the root domain, not a docs subdomain — so
beardrive.ai/llms.txt should redirect or proxy to docs.beardrive.ai/llms.txt.
That redirect lives in the cloud landing page and is the one cross-repo
coordination point this split introduces.
Structure
The sidebar order in astro.config.mjs is the recommended path, and the
recommended path is agent-first:
- Start here — what it is, set up with your agent, first hour. No
brew installappears in this group. - Working with agents — the workflows the product exists for.
- Manual setup (optional) — the CLI route: install, set up by hand, skills and hooks in detail. Same destination, more steps; one click away, never on the critical path.
- Self-hosting, Reference, Concepts — unchanged in intent.
Keep new onboarding content out of Manual. If a page teaches someone how to get started, it belongs in Start here and should say what to ask an agent, not what to type.
Deploying
Static output in dist/. Any static host works; build command npm run build,
output directory dist, project root web/docs.
Redirects
The docs were reorganized around the agent-first path, so three old URLs moved:
| Old | New |
|---|---|
/start/install |
/manual/install/ |
/start/quickstart |
/manual/setup-by-hand/ |
/guides/connect-an-agent |
/start/setup/ |
astro.config.mjs declares these, which in a static build emits meta-refresh
pages — fine for humans, weak for search engines. Real 301s belong in the host.
Firebase Hosting (simplest static option on GCP — CDN, TLS, and custom domains included):
{
"hosting": {
"public": "dist",
"ignore": ["firebase.json", "**/.*"],
"redirects": [
{ "source": "/start/install", "destination": "/manual/install/", "type": 301 },
{ "source": "/start/quickstart", "destination": "/manual/setup-by-hand/", "type": 301 },
{ "source": "/guides/connect-an-agent", "destination": "/start/setup/", "type": 301 }
]
}
}
Cloud Storage behind an external Application Load Balancer: put the rules in the URL map, which redirects before the bucket is ever reached.
gcloud compute url-maps edit docs-url-map # pathMatchers[].pathRules[]:
# - paths: ["/start/install"]
# urlRedirect:
# pathRedirect: "/manual/install/"
# redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
# stripQuery: false
Whichever host wins, keep the Astro redirects block as well: it is the
portable fallback, and it keeps local npm run preview honest.
Note that the build reads a file outside web/docs (the token source), so
the host must check out the whole repository rather than just this
subdirectory.