mirror of
https://github.com/block/buzz.git
synced 2026-11-02 07:22:55 +00:00
Replies in encrypted serverless channels (DM/private) were falling through to the plaintext path — a privacy leak: the reply content went to public relays as a cleartext kind-9. The encrypt branch was gated on parent_event_id.is_none(), so only top-level messages were gift-wrapped. Fix: encrypt replies too. The NIP-10 thread tags now live INSIDE the rumor (the encrypted inner event), so threading is preserved without leaking the reply. The thread root is resolved locally from decrypted messages (the parent rumor isn't queryable in plaintext on the relay) and passed via a new root_event_id command arg. Proven by encrypted_threaded_reply_is_wrapped_and_preserves_thread: asserts the wire event is kind-1059 (not plaintext kind-9), content never leaks, and the decrypted rumor carries the NIP-10 root + reply e-tags.
Sprout
Desktop chat shell with:
- Tauri + React + TypeScript + Vite
- Tailwind CSS
- shadcn/ui-ready shared components
- Biome (lint/format/check)
- Feature-driven frontend structure
Scripts
pnpm dev- run the web frontendpnpm tauri dev- run the desktop apppnpm build- typecheck and build frontendpnpm typecheck- TypeScript checkspnpm lint- Biome lintpnpm format- Biome format (write)pnpm check- Biome check
Structure
src/shared- reusable app-wide code (ui,lib,styles)src/features- feature modules (vertical slices)src/app- top-level app composition