Zero-Knowledge β’ End-to-End Encrypted β’ Private
A truly private messaging app where even the server cannot read your messages, see your nickname, or know who you're talking to.
β οΈ Note: This project uses a Source Available License. You can view, study, and contribute to the code, but redistribution and publishing derivative works is not permitted. See LICENSE for details.
| Platform | Link |
|---|---|
| Android | Download APK |
| iOS | TestFlight |
- True Privacy - Server never sees nicknames, message contents, or friend relationships
- End-to-End Encryption - All messages encrypted using X25519 + AES-256-GCM
- Anonymized IDs - User IDs are hashed before reaching the server
- No Phone/Email Required - Just pick a nickname and start chatting
- Key Verification - Verify contacts with security fingerprints
- QR Code with Key Hash - QR codes include public key hash for verification
- Verified Badges - Mark friends as verified after out-of-band confirmation
- Auto-Expiring Sessions - Chat sessions expire after 3 days
- No Message Storage - Messages exist only on your device
- Session Cleanup - Server automatically purges inactive sessions
- QR Code Sharing - Scan to add friends instantly
- Friend Codes - Share your unique
ECHO-XXXXXXXXcode - Ping Notifications - Invite friends to chat with a single tap
- Beautiful Dark UI - Sleek, modern interface
- Cross-Platform - iOS, Android (Desktop coming soon)
- Offline Message Queue - Messages sync when connection restores
| Data | Protected |
|---|---|
| Message contents | β Encrypted |
| Your nickname | β Encrypted exchange |
| Who you're talking to | β Only sees anonymous tokens |
| Friend relationships | β Stored locally only |
| Your real user ID | β SHA-256 hashed |
The server only sees: Encrypted blobs, anonymous tokens, and timing metadata.
EchoChat/
βββ echochat_app/ # Flutter mobile application
β βββ lib/
β β βββ screens/ # UI screens
β β βββ services/ # Business logic & crypto
β β βββ theme/ # App theming
β βββ ...
β
βββ echochat-backend/ # Node.js WebSocket server
βββ src/
βββ server.ts # Main server (Zero-Knowledge)
βββ session_manager.ts # Session lifecycle
βββ group_manager.ts # Group chat support
βββββββββββββββ βββββββββββββββ
β Client A β β Client B β
β β β β
β βββββββββββ β Encrypted β βββββββββββ β
β βPrivKey Aβ βββββββββββββββββββββΊβ βPrivKey Bβ β
β βββββββββββ β Nickname + β βββββββββββ β
β β β Messages β β β
β βΌ β β β βΌ β
β SharedSecretβ β β SharedSecretβ
β (X25519) β β β (X25519) β
βββββββββββββββ β βββββββββββββββ
β
βΌ
βββββββββββββββββββ
β EchoChat Serverβ
β (v1.2.0 ZK) β
β β
β β No plaintextβ
β β No nicknamesβ
β β No user IDs β
β β
Only tokens β
β β
Only hashes β
β β
Encrypted β
β payloads β
βββββββββββββββββββ
- Flutter SDK 3.x or higher
- Node.js 18+ (for backend)
- Dart 3.x
cd echochat-backend
# Install dependencies
npm install
# Compile TypeScript
npx tsc
# Start the server
node dist/server.js
# Or with custom port
PORT=8080 node dist/server.jsThe server runs on ws://localhost:8080 by default.
cd echochat_app
# Get dependencies
flutter pub get
# Run on device/emulator
flutter run
# Build for release
flutter build apk --release # Android
flutter build ios --release # iOSUpdate the WebSocket URL in lib/services/ws_service.dart:
EchoChatWebSocketService({
this.url = 'wss://your-server.com', // Your server URL
})| Package | Purpose |
|---|---|
cryptography |
X25519 & AES-GCM encryption |
flutter_secure_storage |
Secure key storage |
web_socket_channel |
WebSocket communication |
qr_flutter |
QR code generation |
mobile_scanner |
QR code scanning |
flutter_local_notifications |
Push notifications |
| Package | Purpose |
|---|---|
ws |
WebSocket server |
crypto |
ID anonymization (SHA-256) |
- Algorithm: X25519 (Curve25519 ECDH)
- Key Size: 256-bit
- Each user generates a permanent identity keypair stored securely on-device
- Algorithm: AES-256-GCM
- Nonce: 96-bit random per message
- MAC: 128-bit authentication tag
- Algorithm: FNV-1a with salt
- Output: 128-bit (16 hex characters)
- Backwards compatible with legacy hash format
- Fingerprint: 12 characters (XXXX-XXXX-XXXX)
- QR Format: v3 with embedded key hash
- Out-of-band verification supported
{
"ciphertext": "base64...",
"nonce": "base64...",
"mac": "base64..."
}| Home | Chat | Friends |
|---|---|---|
| Sessions list | E2E encrypted | QR & verification |
- End-to-end encryption
- Session management
- QR code friend adding
- Ping notifications
- Zero-Knowledge architecture
- MITM protection (key verification)
- Backwards compatibility
- Group chats (encrypted)
- Desktop support
- File/image sharing
- Voice messages
- Push notifications (FCM/APNs)
We welcome contributions! This project is open for collaboration to build a better private messenger together.
- π Report Bugs - Found something broken? Open an issue!
- π Security Research - Review the crypto implementation, find vulnerabilities
- π‘ Feature Ideas - Suggest improvements via issues
- π οΈ Code Contributions - Submit pull requests for bug fixes and features
- π Documentation - Help improve docs and translations
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
- Follow the existing code style
- Write meaningful commit messages
- Test your changes before submitting
- Be respectful in discussions
π By contributing, you agree to the terms in our LICENSE.
This project is Source Available - not Open Source.
- View and study the code
- Run it privately for personal use
- Contribute improvements via pull requests
- Perform security research
- Fork for contributing back
- Publish or distribute the app
- Create derivative products
- Use in commercial projects
- Remove attribution
See LICENSE for full terms.
- Built with Flutter
- Cryptography powered by cryptography
- Inspired by Signal's encryption protocol
Made with β€οΈ by TTA