at.rolld.play
A single logged session of playing a board game. The high-volume event record. Reads ('times played', 'who played this game') are served by querying Constellation for backlinks to the 'target' URL — derived live, never stored.
Details · record, key tid
| Kind | record |
|---|---|
| Record key | tid |
| Authority | rolld.at |
| Indexed |
Record
record · key tidProperties
bskyPostRef
refStrong ref (uri + cid) to a companion app.bsky.feed.post, if the user chose to share this play on Bluesky. The post links back to the per-entry permalink (/@<handle>/play/<rkey>). Storing the ref also enables showing Bluesky replies as discussion on the entry later (the Leaflet POSSE pattern).
content
unionOptional rich note about how the play went. Open union (bring-your-own-content, like standard.site's content field) so the format can grow without a breaking change. v1 accepts markpub Markdown. Render via the $type; consumers that don't understand it fall back to textContent.
When this record was created.
durationMinutes
integerHow long the session actually took.
minimum: 0
expansions
arrayExpansions in play, by BGG id.
The game played, referenced by BGG id.
images
arrayOptional photos of the play (board, table, scores). Up to 4, matching Bluesky's per-post image limit so the same blobs can be embedded in a companion app.bsky.feed.post. Each blob lives in the user's PDS and is referenced here; the photo is part of the play (not a standalone record). Powers the per-game photo gallery via the existing plays-of-this-game Constellation query (filter plays that have images). See DECISIONS D-33.
maxLength: 4
location
stringFree text: whose house, which convention, which cafe.
maxLength: 500
When the play session occurred (may differ from createdAt if logged later).
players
arrayWho played. Each entry may carry an atproto DID (for real handles) and/or a plain display name.
Canonical per-game web URL (https://rolld.at/g/<bggId>) that Constellation indexes as a backlink target. FROZEN format, emitted from one shared helper shared by write and read paths. This is the linchpin of the serverless read model — backlinks to this URL ARE the play aggregation. No catalog segment: game identity is permanently BGG-keyed.
textContent
stringPlain-text rendering of `content`, always populated when `content` is present. The universal fallback for any consumer that can't render the content union's $type, and the field to index for search/previews. Same role as standard.site's textContent. No grapheme limit.
maxLength: 100000
winnerDids
arrayDIDs of winning players, if any were recorded as identities.
winnerNames
arrayNames of winners not represented by a DID.
maxLength: 320
Similar lexicons
semantic matchLexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.
-
Image dimensions in pixels (1:1 with app.bsky.embed.defs#aspectRatio shape).
-
ca.jmaingot.boardGamePlay
recordA single board game play
-
at.rolld.rating
recordThe user's grade for a game. Single overwritable record per game (BGG id in the record key); re-rating replaces it, no history kept in v1. Scale is 1-10 to align with BGG's community average you already hydrate.