Voidly
All appsVeil

A private place
to talk.

Encrypted messages, calls and groups. Open Veil in your browser and make it yours. No phone number required.

Messages & callsYour own identityPhone & desktop

Checking shared Relay API…Shared API check; this does not measure Veil usage or message delivery.

Inside VeilView full size
Veil’s conversation interface, showing a demonstration chat and message composer.
Actual app interface with a demonstration conversation.

A full conversation.
However you say it.

Start with a cryptographic identity. Exchange a DID or QR code, verify your contact, then message, call and share.

Say it your way

Messages, voice notes, encrypted images and WebRTC voice or video calls. Reply, react and search your conversations.

Bring your people

Invite contacts by DID. New encrypted groups are private by default; standard channels register the group name and member DIDs with the relay.

Set the boundaries

Verify contact keys and choose disappearing-message timers. Timers cannot stop a recipient from making a copy.

Your first hello
starts here.

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.

  1. Open the invite.

    Ask your contact for their Veil invite link, or open Veil and create your own identity. No phone number or email.

    Create your identity
  2. Message your contact.

    After setup, the invite opens their profile. Check the identity, then choose Add & Message. Without an invite, use Chats → New Message or Share Invite Link.

  3. Keep a way back.

    Export an encrypted identity backup. Message history needs a separate export. You can install the PWA after your first conversation.

    See backup options

First-message speed is a design goal, not a measured guarantee. Your contact must also join and be reachable.

Veil for agents.
Encrypted messages with client-held keys.

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-sdk

Save 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

Encryption covers content. Contact patterns need care.

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 guide

Your keys.
Your conversation.

Content encryption and metadata privacy are different promises. Read both before relying on either.

What the relay carries

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.

What remains visible

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.

Encryption and feature reference

Double Ratchet E2E

Per-message keys and ratcheting limit the impact of a compromised message key. Device compromise and contact verification remain separate risks.

Post-Quantum Protection

ML-KEM-768 + X25519 hybrid key exchange for supported peers. Older or non-Veil peers without an ML-KEM key use classical X25519.

Drop-Box Routing

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.

Deniable Authentication

HMAC-SHA256 shared-secret auth. Neither party can prove the other sent a message — plausible deniability under duress.

Cover Traffic (opt-in)

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.

TOFU Key Pinning

Trust-on-first-use key verification. Pin a contact's public keys and get alerted if they change — detects man-in-the-middle attacks.

Encrypted Channels

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.

No App Store Required

Add the browser app to your Home Screen where supported. Standalone display, notifications and offline screens vary by browser; messages need a relay connection.

QR Identity Exchange

Share your cryptographic identity via QR code. No phone number, no email — just scan and connect.

Voice & Video Calls

Peer-to-peer WebRTC calls with STUN/TURN traversal. Mute, toggle video, see call duration. Incoming call notifications.

Voice Messages

Record and send voice notes up to 30 seconds. Playback with speed control (1x, 1.25x, 1.5x, 2x) and waveform visualization.

Image Sharing

Send photos with inline preview. Full-screen viewer with zoom. Images are encrypted end-to-end like all other messages.

Emoji Reactions

React to any message with quick emoji (👍 ❤️ 😂 😮 😢 🔥). Reactions sync in real-time and show counts.

Reply & Quote

Reply to specific messages with quoted preview. Keeps conversation threads clear even in fast-moving chats.

Disappearing Messages

Set messages to auto-delete after 5 minutes, 1 hour, 24 hours, or 7 days. Per-conversation timer.

Read Receipts

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.

Typing Indicators

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.

Message Search

Full-text search across all conversations. Results show contact name, date, and highlighted match with context.

Message Forwarding

Forward any message to another contact. Search and select from your contact list — the message is re-encrypted for the new recipient.

Link Previews

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.

Presence Indicators

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

When the route
is the problem.

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.

Your next device
starts with a backup.

There is no password-reset shortcut for a lost cryptographic identity. Back up before you need to recover.

Identity backup

A passphrase-encrypted export restores keys and identity. It does not restore message history.

History backup

A separate passphrase-encrypted .veilhist export carries chat history across devices. The relay cannot re-serve old history.

Settings sync

Display name, theme and preferences only. Not messages. A forgotten backup passphrase cannot be reset.

One tap away.
On your Home Screen.

Veil is a web app. Keep it beside the other apps on your phone, or open it in your desktop browser.

Add Veil from Safari.

  1. Open msg.voidly.ai in Safari.
  2. Tap Share, then Add to Home Screen.
  3. Open Veil from its icon.

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 Veil

Before you
start a conversation.

Installation, recovery and the details worth understanding.

Make room for
a private conversation.

Open Veil