Chatelet guest booking UI — standalone app (Nostr-native) #141

Open
opened 2026-07-19 22:14:23 +00:00 by padreug · 0 comments
Owner

Guest-facing booking UI for the aiolabs/chatelet extension (Nostr-native room rentals — now catalog-published at v0.1.0). Backend stays in the extension repo; this is the webapp client.

Label: suggest creating an app:chatelet label (per the one-per-standalone-app convention — restaurant/events/tasks each have one). I couldn't create it via MCP; filed with enhancement for now.

Shape — standalone app pattern

Per webapp/CLAUDE.md (like activities/restaurant), a second Vite entry:

  • HTML entry: chatelet.htmlsrc/chatelet-app/main.ts
  • App shell: src/chatelet-app/{main.ts, App.vue}
  • Vite config: vite.chatelet.config.ts (own build target + PWA/service-worker scoping)
  • npm scripts: dev:chatelet + the demo-host roll-up

Data flow — over Nostr, no HTTP

Talks to the extension over the surface we already built (client-agnostic by design):

  • Discover: chatelet_room_list / chatelet_room_get RPCs (kind-21000).
  • Availability: chatelet_availability RPC, or the public kind:22000/22001 query/response (either works; the public kind is the fully client-agnostic path).
  • Book: chatelet_booking_request → returns a BookingQuote (bolt11); pay the invoice; poll chatelet_booking_get until confirmed.
  • Guest identity: the guest's own signer (bunker or client-side) signs the kind-21000 RPCs — sender_pubkey is their identity; the extension never holds guest keys.
  • Receipts: guest receives the kind:30078 reservation object + the NIP-17 gift-wrapped check-in DM; the guest's client decrypts them (their custody, client-side).

Scope / acceptance

  • Browse active rooms (photos, price, amenities, location).
  • Pick dates → availability check → quote.
  • Request booking → show bolt11 / Lightning pay → confirmation on settle.
  • Show the guest's reservations (decrypt kind:30078) + check-in details.
  • Operator admin stays out of scope (extension's own page / future).

Notes

  • Read webapp/CLAUDE.md first — modular DI architecture, Shadcn forms, mobile file-input defenses, PWA/service-worker scoping for standalone apps.
  • Depends on: a reachable chatelet extension over Nostr, and a bunker-backed operator account for the encrypted flows (reservation + check-in DM) per aiolabs/lnbits ADR-0001.
  • Reference implementations: the activities and restaurant standalone apps.
Guest-facing booking UI for the **`aiolabs/chatelet`** extension (Nostr-native room rentals — now catalog-published at v0.1.0). Backend stays in the extension repo; this is the webapp client. > **Label:** suggest creating an `app:chatelet` label (per the one-per-standalone-app convention — restaurant/events/tasks each have one). I couldn't create it via MCP; filed with `enhancement` for now. ## Shape — standalone app pattern Per `webapp/CLAUDE.md` (like `activities`/`restaurant`), a second Vite entry: - **HTML entry:** `chatelet.html` → `src/chatelet-app/main.ts` - **App shell:** `src/chatelet-app/{main.ts, App.vue}` - **Vite config:** `vite.chatelet.config.ts` (own build target + PWA/service-worker scoping) - **npm scripts:** `dev:chatelet` + the demo-host roll-up ## Data flow — over Nostr, no HTTP Talks to the extension over the surface we already built (client-agnostic by design): - **Discover:** `chatelet_room_list` / `chatelet_room_get` RPCs (kind-21000). - **Availability:** `chatelet_availability` RPC, or the public `kind:22000/22001` query/response (either works; the public kind is the fully client-agnostic path). - **Book:** `chatelet_booking_request` → returns a `BookingQuote` (bolt11); pay the invoice; poll `chatelet_booking_get` until `confirmed`. - **Guest identity:** the guest's own signer (bunker or client-side) signs the kind-21000 RPCs — `sender_pubkey` is their identity; the extension never holds guest keys. - **Receipts:** guest receives the `kind:30078` reservation object + the NIP-17 gift-wrapped check-in DM; the guest's client decrypts them (their custody, client-side). ## Scope / acceptance - [ ] Browse active rooms (photos, price, amenities, location). - [ ] Pick dates → availability check → quote. - [ ] Request booking → show bolt11 / Lightning pay → confirmation on settle. - [ ] Show the guest's reservations (decrypt `kind:30078`) + check-in details. - [ ] Operator admin stays out of scope (extension's own page / future). ## Notes - **Read `webapp/CLAUDE.md` first** — modular DI architecture, Shadcn forms, mobile file-input defenses, PWA/service-worker scoping for standalone apps. - **Depends on:** a reachable chatelet extension over Nostr, and a bunker-backed operator account for the encrypted flows (reservation + check-in DM) per `aiolabs/lnbits` ADR-0001. - Reference implementations: the `activities` and `restaurant` standalone apps.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
aiolabs/webapp#141
No description provided.