Pubky · specs overview · for the pubky.app frontend team

Social specs, sub-specs and who indexes what

Gil Lohner · 27 October 2026 · state of the repos on that day · about 20 minutes to read

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.

Built released, or merged on main Merged in fork in 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

APPS INDEXERS SPECS HOMESERVER pubky.app social, external resources, events, availability shop.pubky.app listings, drops, shops, bookings maps.pubky.app places, routes, ratings on places calendar.pubky.app optional: calendars, private events, availability music nodes self-hosted, one per user: listens, sessions, playlists Nexus (minimal) social graph: posts, tags, follows, collections, counts social 1.1: events, occurrences, RSVPs, ratings app posts: generic, one Resource per URI, no content resource views by URI · resource reference feed Pinakes external resources → typed cards (schema.org) places, external events, groups / also on app-post cards from sub-spec manifests search: text, type, area, time, tags, reach reference feed (URIs only) hydrate: counts, tags, streams rank: search, cards pubky-social-specs 1.0 (released 1.0.0-rc.1): profile, posts, tags, follows, bookmarks, collections, files, feeds, mutes, post envelope 1.1 (draft PR #207): event, rsvp, rating, availability, places Sub-spec crates (in each app's repo) pubky-maps-specs: route pubky-marketplace-specs: listing, drop, shop pubky-music-specs: listen, listening, session Nexus validates with it Pinakes reads manifests (proposal) /pub/social/v1/… profile, posts, tags, follows, files /pub/<ns>/v1/posts/… app kinds, e.g. maps, music, marketplace /priv/… owner only, never indexed Locks guarded docs read through the Lock Server by entitled readers events stream (/pub only) fetches app posts it was told about the web, OSM, event platforms, APIs Apps write straight to the user's homeserver. Indexers never write user data.
Figure 1. The four layers. Nexus and Pinakes never share ids: a client holds URIs and asks both.

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.

1. Is it a tag, reply, embed, bookmark, collection, file or lock? 2. Must other apps read it, or Nexus compute on it (counts, times, notifications)? 3. Is it a social kind plus extra data only your app needs? 4. Is it a public or shareable record that only your app's readers understand? 5. Is it private app state: settings, caches, credentials, sync state, media files? nononono yesyesyesyesyes Use the shared primitive. Never copy it. A playlist is a social collection; a saved place is a bookmark. Social kind: a draft PR on pubky-social-specs. event, rsvp, rating, availability (1.1). Nexus indexes it. The social kind + ext.<ns> on the post. Marketplace review = rating + ext.marketplace attestation. Sub-spec kind under /pub/<ns>/v1/posts/ route; listing, drop, shop; listen, listening, session. App data under /priv/<app domain>/ No spec, never indexed. e.g. /priv/pubky.music/files/ Rule of thumb: if two apps would each write their own version of the same thing, it is social or a primitive. Music's own "review" kind was dropped for social rating for this reason.
Figure 2. The decision rules from the sub-spec proposal (27 October), which follow docs/SUBSPECS.md on the 1.1 branch.

Rules a sub-spec follows

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.

MemberWhat
kindThe kind name. A name the reader does not know reads as Unknown and fails validation.
contentA 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.
parentThe thing this replies to. Any URI the reference gate accepts, depending on the kind.
embedA quoted resource, Pubky or web.
attachments[]{uri, alt?, name?}; always present, [] when empty. The cover is attachments[0].
lockThe 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

ObjectPathPurpose and fields
Profile/pub/social/v1/profile.jsonname, bio?, image?, links?, status?
Post/{pub,priv}/social/v1/posts/{id}/{editId}.jsonThe 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}.jsonPrivate.
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

KindContent
note (default), image, video, link, filePlain 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:

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-specNamespaceKindsUses instead of own copiesStatus
pubky-maps-specs 0.1.0mapsrouterating on places, collection for trip plans, tags, bookmarks, replies, event at a place, photos in attachmentsDraft spec local crate
pubky-marketplace-specs 0.1.0marketplacelisting, drop, shopreview = rating + ext.marketplace; watchlist = bookmarks; keywords = tags; digital goods = lockDraft spec for the marketplace team to adopt; their live data is still /pub/app.marketplace/v1/
pubky-music-specs 0.1.0musiclisten, listening, sessionplaylists = collection + ext.music; review → rating; tags, bookmarks, commentsDraft spec pubky-music-node#111 and #127 (both drafts)
pubky-events-specseventsnoneeverything is social: event, rsvp, availability, collection, ratingDecided 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

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.

KindContentMeaning
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.

{ "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.

/pub/ — public anyone can read; Nexus and Pinakes index it social/v1/: profile, posts, tags, follows <ns>/v1/posts/: route, listing, listen… a teaser post with lock e.g. an invite-only event: title, date, rough area; the rest is guarded availability: coarse public schedule clients/v1/client.json (proposal) /priv/ — owner only never indexed; the owner's clients read it social/v1/: bookmarks, mutes, feeds social/v1/posts/: private events, calendars <ns>/v1/posts/: e.g. private listens <app domain>/: app data (no spec) app.locks/content/… the guarded document: exact venue, meeting link, door details Lock Server checks a criterion: payment, (planned) signed invite, (planned) capacity then proxies the read lock URI reads for entitled reader client merges teaser + guarded doc Private: /priv only. Semi-private (invite-only, ticketed, a shared calendar): a /pub teaser with lock + the guarded document behind Locks. A public post may never reference a private object; the reference gate refuses it.
Figure 3. Three tiers. The guarded document path follows the Locks design for events (15 October).

Locks for events

FlowHowStatus
Paid ticketTeaser 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 checkOrganiser's client lists its own /priv/app.locks/proofs/; a scanner keeps a client-side ledger of scans.Works today client work
Invite-only, approvalcreator-grant, then a signed-invite criterion bound to the invitee.Planned Locks team, first
Hard capacityissuance_policy.capacity enforced at admission.Planned second
One-shot admissionscanned_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

NexusPinakesClients
ReadsHomeserver events, /pub only; the social specsNexus's reference feed; the web and APIs; app posts it is told aboutBoth indexers, and the homeserver for full posts
Social 1.0Posts, profiles, follows, tags, collections (fork fork/v1; upstream #1129 open)Never fetches /pub/social/ or /pub/pubky.app/—
Social 1.1event, rsvp, rating natively (fork #23). availability: not indexedNot social events. External events: pages, feeds, NIP-52Merge Pubky events and external events in calendars
External resourcesResource node per URI: tags, ratings; views by URI; the reference feed (#1170)Typed cards, groups / also on, places, occurrences, searchJoin by URI
App postsGeneric: 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 codeNoneProfiles today; manifests proposedThe app's own

Nexus: what exists

PieceWhatStatus
Upstream #1170GET /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, #1161Move to pubky-social-specs; #1161 (the N2 translator) is merged into the #1129 integration branch, not mainOpen upstream
Fork fork/v1Social v1 indexing through the translator (posts, profiles, follows, tags, collections). Pins social 1.1 draft 8e7f1adMerged in fork (fork PR #21 to fork main still open)
Fork #22Generic app posts for every namespace; no allow-list, no feed-only tierMerged in fork 27 Oct
Fork #23Event 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}, …/attendeesMerged in fork 27 Oct
Replies, embeds, collection items on external URIsA 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 yetOpen next Nexus step

Pinakes: what exists

PieceStatus
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.txtBuilt public API at 8092…/llms.txt, explorer
Legacy app profiles (Loopky, Mapky, Eventky, Rooms, app.marketplace) with open_inOn 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 fetchedCode on branch v2/app-posts, no PR
Manifest engine, client declarationsProposal
@pubky/resources: URI normalisation, resource ids, the Nexus + Pinakes joins (hydrate)Repo gillohner/pubky-resources, not on npm yet

Pinakes ranks, Nexus hydrates

pubky.app e.g. "events this weekend near me, by people I follow" Pinakes GET /v1/search?type=Event&near=… &from&to&reach=following&viewer=… ranked cards, each with its uri Nexus POST /v0/stream/resources/by_ids {uris} posts/by_ids, /v0/event/{author}/{id} counts, tags, my tags, RSVPs, ratings Author's homeserver GET pubky://{author}{version path} full post, validated with the spec crate Other start: a Nexus screen a feed or a profile starts at Nexus; Pinakes POST /v1/resources/lookup names the links it contains 1 2 3 1 · rank: what, where, when 2 · hydrate by URI 3 · on open: fetch the post At most three calls between the two indexers. Never ids: each has its own; join by URI. @pubky/resources computes the same normalised URI.
Figure 4. A filtered or sorted question goes to Pinakes first; a screen that starts from Pubky data goes to Nexus first. Pubky events are ranked by Nexus's own event stream; Pinakes ranks external events.

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.

event (social 1.1) /pub/social/v1/posts/… place OSM URL or geo: pin song external music URL listing /pub/marketplace/v1/posts/… music session /pub/music/v1/posts/… route /pub/maps/v1/posts/… collection calendar, playlist, any list rating parent = any thing note / reply parent + embed availability locations[].uri embed (the track) embed waypoints[].uri for parent parent items[].uri items items parent embed event embeds a song? event embeds a listing? listing → event? Black: a position the current kinds allow. Red dashed: in the ecosystem plan, but event and listing refuse parent and embed and have no other field for it (question 1).
Figure 5. Links between apps. Ratings, tags, bookmarks and collections work on every node, because they take any URI.

What works today, per the specs

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.

FeatureSpecBackendCan pubky.app build it?
Read and write social 1.0 objects at /pub/social/v1/1.0.0-rc.1fork/v1 upstream #1129 openYes, against the fork. Migrator package exists for 0.x data.
Link cards in posts, compose-time previews—Pinakes resolve, lookupYes, now.
Tags on any link1.0fork 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 URIYes. Use @pubky/resources (not on npm yet) for the joins.
Search external resources: text, type, area, time, tags, people I follow—PinakesYes, now.
Place panel: card, address, events here, tags1.1 placesPinakes OSM, venue=Yes for the card and tags.
Replies and comments on a place or any link, with counts1.0Open not counted on the ResourceWrites work; lists and counts wait for Nexus.
Ratings on places, links, posts1.1fork #23Yes, behind a flag until 1.1 is released.
Create events, RSVP, event card, recurrence, attendees1.1fork #23Yes, behind a flag. Use a packed build of the 1.1 branch.
Calendar view of events I'm going to1.1Not verified no "my RSVPs" filter on /v0/stream/events foundPartly: from my own RSVP replies, or a private collection.
Calendars as collections, with external events and feeds1.0fork collections; Pinakes occurrencesYes; the client merges by start.
Ticketed events1.1 lockLocks paykit-paymentYes: teaser + guarded doc + paid lock.
Invite-only and approval events1.1Locks: signed-inviteLater. requested RSVPs work, gating does not.
Hard capacity, one-shot door scan—LocksLater. Soft capacity and a client scan ledger work now.
Simple availability1.1No indexerWriting and reading one user's post works (fetch from the homeserver). No discovery or counts.
Show app posts (routes, listings, sessions) as cardssub-specsNexus generic Pinakes branchLater, when v2/app-posts lands.
"Open in" another client—open_in legacy apps; client declarationsRead open_in now; switch to clients when it ships.
Publish pubky.app's own client declarationProposalProposalLater.

9. Open questions

Each question has the current recommendation. Where the owner already decided, it is not listed here.

#QuestionCurrent recommendation
1Events 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.
2Replies, 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.
3App-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.
4Who 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.
5RSVP 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.
6Pubky 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.
7When 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.
8npm 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.
9Which 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.
10A "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

WhatWhere, version
Direction and decisionsThe 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 specspubky/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 cratespubky-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)
NexusUpstream 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
Pinakespubky/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
DesignsPubky 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.