Skip to content

feat: events page backed by atproto records - #3108

Draft
Adebesin-Cell wants to merge 13 commits into
npmx-dev:mainfrom
Adebesin-Cell:feat/events-page
Draft

feat: events page backed by atproto records#3108
Adebesin-Cell wants to merge 13 commits into
npmx-dev:mainfrom
Adebesin-Cell:feat/events-page

Conversation

@Adebesin-Cell

@Adebesin-Cell Adebesin-Cell commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

🔗 Linked issue

No issue yet — this came out of a Discord thread with Alex, Patak, Felix and Willow about finally building the events page. Can open one to track if we want.

Related: ghostdevv/guild-atproto#6 — the sync that mints the talk records and attendee counts this page reads. That's the producer, this is the consumer.

🧭 Context

We want an events page for npmx meetups, talks and photos, and we didn't want to store any of it as objects in the repo. The events already live on npmx.social as community.lexicon.calendar.event records (Willow's Guild→atproto sync mints them), so this reads straight from those.

📚 Description

The page:

  • List (/events) — past/upcoming split, filter chips by kind, short date ranges, cover images, attendee counts.
  • Detail (/events/[slug]) — description (rendered from markdown with marked, using the design-system prose styles), talks as Watch / Slides / PDF rows (borrowed from antfu.me/talks), a masonry photo gallery with a lightbox, the Bluesky post as a "social" embed, attending, hosts, related events. Register is hidden once an event is in the past.
  • Custom not-found for unknown slugs, with a real 404 status (same as the noodles page).
  • /events is reserved in canonical-redirects so it doesn't resolve to the events npm package.

Reading from atproto:

  • Vendored the community calendar lexicons (community.lexicon.calendar.event + rsvp, location.address/geo) so we're on the shared standard, not a bespoke schema. Smoke Signal and atmo.rsvp use the same one.
  • Added two npmx extensions: dev.npmx.calendar.talk (talks/recordings/slides) and dev.npmx.calendar.eventMeta (cover/kind/tags/hosts).
  • /api/events reads the live records off npmx.dev's repo on npmx.social: the event (mode/status/dates/links, and the atmo.rsvp media thumbnail resolved to a cover), the dev.npmx.calendar.talk records matched to each event, and the attendee count from additionalData.attendeeCount. useEvents() reads that endpoint — no dummy data.
  • Allowed npmx.social in the CSP img-src so cover blobs load.

What's still rough:

  • Talks and attendee counts depend on feat: sync event talks and attendee counts from Guild ghostdevv/guild-atproto#6. Until that sync runs, those records don't exist yet, so the talks section and counts are empty — the page degrades gracefully (sections hide).
  • Reads one account. Felix's Vienna meetups are on a different PDS, so we'll want a curated list of event URIs to aggregate across repos (Willow suggested the Bluesky list lexicon).
  • eventMeta is defined but not written or read yet — it's there for when we add cover/kind/tags we control.

Tests: unit tests for the date-range formatter, and the a11y coverage check is updated for the new components.

Adds an events feature backed by atproto records:
- vendors the community calendar lexicons (community.lexicon.calendar.event/rsvp,
  location.address/geo) and adds npmx extensions (dev.npmx.calendar.talk for
  recordings/slides/speakers, dev.npmx.calendar.eventMeta for cover/kind/tags/hosts)
- events list with past/upcoming split + kind badge filters, compact date ranges,
  cover images and attendee avatars
- event detail: schedule, talks (Watch/Slides/PDF), masonry photo gallery with a
  lightbox, bsky social embed, attending, hosts, related events
- reserves /events in canonical-redirects so bare names don't resolve to packages
- seed data (real npmx meetup photos) behind useEvents() with a swap-to-PDS seam
- /api/events reads real community.lexicon.calendar.event records from the
  npmx.dev account (did:plc:u5zp7...) on npmx.social via raw XRPC listRecords,
  maps mode/status/dates/uris and resolves the atmo.rsvp media thumbnail to a
  getBlob cover URL
- useEvents() now fetches /api/events (SSR-blocking, shared key); seed removed
- custom in-page event not-found state with a real 404 status, mirroring noodles
@vercel

vercel Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
npmx.dev Ready Ready Preview Aug 7, 2026 9:17pm
2 Skipped Deployments
Project Deployment Actions Updated (UTC)
docs.npmx.dev Ignored Ignored Preview Aug 7, 2026 9:17pm
npmx-lunaria Ignored Ignored Aug 7, 2026 9:17pm

Request Review

@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: d0adfcec-f26b-4269-9d0e-af34471856ed

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Jul 31, 2026

Copy link
Copy Markdown

Lunaria Status Overview

🌕 This pull request will trigger status changes.

Learn more

By default, every PR changing files present in the Lunaria configuration's files property will be considered and trigger status changes accordingly.

You can change this by adding one of the keywords present in the ignoreKeywords property in your Lunaria configuration file in the PR's title (ignoring all files) or by including a tracker directive in the merged commit's description.

Tracked Files

File Note
i18n/locales/en.json Source changed, localizations will be marked as outdated.
Warnings reference
Icon Description
🔄️ The source for this localization has been updated since the creation of this pull request, make sure all changes in the source have been applied.

@codecov

codecov Bot commented Jul 31, 2026

Copy link
Copy Markdown

@Adebesin-Cell Adebesin-Cell changed the title feat(events): events page backed by atproto records feat: events page backed by atproto records Aug 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant