coordination layer for jams · on atproto
Same prompt. Same deadline. Different people, different work.
atjam coordinates — it never hosts. Your work lives on your PDS; atjam only holds the pointer.
A jam is a shared-deadline creative challenge: one prompt, a roster of participants, a single due date. Submissions point at records that live wherever they already do.
- 1 · organize
Post a prompt, a deadline, and the kinds of records that count.
- 2 · join
One click to sign up. Your signup record lives on your PDS.
- 3 · submit
Link your work from any atproto app. atjam holds the reference.
Recent rounds
- Jun 3, 2026closed
Empty round (no signups, no submissions)
by @nls-testuser1.bsky.socialFresh round with nobody signed up and nothing submitted. Confirms the empty-state UI for both Signups and Submissions sections renders cleanly.
- Jun 3, 2026open
Custom phases — gotcha (no submission-deadline)
by @nls-testuser1.bsky.socialEvery milestone is a custom label and all are in the past, so the Timeline looks finished — but there is no 'submission-deadline', so deriveState has nothing to close on and the header still reads OPEN. This is the documented gotcha: pair custom phases with a standard submission-deadline (see /docs/extending).
- Jun 3, 2026closed
Custom phases — multi-stage round
by @nls-testuser1.bsky.socialMilestones use custom labels as named phases, EPTSS-style: signup-opens → voting-opens → covering-begins → submission-deadline → closing-event. The Timeline renders every label as a station with the 'now' dot mid-line (covering phase). Round.deriveCurrentPhase reports since='covering-begins', until='submission-deadline'. A standard submission-deadline is included so deriveState stays meaningful — the header reads OPEN until it passes.
- Jun 3, 2026closed
Round accepting multiple submission types
by @nls-testuser1.bsky.socialacceptedSubmissionTypes lists three NSIDs from different atproto apps. The 'Accepted submission types' section should render all three as pills.
- Jun 3, 2026closed
Round with subject + closingEvent
by @nls-testuser1.bsky.socialBoth optional structured fields (subject and closingEvent) are populated with fake $type-discriminated objects. The page should render without crashing even if it doesn't display the structured fields directly.
- Jun 3, 2026closed
Network round — cycle attempt
by @nls-testuser1.bsky.socialjoinMode=network. test2 and test3 try to invite each other without ever rooting at the organizer (no organizer→test2 or organizer→test3 invitation exists). Both signups cite the other's invitation. Validator should detect the cycle and render both as INVALID with the 'cycle detected' reason.
- Jun 3, 2026closed
Network round — contributed gate
by @nls-testuser1.bsky.socialjoinMode=network, networkGate=contributed. Two inviters: • test2 has signup AND submission → her invitee (test3) is VALID • test4 has signup but NO submission → her invitee would be INVALID (test4 didn't invite anyone, but we set it up so validator's gate logic is visible per chain) Confirm the validator distinguishes inviters who've earned invitation rights from those who haven't.
- Jun 3, 2026closed
Network round — chain
by @nls-testuser1.bsky.socialjoinMode=network. Chain of invitations: organizer → test2 → test3, plus organizer → test4 directly. All three signups should render valid because every chain roots at the organizer.
- Jun 3, 2026closed
Hosted round — mixed validation
by @nls-testuser1.bsky.socialjoinMode=hosted. Three signups, three different validator outcomes: • test2 with valid invitation from organizer → VALID • test3 with no invitation field → INVALID • test4 with self-forged invitation → INVALID Hover the amber badges to see the failure reason.
- Jun 3, 2026closed
Open round — state: closed
by @nls-testuser1.bsky.socialSubmission-deadline (1 day ago) is past. State derives to 'closed'. Header should show 'CLOSED'. Page should display the 'round is closed' notice; no signup or submission UI.
- Jun 3, 2026closed
Open round — state: in-progress
by @nls-testuser1.bsky.socialSignup-deadline (1 day ago) is past, submission-deadline (30 days out) is still future. State derives to 'in-progress'. Header should show 'IN-PROGRESS'. Signup button should be hidden or rejected; submissions still accepted.
- Jun 3, 2026closed
Open round — state: open
by @nls-testuser1.bsky.socialBase case. Signup-deadline (7 days out) and submission-deadline (30 days out) are both in the future. State derives to 'open'. Header should show 'OPEN'.