Please report security issues privately through
GitHub private vulnerability reporting
rather than opening a public issue. Include reproduction steps and the affected
surface (PWA, Cloudflare Functions backend, or the native Android/iOS app —
the native client lives in the flutter directory, which accepts reports
the same way).
We aim to acknowledge reports promptly and to credit reporters in release notes unless they prefer otherwise.
- Private messages and group chats are end-to-end encrypted (NIP-17/NIP-44/ NIP-59); relays and the D1 storage layer only ever hold ciphertext. Findings that break that property are the highest-value reports we can receive.
- Public channels (kinds 20000/23333) are intentionally unencrypted.
- The
/api/proxyendpoint is intentionally unauthenticated (it exists to keep user IPs away from third-party servers); reports about its abuse potential should focus on bypasses of its SSRF, origin, or content-type controls. Request-rate abuse is handled by Cloudflare at the edge rather than in the worker, so volumetric findings belong there.
The Cloudflare Functions backend vendors its crypto primitives
(secp256k1/schnorr, SHA-256/HMAC/HKDF, NIP-44) in functions/api/_shared.js
rather than importing them, so dependency scanners will not flag upstream
advisories automatically. Maintainers: when a security advisory lands for
@noble/curves, @noble/hashes, or nostr-tools, re-vendor from the patched
release. The provenance header at the top of _shared.js records what to
compare against.