- TypeScript 94%
- CSS 6%
- JavaScript <1%
- Docker <1%
- Shell <1%
publishing #
A site for reading very-long-form ebooks published to the AT Protocol, built on the standard.site lexicons.
Lexicon design #
See DESIGN.md for the design constraints and the
standard.site mapping: book = publication carrying our page.cavu.book
extension object (spine), series = publication, content chunks =
documents with page.cavu.content blocks (text) or page.cavu.pages
image pages (comics), TOC = a block in the frontmatter document.
NSID authority:
page.cavu.*= cavu.page ("Cavu Books"). Before publishing the lexicons to the network, point_lexicon.cavu.pageTXT at the DID that owns them.
Layout #
lexicons/— lexicon schemas, path mirrors the NSID.site.standard.*andcom.atproto.*are fetched from the network (treat as vendored, read-only);page/cavu/are ours.src/lexicons/— TypeScript client generated by@atproto/lex-cli. Do not edit; regenerate instead.scripts/— tooling (see below).
Tooling #
Requires Node 24 (nvm use) and pnpm.
pnpm fetch-lexicon <nsid>...— resolve published lexicons from the network via DNS (_lexicon.<authority>TXT → DID → PDS →com.atproto.lexicon.schemarecord) and vendor them intolexicons/, following refs recursively.pnpm codegen— regeneratesrc/lexicons/from the lexicon roots listed inscripts/codegen.ts, following refs and fetching anything missing from the network.pnpm typecheck— TypeScript 7 (native)tsc --noEmit.pnpm smoke— validates an example book record against the compiled lexicon schemas.
Note: site.standard.authSocial / authFull are OAuth permission-set
lexicons; lex-cli can't codegen them and nothing refs them, so they're
vendored but excluded from codegen (they fall out naturally since codegen is
ref-driven).