Feature: festival / venue aggregator view (NIP-51 list) #8
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Background
A "festival", "food court", "collective space", or "neighborhood"
is any context where a customer wants to browse and order across
multiple restaurants in one cart. The design rationale (see
docs/webapp-integration.md) commits us to emergent grouping:whoever runs the venue publishes a NIP-51 list event of restaurant
pubkeys; the webapp consumes that list and fans out per restaurant.
No central database, no central wallet, no server-side "festival"
entity inside the extension.
The current customer webapp module ships single-venue only —
/r/:slugresolves one restaurant. The cart store already keys byrestaurant_idso the data model is ready; this issue is only thediscovery + presentation layer.
Goals
/festival/:naddr(or/group/:naddr) that resolvesa NIP-51 addressable list event and renders a unified browse over
its restaurants.
Checkout opens N invoices in sequence, settling each via
WalletService.payInvoice(one bolt11 per restaurant)./quoteresponses across allrestaurants in the cart before opening any invoice.
KDS / print pipeline runs independently).
NIP-51 list event. Probably out of scope of this issue — list
authoring can live elsewhere; this issue is consumer-only.
Open design questions
kind 30000(follow set) is generic;kind 30002(relay set) andkind 30003(bookmark set) allparameterized-replaceable; we may want a custom kind in the
30000–39999range so curators can distinguish "festival lists"from regular follow sets. Reference: NIPs at
~/dev/refs/repos/nostr-protocol/nips/51.md./festival/:naddr(NIP-19 addressable identifier)vs
/festival/:hexIdvs operator-defined slug —naddr1...ismost protocol-pure but ugly. May want both: addressable id under
the hood, optional human-readable slug indexed by a separate
registry event.
mid-cart. Best-effort sequential payment is fine; HODL invoices
are the harder atomic alternative (its own issue when we want
it).
LNbits instances, the webapp talks to N different
apiBaseUrls.Restaurant profile would need to carry its
api_basesomewhere— either added to the kind-0 metadata event or resolved per
restaurant from its
nostr_pubkeyvia an LNbits well-knownendpoint.
Acceptance criteria
/festival/:naddrroute resolves a NIP-51 list and rendersa header (curator name, list title) plus a per-restaurant
accordion or tabbed view.
sequentially with per-restaurant progress feedback.
/orders/:idtracker.
is informed clearly which restaurants completed and which
didn't, with retry / refund affordances.
docs/webapp-integration.mdupdated; new notedocs/festival-aggregator.mdadded under the Obsidian vaultand indexed from
docs/index.md.Out of scope
api_baseperrestaurant is configurable for now).
Files / surfaces (rough)
~/dev/webapp/src/modules/restaurant/views/FestivalPage.vue(new)~/dev/webapp/src/modules/restaurant/composables/useFestival.ts(new)~/dev/webapp/src/modules/restaurant/services/RestaurantNostrSync.ts(extend to subscribe to multiple authors)
~/dev/webapp/src/modules/restaurant/stores/cart.ts(multi-restaurant code paths already wired in v1; just exercise them)
~/dev/shared/extensions/restaurant/docs/webapp-integration.mdSee also
layer concern but related Nostr-native trajectory
References
~/dev/refs/repos/nostr-protocol/nips/51.md~/dev/shared/extensions/restaurant/docs/webapp-integration.md(multi-restaurant cart flow rationale)