atproto utils for zig zat.dev
atproto sdk zig

zat publishes its own docs to ATProto#

zat uses itself to publish these docs as site.standard.document records. here's how.

the idea#

i'm working on search for leaflet and more generally, search for standard.site records. many are currently thinking about how to facilitate better idea sharing on atproto right now.

this is me doing a rep of shipping a "standard.site", so i know what i'll be searching through, and to better understand why blogging platforms choose their schema extensions etc for i start indexing/searching their record types.

what we built#

a zig script (scripts/publish-docs.zig) that:

  1. authenticates with the PDS via com.atproto.server.createSession
  2. creates a site.standard.publication record
  3. publishes each doc as a site.standard.document pointing to that publication
  4. uses deterministic TIDs so records get the same rkey every time (idempotent updates)

the mechanics#

TIDs#

timestamp identifiers. base32-sortable. we use a fixed base timestamp with incrementing clock_id so each doc gets a stable rkey:

const pub_tid = zat.Tid.fromTimestamp(1704067200000000, 0);  // publication
const doc_tid = zat.Tid.fromTimestamp(1704067200000000, i + 1);  // docs get 1, 2, 3...

CI#

.tangled/workflows/publish-docs.yml triggers on v* tags. tag a release, docs publish automatically.

putRecord with the same rkey overwrites, so the CI job overwrites standard.site records when you cut a tag.