Skip to content

feat(events): events page backed by atproto records - #3108

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

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

Conversation

@Adebesin-Cell

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.

🧭 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 avatars.
  • Detail (/events/[slug]) — schedule, 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.
  • 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.

The atproto side:

  • 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, where slides and recording are each a blob or an external URL) and dev.npmx.calendar.eventMeta (cover/kind/tags/hosts).
  • /api/events reads the live event records off npmx.dev's repo on npmx.social, maps mode/status/dates/links, and resolves the atmo.rsvp media thumbnail into a cover. useEvents() reads that endpoint — no dummy data.

What's still rough:

  • Talks and attendance aren't on atproto yet — they only live on Guild, so those sections are empty right now. Next step is extending Willow's guild-atproto sync to also mint dev.npmx.calendar.talk records, and pulling attendee counts from the Guild API.
  • It reads one account. Felix's Vienna meetups are on a different PDS, so we'll need 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 Jul 31, 2026 10:39pm
2 Skipped Deployments
Project Deployment Actions Updated (UTC)
docs.npmx.dev Ignored Ignored Preview Jul 31, 2026 10:39pm
npmx-lunaria Ignored Ignored Jul 31, 2026 10:39pm

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: 64379376-ed38-4258-8da9-0d1165711a54

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

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