At this level
page.corvus · 14- page.corvus.backchannelFrame defs Wire format for messages a client sends server-bound over the same WebSocket opened by `page.corvus.subscribeOps`. Atproto's `subscription` lexicon type is server-push only — every server→client frame is defined under `page.corvus.subscribeOps`. The client→server side of the duplex socket is described here as a separate frame union. Clients dispatch on each message's `$type` discriminator (e.g. `page.corvus.backchannelFrame#op`). **Multi-block.** A single WebSocket connection authenticates one
- page.corvus.block record A block
- page.corvus.contentBlocks defs Content block variants — atomic content types that compose into documents and database cells. Each sub-def is a block content shape selected by `page.corvus.block.blockType`.
- page.corvus.core defs Shared primitives used across the corvus lexicons: id types (`#opId`, `#atomId`), the generic value primitives the applier materializes scalar / counter / set / sequence fields into (`#register`, `#counter`, `#orSet`, `#seq`), and the supporting types for `#seq` (`#run`, `#tombstone`). The `#block` def captures the envelope shape every variant in `page.corvus.block` inlines (`id`, `parent`, `afterSibling`); `#children` is a sentinel referenced by `editableAs` on ordered-children fields. Variants
- page.corvus.database object A database block
- page.corvus.document object A collection of text formatting document blocks
- page.corvus.drawing object A drawing block — a vector image composed of shapes that render onto an HTML canvas 2D context. The drawing's `shapes` sequence holds shape block ids in z-order (later = on top). Each shape variant below is its own block. Coordinates are integer pixels; an editor that needs sub-pixel precision can scale its working coord space.
- page.corvus.facets object A facet, facets are features that apply to a range of text, they're immutable. So changing a facet requires dropping the old facet and inserting a new one.
- page.corvus.getBlock query Fetch materialized snapshots of an explicit set of blocks plus the `cursor` at the time of the snapshot. Bootstrap path for clients that don't want to replay history from scratch. **Explicit set, no descent.** The server returns one snapshot per requested `blockId`. It does NOT walk children, references, or any other graph relation — the caller decides which blocks to materialize. To render a tree, the caller fetches a root, reads child block-ids out of its data, then issues a follow-up `getBlo
- page.corvus.getOps query Paginated forward read of an op log scoped to an explicit block set. Pull-based alternative to opening a `page.corvus.subscribeOps` WebSocket at `cursor: 0` — same op shape, same cursor semantics, just delivered as a query page instead of a live tail. Each entry is a `page.corvus.subscribeOps#op` so live and historical paths feed the same applier. Like `subscribeOps`, this query does NOT walk graph relations. Callers fetch ops for the blocks they care about and follow refs explicitly with subse
- page.corvus.project record A project is a root document block with a list of collaborators
- page.corvus.publishOps procedure HTTP alternative to streaming `page.corvus.backchannelFrame#op` frames over a `page.corvus.subscribeOps` WebSocket. Each entry is a `page.corvus.backchannelFrame#op` and is validated, ingested, and broadcast by the same code the backchannel uses, so the wire shape and semantics are identical. No response body — the server-assigned cursor is observed via `page.corvus.subscribeOps#op` echo, same as the backchannel. Ops are processed in order; the procedure stops at the first validation failure (op
- page.corvus.subscribeOps subscription Subscribe to CRDT op streams from a corvus server over a single WebSocket connection. **Connection-scoped, multi-block**: one connection authenticates one DID and may carry subscriptions to many block sets. Subscribes and unsubscribes happen mid-connection via `page.corvus.backchannelFrame#subscribe` / `#unsubscribe` — the upgrade itself takes no parameters and starts with no active subscriptions. **Subscriptions name an explicit block set.** A subscribe frame carries the `blockIds` the client
- page.corvus.view defs View block variants — visualizations rendered over a database or SQL query (`page.corvus.database`). Each sub-def is a view shape selected by `page.corvus.block.blockType`.