Private encrypted chat rooms that self-destruct in 24 hours. No accounts. No logs. No trace.
Live demo: v2v.site
- Open the site — click Create Encrypted Room
- Share the 6-digit room code with whoever you want
- Chat with text, voice messages, and photos
- Everything auto-deletes after 24 hours
No registration. No email. No phone number.
All encryption happens in the browser using the Web Crypto API. The server never sees plaintext.
- Algorithm: AES-256-GCM
- Key derivation: SHA-256 of room ID + salt, derived client-side
- Files: Encrypted as binary blobs before upload — server stores only ciphertext
- Participants: Nicknames are encrypted before being sent to the server
- Key transport: The room key never leaves the browser. Share rooms via the "Copy Secure Link" button which embeds the key in the URL fragment (
#key=...) — fragments are never sent in HTTP requests
| Data | What server stores |
|---|---|
| Messages | AES-256-GCM ciphertext only |
| Files | Encrypted binary blob |
| Nicknames | Encrypted |
| IP address | SHA-256 hashed (salted, not reversible) |
| Room key | Never — key stays in browser |
- Text messages, emoji
- Voice messages (recorded in browser, encrypted before upload)
- Photo sharing (encrypted before upload)
- Participant list (encrypted nicknames)
- Delete individual messages
- Drag & drop file upload
- Paste images from clipboard
- Mobile-first design (iOS & Android optimized)
- Long-poll real-time delivery
- Auto-delete rooms after 24h of inactivity
Requirements: PHP 7.4+, Apache or Nginx, write permissions on the project directory.
git clone https://github.com/YOUR_USERNAME/v2v.git
cd v2v
chmod 755 .Point your web server document root to the project folder. No database needed — rooms are stored as JSON files.
Apache — make sure mod_rewrite is enabled. The project works without .htaccess changes.
Nginx example:
server {
root /var/www/v2v;
index index.php;
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}Configure in config.php:
define('ETH_ADDRESS', 'your_eth_address'); // donation address
define('ROOM_TTL', 86400); // 24h in seconds
define('RATE_LIMIT_MAX', 80); // requests per minute per IP
define('MAX_FILE_SIZE', 10 * 1024 * 1024); // 10 MBv2v/
├── index.php # Entry point — routing
├── api.php # All API endpoints + form handlers
├── server.php # Core functions: logging, rate limiting, cleanup
├── config.php # Configuration constants
├── views/
│ ├── main.php # Landing page HTML
│ └── room.php # Chat room HTML
└── assets/
├── crypto.js # AES-256-GCM encryption engine (Web Crypto API)
├── chat.js # Chat logic: send, poll, render, voice, files
├── main.css # Landing page styles
└── room.css # Chat room styles
Directories created automatically at runtime:
rooms/ — room JSON files
uploads/ — encrypted file blobs
admin/ — analytics (server-side only)
ratelimit/ — rate limit counters
v2v/ — action logs (hashed IPs only)
The API is fully documented at runtime:
GET /index.php?api=1&action=api_schema
| Endpoint | Description |
|---|---|
POST ?api=1&action=create_room |
Create a new room |
POST ?api=1&action=send_message&room=ID |
Send encrypted message |
GET ?api=1&action=get_messages&room=ID&last_id=0 |
Long-poll for new messages |
GET ?api=1&action=get_history&room=ID |
Last 100 messages |
POST ?api=1&action=upload_file&room=ID |
Upload encrypted file |
POST ?api=1&action=add_participant&room=ID |
Register encrypted nickname |
GET ?api=1&action=get_participants&room=ID |
Active participants |
GET ?api=1&action=room_info&room=ID |
Room metadata |
POST ?api=1&action=ping&room=ID |
Keepalive |
- Room IDs are 6-digit numeric codes — not a secret, just a rendezvous point
- The actual encryption key is derived from the room ID in the browser; sharing the room ID with someone means they can read the messages
- For higher security, use "Copy Secure Link" which includes a randomly generated key in the fragment
- Rate limiting: 80 requests per minute per IP
- File size limit: 10 MB per file
- Maximum 500 messages stored per room
- Rooms auto-expire after 24h of inactivity
MIT — free to use, modify, and self-host.
Built because I was tired of messengers that know too much.