The Cavu Reader

Files
README.md

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.page TXT at the DID that owns them.

Layout #

  • lexicons/ — lexicon schemas, path mirrors the NSID. site.standard.* and com.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.schema record) and vendor them into lexicons/, following refs recursively.
  • pnpm codegen — regenerate src/lexicons/ from the lexicon roots listed in scripts/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).