Built for two kinds of users — people who treat privacy as a discipline (screenshot blocked, disappearing messages that actually disappear, locked attachments) and Solana digital-asset communities (non-custodial wallet, on-chain marketplace, revenue-sharing channels). Signal Protocol cryptography, on-device key custody, zero plaintext on the server.
Footprints in fresh snow vanish with the next gust of wind.
So should the trail of your messages, your files, your identity.
Centralized platforms keep failing in the same direction — your data leaked, your earnings deleted, your audience held hostage. SnowChat is the opposite premise: cryptographic control returned to whoever owns the message and whoever creates the value.
Major chat platforms keep getting breached — Discord 2024, Telegram metadata cooperation cases, repeated cloud-side leaks. As long as the server can read your message, someone else eventually will.
SnowChat answer · The server literally cannot read your messagesTensor removed creator royalties from its marketplace in 2024 — entire creator economies erased by a single platform decision. Whoever owns the venue owns the rules.
SnowChat answer · Creator royalties enforced on Solana, not by a platform policyBuild a community on someone else's chat server, get deplatformed, lose all of it. The channel is the asset; the host should not be allowed to repossess it.
SnowChat answer · Encrypted channels with portable identity — your community moves with youNo crypto jargon in your face. The complexity lives inside the protocol — the surface is just chat, wallet, and a built-in NFT marketplace. Below are unmodified captures from the production build.
SnowChat ships a clean-room Pure Dart implementation of the Signal Protocol — no platform channels, no opaque native blobs. Every cryptographic primitive is auditable Dart source.
Extended Triple Diffie-Hellman bootstraps a new session. Pre-keys hosted server-side allow asynchronous first contact without ever revealing a long-term private key.
x25519 · ed25519
Every message advances both a DH ratchet and a chain ratchet. Past sessions cannot be decrypted from a future compromise; future sessions cannot be decrypted from a past one.
HKDF · HMAC-SHA256
Group messages encrypt once and fan out to N members in O(1). SKDM (Sender Key Distribution Messages) ride inline with each group message to prevent distribution loss.
Signal Hybrid · 5-generation cache
For 1:1 and group messages, the server stores no sender identifier on the row. Ownership verifiable via HMAC, but operator-side peek of "who sent what" is blocked at the DB layer.
senderId = NULL + senderHash
Every file is sealed with XSalsa20-Poly1305 before upload. Filenames, mimetypes, and content all live inside the E2EE payload — the server only sees encrypted blobs and their size.
XSalsa20-Poly1305
The local Signal session database is sealed with a HKDF-derived key, kept in flutter_secure_storage (iOS Keychain / Android Keystore). No plaintext fallback. Ever.
SecretBox · Keychain
Both Android FLAG_SECURE and iOS background-snapshot blocking are active by default. Screenshots, screen recordings, and the iOS app-switcher snapshot all render black for any view that contains private data.
iOS is best-effort — Apple does not allow third-party apps to fully block screen captures the way Android can. And no software setting can prevent a second device pointed at your phone. We tell you the limits instead of pretending they don't exist.
⚠ Out-of-band photos with another camera cannot be prevented — that's a hardware limit, not a software bypass.| Aspect | Server knows | Server does NOT know |
|---|---|---|
| Text messages | Ciphertext only — cannot decrypt | Plaintext content |
| File body | XSalsa20-Poly1305 ciphertext blob | Original file, filename, mimetype |
| File decryption key | — | fileKey lives inside the E2EE payload |
| Session store | — | SecretBox-encrypted on disk |
| Disappearing TTL | Bucketed hint (e.g. <5m) |
Precise expiration timestamp |
| Sealed sender ID (1:1, group) | HMAC ownership token only | Plain sender userId at the DB row |
| Group name | Ciphertext blob (Phase 8.8 GMK) | Plaintext group name |
Cryptography is the floor, not the ceiling. SnowChat layers user-controlled deletion, OS-level capture blocking, and platform-level forensic resistance on top of the Signal Protocol — so the message disappears even when the device is lost, someone tries to screenshot, or the recipient tries to exfiltrate the file.
Per-thread TTL (5 minutes, 1 hour, 1 day, 7 days, custom). Both sides delete on the same wall clock — the server only sees a coarse bucket hint, never the precise expiration. Disappears means gone from disk, not just hidden from the UI.
Bucketed TTL · dual-side sync
Files sent inside a disappearing thread cannot be downloaded, saved to gallery, shared, or forwarded. The viewer renders inside SnowChat's process and deletes the decrypted blob when the TTL expires. PDFs use an in-app PDFKit viewer instead of routing through external apps.
In-app viewer · no Save/Share
Always on. Android FLAG_SECURE blocks both manual screenshots and the recent-apps thumbnail. iOS background-snapshot blocking renders the chat black in the app switcher. Settings setting visible to the user — no hidden toggles.
FLAG_SECURE · iOS snapshot block
The server doesn't store sender identity at the row level. senderId = NULL, ownership verified via HMAC. Operator-side "who sent what" peek blocked at the DB layer; full forensic delivery-token transition planned (see roadmap).
senderId NULL · HMAC ownership
No phone number. No email. No PII at registration. Your identity is a 24-word BIP-39 phrase derived locally — recoverable on any device, untraceable from any account directory. Server has nothing to hand over to a directory subpoena.
BIP-39 · 24 words · zero PII
Android allowBackup="false" and fullBackupContent="false" opt the app out of Google Drive backup entirely. iOS Keychain entries marked non-syncable. Lose your phone — lose your messages. Lose your recovery phrase — lose your wallet. There is no copy on someone else's server.
Android backup off · iOS Keychain local
SnowChat channels aren't just group chats — they're communities you can build, govern, and earn from. Members gather over Sender Key group encryption (O(1) fan-out, server sees only ciphertext), govern through cryptographically-signed roles (the platform can't reassign anyone), and share in on-chain marketplace revenue (50% of fees flow back to the channel). The platform is the relay; the members hold the keys.
Encrypt a group message once, server delivers it to N members in O(1). Signal Hybrid pattern with inline SKDM (Sender Key Distribution Message) prevents key distribution loss when new members join mid-conversation.
Sender Key · SKDM inline
The group's display name is sealed with a Group Metadata Key (GMK) shared only among members. The server stores the encrypted blob — operators see encryptedName: xKj9..., not "TEST CHANNEL".
Phase 8.8 · GMK rotation
Owner, Moderator, Member. Role transitions are signed by the existing owner and enforced cryptographically — the server can't grant or revoke roles, only relay the signed transitions. Moderation lives with the community, not the host.
Ed25519 signed roles
Channels that host NFT listings earn 50% of every marketplace fee — split on-chain by a PDA program, not by a platform policy. A creator economy that survives the platform owner because the rule lives on Solana.
PDA fee split · 50/50
SnowChat ships with a non-custodial Solana wallet derived from your recovery phrase via SLIP-0010 — the same hierarchical-deterministic standard hardware wallets use. Send, receive, and trade without leaving the chat.
Send SOL or SPL tokens to any contact directly inside the chat. The transaction is signed locally — the server never sees a private key.
SLIP-0010 · BigInt lamports
NFT listings and trades settled by a PDA-based on-chain program (Tensor-style escrow → PDA refactor). No off-chain custodian — the protocol enforces the swap.
Solana PDA · Anchor
50% of every marketplace fee flows back to the community channel that hosted the listing. Built into the program, not a policy the platform can revoke.
On-chain rule · 50/50 split
No phone number. No email. No PII. Your identity is your recovery phrase — recoverable on any device, untraceable from any account directory.
BIP-39 · 24 words
Voice calls use WebRTC peer-to-peer with native CallKit (iOS) / ConnectionService (Android) integration. Signaling is sealed and ephemeral; the audio stream is SRTP between devices. TURN relay via Cloudflare is fallback-only.
iOS PushKit + CallKit so incoming calls ring through the system UI even on a locked phone. On Android, a Self-Managed Telecom ConnectionService bypasses the keyguard for the same experience.
Call invite, answer, ICE candidates all travel through the same Sealed Sender envelope as messages. The server doesn't see who is calling whom at the DB-row level.
One-tap voice notes recorded as WAV (PCM 16 kHz) and end-to-end encrypted alongside text and files. Playback inside the chat with TTL countdown for disappearing audio.
SnowChat ships as a single Docker Compose stack — server, Postgres, Redis. Deploy it inside your organization's perimeter and your messenger never crosses it. Government agencies, regulated industries, security-conscious enterprises — your data stays on your hardware, under your audit, with your branding.
Deploy the full SnowChat stack on your own Docker / Kubernetes / bare-metal infrastructure. Server, Postgres, Redis — all isolated within your network. No data leaves your perimeter, ever. Air-gapped environments supported.
Docker Compose · K8s manifest available
Custom domain, logo, app icon, in-app strings, app store listing. Rebrand SnowChat as your organization's official messenger. Fork the AGPL-3.0 client and ship as your own — or we handle the build pipeline for you.
Custom domain · Custom build
Full source access (client already public on GitHub under AGPL-3.0, server licensed separately for on-premise). Internal audit documentation, security review support, custom SLA available. Three internal cryptographic audits already passed.
Source disclosure · Custom SLA
Android: direct APK download (V1 production-signed). iOS: TestFlight beta — request access by email while public TestFlight is being set up.
Direct APK install. Modern Android (Galaxy S10+, Pixel 3+, equivalent). Requires "Install unknown apps" enabled for the source browser. Signed with the V1 production keystore — upgrades from previous V1 builds install in place; older signing keys require uninstall first.
Hosted on GitHub Releases · SHA-256 · 0539e57442aa23be011c5f4c2014be6e99930c4746b0a56598d0c68242cd52a1
Public TestFlight is being staged. To join the closed beta right now, email the address below — include the Apple ID (email) you want added as a tester. Invites are sent manually within 24 hours.
✓ TestFlight is Apple's own app for trying apps before they reach the App Store — free and completely safe.
✓ Signed with the V1 production key. Existing users upgrade in place — no data loss.