alpha
Login
or
Join now
natespilman.at
/
atjam.at
Star
0
Fork
0
Atom
Configure Feed
Issues
Pull Requests
Commits
Tags
Feed URL
Select the types of activity you want to include in your feed.
A jam is a shared-deadline creative challenge: one prompt, a roster of participants, a single due date. Submissions point at records that li
Star
0
Fork
0
Atom
Configure Feed
Issues
Pull Requests
Commits
Tags
Feed URL
Select the types of activity you want to include in your feed.
Overview
Issues
Pulls
Pipelines
atjam.at
/
web
/
app
/
components
/
at
main
1 folder
13 files
Nate Spilman
web: rank the feed by what's live, and point prod at EPTSS
11d ago
06a063bb
ui
web: design system primitives + /styleguide (Phase 1) Button primitive (tailwind-variants: solid/signal/outline × sizes, one focus-ring token) now backs the four identical write buttons (sign up, submit, invite, create) — the duplicated black-button string is gone. STATE_VISUALS (round-visuals.ts) is the single home for the state visual language; StatePill reads from it, and the transit line / cards will too. No completeness test — the Record<RoundState> type enforces it. /styleguide renders every token + primitive in both themes (noindex, footer link) — the visual-review surface, mirroring /scenarios. App shell (footer) and auth-bar migrated to semantic tokens. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2 months ago
actor-name.tsx
web: rank the feed by what's live, and point prod at EPTSS Prod's home feed was built with VITE_KNOWN_ORGANIZERS set to the nls-testuser1 test account, so atjam.at listed fourteen seeded test rounds and no real ones — EPTSS Round 31 was never in the feed at all. Point it at @eptss.at. Vite bakes this at build time, so it takes a `flyctl deploy` to land. Then rank what's left. Thirty-one archived EPTSS rounds outnumber the one live round 31:1, and an undivided list buries the only round anyone can act on. Split on the existing Round.deriveState — open/in-progress up top under "Active", closed folded into a <details> the browser already knows how to render. Add UNLISTED_ROUNDS for records that are real but not presentable: partial migrations, drafts superseded by a later record. They stay on the network and reachable by direct link, they just don't get featured. A partially migrated duplicate of Round 29 is the first entry — it derives `open`, so it was ranking beside the genuinely active round. Both surfaces that list rounds route through listedRounds(). Also group milestones that share an instant into one transit station. A phase boundary is a point, not a span — EPTSS closes signups and opens voting at the same moment — so drawing two stations put a segment between them and asserted a duration that doesn't exist. Round 31 has two such boundaries and goes from six stations to four. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 week ago
auth-bar.tsx
web: design system primitives + /styleguide (Phase 1) Button primitive (tailwind-variants: solid/signal/outline × sizes, one focus-ring token) now backs the four identical write buttons (sign up, submit, invite, create) — the duplicated black-button string is gone. STATE_VISUALS (round-visuals.ts) is the single home for the state visual language; StatePill reads from it, and the transit line / cards will too. No completeness test — the Record<RoundState> type enforces it. /styleguide renders every token + primitive in both themes (noindex, footer link) — the visual-review surface, mirroring /scenarios. App shell (footer) and auth-bar migrated to semantic tokens. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2 months ago
doc.tsx
docs: add "Built on atjam" showcase page New /docs/built-on (TSX route + markdown mirror): a truthful "in the wild" adopters table (the atjam.at app itself + EPTSS) plus an end-to-end worked example mapping a judged, votable game jam — the rpg.actor shape — onto the at.atjam.* spine. It shows the two illustrative actor.rpg.* lexicons an adopter would publish under their own namespace, the round wired through the extension points, and vote tallying via the existing Queries.getBacklinks substrate. Explicit callout that rpg.actor does not actually run on atjam. Wired into the docs sidebar, the overview list, and the footer. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2 months ago
empty-state.tsx
web: the void & the gradient (plan step 4) Now that the transit line is a strong center, remove the scaffolding that compensated for its weakness. Delete the Join-policy/State panel: the state is the timeline, and the join policy collapses into one plain sentence beneath it ("Invitation required from the organizer…") — the precise, actionable detail still surfaces at decision time in the signup area (a gradient of disclosure, per Fukasawa). Drops a boxed section, so the round page gets a void around its anchor (per Rams). Adds a small EmptyState mark (a dashed hollow ring) to the empty signups / invitations / submissions / rounds lists, so dead ends feel cared-for rather than blank (per Kare; a placeholder until the icon family lands). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2 months ago
invite-form.tsx
web: sweep route bodies + components to design tokens (Phase 1 tail) Migrates the remaining stone-* / dark: usages across the route bodies and shared components to the semantic token vocabulary (paper/panel/line/ ink/ink-2/ink-3). Redundant `dark:` stone variants are dropped — the tokens flip themselves at [data-theme]. Externally-provided jam links move to the signal accent. Semantic colored notices (emerald confirm, amber warning, red error) are deliberately preserved. No behavior change. The app now speaks one token vocabulary end to end; no stone-* remain outside the prose-stone typography theme. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2 months ago
notice.tsx
web: design token + theming foundation (DESIGN.md Phase 0) Tailwind v4 two-tier tokens: themed CSS vars (warm paper/ink neutrals, signal red, state hues) registered via @theme inline so utilities emit var(--token) and flip at runtime. Dark is now driven by a [data-theme] attribute (set before paint by a no-FOUC script in root.tsx) via @custom-variant, not prefers-color-scheme — controllable, and components flip through tokens instead of duplicated `dark:` pairs. Adds cn() (clsx + tailwind-merge) and the tailwind-variants dep for typed variants (used from Phase 1). Migrates the two named primitives — Notice and StatePill — onto semantic tokens as the proof; the rest of the app keeps working (residual `dark:` now keys off the attribute). Fonts deferred until the grotesque/mono are licensed. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2 months ago
round-row.tsx
web: timetable rows + relationship tables (Phase 3) Round lists on the home feed and jam pages become one shared RoundRow: a timetable row with a fixed left column (date + state) aligned across rows, then title / organizer / two-line excerpt, hairline-ruled, no boxes. Removes the duplicated list rendering between the two routes. On the round page, the signups and invitations lists become aligned column tables (participant · joined · status; invitee · inviter) with label headers — legible as relations rather than loose lists. The invalid-signup disclosure reuses the same SignupRow. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2 months ago
signup-button.tsx
web: design system primitives + /styleguide (Phase 1) Button primitive (tailwind-variants: solid/signal/outline × sizes, one focus-ring token) now backs the four identical write buttons (sign up, submit, invite, create) — the duplicated black-button string is gone. STATE_VISUALS (round-visuals.ts) is the single home for the state visual language; StatePill reads from it, and the transit line / cards will too. No completeness test — the Record<RoundState> type enforces it. /styleguide renders every token + primitive in both themes (noindex, footer link) — the visual-review surface, mirroring /scenarios. App shell (footer) and auth-bar migrated to semantic tokens. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2 months ago
state-pill.tsx
web: design system primitives + /styleguide (Phase 1) Button primitive (tailwind-variants: solid/signal/outline × sizes, one focus-ring token) now backs the four identical write buttons (sign up, submit, invite, create) — the duplicated black-button string is gone. STATE_VISUALS (round-visuals.ts) is the single home for the state visual language; StatePill reads from it, and the transit line / cards will too. No completeness test — the Record<RoundState> type enforces it. /styleguide renders every token + primitive in both themes (noindex, footer link) — the visual-review surface, mirroring /scenarios. App shell (footer) and auth-bar migrated to semantic tokens. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2 months ago
structured-field.tsx
web: sweep route bodies + components to design tokens (Phase 1 tail) Migrates the remaining stone-* / dark: usages across the route bodies and shared components to the semantic token vocabulary (paper/panel/line/ ink/ink-2/ink-3). Redundant `dark:` stone variants are dropped — the tokens flip themselves at [data-theme]. Externally-provided jam links move to the signal accent. Semantic colored notices (emerald confirm, amber warning, red error) are deliberately preserved. No behavior change. The app now speaks one token vocabulary end to end; no stone-* remain outside the prose-stone typography theme. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2 months ago
submit-form.tsx
web: submit a plain URL when the link isn't a known record The submit form now resolves a pasted input two ways: a known record (at:// or a recognized app URL) takes the record path — gated to the round's acceptedSubmissionTypes and fetched for its CID — while any other http(s) link becomes a plain `url` deliverable. resolveSubmissionInput keeps known hosts on the record path so a transient resolution failure can't silently downgrade a record to a url. The hint copy names both paths, keeping payload primary and the url an explicit fallback. Tests cover the new branches. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2 months ago
transit-line.test.ts
web: rank the feed by what's live, and point prod at EPTSS Prod's home feed was built with VITE_KNOWN_ORGANIZERS set to the nls-testuser1 test account, so atjam.at listed fourteen seeded test rounds and no real ones — EPTSS Round 31 was never in the feed at all. Point it at @eptss.at. Vite bakes this at build time, so it takes a `flyctl deploy` to land. Then rank what's left. Thirty-one archived EPTSS rounds outnumber the one live round 31:1, and an undivided list buries the only round anyone can act on. Split on the existing Round.deriveState — open/in-progress up top under "Active", closed folded into a <details> the browser already knows how to render. Add UNLISTED_ROUNDS for records that are real but not presentable: partial migrations, drafts superseded by a later record. They stay on the network and reachable by direct link, they just don't get featured. A partially migrated duplicate of Round 29 is the first entry — it derives `open`, so it was ranking beside the genuinely active round. Both surfaces that list rounds route through listedRounds(). Also group milestones that share an instant into one transit station. A phase boundary is a point, not a span — EPTSS closes signups and opens voting at the same moment — so drawing two stations put a segment between them and asserted a duration that doesn't exist. Round 31 has two such boundaries and goes from six stations to four. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 week ago
transit-line.tsx
web: rank the feed by what's live, and point prod at EPTSS Prod's home feed was built with VITE_KNOWN_ORGANIZERS set to the nls-testuser1 test account, so atjam.at listed fourteen seeded test rounds and no real ones — EPTSS Round 31 was never in the feed at all. Point it at @eptss.at. Vite bakes this at build time, so it takes a `flyctl deploy` to land. Then rank what's left. Thirty-one archived EPTSS rounds outnumber the one live round 31:1, and an undivided list buries the only round anyone can act on. Split on the existing Round.deriveState — open/in-progress up top under "Active", closed folded into a <details> the browser already knows how to render. Add UNLISTED_ROUNDS for records that are real but not presentable: partial migrations, drafts superseded by a later record. They stay on the network and reachable by direct link, they just don't get featured. A partially migrated duplicate of Round 29 is the first entry — it derives `open`, so it was ranking beside the genuinely active round. Both surfaces that list rounds route through listedRounds(). Also group milestones that share an instant into one transit station. A phase boundary is a point, not a span — EPTSS closes signups and opens voting at the same moment — so drawing two stations put a segment between them and asserted a duration that doesn't exist. Round 31 has two such boundaries and goes from six stations to four. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 week ago