Replaces the 🐻 emoji standing in for a logo everywhere. The mark is the letter B built from three rectangles — a rail and two blocks, the same shape as the product (a spine with volumes hanging off it). One fill, so `currentColor` themes it in the sidebar, the favicon, and flat ink. - Web app: <Mark> in shell.tsx replaces the emoji-in-a-gradient-tile badge; the mark takes the honey and the wordmark takes text colour, so the accent lands once. #vault-name sets in Jersey 10 at 18px — the face is condensed, so that measures like 13px of the UI face. - Auth pages (authlocal.go): server-rendered, so they had their own emoji logo. Same mark, inline. - Docs: bear.svg becomes the mark (fixed honey fill — Starlight renders the logo as <img>, which can't inherit currentColor), and .site-title sets in Jersey 10. Starlight tints that title with the accent by default, which put honey on white in light mode and failed contrast; it now takes --sl-color-white, matching the app. - Favicon: the mark, as a data URI. Jersey 10 is SIL OFL and self-hosted in both trees — Vite fingerprints the app's copy into static/assets/, the docs serve theirs from public/ — so no surface makes a third-party font request. Licence ships beside each file. It is deliberately not a design token: tw.css's @theme block is mirrored by the cloud landing's tokens.css and a drift check fails the build if they diverge, so the logo face lives in plain CSS. The cloud landing page carries the same mark and face (separate repo). 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.
Deploying
Static output in dist/. Any static host works; build command npm run build,
output directory dist, project root web/docs.
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.