page.cavu.progress

Reading progress for one book, written to the reader's own repo. One record per (reader, publication) by convention: clients list their own repo and update the existing record for a publication rather than create a second (the BookHive shelf pattern). The publication AT-URI makes records discoverable by backlink index (Microcosm/Constellation), so 'who is reading this book' needs no app-side database. Positions anchor documents by strongRef: the cid pins the chunk *as read*, so a later edit to an already-read chunk is detectable by cid drift and clients can flag it. Where the reader's PDS implements atproto permissioned data (proposal 0016), clients write these records into the reader's personal space instead — at://<did>/space/page.cavu.personal/self, an owner-only (empty member list) space anchored on the reader's own DID so their PDS is also the space host — and migrate any public record there on first read (merge, rewrite into the space, delete the public copy). Space records are invisible to backlink indexes, so private progress deliberately drops out of 'who is reading this book'. On any other PDS the record is a public repo record and clients must disclose at sign-in that reading positions are saved to the reader's own repo.

Repository @cavu.page did:plc:citulkqjdzbnf7wd5xb6lled namespace authority
Details · record, key tid
Kindrecord
Record keytid
Authoritycavu.page
Indexed

Record

record · key tid

Properties

Spine documents read to completion, each pinned at the cid it had when finished. A finished entry whose cid no longer matches the live record marks a chunk that changed after the reader read it; re-reading a changed chunk to completion replaces its entry with the new cid.

itemsref

finishedAt

string · datetime

When the reader finished the book. Presence marks the book finished regardless of percent.

Furthest position ever reached, when it differs from position (re-reading, or a device syncing an older current position). Clients max-merge by spine order: position is last-writer-wins, furthest never regresses.

Reference

percent

integer

Denormalized whole-book completion percent at `position`, weighted over body-matter chapters, computed by the writing client (which has the book loaded). Lets list views render progress bars from this record plus the publication record alone. A serial's denominator grows with each release, so display against the live spine when possible.

  • minimum: 0
  • maximum: 100

position

requiredref

Where the reader currently is — the resume point.

Reference

publication

requiredstring · at-uri

AT-URI of the book's site.standard.publication record — the backlink target.

startedAt

string · datetime

When the reader started the book.

updatedAt

requiredstring · datetime

When this record was last written. Doubles as last-read-at for surfacing recently read books.

#position

object

A place in a book: the spine document (pinned at its as-seen cid) plus how far through it the reader is. Fractional depth in thousandths keeps the grammar integer-only and is deliberately edit-tolerant — after an in-place edit it lands near the old spot and clamps, and the strongRef cid tells clients the ground shifted.

Properties

document

requiredref

Spine document the reader is in, at the cid last seen by this client.

How far through the document the reader is, in thousandths (0 = top, 1000 = end). Omit when unknown; clients treat absence as the top of the document.

  • minimum: 0
  • maximum: 1000

Similar lexicons

semantic match

Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.

  • A reader's reading of a book BookHive's catalogue doesn't hold, or can't be matched to for certain: the home of last resort, so any book can be added to a library and reviewed. One per book. Status, dates, rating, review and progress live here as they do on a buzz.bookhive.book; the book is named in every key anyone uses, so any app that recognises one of them can show the reading. When BookHive's catalogue has the book, Resenha moves the reading there: it writes a buzz.bookhive.book with everyt

  • social.dracome.library.state

    record not from the namespace authority

    A reading-state record for one edition per actor. Duplicate convention: the rkey is a TID minted once at first create and never changes. Several records may exist for one actor and edition (for example from out-of-band writers); consumers SHOULD treat the record with the greatest `updatedAt` (falling back to `createdAt`) as the winner and break ties by the lowest TID, ignoring the others. This is a convention, not an enforced contract: AppViews MUST tolerate a differing winner, and may see a rec

  • A reading status change event for a book. Records are append-only and timestamped — each status transition creates a new record rather than mutating an existing one. The current status of a book is derived by taking the most recent status record (by createdAt) referencing that book.

  • Where the reader stands with a Work. One per Work: the record key is the Work's Catalog identifier. Exists with or without a Copy. No record means unread.

  • Book extension object, embedded in a site.standard.publication record as a pass-through `book` property (the Leaflet `theme` pattern). Its presence marks the publication as a book; series publications omit it. The publication's standard fields remain the fallback identity (name = title, description = blurb, icon = square mark).