██╗ ██╗███████╗████████╗██████╗ █████╗
██║ ██║██╔════╝╚══██╔══╝██╔══██╗██╔══██╗
██║ ██║█████╗ ██║ ██████╔╝███████║
╚██╗ ██╔╝██╔══╝ ██║ ██╔══██╗██╔══██║
╚████╔╝ ███████╗ ██║ ██║ ██║██║ ██║
╚═══╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝
Most messengers are bloated. Ads. Subscriptions. Tracking. Slow.
Vetra is different.
It's fast, private, and built around the way people actually communicate — in real time, with friends, teams, or communities. No distractions. No compromises.
Send messages that arrive in milliseconds. Edit them, react to them, reply to them, search through them. Everything you'd expect — done right.
Create your own space. Organise conversations into channels by topic. Invite your people. You're in control.
One click to call anyone. One click to call anyone. No accounts to link, no call limits, no waiting rooms.
Drop a photo, a video clip, a file — right into the chat. Instantly previewed, instantly delivered.
Say more with less. React to any message with an emoji and keep the conversation flowing without cluttering it.
Get notified about what matters. Ignore the rest. Customise notifications per server, per channel, or mute everything when you need focus.
See who's online. Set your status. Personalise your profile. Know when your friends are around.
Vetra is a desktop app — not a browser tab.
It launches instantly, stays in your taskbar, and uses your computer's hardware properly. No memory leaks. No tab juggling. No "is this thing still open?"
Works on Windows, macOS, and Linux.
- 🔒 No ads. No tracking. No selling your conversations.
- 🔐 Voice calls are private — your conversations stay between you.
- 🚫 We don't read your messages.
| Platform | Download |
|---|---|
| 🪟 Windows | Download .exe |
| 🍎 macOS | Download .dmg |
| 🐧 Linux | Download .AppImage |
Or clone the repo and build it yourself — we respect that.
Messaging · Calls · Servers · Profile — all in one window.
[ screenshot 1 ] [ screenshot 2 ] [ screenshot 3 ]
1. Download Vetra for your platform
2. Create an account — takes 10 seconds
3. Make a server, or message someone directly
4. That's it.
Copy .env.smoke.example to .env.smoke, fill in the LAN backend URLs plus VETRA_SMOKE_USERNAME and VETRA_SMOKE_PASSWORD, and keep .env.smoke out of git. The smoke login uses the same username field as the app.
Read-only smoke:
npm run smoke:lanWrite smoke with tagged test messages and reaction toggles:
npm run smoke:lan:writeRelease check without Tauri packaging:
npm run check:releaseRelease check including Tauri packaging:
npm run check:release:tauriThe release wrappers reuse VETRA_SMOKE_API_URL and VETRA_SMOKE_SOCKET_URL as VITE_API_URL and VITE_SOCKET_URL when those build variables are not already set.
Copy .env.load.example to .env.load, fill in the LAN backend URLs plus VETRA_LOAD_USERNAME and VETRA_LOAD_PASSWORD, and keep .env.load out of git. The load tool reuses the same username/password login flow and socket-ticket flow as the app and smoke tests. Large VU startups are ramped by VETRA_LOAD_RAMP_BATCH_SIZE and VETRA_LOAD_RAMP_BATCH_DELAY_MS so socket-ticket requests do not burst all at once.
Set VETRA_LOAD_SERVER_MONITOR=1 to sample the Ubuntu backend over SSH during the test. The built-in monitor uses VETRA_LOAD_SERVER_SSH, VETRA_LOAD_SERVER_SERVICE, VETRA_LOAD_SERVER_PORT, and VETRA_LOAD_SERVER_SAMPLE_INTERVAL_MS to collect service PID, process CPU/RAM, available RAM, and TCP connection counts. SSH monitor failures are logged as warnings and recorded in the JSON summary without aborting the load run.
Use VETRA_LOAD_STARTUP_TIMEOUT_MS to cap each VU startup step (socket-ticket, socket connect, user-channel join) so ramp-up cannot hang forever. Use VETRA_LOAD_MONITOR_SSH_TIMEOUT_MS to cap each SSH sample separately so server monitoring cannot block the main load run.
Safe connect-only load test:
npm run load:lanChannel-message load mode:
npm run load:lan:messagesCall-signaling load mode:
npm run load:lan:callsLow-rate soak mode:
npm run load:lan:soakDefault behavior is non-destructive. Set VETRA_LOAD_WRITE=1 only when you intentionally want to send tagged [load-test] messages or signaling events. Real media load is peer-to-peer/TURN and is not the same as backend signaling load. JSON summaries are written to load-results/ by default.