Written to be honest rather than reassuring. If you are evaluating whether to trust this service, the interesting sections are §3 and §4 — the things it does not protect.
Every phone number belonging to someone other than the account holder is encrypted before storage, under a key this server does not possess.
That covers:
| Data | Storage | Server can read it? |
|---|---|---|
| Caller's real number in your call history | sealed to your public key | No |
| Protected-contact labels | sealed | No |
| Protected-contact numbers | sealed | No |
| Alias↔caller mapping | sealed | No |
| Your own handset number | plaintext | Yes — we must dial it |
| Alias presented on a call | plaintext | Yes — it's ours, not personal |
| Call time, duration, coarse origin city | plaintext | Yes — needed for billing |
| Never-mask list | blind index (see §3) | Only by brute force |
ECIES over P-256: ephemeral ECDH → HKDF-SHA256 → AES-256-GCM.
The repository includes browser interoperability checks and a database sweep designed to detect plaintext caller numbers. Current verification status is maintained with each release.
It is a keyed hash (HMAC-SHA256 with a server-side pepper and per-user salt), not sealed data. It has to be, because the server must match an inbound caller against it while your browser is closed.
There are roughly 10^10 North American numbers. Anyone holding both the database and the application pepper can enumerate that space and recover the list. Treat the never-mask list as obscured, not encrypted. Put your bank on it; do not put anything you would be harmed by on it — put those in protected contacts, which are genuinely sealed.
Masking happens in Twilio's network, so Twilio necessarily knows who called you and when. You have moved trust from your carrier to Twilio, not eliminated it. Nothing in this design can change that, and any claim otherwise would be false.
Carrier records exist independently of us. This service does not remove lawful carrier records and must never be marketed as though it does.
Malware, a malicious extension, or a hostile person with your unlocked phone can read decrypted data on screen. End-to-end encryption protects data in transit and at rest, not a device someone else controls.
This is the honest cost of holding no key. There is no reset. Your history becomes permanently unreadable — including to us.
Even sealed, the pattern "this account received 14 calls from the same unidentified party between 11pm and 1am" is meaningful. Sealing identities does not seal patterns. Retention limits (7/90/365 days by plan, actually deleted) are the mitigation.
These are not optional; the guarantee is void without them.
BLIND_INDEX_PEPPER must be set or the server refuses to start. Generate once with openssl rand -base64 32. Store it in the secret manager, not in the repo, and never in the same place as database backups — together they defeat §3's blind index.VALIDATE_TWILIO=true in production. Without it, anyone who discovers the webhook URL can make a subscriber's phone ring.Security issues: security@yourdomain — please allow 90 days before disclosure. Abuse: the /abuse-report endpoint, reviewed on every business day. Credible reports of unlawful use result in suspension pending review.