Vision
Grow yap from a minimal chat into a personal / family Telegram replacement — your messages on your pod (durable, identity-anchored) delivered live over nostr relays (cross-device, NAT-traversing). Same build-free web codebase ships as web → desktop → Android.
Scope note: we're aiming at the personal/family model first (your devices + people who'll accept npub-based contacts + your own relay & pod). Mass-market, phone-number onboarding is a separate, much bigger bet — explicitly out of scope here.
Shipped (v1)
Phase 1 — durable & reliable messaging
Phase 2 — notifications (the "feels like an app" unlock)
Phase 3 — identity, contacts, privacy
Phase 4 — media & richer messages
Phase 5 — desktop app
Phase 6 — Android app
Later / stretch
Key constraints & decisions
- Mixed content: browsers block an
https:// page from opening an insecure ws:// socket. So a plain-ws:// LAN relay only works when yap is served over http (local jspod / the desktop shell). wss://melvin.me works from gh-pages anywhere. → drives the "bundled local relay in the desktop shell" approach (Phase 5).
- Push gateway (Phase 2) is the single biggest lift toward the Telegram feel and the only piece that isn't pure client-side.
- Identity model (Phase 3): per-device keys are great for "my gadgets"; Telegram users expect one account across devices. Decide deliberately — likely support both.
- Encryption: DMs first (tractable); group E2E later.
Suggested order
Phase 1 (durability) and Phase 2 (push) give the biggest jump in "real app" feel; Phase 5 (desktop + bundled relay) makes the local/LAN story turnkey. Each phase can ship independently behind the existing room UI.
Vision
Grow
yapfrom a minimal chat into a personal / family Telegram replacement — your messages on your pod (durable, identity-anchored) delivered live over nostr relays (cross-device, NAT-traversing). Same build-free web codebase ships as web → desktop → Android.Scope note: we're aiming at the personal/family model first (your devices + people who'll accept npub-based contacts + your own relay & pod). Mass-market, phone-number onboarding is a separate, much bigger bet — explicitly out of scope here.
Shipped (v1)
meeting:LongChat+flow:Message) stored/read as JSON-LD via content negotiation; read + post + poll(4s)kind:42events keyed by a#ttag, live over the relay socket, no pod/login neededwss://melvin.me/relay(editable via Device),nostr:<name>rooms +?chat=<url>deep linksPhase 1 — durable & reliable messaging
LongChathistory on the podsince/limit) + paginationPhase 2 — notifications (the "feels like an app" unlock)
Phase 3 — identity, contacts, privacy
Phase 4 — media & richer messages
schema:ReactAction/ NIP-25), edit/delete, replies/threadsPhase 5 — desktop app
Phase 6 — Android app
Later / stretch
Key constraints & decisions
https://page from opening an insecurews://socket. So a plain-ws://LAN relay only works when yap is served over http (local jspod / the desktop shell).wss://melvin.meworks from gh-pages anywhere. → drives the "bundled local relay in the desktop shell" approach (Phase 5).Suggested order
Phase 1 (durability) and Phase 2 (push) give the biggest jump in "real app" feel; Phase 5 (desktop + bundled relay) makes the local/LAN story turnkey. Each phase can ship independently behind the existing room UI.