better-sqlite3 prebuilt binaries don't exist for Node 24 yet, causing npm install to fall back to node-gyp compilation which requires Python and Visual C++ Build Tools that normie users won't have. - install-node.ps1: filter for v22.x specifically instead of latest LTS - Start Haven.bat: add Node major version check, block >=24 with message - package.json: add engines field (node 18-22)
⬡ HAVEN — Private Chat That Lives On Your Machine
Your server. Your rules. No cloud. No accounts with Big Tech. No one reading your messages.
Haven is a self-hosted Discord alternative. Run it on your machine. Invite friends with a code. No cloud. No email signup. No tracking. Free forever.
Quick Start — Docker (Recommended)
git clone https://github.com/ancsemi/Haven.git
cd Haven
docker compose up -d
Open https://localhost:3000 → Register with username admin → Create a channel → Share the code with friends. Done.
Certificate warning is normal — click Advanced → Proceed. Haven uses a self-signed cert for encryption.
Quick Start — Windows (No Docker)
- Download and unzip this repository
- Double-click
Start Haven.bat— it handles everything automatically (Node.js install, dependencies, SSL, firewall, browser) - Register as
admin— you're done
No Node.js? The script detects this and offers to install it for you with one keypress.
Quick Start — Linux / macOS (No Docker)
chmod +x start.sh
./start.sh
Or manually: npm install && node server.js
Who Is This For?
- Small friend groups who want a private place to talk
- Self-hosters who run services on their own hardware
- Privacy-conscious communities done with Big Tech
- LAN gaming crews who need voice + screen share without Discord
- Homelab enthusiasts looking for a lightweight chat service
Why Not Discord?
| Discord | Haven | |
|---|---|---|
| Hosting | Their cloud | Your machine |
| Account | Email + phone required | No email, no verification |
| Your data | Stored by Discord Inc. | Never leaves your server |
| Cost | Nitro upsells, boosts | Free forever |
| Telemetry | Analytics, tracking | Zero telemetry |
| Source code | Closed | Open (MIT-NC) |
Features
| Category | What You Get |
|---|---|
| Chat | Real-time messaging, image uploads (paste/drag/drop), typing indicators, message editing, replies, emoji reactions, @mentions with autocomplete, message pinning (admin) |
| Voice | Peer-to-peer audio chat, per-user volume sliders, mute/deafen, join/leave audio cues, talking indicators |
| Screen Share | Multi-stream screen sharing with tiled grid layout, per-user video tiles, one-click close |
| Channels | Hierarchical channels with sub-channels, private (invite-only) sub-channels with 🔒 indicator, channel topics |
| Join Codes | Per-channel invite codes with admin controls: public/private visibility, static/dynamic mode, time-based or join-based auto-rotation, manual rotation |
| Avatars | Upload profile pictures, choose avatar shape (circle/square/hexagon/diamond), per-user shapes visible to everyone |
| Formatting | Bold, italic, code, ||spoilers||, auto-linked URLs, fenced code blocks with language labels, blockquotes |
| Link Previews | Automatic OG metadata previews for shared URLs with title, description, and thumbnail |
| GIF Search | GIPHY-powered GIF picker — search and send GIFs inline (admin-configurable API key) |
| Direct Messages | Private 1-on-1 conversations — click 💬 on any user in the member list |
| User Status | Online, Away, Do Not Disturb, Invisible — with custom status text and auto-away after 5 min idle |
| File Sharing | Upload and share PDFs, documents, audio, video, archives (up to 25 MB) with inline players |
| Persistent Unread | Server-tracked read state — unread badges survive page refreshes and reconnects |
| Slash Commands | /shrug, /tableflip, /roll 2d20, /flip, /me, /spoiler, /tts, and more — type / to see them all |
| Search | Search messages in any channel with Ctrl+F |
| Themes | 20+ themes with stackable visual effects: CRT, Matrix Rain, Cyberpunk Text Scramble, Snowfall, Campfire Embers, and more — configurable intensity/frequency sliders |
| Multi-Server | Add friends' Haven servers to your sidebar with live online/offline status |
| Notifications | 5 notification sounds, per-channel volume controls |
| Moderation | Admin: kick, mute (timed), ban, delete users, delete channels, auto-cleanup. Role system with granular permissions. |
| Security | Bcrypt passwords, JWT auth, HTTPS/SSL, rate limiting, CSP headers, input validation |
| E2E Encryption | ECDH P-256 + AES-256-GCM encrypted DMs — private keys never leave the browser |
| Game | Shippy Container — Drew's shipment got hung up. Server-wide leaderboard. |
Letting Friends Connect Over the Internet
If your friends aren't on your WiFi, you need to open a port on your router.
Step 1 — Find Your Public IP
Go to whatismyip.com. That's the address your friends will use.
Step 2 — Port Forward
- Log into your router (usually
http://192.168.1.1orhttp://10.0.0.1) - Find Port Forwarding (sometimes called NAT or Virtual Servers)
- Forward port 3000 (TCP) to your PC's local IP
- Save
Find your local IP: Open Command Prompt → type
ipconfig→ look for IPv4 Address (e.g.192.168.1.50)
Step 3 — Windows Firewall
Open PowerShell as Administrator and run:
New-NetFirewallRule -DisplayName "Haven Chat" -Direction Inbound -LocalPort 3000 -Protocol TCP -Action Allow
Step 4 — Share With Friends
Send them:
https://YOUR_PUBLIC_IP:3000
Tell them to click Advanced → Proceed on the certificate warning. It's normal.
Configuration
Haven creates a .env config file automatically on first launch — you don't need to create or rename anything. It lives in your data directory:
| OS | Data Directory |
|---|---|
| Windows | %APPDATA%\Haven\ |
| Linux / macOS | ~/.haven/ |
| Setting | Default | What It Does |
|---|---|---|
PORT |
3000 |
Server port |
SERVER_NAME |
Haven |
Your server's display name |
ADMIN_USERNAME |
admin |
Register with this name to get admin powers |
JWT_SECRET |
(auto-generated) | Security key — don't share or edit this |
SSL_CERT_PATH |
(auto-detected) | Path to SSL certificate |
SSL_KEY_PATH |
(auto-detected) | Path to SSL private key |
HAVEN_DATA_DIR |
(see above) | Override the data directory location |
After editing .env, restart the server.
Slash Commands
Type / in the message box to see the full list. Here are some highlights:
| Command | What It Does |
|---|---|
/shrug |
¯\(ツ)/¯ |
/tableflip |
(╯°□°)╯︵ ┻━┻ |
/unflip |
┬─┬ ノ( ゜-゜ノ) |
/roll 2d20 |
Roll dice (any NdN format) |
/flip |
Flip a coin |
/me does something |
Italic action text |
/spoiler secret text |
Hidden spoiler text |
/tts hello |
Text-to-speech |
/nick NewName |
Change your username |
/clear |
Clear your chat view |
/bbs |
"Will be back soon" |
/afk |
"Away from keyboard" |
Themes
25 themes, switchable from the sidebar:
Haven · Discord · Matrix · Tron · HALO · Lord of the Rings · Cyberpunk · Nord · Dracula · Bloodborne · Ice · Abyss
Your theme choice persists across sessions.
Voice Chat
- Join a text channel
- Click 🎤 Join Voice
- Allow microphone access
- Adjust anyone's volume with their slider
- Click 📞 Leave when done
Voice is peer-to-peer — audio goes directly between users, not through the server. Requires HTTPS.
- Join / leave cues — synthesized audio tones when users enter or leave voice.
- Talking indicators — usernames glow green when speaking (300 ms hysteresis for smooth animation).
- Screen sharing — click 🖥️ Share Screen to broadcast your display. Multiple users can share simultaneously in a tiled grid.
Admin Guide
If you registered with the admin username, you can:
- Create / delete channels
- Kick users — disconnects them (they can rejoin)
- Mute users — timed mute (can't send messages)
- Ban users — permanent ban (can't connect)
- Delete users — remove banned accounts (frees up their username)
- Auto-cleanup — configure automatic deletion of old messages (Settings → Admin)
- Server settings — EULA, max message age, DB size limits
Access admin controls in the Settings panel (⚙️ gear icon in the sidebar).
Troubleshooting
| Problem | Fix |
|---|---|
| "SSL_ERROR_RX_RECORD_TOO_LONG" | Your browser is using https:// but the server is running HTTP. Change the URL to http://localhost:3000, or install OpenSSL and restart to enable HTTPS (see below). |
| "Node.js is not installed" | The launcher offers to install it automatically. Or run winget install OpenJS.NodeJS.LTS in a terminal, restart, and try again. |
| Browser shows blank page | Clear cache or try incognito/private window |
| Friends can't connect | Check port forwarding + firewall. Make sure server is running. |
| "Error: EADDRINUSE" | Another app is using port 3000. Change PORT in .env. |
| Voice chat echoes | Use headphones |
| Voice doesn't work remotely | Must use https://, not http:// |
| Certificate error in browser | Normal — click Advanced → Proceed |
HTTPS / SSL Details
Haven automatically generates self-signed SSL certificates on first launch — but only if OpenSSL is installed on your system.
How to tell which mode you're in: Look at the startup banner in the terminal window. If the URL shows http:// — you're on HTTP. If it shows https:// — you're on HTTPS.
If Haven falls back to HTTP (no OpenSSL, or cert generation failed):
- Everything works fine for local use — just use
http://localhost:3000 - Voice chat will only work on localhost, not for remote friends
- To enable HTTPS:
- Install OpenSSL: slproweb.com/products/Win32OpenSSL.html (the "Light" version)
- During install, choose "Copy OpenSSL DLLs to the Windows system directory"
- Restart your PC
- Delete
%APPDATA%\Haven\certsand re-launchStart Haven.bat
Keyboard Shortcuts
| Key | Action |
|---|---|
Shift+Enter |
New line |
Ctrl+F |
Search messages |
@ |
@mention autocomplete |
/ |
Slash command autocomplete |
Tab |
Select autocomplete suggestion |
Backing Up Your Data
All your data lives in a dedicated directory outside the Haven code folder:
| OS | Location |
|---|---|
| Windows | %APPDATA%\Haven\ |
| Linux / macOS | ~/.haven/ |
Inside you'll find:
haven.db— all messages, users, and channels.env— your configurationcerts/— SSL certificatesuploads/— uploaded images
Copy the entire folder somewhere safe to back up everything. The Haven code directory contains no personal data.
GIF Search — GIPHY API Setup
Haven has a built-in GIF picker powered by GIPHY. To enable it you need a free API key.
1. Create a GIPHY Developer Account
- Go to developers.giphy.com
- Sign up for an account (or sign in)
2. Create an App
- Click Create an App
- Choose API (not SDK)
- Give it any name (e.g. "Haven Chat") and a short description
- Copy the API Key shown on the next page
3. Add the Key in Haven
- Log into Haven as your admin account
- Click the GIF button (🎞️) in the message input area
- You'll see a setup prompt — paste your API key and save
- The key is stored server-side in the database — only admins can see or change it
That's it. All users can now search and send GIFs.
Free tier: GIPHY's free tier allows plenty of requests for a private chat server — you'll never come close to the limit.
Roadmap
Planned features — roughly in priority order:
| Feature | Status | Description |
|---|---|---|
| Sub-channels | ✅ Done | Hierarchical channels with auto-membership inheritance and private (invite-only) sub-channels |
| Join code management | ✅ Done | Admin controls: public/private visibility, static/dynamic mode, time/join-based rotation |
| Role system | ✅ Done | Role-based access with granular per-channel permissions |
| Avatar system | ✅ Done | Profile picture uploads with selectable avatar shapes (circle, square, hexagon, diamond) |
| Effect system | ✅ Done | 15+ stackable visual effects with configurable intensity/frequency |
| Webhook / Bot support | ✅ Done | Incoming webhooks and a lightweight bot API for external integrations |
| Thread replies | 📋 Planned | Threaded conversations that branch off a message |
| End-to-end encryption | ✅ Done | ECDH P-256 + AES-256-GCM encryption for DMs — private keys stay in the browser |
| Android App | 🚧 In Progress! | https://github.com/ancsemi/Haven-App |
Want something else? Open an issue — PRs are always welcome.
License
MIT-NC — free to use, modify, and share. Not for resale. See LICENSE.
Original project: github.com/ancsemi/Haven
⬡ Haven — Because your conversations are yours.