-
-
Notifications
You must be signed in to change notification settings - Fork 274
Description
Summary
Add a Conference and Community directory to npmx that links events, people (maintainers), and packages using atproto identities (DIDs) as the underlying data layer.
Conferences publish structured event records from their atproto accounts. People optionally publish appearance records. npmx materializes a browsable graph on-demand by resolving signed atproto records and npm registry data, then caching the derived view:
events ↔ people ↔ packages
This turns npmx into a discovery layer for open-source communities, beyond code artifacts.
This issue is being spawned from the original idea posted in the Discord here. This also would not have been possible without significant support from @Nadjaroemer, therefore consider this RFC owned by the both of us :)
Motivation
Open-source ecosystems are social systems. Packages are maintained by people, and those people show up at conferences, community meetups, workshops, podcasts, panels, and other events. Today, that social layer exists, but package infrastructure does not model it. One of the main reasons people attend conferences is to connect with maintainers and learn about how the ecosystem is moving, and learn from it! The aim of this proposal is to have npmx help surface those connections.
This matters significantly for attracting new contributors to open source packages. If npmx can show “who maintains this” and “where they show up publicly”, it lowers the barrier to learning, networking, and eventually contributing.
I've even heard of an instance where, at an NG (Angular) conference, the Angular team themselves were present at a booth, sat down with a potential contributor for a live onboarding where they picked a new issue, worked on it together till it was shipped. Newcomers should be able to more easily find these incredible opportunities
Goals
- Conference/Meetup Organizers can authenticate with atproto and publish identity-backed organization plus event records
- SEO-friendly routes for organizers and events
- Queryable relationships between:
- events (conferences, meetups)
- people (maintainers, contributors)
- packages
- Browsing experiences:
- from a package page, see relevant events and appearances
- from a person page, see packages and upcoming appearances
- from an event edition page, see appearing people and represented packages (derived)
- Organizers can publish and update their own event data
Non-goals
- Ticketing, scheduling systems, or replacing conference websites
- Real-time attendance tracking
- Mandatory user tracking or precise location storage
- Automatic scraping of all conference sites
Proposed UX
Package page
On a package page like @tanstack/react-query, show an Events section near Maintainers/Provenance:
- upcoming events where a maintainer appears (opt-in appearances)
- represented events derived from maintainer appearances
- links to event pages and person pages
Person page
Add an “Events” page for a user:
/~:username/eventslists upcoming and past appearances (opt-in)
Event pages
For each event edition (example: “ZurichJS 2026”):
- location, dates, website link
- people appearing (only opt-in/confirmed appearances in the canonical list)
- packages represented (derived from maintainer appearances)
Terminology
- Event: a single occurrence with dates(one day or multiple), location and
type(conference,meetup) andformat(online,in_person,hybrid) - Organization: an organizing body, hosting events, with a one-to-many relationship with events (e.g., ZurichJS)
- Actor: an identity backed by atproto DID, can be an org or person
- Person: an actor representing an individual maintainer/contributor
- Appearance: an opt-in public record by a person indicating participation in an event
- Representation: derived relationship, a package is represented at an event if a maintainer appears there
Design overview
Identity model
All actors are atproto identities (DIDs).
- Organizer accounts publish canonical event metadata (e.g. event title, date range, location, list of represented maintainers, either via speaking or attending)
- People publish opt-in appearance records
- npmx resolves and joins records on-demand to produce derived views
Data model (conceptual)
Core entities
Organizer(actor DID)Event(organizer DID plus event slug plus date range)Person(actor DID)Package(npm package name plus registry metadata)Appearance(person DID → edition)Location(city, country)PackageClaim(person DID ↔ package, opt-in, role = maintainer | contributor)Representation(derived: edition ↔ package)
Relationship rules
Appearanceis explicitly published by a person (opt-in)Representationis derived:- if a person appears at an event
- and that person is a maintainer of a package (as currently inferred)
- then that package is “represented” at that edition
Contributors can appear, but do not create representation by default. Maintainers do.
Graph model
graph TD
O[Organization] --> E[Event]
P[Person] --> A[Appearance]
A --> E
P --> PC[Package Claim]
PC --> N[Package]
P --> M[Maintainer Of]
M --> N
E --> R[Representation]
R --> N
Future extension: personalized discovery (optional)
Opt-in feature:
- infer relevant events from a user’s dependency graph
- notify when maintainers of dependencies appear at nearby events
Considerations
A few things to think through so this doesn’t get noisy, stale, or gamed over time.
Freshness and “stale directory” prevention
- Organization activity requirement: an organization should publish at least one event per year to remain discoverable in the main directory.
- If inactive, it can be moved to an “inactive” state (still accessible via direct link in order to not create link rot via external references, but not promoted in browse/search).
- Event expiry: events should automatically move from “upcoming” to “past” once the end date passes, and eventually collapse behind pagination or filters.
- Appearance expiry: appearances should be time-bounded to the event date range, and not linger as “upcoming” if the event record changes or disappears.
Note:
I'd love to implement this with the support of @Nadjaroemer and whoever else would be keen to iterate/ideate over what the final implementation could be. While I, @farisaziz12 am new to atproto based integrations and Nuxt overall, I have written up the proposal to the best of my knowledge on how the system/repo currently works. Would love some feedback and feel free to point out any misunderstandings so that we can evolve the RFC into a state we are happy to break it down and implement.
Additional information
- Would you be willing to help implement this feature?
Final checks
- Read the contribution guide.
- Check existing issues.