Social specs, sub-specs and who indexes what
This is the data model pubky.app and the apps around it share: what lives on the homeserver, which spec defines it, which indexer reads it, and what you can build on today. Each part says if it is built, merged in our Nexus fork, a draft or only planned. Section 9 lists the questions where we want the team's view.
gillohner/pubky-nexus fork/v1, not upstream
Code on branch written and tested, not merged
Draft spec in a draft PR or a local crate
Proposal written down, no code
Planned agreed direction, no design yet
Open needs a decision
1. Summary and the layers
- Every object lives on the user's homeserver. Public data is under
/pub/, private data under/priv/. Indexers only read/pub/. - pubky-social-specs defines what several apps must read: profile, posts, tags, follows, bookmarks, collections, files, feeds, mutes (1.0), and
event,rsvp,rating,availability(1.1). Paths are/{pub,priv}/social/v1/…. - Sub-specs are an app's own post kinds on the same post envelope under
/{pub,priv}/<ns>/v1/posts/:route(maps),listing,drop,shop(marketplace),listen,listening,session(music). Each lives in the app's own repo. - Nexus indexes the social graph and the social kinds. It treats every app namespace the same way and reads no app content. We keep it as small as we can.
- Pinakes indexes external resources (web pages, places, events, books, music…) and gives app posts a card. It ranks and searches; it holds no posts, users or tags.
- Rule for clients: Pinakes ranks, Nexus hydrates. They join only by URI.
2. Where a kind lives
Owner decisions from 24 to 27 October fix one rule: a kind goes in the social specs (and so into Nexus) only if other apps must read it. Everything else belongs to an app. Ask the questions below in order; the first "yes" decides.
docs/SUBSPECS.md on the 1.1 branch.Rules a sub-spec follows
- Namespace: 1 to 32 characters of
a-z,0-9,-, starting with a letter, no dot.socialis reserved. One per app family. Public sub-spec namespaces aremusic,maps,marketplaceandevents. - Paths: a version is
/{pub,priv}/<ns>/v1/posts/{id}/{editId}[-{slug}].json; references name the post versionless:pubky://{owner}/{pub,priv}/<ns>/v1/posts/{id}. v1is the envelope's version, not the app's. Content changes are additive; a change that cannot be additive becomes a new kind name.- Values: instants are
*_atin integer microseconds; durations end in their unit (_ms,_s,_days) unless JSCalendar names them; places are canonical OSM object URLs orgeo:pins; money is{amount_minor, currency, exponent}; the cover image isattachments[0]. - A sub-spec may not define a kind that repeats a primitive or a social kind, may not need Nexus code, and names no client.
3. Social specs 1.0 and 1.1
Built 1.0 is released as 1.0.0-rc.1 on crates.io and npm (pubky-social-specs, plus pubky-social-migrator for 0.x data). Draft spec 1.1 is draft PR pubky/pubky-social-specs#207, branch v1.1-subspecs, head 8e7f1ad, crate version 1.1.0-alpha.1 (not published). 1.1 changes nothing in 1.0: a 1.0 reader reads a 1.1 post as a kind it does not know and skips it.
The post envelope (1.0)
Every post, social or sub-spec, is PostEnvelope<K>. Only the kind set and the rules for content differ.
| Member | What |
|---|---|
kind | The kind name. A name the reader does not know reads as Unknown and fails validation. |
content | A string. Plain text for note-like kinds; a JSON document (as a string) for typed kinds such as article, collection and the 1.1 kinds. |
parent | The thing this replies to. Any URI the reference gate accepts, depending on the kind. |
embed | A quoted resource, Pubky or web. |
attachments[] | {uri, alt?, name?}; always present, [] when empty. The cover is attachments[0]. |
lock | The URI of a lock. Present means the content is gated; content is then the teaser. |
other members (ext) | Kept on rewrite by every reader. Apps put their extra data in ext.<ns>. |
Ids are timestamp ids. A post is a folder of versions: /pub/social/v1/posts/{id}/{editId}[-{slug}].json. An edit writes a new version; the indexer keeps the newest. A public post can never reference a private object (the gate refuses it).
1.0 objects
| Object | Path | Purpose and fields |
|---|---|---|
| Profile | /pub/social/v1/profile.json | name, bio?, image?, links?, status? |
| Post | /{pub,priv}/social/v1/posts/{id}/{editId}.json | The envelope above. 1.0 kinds below. |
| Tag | /pub/social/v1/tags/{hash(uri:label)}.json | {uri, label, created_at}. A label on any URI: a post, a profile, a web page, a place. |
| Follow | /pub/social/v1/follows/{pubky}.json | {created_at} |
| Mute | /priv/social/v1/mutes/{pubky}.json | Private. |
| Bookmark | /priv/social/v1/bookmarks/{base64url target}.json | {created_at, target?}. Private; the target is in the file name. Works on any URI. |
| Feed | /priv/social/v1/feeds/{id}.json, optional public copy | {feed: {tags?, domain_tags?, reach, layout, sort, content?}, name, icon?, created_at}. Reach: following, followers, friends, all, wot, me. |
| File | /{pub,priv}/social/v1/files/… | Media bytes, named by hash. Posts point at them from attachments. |
1.0 post kinds
| Kind | Content |
|---|---|
note (default), image, video, link, file | Plain text. The kind is a display hint; media are in attachments. |
article | {title, body, cover_image?} |
collection | {name, description?, items: [{uri, note?}], cover_image?, layout?}, layout grid, list or visual. Items are any URI. This is also a calendar, a playlist, a list of places. |
1.1 kinds Draft spec
Four kinds on the same envelope under social. Member names follow JSCalendar (RFC 8984), so iCalendar import and export are renames. Times are local: start is a wall-clock time in timeZone, and the indexer computes the instant.
event
An event created on Pubky. Cover is attachments[0], categories are tags, parent and embed are refused, lock is set when details are guarded. Policy is open, approval, invite or ticket. One recurrence rule at most, capped at 1,000 occurrences or 3 years. An override of one occurrence is a separate event with recurrenceOf and recurrenceId.
{
"title": "Lugano Bitcoin Evening",
"description": "Monthly meetup. Talks start at 19:00.",
"start": "2026-10-14T18:30:00",
"timeZone": "Europe/Zurich",
"duration": "PT2H30M",
"status": "confirmed",
"locations": [{ "name": "Plan ₿ Hub",
"uri": "https://www.openstreetmap.org/way/481516234" }],
"attendance": { "policy": "open", "capacity": null,
"waitlist": false },
"links": [{ "title": "Website",
"url": "https://planb.network/" }],
"recurrenceRules": [{ "frequency": "monthly",
"byDay": [{ "day": "tu", "nthOfPeriod": 2 }] }]
}
rsvp
An answer: a reply whose parent is the event. Status requested, accepted, declined or tentative. One per author per event or occurrence; the client edits its post. guests 0 to 100 count toward capacity except under ticket.
{ "status": "accepted",
"recurrenceId": "2026-11-10T18:30:00",
"guests": 1, "note": "bringing cake" }
rating
Stars on any thing: a reply whose parent is what is rated (a place, a track, a listing, an event, a link). rating 1 to 10 half stars (10 = five stars), no zero. One per author per target. Photos allowed in attachments. Every app rates through this kind.
{ "kind": "rating",
"parent": "https://www.openstreetmap.org/node/240109189",
"content": "{\"rating\":7,\"text\":\"great coffee\"}",
"attachments": [] }
availability
When a person, or a resource of theirs, can be booked: a public, coarse schedule the client derives from its private calendar and bookings. One current post per author per for (absent for means the author). Blocks have start, duration, optional recurrence; available blocks may carry title and capacity (units free). Slots are derived, never stored. Prices and booking rules go in ext.<ns> or the app's own kind.
{
"timeZone": "Europe/Zurich", "horizonDays": 60,
"for": "pubky://<owner>/pub/marketplace/v1/posts/0032SSN7Q4EVG",
"available": [{ "title": "Double room", "start": "2026-10-19T14:00:00", "duration": "P1D",
"capacity": 12, "recurrenceRules": [{ "frequency": "daily" }] }],
"busy": [{ "start": "2026-10-24T14:00:00", "duration": "P2D" }]
}
Places (1.1 writer conventions)
No object has a location field. A located post is a post whose parent or embed (or an event's locations[].uri) is a place. Two spellings make every writer land on one resource:
- An OSM place:
https://www.openstreetmap.org/{node|way|relation}/{id}, nothing else. Map view links (#map=,?mlat=,osm.org) are not places; the client turns them into a pin or a reverse lookup before writing. - A coordinate:
geo:<lat>,<lon>, at most 5 decimals (about 1 m), no trailing zeros. Fewer digits for a rough spot: 3 is about 100 m.
The conventions are enforced in the 1.1 place positions (event locations, sub-spec place fields such as route waypoints). In parent, embed, tags and collection items they are what a 1.1 client writes, but the 1.0 gate does not check them.
Calendars
There is no calendar kind. A calendar is a collection of event URIs, public or private, at most 100 items. Items are universal, so a Luma page or an .ics feed sits next to Pubky events.
4. Sub-specs: maps, marketplace, music, events
Each sub-spec is a Rust crate in the app's own repo, built on pubky_social_specs::subspec. None of them needs anything from Nexus. The maps, marketplace and events crates are not pushed to a repository yet, and pin social at 6baa542 (before availability became a social kind).
| Sub-spec | Namespace | Kinds | Uses instead of own copies | Status |
|---|---|---|---|---|
pubky-maps-specs 0.1.0 | maps | route | rating on places, collection for trip plans, tags, bookmarks, replies, event at a place, photos in attachments | Draft spec local crate |
pubky-marketplace-specs 0.1.0 | marketplace | listing, drop, shop | review = rating + ext.marketplace; watchlist = bookmarks; keywords = tags; digital goods = lock | Draft spec for the marketplace team to adopt; their live data is still /pub/app.marketplace/v1/ |
pubky-music-specs 0.1.0 | music | listen, listening, session | playlists = collection + ext.music; review → rating; tags, bookmarks, comments | Draft spec pubky-music-node#111 and #127 (both drafts) |
pubky-events-specs | events | none | everything is social: event, rsvp, availability, collection, rating | Decided drop the crate, keep the namespace reserved |
Maps: route
A saved route: ordered waypoints (2 to 100, each a place under the conventions), an encoded polyline with the engine and profile that made it, distance, duration, elevation, optional steps. parent is refused; embed may name the trail it follows (an OSM relation). Directions are not stored; a route reaches Pubky only when someone saves it.
{ "name": "Lakeside loop", "activity": "running",
"waypoints": [{ "uri": "geo:46.00547,8.95186", "name": "Start" },
{ "uri": "https://www.openstreetmap.org/node/240109189" }],
"polyline": { "encoded": "_p~iF~ps|U_ulLnnqC_mqNvxq`@", "engine": "valhalla",
"profile": "pedestrian", "precision": 6 },
"distance_m": 5200, "duration_s": 1800, "elevation_gain_m": 12, "elevation_loss_m": 12 }
Marketplace: listing, drop, shop, and reviews
listing: something for sale. Title, description, state (active,paused,ended,removed), category, condition, optionallocation.uri(a place), variants, a sale (fixed_priceorauction), fulfillment, shipping, returns,adult_only. Photos are attachments (1 to 10).parentandembedare refused.drop: a timed first-come-first-served release of 1 to 20 of the seller's listings (starts_at,ends_at?, quantities).shop: the storefront: name, bio, location, policies,transaction_service(the https endpoint for checkout and orders). One current post per seller.- Reviews are social
ratingposts. A buyer rates the listing (parentthe listing); a seller rates the buyer (parentthe buyer's profile).ext.marketplacecarriesrole,listing,order_ref, a purchaseattestation(compact JWS signed by the transaction service) and sub-scores on the same 1 to 10 scale. A response to a review is a reply to the rating.
Music: listen, listening, session
Every music post embeds the music it is about and has no parent. Times are microseconds, durations milliseconds. The path decides who sees it.
| Kind | Content | Meaning |
|---|---|---|
listen | {played_at, duration_ms?, source?} | One play. /priv/ for a private history, /pub/ for a public one (user setting). |
listening | {started_at, expires_at, name?, duration_ms?, source?} | Now playing, until expires_at (at most 24 h after start). |
session | {started_at, expires_at?, host, name?, source?} | A listening session others can join, hosted by host (a pubky:// key). There is no separate "joinable" flag: a session is by definition joinable. |
The optional name on listening and session is merged on both music branches (commit dd8a24c): 1 to 100 code points; when absent, readers show a generic name ("Alice's listening session", "Alice is listening"). Playlists are social collections; ext.music adds per-item source and added_at, and per-playlist source_order and original. Audio files stay app data in /priv/pubky.music/files/ on purpose. A rating of a track is a social rating with parent the music URL.
Events and calendar apps
An events or calendar app writes only social kinds: event, rsvp, availability, calendars as collections, rating on events, venues as place URIs, labels as tags, saved events as bookmarks. A personal calendar and its private events live under /priv/social/v1/. Busy details stay private; the app derives the public, coarse availability from them. If an app later needs more (prices on a schedule, booking rules), it adds ext.events on the availability or its own kind in the events namespace.
Manifests and client declarations Proposal
The sub-spec proposal (27 October) adds two small JSON files. Owner decisions on it are already taken; nothing is built yet.
subspec.jsonin each crate says how a kind becomes a Pinakes card: schema.org type, name, image, place, time, facts, which references count. Pinakes bundles a pinned copy and reviews it like code; it never fetches manifests live. Planned cards:route→Trip;listing→Product;drop→SaleEvent;shop→OnlineStore;session→BroadcastEvent; a publiclistengets no card and counts on the track;listeninggets a short-lived card.- Client declarations: each client publishes
pubky://<client key>/pub/clients/v1/client.jsonwith the namespaces and kinds it handles and an optionalopenURL template. Pinakes collects them from a reviewed key list and shows "Clients that support this" on each card. This replaces today's hard-codedopen_in.clientsbecomes a reserved namespace. - A post in a namespace without a manifest still gets a general card from standard fields (name or title, description, image).
{ "declaration": 1, "name": "Pubky Maps", "homepage": "https://maps.pubky.app",
"supports": [
{ "namespace": "maps", "kind": "route", "open": "https://maps.pubky.app/route/{owner}/{id}" },
{ "namespace": "social", "kind": "rating" } ] }
5. Storage and privacy
There is no visibility flag on any object. Who can read something is decided by where it is stored.
Locks for events
| Flow | How | Status |
|---|---|---|
| Paid ticket | Teaser lock → content lock with a paykit-payment criterion. The buyer's bundle_id is the ticket (QR {creator, bundle_id}). Price tiers are separate locks. | Works with Locks today per the Locks review of 15 Oct |
| Sales count, door check | Organiser's client lists its own /priv/app.locks/proofs/; a scanner keeps a client-side ledger of scans. | Works today client work |
| Invite-only, approval | creator-grant, then a signed-invite criterion bound to the invitee. | Planned Locks team, first |
| Hard capacity | issuance_policy.capacity enforced at admission. | Planned second |
| One-shot admission | scanned_at redemption and a door-link credential. | Planned third |
Nexus shows public RSVP counts; it never checks tickets or invites. Refunds and transfers are not possible (no refund rail in Paykit).
6. Who indexes what
| Nexus | Pinakes | Clients | |
|---|---|---|---|
| Reads | Homeserver events, /pub only; the social specs | Nexus's reference feed; the web and APIs; app posts it is told about | Both indexers, and the homeserver for full posts |
| Social 1.0 | Posts, profiles, follows, tags, collections (fork fork/v1; upstream #1129 open) | Never fetches /pub/social/ or /pub/pubky.app/ | — |
| Social 1.1 | event, rsvp, rating natively (fork #23). availability: not indexed | Not social events. External events: pages, feeds, NIP-52 | Merge Pubky events and external events in calendars |
| External resources | Resource node per URI: tags, ratings; views by URI; the reference feed (#1170) | Typed cards, groups / also on, places, occurrences, search | Join by URI |
| App posts | Generic: Resource node of the post URI with namespace, kind, author, parent/embed edges, no content; a kind:"post" feed line; /v0/stream/posts?namespace=&kind= (fork #22) | Cards from the post content (branch now; manifests proposed) | Validate the full post with the app's crate or npm package |
| App-specific code | None | Profiles today; manifests proposed | The app's own |
Nexus: what exists
| Piece | What | Status |
|---|---|---|
| Upstream #1170 | GET /v0/resources/changes (the reference feed; tag lines only, reply, embed, collection reserved) and POST /v0/stream/resources/by_ids (views by URI or id, 1 to 100) | Open upstream ready for review; in the fork |
| Upstream #1129, #1161 | Move to pubky-social-specs; #1161 (the N2 translator) is merged into the #1129 integration branch, not main | Open upstream |
Fork fork/v1 | Social v1 indexing through the translator (posts, profiles, follows, tags, collections). Pins social 1.1 draft 8e7f1ad | Merged in fork (fork PR #21 to fork main still open) |
| Fork #22 | Generic app posts for every namespace; no allow-list, no feed-only tier | Merged in fork 27 Oct |
| Fork #23 | Event start/end in UTC, LOCATED_AT edges, 12-month occurrence index, overrides, RSVP rules and counts, waitlist order, ratings 1 to 10 with rating_avg / rating_count on posts and Resources, sorting=rating, event_changed notifications. Routes: /v0/stream/events, /v0/event/{author}/{id}, …/attendees | Merged in fork 27 Oct |
| Replies, embeds, collection items on external URIs | A rating on a URL is counted. A plain reply to a URL is indexed but gets no reply edge, so it is not counted on the Resource; no reply/embed/collection feed lines yet | Open next Nexus step |
Pinakes: what exists
| Piece | Status |
|---|---|
Cards for external resources (schema.org types), aliases, groups and also_on, OSM places, external events and calendar occurrences, identifiers (isbn:, doi:, isrc:, mbid:, wikidata:…) | Built main 02989ee |
Search: q, type (several), near+radius, bbox, cluster, from/to, tags, reach, boost, facets, collapse=group; resolve previews; lookup; changes/lookup; MCP endpoint and /llms.txt | Built public API at 8092…/llms.txt, explorer |
Legacy app profiles (Loopky, Mapky, Eventky, Rooms, app.marketplace) with open_in | On main Mapky and Eventky are removed on the app-posts branch |
v1 app posts from the kind:"post" feed line: any namespace gets a card; music listening expires; listen has no card; social events never fetched | Code on branch v2/app-posts, no PR |
| Manifest engine, client declarations | Proposal |
@pubky/resources: URI normalisation, resource ids, the Nexus + Pinakes joins (hydrate) | Repo gillohner/pubky-resources, not on npm yet |
Pinakes ranks, Nexus hydrates
One detail for event screens: since the owner's decision of 26 October, Pinakes does not index social events. "Events near me" over both Pubky and external events is therefore two queries today: Nexus /v0/stream/events (time, tags, collection, author, following; no location filter) and Pinakes search for external events. Nexus stores LOCATED_AT edges to venue Resources, so a client can ask Pinakes for venues in an area and Nexus for their events, but there is no single "Pubky events in this bbox" query yet. See question 6.
7. Links between apps
All links between apps are plain URI references. Whether a link is possible depends on which positions a kind allows. The solid lines below are allowed by the current specs. The dashed red lines are in the ecosystem plan but have no position in the specs today.
What works today, per the specs
- Ratings on places, tracks, listings, events, links: a
ratingwith thatparent. Nexus counts it on the post or on the Resource of the URI (fork #23). - An event at a place:
locations[].uri. Nexus writes aLOCATED_ATedge to the place's Resource. - A song at an event: a note or reply with
parentthe event andembedthe song; or both in a collection. - A music session, a listen:
embedthe track. - A bookable listing: an
availabilitywithforthe listing. - A calendar mixing Pubky and external events, a list of places and routes, a playlist: a
collection. - A route along a trail:
embedthe OSM relation; waypoints are places. - Grouping across services: Pinakes
also_onshows the same song on Spotify and Apple Music, or one event on two platforms.
8. What pubky.app can build now and later
"Backend" below means the version a dev or staging pubky.app can run against: Nexus from the fork's fork/v1, Pinakes main. Production Nexus is upstream and has none of the fork work yet.
| Feature | Spec | Backend | Can pubky.app build it? |
|---|---|---|---|
Read and write social 1.0 objects at /pub/social/v1/ | 1.0.0-rc.1 | fork/v1 upstream #1129 open | Yes, against the fork. Migrator package exists for 0.x data. |
| Link cards in posts, compose-time previews | — | Pinakes resolve, lookup | Yes, now. |
| Tags on any link | 1.0 | fork Resource tags + feed (#1170 open upstream) | Yes, against the fork. |
| A thing's page: all its links, also on, tags from every site | — | Pinakes groups, also_on + Nexus by URI | Yes. Use @pubky/resources (not on npm yet) for the joins. |
| Search external resources: text, type, area, time, tags, people I follow | — | Pinakes | Yes, now. |
| Place panel: card, address, events here, tags | 1.1 places | Pinakes OSM, venue= | Yes for the card and tags. |
| Replies and comments on a place or any link, with counts | 1.0 | Open not counted on the Resource | Writes work; lists and counts wait for Nexus. |
| Ratings on places, links, posts | 1.1 | fork #23 | Yes, behind a flag until 1.1 is released. |
| Create events, RSVP, event card, recurrence, attendees | 1.1 | fork #23 | Yes, behind a flag. Use a packed build of the 1.1 branch. |
| Calendar view of events I'm going to | 1.1 | Not verified no "my RSVPs" filter on /v0/stream/events found | Partly: from my own RSVP replies, or a private collection. |
| Calendars as collections, with external events and feeds | 1.0 | fork collections; Pinakes occurrences | Yes; the client merges by start. |
| Ticketed events | 1.1 lock | Locks paykit-payment | Yes: teaser + guarded doc + paid lock. |
| Invite-only and approval events | 1.1 | Locks: signed-invite | Later. requested RSVPs work, gating does not. |
| Hard capacity, one-shot door scan | — | Locks | Later. Soft capacity and a client scan ledger work now. |
| Simple availability | 1.1 | No indexer | Writing and reading one user's post works (fetch from the homeserver). No discovery or counts. |
| Show app posts (routes, listings, sessions) as cards | sub-specs | Nexus generic Pinakes branch | Later, when v2/app-posts lands. |
| "Open in" another client | — | open_in legacy apps; client declarations | Read open_in now; switch to clients when it ships. |
| Publish pubky.app's own client declaration | Proposal | Proposal | Later. |
9. Open questions
Each question has the current recommendation. Where the owner already decided, it is not listed here.
| # | Question | Current recommendation |
|---|---|---|
| 1 | Events and listings cannot point at other things. The plan says an event can embed a song or a listing and a listing can reference an event, but event and listing both refuse parent and embed, and event links[] take https only. Do we add a field before 1.1 is released? | Decide before 1.1 is released: allowing a value later makes posts that 1.1 readers refuse. Until then, link through a reply or note (parent event, embed song) or a collection. If the card needs it, propose an optional embed on event in #207. |
| 2 | Replies, embeds and collection items on external URIs. A plain reply to an OSM URL is indexed but not linked or counted on the Resource; the feed has no reply/embed/collection lines. | Next Nexus step (plan item 2): count them on the Resource and emit the reserved feed kinds. Ratings already work. |
| 3 | App-post nodes in Nexus. Fork #22 keeps a Resource with namespace, kind, author and edges, and a namespace stream. The plan proposes to cut that to the feed line only and let Pinakes serve app-post queries. | The plan's cut. Tags, replies and ratings on an app post still land on its Resource by URI. pubky.app should not rely on /v0/stream/posts?namespace= until this is settled. |
| 4 | Who indexes availability? It is a social kind, so Pinakes dropped it; fork #23 indexes event, rsvp and rating only. | Nexus keeps the newest post per author per for and serves it by author and by for; clients compute slots. Until then pubky.app reads it from the homeserver. |
| 5 | RSVP to an external event. The spec allows any parent ("an answer to an external event page is the same post"); Nexus counts RSVPs only on indexed Pubky events. | Keep RSVPs for Pubky events. For a Luma or Meetup page, use a bookmark or a private calendar collection. Revisit if people ask for "going" on external events. |
| 6 | Pubky events by area. Nexus has no location filter and Pinakes no longer sees social events. | Two calls: Pinakes for venues in the area, Nexus for events located at them. Measure on real data before adding anything. |
| 7 | When is social 1.1 released? #207 is a draft; the crate is 1.1.0-alpha.1 and unpublished. | Build event features behind a flag against a packed tarball of the branch (the README describes it). Release after questions 1 and 4 are answered. |
| 8 | npm packages for sub-specs. Only the Rust crates exist. pubky.app needs TS validation for the kinds it renders. | Optional per sub-spec; pubky.app adds npm packages for the sub-specs it shows, held to the crate's vector files. |
| 9 | Which app writes the Shop links? Pinakes' marketplace profile opens pubky.app/shop/…; the plan names shop.pubky.app. | Settle the host; then each client publishes its own declaration and the hard-coded links go. |
| 10 | A "my events" stream. No Nexus route was found that returns the events a user RSVP'd to. | Start client-side from the user's own RSVPs; add a going filter to /v0/stream/events if that is too slow. |
10. Sources
| What | Where, version |
|---|---|
| Direction and decisions | The owner's ecosystem plan (27 Oct), the owner decisions of 24 to 27 Oct (later ones win), and the sub-spec proposal with its owner decisions (27 Oct). Internal notes, not linked. |
| Social specs | pubky/pubky-social-specs: tag v1.0.0-rc.1; branch v1.1-subspecs @ 8e7f1ad (draft #207): docs/SPEC_V1.1.md, docs/SUBSPECS.md, src/models |
| Sub-spec crates | pubky-maps-specs @ f4b0eb1, pubky-marketplace-specs @ fc487a3, pubky-events-specs @ 1344c17 (not pushed yet); gillohner/pubky-music-node crates/pubky-music-specs on app/social-rating @ 0ee909f (#127, draft) and app/social-v1-music @ dd8a24c (#111, draft) |
| Nexus | Upstream pubky/pubky-nexus: #1170 (open), #1129 (open), #1161 (merged into #1129), #1165 (draft). Fork gillohner/pubky-nexus fork/v1 @ 0a5a14a (#22, #23 merged): docs/app-kinds.md, docs/social-events.md, docs/resource-changes.md, docs/fork-v1.md |
| Pinakes | pubky/pinakes main 02989ee: docs/api.md, docs/pubky-apps.md, docs/design.md; branch v2/app-posts @ d8e4ceba; gillohner/pubky-resources; live API /llms.txt |
| Designs | Pubky Events (14 Oct, partly superseded), Pubky Maps client plan (14 Oct, partly superseded), Locks for events (15 Oct). Internal notes, not linked. |
Two design notes are older than the current decisions. The Events design still says availability is per app, ratings are 0 to 9, and Pinakes gets an event feed line. The Maps plan still has Nexus indexing route with a bbox stream. This page follows the later decisions: availability is social, ratings are 1 to 10, Nexus indexes social events itself, and route is a maps sub-spec kind that Nexus treats like any app post.