Creating Bluesky starter packs from code: three AT Protocol records and one non-idempotency trap
Bluesky starter packs look like a single thing in the app — a shareable page that lets a new user follow a curated group in one tap. At the protocol level they are three separate records glued together by references, and if you create them from code (we do, as part of an automated outreach pipeline), the decomposition matters: it decides what you can update later, what you can only create once,…
Bluesky starter packs are a shareable page that allows new users to follow a curated group with a single tap. At the protocol level, they consist of three separate records connected by references, which must be created from code as part of an automated outreach pipeline. The three records include a list, memberships, and the pack itself.
The list record holds metadata like name, purpose, and createdAt, while each membership record contains the member's DID and the list's AT-URI. The pack record makes the share page exist, and its creation is not idempotent. Running the create-starter-pack script twice results in two packs with different URLs. The limit of 150 members per pack is enforced by the application, and deleting a pack record leaves the list and its members in the repository.
Updating pack metadata is the only place where real idempotency occurs, as the same URL remains throughout. The pipeline is designed to handle partial failures, ensuring that only successfully added members are reported.
Written by urgent.news from Dev.to's reporting — not their text. Machine-written — may contain errors; check the original before relying on it.