feat(events): events page backed by atproto records - #3108
Conversation
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
|
The latest updates on your projects. Learn more about Vercel for GitHub.
2 Skipped Deployments
|
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
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. Comment |
Lunaria Status Overview🌕 This pull request will trigger status changes. Learn moreBy default, every PR changing files present in the Lunaria configuration's You can change this by adding one of the keywords present in the Tracked Files
Warnings reference
|
Codecov Report❌ Patch coverage is 📢 Thoughts on this report? Let us know! |
🔗 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.socialascommunity.lexicon.calendar.eventrecords (Willow's Guild→atproto sync mints them), so this reads straight from those.📚 Description
The page:
/events) — past/upcoming split, filter chips by kind, short date ranges, cover images, attendee avatars./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./eventsis reserved incanonical-redirectsso it doesn't resolve to theeventsnpm package.The atproto side:
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.dev.npmx.calendar.talk(talks/recordings/slides, whereslidesandrecordingare each a blob or an external URL) anddev.npmx.calendar.eventMeta(cover/kind/tags/hosts)./api/eventsreads the live event records offnpmx.dev's repo onnpmx.social, maps mode/status/dates/links, and resolves theatmo.rsvpmedia thumbnail into a cover.useEvents()reads that endpoint — no dummy data.What's still rough:
guild-atprotosync to also mintdev.npmx.calendar.talkrecords, and pulling attendee counts from the Guild API.eventMetais 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.