aboutsummaryrefslogtreecommitdiffstats
path: root/src/marmot-client.js
Commit message (Collapse)AuthorAgeFilesLines
* White Noise groups reach every device of an accountAdam Soltys8 days1-13/+56
| | | | | | | | | | | | | | | An invitation adds all of a person's fresh KeyPackages (one per slot, at most ten) instead of one, and where our account is an admin a device that finds a sibling's KeyPackage not yet in a group adds it, so the Welcome reaches the other device through our own inbox. These are the same-account rules Marmot's multi-device direction marks as valid today; the device group and pairing it plans are not here. Verified against MDK (wn): a group with two coinos leaves of one npub plus a wn member, all three reading and writing (tools/marmot-multidevice-test.js). marmotClient takes an injectable store for tests. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01YRC6aKhwAud231ot9FPmhi
* White Noise attachments (encrypted-media-v2)Adam Soltys12 days1-0/+12
| | | | | | | | | | | | | | | | | | | Pictures and files now travel in White Noise groups and direct chats, both ways. A file is sealed under the group's media secret for the epoch its message goes out in (MLS exporter "encrypted-media" -> HKDF -> ChaCha20-Poly1305, AAD bound to hash, type and name), uploaded to Blossom, and sent as a kind 9 with a v2 imeta tag. A commit landing mid-upload moves the epoch, so the file is sealed again rather than sent under a stale key. Receivers keep each epoch's media secret for as long as a message from it is in the log, so older pictures still open. Groups founded here now carry and require marmot.group.encrypted-media.v2 (blossom-v1 on blossom.ditto.pub and nostr.download). Checked against MDK's wn: our pictures decrypt in wn, wn's in ours, and wn uploads into our groups by our policy. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* White Noise shows a coinos user's real name: the profile goes to its relays tooAdam Soltys12 days1-15/+25
| | | | | | | | | A coinos account appeared in White Noise as "Rapid Flamingo": with no kind 0 on its relays the app makes a name up. The profile now travels with the relay lists (the account's own signed events, unchanged), and is sent again when it changes, checked at boot and while Chat is open. Co-Authored-By: Claude Fable 5.1 <[email protected]>
* White Noise can find a coinos account: relay lists go to its directory relaysAdam Soltys12 days1-1/+25
| | | | | | | | | | | The Android app said a coinos user "isn't on White Noise yet" although their KeyPackage was published: MDK will not invite an account whose kind 10002 and 10050 lists it cannot find, and it looks on relay.eu/us.whitenoise.chat and purplepag.es, where coinos never wrote. The client now passes the account's already-signed lists along to those relays (no signer needed, nothing rewritten), weekly and until both exist. Co-Authored-By: Claude Fable 5.1 <[email protected]>
* Group chats notice a relay that dropped their subscriptionAdam Soltys12 days1-7/+16
| | | | | | | | | A group that misses a commit is stuck until it hears it, and a group founded by White Noise can live on a single relay. Its subscriptions now report a close to the chat watchdog, and one made while a relay was being skipped as dead is rebuilt when that relay comes back. Co-Authored-By: Claude Fable 5.1 <[email protected]>
* Group chats live on relays White Noise will dialAdam Soltys12 days1-2/+3
| | | | | | | | MDK refuses relay.damus.io and relay.nostr.band outright (its retired hosts), so a group founded here must not name them: relay.primal.net takes damus's place. The UI test can also run against a deployed site. Co-Authored-By: Claude Fable 5.1 <[email protected]>
* White Noise (Marmot) chats: MLS group messaging in native JSAdam Soltys12 days1-0/+370
The Chat tab now speaks the protocol the White Noise app speaks, beside Concord communities and NIP-17 DMs, without anyone having to pick one: - A two-person group with no name is a direct message. It lands in the same thread as that person's NIP-17 messages, and a reply goes back the way their last message came. A first message goes by White Noise only to someone whose KeyPackage another app published (a coinos wallet reads NIP-17 on all its devices; an MLS group reaches one). - Groups get rows of their own in the Messages list, a New group button, an invitation card, members, add/remove/rename for admins, leave. - Every wallet publishes a KeyPackage (kind 30443), so it can be invited. src/mls.js is RFC 9420 for ciphersuite 0x0001 on the noble libs (no WebAssembly), with the extensions-draft pieces Marmot needs (app_data_dictionary, app_data_update, app_ephemeral, self_remove). src/marmot.js is the Marmot layer: components, the account identity proof, the 30443/444/445 event shapes and the group engine (publish-before-apply, retained epochs, same-epoch tie-break). State is per device, in IndexedDB (src/marmot-store.js). The whole stack is one lazy chunk (72 KB). Tested against the RFC 9420 vectors (tools/mls-vectors-test.js) and against the Rust reference, MDK's wn CLI, at the protocol level (tools/marmot-interop-test.js) and through the real UI (tools/marmot-chat-test.js). Not yet: attachments in these chats, push for group messages, the app-message witness boost in fork selection. Co-Authored-By: Claude Fable 5.1 <[email protected]>