Resolution Roulette

Lexicons

Resolution Roulette stores all game data in your AT Protocol Personal Data Server (PDS) using three custom record types, or lexicons. Because the records live in your PDS, you own them — you can read, export, or delete them with any AT Protocol client independently of this application.

me.gdey.resolutionroulette.entry

The game record

JSON ↗

One record per game. Holds the title, goal date, reveal hour, and the full list of candidates. Each candidate has a stable integer id that elimination and promotion records reference, plus an optional eliminatedOn timestamp that is set directly on the candidate when it is eliminated.

key — TID (assigned at creation)

required — resolutionDate, startDate, resolutions, createdAt

optional — title, announcePrefix, tagUsers, tags

me.gdey.resolutionroulette.elimination

Daily elimination record

JSON ↗

Written by the background worker once per day per active game. Contains a strong reference to the parent entry, the eliminated candidate's id and a snapshot of its text, and the calendar date (eliminationDate) for which it was eliminated. The text snapshot means the elimination record remains self-contained even if the entry is later edited.

key — TID (assigned at write time)

required — entryRef, eliminatedId, eliminatedText, eliminatedAt, eliminationDate

me.gdey.resolutionroulette.promotion

Winner record

JSON ↗

Written on the goal date when a winner is chosen. The record is created before the Bluesky post so that the promotion is durable even if the post fails. Once the app.bsky.feed.post succeeds, its AT URI is patched into the promotion record's optional postUri field.

key — TID (assigned at write time)

required — entryRef, promotedId, promotedText, promotedAt

optional — postUri (patched after post succeeds)

Raw JSON schemas are served at /lexicons/me/gdey/resolutionroulette/{name}.json and are compatible with standard AT Protocol tooling. See the AT Proto lexicon guide for more on how lexicons work.