A messenger that requires only a username and password. No phone number. No email. No identity.
Live: https://4send-messenger.hf.space
Every "secure" messenger asks for your phone number. But a phone number is your real identity - tied to your passport, your carrier, your location. We removed that dependency entirely.
4SEND knows nothing about you except your username. That is by design.
- Anonymous registration - username and password only
- Full interface localization - 20 languages
- Secret chats with end-to-end encryption (Signal protocol)
- P2P client-side file transfer
- Chat folders
- Extensive interface customization
- Keyboard shortcuts
- Cache monitoring and data export
- Database encryption at rest
- Symmetric encryption - messages are encrypted in transit and at rest
- No IP logging, no connection logs
- Auto-delete messages with a timer
- EXIF metadata stripped from all uploaded images
- File integrity validation on transfer
- Voice messages, video messages, P2P calls
- Groups, rooms and channels
- Multiple accounts on one device
- Works on Web, Android (APK), iOS (PWA), Windows
All features are free. No subscription, no limits.
- Backend: Node.js, Express, Socket.IO, MongoDB, Mongoose
- Client: React 19 + TypeScript + Vite
- Auth: JWT, bcryptjs
- Media: Cloudinary, Sharp (EXIF stripping, image processing)
- Encryption: e2ee signal protocol (secret chats), aes-256-gcm
- Push: Firebase Cloud Messaging / Web Push
- Rate limiting: express-rate-limit
- Sessions: express-session + connect-mongo
- JWT verified on every Socket.IO connection - no unauthenticated sockets
senderis always set server-side from the verified JWT - clients cannot spoof it- NoSQL injection protection - recursive input sanitization on all REST and Socket events
- File uploads validated by magic bytes (file signature), not just extension
- Link preview protected against SSRF - private IP ranges blocked, redirects disabled, strict timeouts
- Rate limiting bound to
username, not IP - prevents bypass via reconnects - Disappearing messages use both
setTimeoutand a MongoDB TTL index as fallback - Encryption is fail-closed - if key validation fails on startup, server does not start
The server reads all secrets from environment variables. Never hardcode them.
MONGO_URI=
JWT_SECRET=
ENCRYPTION_KEY= # 32 bytes as 64 hex chars
SECURE_SALT=
SESSION_SECRET=
PORT= # default 7860
NODE_ENV=
REPORT_RECIPIENT= # username that receives bug reports
CLOUDINARY_NAME=
CLOUDINARY_KEY=
CLOUDINARY_SECRET=
FIREBASE_SERVICE_ACCOUNT= # JSON string of service account
FIREBASE_API_KEY=
FIREBASE_AUTH_DOMAIN=
FIREBASE_PROJECT_ID=
FIREBASE_STORAGE_BUCKET=
FIREBASE_MESSAGING_SENDER_ID=
FIREBASE_APP_ID=
FIREBASE_VAPID_KEY=
GEMINI_API_KEY=
GEMINI_API_KEY_TWO=
GEMINI_API_KEY_THREE=
The project is a Node.js backend (root) plus a React client in public/.
# 1. backend
npm install
npm start # node index.js
# 2. client (React) - build so the server can serve the frontend
cd public
npm install
npm run build # outputs to public/dist, served from public/Set all environment variables before starting. The server will throw on startup if ENCRYPTION_KEY is missing or invalid.
4SEND/
├── index.js # entry: HTTP server + Socket.IO + DB init
├── app.js # Express app, middleware, routes
├── public/ # React (Vite) client
│ ├── src/ # React source
│ ├── public/ # static assets (languages, privacy.html, ...)
│ └── package.json
├── config/ constants/ models/ routes/
├── services/ socket/ jobs/ middleware/ utils/
└── uploads/ # runtime user uploads (gitignored)
| Platform | Type | Notes |
|---|---|---|
| Web | PWA | Any browser |
| Android | APK | Direct install |
| iOS | PWA | Install via Safari |
| Windows | Electron | .exe |
ISC
Available at /privacy.html - data collection, encryption architecture, zero-knowledge design, and legal requests.
Key points: no IP storage, no connection logs, no contact sync, physical file deletion on message delete.
Каждый "безопасный" мессенджер просит ваш номер телефона. Но номер телефона - это ваша настоящая личность: привязка к паспорту, к оператору, к геолокации. Мы убрали эту зависимость полностью.
4SEND не знает о вас ничего, кроме логина. Это сделано намеренно.
- Анонимная регистрация - только логин и пароль
- Полноценная локализация интерфейса - 20 языков
- Секретные чаты с сквозным шифрованием (протокол Signal)
- Отправка файлов через клиент по P2P
- Папки для чатов
- Обширная кастомизация интерфейса
- Горячие клавиши
- Мониторинг кэша и экспорт данных
- Шифрование базы данных при хранении
- Симметричное шифрование - сообщения шифруются при передаче и хранении
- Нет логов IP-адресов, нет логов подключений
- Автоудаление сообщений по таймеру
- Автоматическая очистка EXIF-метаданных из загружаемых изображений
- Проверка целостности файлов при передаче
- Голосовые сообщения, видеосообщения, P2P звонки
- Группы, комнаты и каналы
- Несколько аккаунтов на одном устройстве
- Работает везде: Web, Android (APK), iOS (PWA), Windows
Весь функционал бесплатен. Без подписки, без ограничений.
- Бэкенд: Node.js, Express, Socket.IO, MongoDB, Mongoose
- Клиент: React 19 + TypeScript + Vite
- Авторизация: JWT, bcryptjs
- Медиа: Cloudinary, Sharp (очистка EXIF, обработка изображений)
- Шифрование: e2ee signal protocol (секретные чаты), aes-256-gcm
- Push: Firebase Cloud Messaging / Web Push
- Rate limiting: express-rate-limit
- Сессии: express-session + connect-mongo
- JWT проверяется при каждом подключении Socket.IO - неаутентифицированные сокеты не открываются
senderвсегда устанавливается на сервере из верифицированного JWT - клиент не может подменить отправителя- Защита от NoSQL-инъекций - рекурсивная санитизация входных данных во всех REST и Socket-событиях
- Файлы при загрузке проверяются по сигнатуре (magic bytes), а не только по расширению
- Link preview защищён от SSRF - приватные IP-диапазоны заблокированы, редиректы отключены, строгие таймауты
- Rate limiting привязан к
username, а не к IP - защита от обхода через переподключения - Исчезающие сообщения используют и
setTimeout, и TTL-индекс в MongoDB как резервный механизм - Шифрование работает fail-closed - если ключ не валидируется при старте, сервер не запускается
Сервер читает все секреты из переменных окружения. Никогда не хардкодьте их.
MONGO_URI=
JWT_SECRET=
ENCRYPTION_KEY= # 32 байта в виде 64 hex-символов
SECURE_SALT=
SESSION_SECRET=
PORT= # по умолчанию 7860
NODE_ENV=
REPORT_RECIPIENT= # логин, принимающий отчёты об ошибках
CLOUDINARY_NAME=
CLOUDINARY_KEY=
CLOUDINARY_SECRET=
FIREBASE_SERVICE_ACCOUNT= # JSON строка сервисного аккаунта
FIREBASE_API_KEY=
FIREBASE_AUTH_DOMAIN=
FIREBASE_PROJECT_ID=
FIREBASE_STORAGE_BUCKET=
FIREBASE_MESSAGING_SENDER_ID=
FIREBASE_APP_ID=
FIREBASE_VAPID_KEY=
GEMINI_API_KEY=
GEMINI_API_KEY_TWO=
GEMINI_API_KEY_THREE=
Проект состоит из Node.js-бэкенда (корень) и React-клиента в public/.
# 1. бэкенд
npm install
npm start # node index.js
# 2. клиент (React) - собрать, чтобы сервер отдавал фронтенд
cd public
npm install
npm run build # результат в public/dist, отдаётся из public/Установите все переменные окружения перед запуском. Сервер упадёт при старте, если ENCRYPTION_KEY отсутствует или невалиден.
4SEND/
├── index.js # вход: HTTP-сервер + Socket.IO + инициализация БД
├── app.js # Express-приложение, middleware, роуты
├── public/ # React (Vite) клиент
│ ├── src/ # исходники React
│ ├── public/ # статические ассеты (языки, privacy.html, ...)
│ └── package.json
├── config/ constants/ models/ routes/
├── services/ socket/ jobs/ middleware/ utils/
└── uploads/ # загрузки пользователей в рантайме (в .gitignore)
| Платформа | Тип | Примечание |
|---|---|---|
| Web | PWA | Любой браузер |
| Android | APK | Прямая установка |
| iOS | PWA | Установка через Safari |
| Windows | Electron | .exe |
ISC
Доступна по адресу /privacy.html - сбор данных, архитектура шифрования, zero-knowledge дизайн, правовые запросы.
Ключевое: нет хранения IP, нет логов подключений, нет синхронизации контактов, физическое удаление файлов при удалении сообщения.