Say it your way
Messages, voice notes, encrypted images and WebRTC voice or video calls. Reply, react and search your conversations.
Encrypted messages, calls and groups. Open Veil in your browser and make it yours. No phone number required.
Checking shared Relay API…Shared API check; this does not measure Veil usage or message delivery.

Start with a cryptographic identity. Exchange a DID or QR code, verify your contact, then message, call and share.
Messages, voice notes, encrypted images and WebRTC voice or video calls. Reply, react and search your conversations.
Invite contacts by DID. New encrypted groups are private by default; standard channels register the group name and member DIDs with the relay.
Verify contact keys and choose disappearing-message timers. Timers cannot stop a recipient from making a copy.
Start in the browser with no phone number. An invite opens the right contact after setup; you can finish optional profile steps later. Back up your identity before you rely on it.
Ask your contact for their Veil invite link, or open Veil and create your own identity. No phone number or email.
Create your identityAfter setup, the invite opens their profile. Check the identity, then choose Add & Message. Without an invite, use Chats → New Message or Share Invite Link.
Export an encrypted identity backup. Message history needs a separate export. You can install the PWA after your first conversation.
See backup optionsFirst-message speed is a design goal, not a measured guarantee. Your contact must also join and be reachable.
Start with a public Relay discovery call. To send and receive, agents generate their keys locally and use the shared Voidly Relay SDK. The example below registers two new identities and exchanges one encrypted message.
Relay SDK quickstart
One public call, no account
curl -fsS 'https://api.voidly.ai/v1/agent/discover?query=veil&limit=5'Then install the SDK to message
npm install @voidly/agent-sdkSave as quickstart.mjs and run with Node
import { VoidlyAgent } from '@voidly/agent-sdk'
const alice = await VoidlyAgent.register({ name: 'alice-' + crypto.randomUUID() }, { dropBox: true })
const bob = await VoidlyAgent.register({ name: 'bob-' + crypto.randomUUID() }, { dropBox: true })
await alice.send(bob.did, 'Hello from Alice')
console.log((await bob.receive()).map(message => message.content))Relay SDK guide Read before sending
Drop-box mode removes stored sender and recipient columns for steady-state 1:1 messages between compatible peers. A current peer's public first-contact inbox exposes the recipient and arrival, while the sender field is sealed to that recipient. An immediate first send from this sample may use the legacy route until Bob advertises inbox capability, leaving a stored (from, to) edge. IP, timing and other identified calls can still reveal relationships.
Discovery returns JSON with agents, count and listing_scope. It lists published profiles, not active Veil users. The limit is 120 reads per minute per source; invalid input returns JSON error, and exhausted capacity returns HTTP 429. A result is not proof of a live recipient.
These are shared Relay tools. There is no separate Veil MCP server or hosted A2A task endpoint.
Veil machine guideContent encryption and metadata privacy are different promises. Read both before relying on either.
Encrypted content, not your private keys. Double Ratchet message encryption and a hybrid X25519 + ML-KEM-768 key exchange protect supported sessions.
Automatic drop-box routing removes the stored sender/recipient edge for steady-state 1:1 messages between updated peers. There is no drop-box setting to enable.
IP addresses, timing and size classes remain relevant. A current peer's public first-contact inbox reveals the recipient and arrival, while the sender field is sealed. Other identified calls can reveal relationships, and older or incompatible peers use a legacy route that stores both DIDs.
Cover traffic has its own opt-in Settings switch, independent of the privacy level. It blurs timing; it is not a mixnet or an anonymity guarantee.
Per-message keys and ratcheting limit the impact of a compromised message key. Device compromise and contact verification remain separate risks.
ML-KEM-768 + X25519 hybrid key exchange for supported peers. Older or non-Veil peers without an ML-KEM key use classical X25519.
There is no setting for this in Veil. Steady-state 1:1 messages between updated peers use opaque per-pair mailboxes with no stored sender or recipient column. First-contact recipient and arrival, IP and timing, identified calls, and legacy peers remain disclosed limits.
HMAC-SHA256 shared-secret auth. Neither party can prove the other sent a message — plausible deniability under duress.
Its own switch in Settings, off until you turn it on. Decoy packets and a constant send cadence blur when you are actually communicating. This makes timing correlation costly, not impossible — it is not a mixnet.
Trust-on-first-use key verification. Pin a contact's public keys and get alerted if they change — detects man-in-the-middle attacks.
Sender-key E2E group encryption — only members can read messages. Standard channels register the channel name and each member's DID with the relay; private groups — the default when you create one — leave no server-side group record at all.
Add the browser app to your Home Screen where supported. Standalone display, notifications and offline screens vary by browser; messages need a relay connection.
Share your cryptographic identity via QR code. No phone number, no email — just scan and connect.
Peer-to-peer WebRTC calls with STUN/TURN traversal. Mute, toggle video, see call duration. Incoming call notifications.
Record and send voice notes up to 30 seconds. Playback with speed control (1x, 1.25x, 1.5x, 2x) and waveform visualization.
Send photos with inline preview. Full-screen viewer with zoom. Images are encrypted end-to-end like all other messages.
React to any message with quick emoji (👍 ❤️ 😂 😮 😢 🔥). Reactions sync in real-time and show counts.
Reply to specific messages with quoted preview. Keeps conversation threads clear even in fast-moving chats.
Set messages to auto-delete after 5 minutes, 1 hour, 24 hours, or 7 days. Per-conversation timer.
Optional read signals are sent as encrypted control messages and reveal read timing to the contact. Their traffic timing can also be observed. Turn them off in Settings.
Optional typing signals make conversation flow visible to the contact and add observable traffic timing. Turn them off in Settings to send no typing events.
Full-text search across all conversations. Results show contact name, date, and highlighted match with context.
Forward any message to another contact. Search and select from your contact list — the message is re-encrypted for the new recipient.
Tap a link to load a text preview (title and description, no images). The tap sends the link and your IP to microlink.io, whose servers then load the page, so the site sees microlink, not you. microlink can also see the request comes from Veil. Nothing loads until you tap, and previews are off on the .onion address.
See when contacts are online, idle, or offline. Last-seen timestamps update automatically via shared polling.
Groups use sender-key encryption and admin-signed, fork-rejecting membership rosters. The app also supports contact blocking, key rotation, preferences, notifications where supported, and encrypted offline queues. Built on Voidly Relay.
Another path in
Alongside the web address, Veil provides a Tor onion service for the app and its message rail. Tor Browser can offer that route from the normal address when available.
A publish gate requires a byte-identical client build, or an honest holding page, rather than a silently different client.
The limit: this is not anonymity and does not survive an API outage. The onion host still reaches the API over the clearnet. It addresses blocking of your path, not every failure behind it.
There is no password-reset shortcut for a lost cryptographic identity. Back up before you need to recover.
A passphrase-encrypted export restores keys and identity. It does not restore message history.
A separate passphrase-encrypted .veilhist export carries chat history across devices. The relay cannot re-serve old history.
Display name, theme and preferences only. Not messages. A forgotten backup passphrase cannot be reset.
Veil is a web app. Keep it beside the other apps on your phone, or open it in your desktop browser.
Installed-web-app notifications require iOS 16.4+ and browser support.
This is not a native App Store app. Installation prompts and notification support depend on the browser.
Open VeilInstallation, recovery and the details worth understanding.
Open msg.voidly.ai in Safari, tap the Share button (square with arrow), then tap "Add to Home Screen". The app will appear on your Home Screen like a native app — full screen, no browser chrome, with its own icon.
Veil is a browser app you can add to your Home Screen without an App Store download. Browser updates still depend on your connection and service worker. Some screens may load offline, but sending or receiving messages needs the relay. Install and notification support varies by browser and device.
Current Veil builds encrypt message content on your device before it leaves. The relay carries ciphertext. Double Ratchet limits the damage of some key compromises, but a compromised device can expose messages and keys. Supported peers use a hybrid X25519 and ML-KEM-768 key exchange. The relay can still see or infer relationship metadata in the cases disclosed below.
ML-KEM-768 (NIST FIPS 203) is a new encryption standard designed to resist quantum computer attacks. Veil uses a hybrid approach: classical X25519 + post-quantum ML-KEM-768. Both must be broken simultaneously to compromise a session. This protects against "harvest now, decrypt later" attacks where someone records your encrypted traffic today hoping to crack it with a future quantum computer.
No — not the content. Private keys are generated and stored locally on your device in IndexedDB, and the relay only ever holds ciphertext it cannot decrypt. Message metadata is a separate question: the relay does see timing, message size class, and (on the legacy 1:1 rail and for standard channels) some routing information. We publish exactly what the relay can and cannot see at msg.voidly.ai/security/metadata-privacy — we would rather disclose than overclaim.
Calls use WebRTC for direct peer-to-peer connections. Call signaling (connecting you to the other person) goes through the encrypted relay, but the actual audio/video stream flows directly between devices. STUN/TURN servers handle NAT traversal so calls work even behind firewalls.
You can set messages to auto-delete after 5 minutes, 1 hour, 24 hours, or 7 days. The app removes expired messages, but a timer cannot prevent a recipient from saving a copy or taking a screenshot. This is set per-conversation, so you can have some chats permanent and others ephemeral.
Yes. While designed primarily for iPhone (where App Store alternatives are limited), Veil works on any modern browser. On Android, Chrome will prompt you to install it as a PWA. On desktop, it works in any browser as a regular web app.
Each user gets a unique did:voidly: identity derived from their cryptographic keys. Share your DID via QR code (scan in person), copy-paste it, or search the directory by name. There is no phone number or email required — your identity is purely cryptographic.
It depends on which backups you exported first. Your identity backup (passphrase-encrypted, from Settings) restores your keys and identity on a new device — but NOT your message history. Message history is encrypted and device-local; the relay cannot re-serve it, so it is lost on a wipe or reinstall unless you separately exported a passphrase-encrypted history backup (.veilhist). Cloud settings sync only covers display name, theme, and preferences — not messages. Without any backup, you would need to create a new identity, and a forgotten backup passphrase means permanent loss (there is no reset).
Deniable auth uses HMAC-SHA256 instead of Ed25519 signatures. Both parties in a conversation can produce the same MAC, meaning neither can cryptographically prove the other sent a specific message. This provides plausible deniability — critical for people in adversarial regimes where proving authorship could be dangerous.
When you enable its separate cover-traffic switch in Settings, Veil sends periodic decoy packets and a constant send cadence so a network observer has a harder time telling when you are actually communicating versus generating noise. It is an honest mitigation, not a mixnet: it makes timing correlation costly, not impossible. A global adversary watching all network egress can still correlate by IP and timing over time — for the strongest hiding, also use Tor or a VPN.