Skip to content

What NeverNo keeps, and what it doesn’t

Every sentence on this page was checked against the code that runs the site. It shows what NeverNo keeps, what it never keeps, who reads your messages and how to check it yourself.

Last checked against the code: November 11, 2026

  • In your browser

    Your conversations, images, characters and memory, encrypted with a key your browser will not let anyone export. If you turn on sync, an unreadable copy on our servers, without the media.

  • On our servers

    Your account, plan, credits, usage counters and the account records listed below (devices, payments, trials). Share links, your backup and sync, only encrypted, unreadable to us.

  • Never kept

    The text of your messages and replies, your images, your voice: they pass through our servers while the reply is made, and are not recorded in readable form.

What stays in your browser

Everything you create lives in an IndexedDB database called neverno, in this browser only. There is no readable copy on our servers: only, if you create them yourself, a backup, a share link or the sync copy, all three encrypted (see below).

On first use, your browser creates a “non-extractable” AES-256-GCM key: the page can use it to encrypt and decrypt, but no script can read it as bytes, not even ours. It stays in the keys table of the same database and never leaves the device. Each piece of content is encrypted on its own, with a random 12-byte vector.

So your conversations can be sorted and found without decrypting everything, a few markers stay readable: ids, dates, the model used. The table says which.

What is storedEncryptedStays readable
ConversationsThe titleId, folder, project, kind (for example a Confessional session), pinned or not, model, character, dates
MessagesThe text, the model’s reasoning, web sources, steps, versions, your voteId, author (you or NeverNo), model, status, links to media, date, reasoning time
FoldersThe nameOrder, date
Images, videos and soundsThe file, its description, model and sizeMedia type, file format, linked conversation, date
Characters you createThe whole sheetId, dates
Memory (accounts)Each memory and its vectorConversation it came from, kind of memory, who it is about (you or a character), dates
Custom instructions, pending learningThe textNothing
SettingsThe names to mask before anonymized models, the sync data keyMemory on or off, masking on or off, automatic backup, date of the last backup, backup key (non-extractable), your share links with their key, so you can copy them again, sync state (account, key epoch, cursor, date of the last exchange)
Sync trackingNothing: no content is copied thereThe changed rows to send (table and id), and for each item already exchanged its opaque id, its counter, its version and a fingerprint
Private vaultEach document’s name and details, the text of each passage and its vectorIds, passage order, indexing state, number of passages, dates
ProjectsThe whole project: its name, instructions and settingsId, dates
Files of a project or a conversationThe name and the contentId, linked conversation or project, file type and size, origin (you or an agent), dates
Tracking of synced files (when media sync is on)Each file’s own keyOpaque id, size, number of pieces, upload state, date

In local storage, in plain text

A few interface preferences are kept in plain text in the browser’s localStorage, with no conversation content: the chosen model, the image Studio settings (negative prompt included), the chosen voice, the accent color, a visitor’s avatar, the sidebar state, the upgrade suggestions already shown, and other settings of the same kind (the character chosen in the Confessional, notifications, the welcome screens already seen and, for an account just created, its id and creation time). One exception: while a video, a piece of music or a sound effect is being created, its description and settings are kept there in plain text so the creation can be found again after a reload; they are removed when it arrives or when you remove it, and on your first visit more than 24 hours after a failure. A creation started from an ephemeral chat is never written there.

When you turn a message into a mission, its text goes to the Missions page through the tab’s sessionStorage, in plain text: the page reads it once and erases it, and it is gone anyway when the tab closes.

“Erase everything” in Settings, or clearing the site’s data in your browser, deletes the database and the key. Without a backup or sync, nothing can be recovered, by you or by us.

Encrypted sync between your devices

Nothing readable on our servers. We only keep an unreadable copy, which only your passkey, your recovery key or your approved devices can open. We see how many items you sync and when, never their content.

With an account, you can turn it on in Settings › Data: your conversations, folders, characters, projects (with their files up to 200 KB each), memory, agents, custom instructions and settings follow you to your other devices. Each item is encrypted in your browser with AES-256-GCM before it leaves, under a data key our servers never have, and its id is made opaque: the server cannot tell whether it stores a message, a character or a setting. The vault (documents and passages) syncs too, encrypted the same way. Images, videos and sounds are not synced yet: they stay in this browser, and in your encrypted backup if you make one. A visitor without an account has no sync.

The data key is created on your first device. It is wrapped by your passkey (a WebAuthn key used for this alone, not to sign in), by your recovery key, and sealed for each of your approved devices. A new device gets it through one of these three paths. A stolen session is not enough: every sync request must be signed by an approved device.

What our servers see

  • how many items are synced and the size of each, rounded to a multiple of 256 bytes, never their kind or their content;
  • the time of each write, of the last exchange, and the device that wrote each item;
  • your devices (their name, status and dates) and your passkeys (id, name, date);
  • the space used, compared with your plan’s limit. A deleted item leaves a trace without content for 180 days, so that your other devices delete it too.

Sync space per plan

PlanSpace
Free100 MB
Pro5 GB
Pro+20 GB
Max100 GB

Once the space is full, your new changes wait on your device: nothing is lost, and your other devices keep receiving what is already synced. If your plan changes to one with less space than you use, nothing is erased, but nothing new syncs, text included, until you delete enough.

You stay in control

  • Turning it off, in Settings › Data, stops the sync and erases the items, the key envelopes and the device access from our servers. Only markers without content remain, listed further down: the date you turned it off, and the trace of any reset. Your data stays in this browser.
  • An ephemeral chat is never written to this browser, so it is never synced.
  • Your recovery key opens your data on a new device if you lose your passkey. It is shown once, and we never see it. Asking for a new one takes your passkey, or the old recovery key.
  • Without a passkey, a recovery key or another approved device, our copy can no longer be opened. Your devices keep their data, and you can turn sync on again from one of them.
  • “Change the key” re-encrypts everything under a new key: do it after revoking a device you no longer control.

Ephemeral chats: nothing kept, even here

An ephemeral chat (the dashed bubble next to the model picker, or “New ephemeral chat” in the sidebar and the ⌘K palette) works like any other chat, with one difference: it is never written to this browser. Its messages, the images and voices made in it and the files you attach live in the tab’s memory, and nowhere else.

  • nothing goes into IndexedDB: no conversation, no message, no media, and no key is created for it;
  • no title in the sidebar or in the search, and no address of its own: it stays at /chat?ephemeral=1;
  • the memory neither reads from it nor learns from it, and it never goes into a backup, a share link or the sync;
  • reloading the page, closing the tab or leaving the chat (inside the app, after a confirmation) erases it for good.

What still counts: your messages count toward the daily quota, and a vote on a reply adds to an anonymous total, as in any chat. Nothing changes on our side either: as for every chat, the text crosses our servers to the model and is written nowhere.

Private vault: your documents, and what leaves

The vault (“Vault” in the sidebar) keeps the documents you add, PDF, Word, Markdown, text or code, in the same neverno database, encrypted with the same key. Each document is cut into passages of about 800 tokens; the name and details of the document, the text of each passage and its vector are sealed. Only ids, the order of the passages, the indexing state and the counts stay readable. The original file is not kept.

Finding the passages that answer a question takes a vector for each passage: 1,024 numbers that describe its meaning. That calculation is not done in your browser. Here is exactly what leaves it, and when.

What leaves your browser

  • when you add a document: nothing. PDF (page by page), Word, Markdown, text and code files are read in your browser and are never sent whole;
  • while a document is indexed: the text of each passage, once, to our server and on to DeepInfra, which returns its vector; nothing is kept and the text is never logged (/api/memory/embed);
  • with each question, when “Answer from my vault” is on: the question, to get its vector the same way, then only the passages closest to it (6 at most, 3 on the free plan) with their document’s name, with that message only, to our server and to the model that answers, like the rest of the message. They are not stored in the conversation and are not sent again with the next messages.

What never leaves

  • the rest of your documents: the passages a question did not need, and the name of a document that gave none;
  • the search itself: the closest passages are picked in your browser, over the vectors stored there;
  • the list of your documents, which ones a conversation uses, and the word search on the Vault page.

What still counts: each passage indexed and each question searched counts toward a daily quota (vault), and what the calculation costs us is recorded as an amount, as for the memory. On a model marked “Anonymized”, the passages reach its maker with the message, under that maker’s rules. “Erase everything” in Settings deletes the vault with the rest.

Missions: when an agent works without you

A mission (paid plans, and one trial for a free account) runs on our servers while you are away: it is the only part of NeverNo where the server must read your instructions to do the work. We say it plainly, and keep what remains to the strict minimum.

The instructions, the agent’s sheet, the feedback you give and a watch’s last observation are encrypted at rest with a key only the missions server holds, bound to the mission and to your account. During a run, the pages read and the working notes are kept encrypted, then erased as soon as the result is delivered.

The result is encrypted for your devices’ public key: the private key is made in your browser and never leaves it (it goes with your encrypted backup). We have no way to read a delivered result again; its ciphertext is erased from our servers as soon as your device has it, and after 30 days at the latest. These timed erasures (30 and 90 days) are done by a purge that runs every hour.

DataReadable by the serverKept
Rhythm (days, time, time zone), budget, state, countersYes, to wake the missionAs long as the mission exists
Instructions, agent sheet, feedback, chosen connectorsOnly during a run (encrypted at rest)As long as the mission exists
A watch’s last observation (the few facts to compare)Only during a run (encrypted at rest)Replaced at every run
Pages read, working notes, step logDuring the run (encrypted at rest)Erased at delivery
Delivered resultNo: encrypted for your devicesUntil your device receives it, 30 days at most
A connector’s token or secretOnly for the call (encrypted at rest)Erased as soon as you disconnect

Every outward action (sending a message, calling a tool that acts) waits for your one-tap approval; notifications never contain the mission’s content.

What our servers keep, exactly

Our database (Supabase, Postgres) has no table that can read messages, replies or images: the sync only stores encrypted items there, with no readable kind or id. Here is what it keeps, by family, read from its migrations (supabase/migrations/).

DataWhyHow long
Account: email address, sign-up date and last sign-in. Supabase, which handles sign-in for us, keeps for each open session your browser’s full name (its user agent) and the IP address it was opened from, and keeps a log of sign-insSigning you in with a code sent by emailAs long as the account exists; a session: until it is closed (you can see and close your sessions in Settings › Security)
Profile: plan and renewal date, content filter on or off, date of your “18 or older” statement, any suspension, chosen avatar (a seed of at most 64 characters, never a photo), accent colorApplying your plan’s rights, showing your interface on every deviceAs long as the account exists
Payment: Stripe customer id, subscription status, auto top-up (threshold, amount, the card’s id at Stripe), gift codes used, ids of the Stripe events already handledBilling, managing the subscription, never handling a payment twiceAs long as the account exists; invoices at Stripe, as accounting law requires
Credits: each batch (amount, origin, expiry) and each spend, with its amount, date and a reason that names the feature or the model paid for (for example chat:claude-opus-5.5, confessional, debate:contract, research:…, image:…, media:…). This log therefore shows on which dates you paid for a Confessional session, with nothing of what was said in itKeeping your balance right, refunding a failed creationAs long as the account exists
Usage counters: the kind of action (message, image, search…) and the time, tied to your account; for a visitor without an account, to a random trial id and to a fingerprint of their IP address computed with a secret key (for an IPv6 address: of its whole /64 network, the block one connection can rotate through, not of the single address); for a free account, images, read-aloud and dictation are also counted against that fingerprint, in a separate counter that does not carry the account id (free accounts on one connection share a limit)Limits over a rolling 24 hours, and the 30-day calendar in “My subscription”Account: kept 31 days (numbers only, never content), then erased every hour. Visitor without an account: erased every hour past 48 hours. The last minute’s, which limit bursts of requests, after one hour
Cost of your included usage: an amount in dollars, a kind (chat, image, voice…) and the time, tied to your account or, for a visitor without one, to their trial id or to the fingerprint of their IP addressEach plan’s daily cost ceilingAccount: erased every hour past 35 days. Visitor without an account: past 48 hours
Long creations (video, music, sound effects): the model, status, dates, reserved credits, the provider’s task number and, for a video, the fact that it starts from an imported imageFollowing the generation and paying for it onceAs long as the account exists, with no description and no file on our side; the task number lets the provider find the description it received, for as long as it keeps it
Share links: the encrypted text (unreadable to us), its size, its creation and expiry dates, the account that made itSo that whoever has the link can read itUntil the expiry you chose (1, 7 or 30 days) or until you delete it, then erased within the hour
Backup: one file encrypted with your passphrase, its size and dateGetting your data back on another deviceUntil you delete or replace it
Encrypted sync: each encrypted item (unreadable to us) with its opaque id, its version, its size rounded to 256 bytes, its time and the device that wrote it; the data key wrapped by your passkey, your recovery key and for each approved device; the space usedGetting your data on your other devicesUntil you turn sync off or delete the account; a deleted item leaves a trace without content for 180 days
Companions’ spontaneous messages: for each companion, an opaque random id (never which character it is), the frequency you chose, the next time, your time zone and quiet hours, the day of the last notification and whether one is waiting; its name only if you allowed it in the notification. Never a word of a conversation: the message is written on your device when you open the appSending a notification without content (“NeverNo”, “Lena is thinking of you” or “A message is waiting for you”)Until you turn it off for that companion or for the account, start the relationship over, or delete the account
API keys: their name, first 12 characters and a SHA-256 fingerprint (never the key itself), the date of last useRecognizing your API callsAs long as the account exists (a revoked key keeps its revocation date)
Votes on replies: counters per day, model, vote and reasonTuning the Auto modeWithout limit, but with no account, no id and no text: nothing ties them to you
Admin log: each action an administrator takes on an account (credits added, suspension…) and some automatic actions (a subscription that reached its end, an order paid in crypto with the declared country and the country of the connection, a sync reset, the purge of an inactive account)Oversight and securityKept, even after the account is deleted, without its id; no maximum duration is set yet
Usage statistics: event names from a fixed list, a page template, the referrer’s domain, campaign tags, country, kind of device, language, a fingerprint of the day (its key erased every night); for an account, its sign-up day, origin, first payment and totals of revenue and costKnowing what to improve, measuring sign-ups and marginRaw events 90 days, then anonymous daily totals only; the account part until you turn it off or delete the account
Inactivity notice: the account id, the date the notice email was sent and the planned deletion date, for a free account unused for three yearsKeeping the promise of the privacy policy: a warning 30 days before, one deletion through the same steps as “Delete my account”, never twiceUntil you sign in again (the notice is dropped) or until the account is deleted
Browsers known to the account: the browser’s and system’s name (“Chrome, Windows”), when it was first and last seen, the date of the alert emailEmailing you when a new browser signs inAs long as the account exists (30 browsers at most)
Code confirmation of a sensitive action: for the session that asks, a fingerprint of the 6-digit code, the number of tries and of sends, the time of the last send and the end of the confirmation windowChecking it is you before signing your other sessions out or turning the sign-in alerts offThe code: 10 minutes; the row, without a code: until a later code request more than 24 hours after, or until the account is deleted
Trials of paid features: a counter per account and per IP address fingerprint, per feature and per month (or once only, for trials given a single time); for the missions trial, its dateOffering each trial once, without an account farm multiplying itIP address fingerprint: the current month, erased on the first night of the next one. Account: monthly counters kept 3 months at most; trials given a single time (Claude Opus answers, Confessional, video, agents, missions…): as long as the account exists; everything is erased with the account
Orders paid in crypto: the plan, price, status, dates, declared country, country of the connection, VAT and the order number at CoinGateOpening the plan you paid for, and keeping the accounting and VAT records the law requiresA paid order: 10 years, the period the law requires, detached from the account when it is deleted (automatic erasure at the end of that period is not in place yet); an unpaid order goes with the account
Contract evidence: when confirmations and receipts were sent, the version of the notice shown, and the waiver of the right of withdrawal checked before a purchaseProving what was agreed to and sent, as consumer law requiresAs long as the account exists; those of a paid crypto order stay, without the account
Granted plans and credits taken back: a plan granted by the administrator, with a free-text note; credits taken back after a refund or a dispute; automatic corrections of reservations (reason, amounts)Applying a granted plan, taking back refunded credits, closing a reservation left openGranted plan: until it ends; credits taken back: as long as the account exists; corrections: 365 days
Auto top-up: the last payment error (the start of Stripe’s message) and each attempt (amount, status, invoice number, date)Never charging twice, stopping after three failuresAs long as the account exists
Developer subscription: the subscription’s id at Stripe, its status and its renewal dateApplying the developer plan’s rightsAs long as the account exists
Missions, devices and notifications: for each device, its public keys, name, status and dates; the log of approvals and revocations; your browser’s notification subscription addressEncrypting results for your devices alone, notifying you without contentAs long as the device or the subscription exists; a device never approved: 30 days; a revoked device leaves a trace without keys for 90 days; log: 90 days
Missions, connectors: the access to each connected service (encrypted with the missions server’s key, which can read it to act) and the date it was last usedReading or acting in your services when a mission asks for itUntil you disconnect it or delete the account; we then ask the service (Google, Notion, Slack, GitHub) to revoke the authorization
Sync, account and keys: the wrapped data key, your passkeys, the approved devices; after you turn sync off or reset it, the date you turned it off, and the date, the device and the count of resetsOpening your data on your devices, and keeping an old device from reopening an erased copyAs long as sync is on; the off and reset markers: as long as the account exists
Current agents: for each personal agent you run, a keyed fingerprint of its id (never its name or its sheet), when it became the account’s agent, when it last ran and, if it was replaced, whenApplying the number of agents of your planThe current agent: as long as the account exists; a replaced agent: 31 days, then erased at the next run
Queue for the Confessional’s voice: the account or visitor holding a line or waiting for one, its state, its priority and two timestampsStaying under the number of simultaneous calls, and serving everyone in turnFor the length of the call or the wait; an abandoned line is removed at the next call, yours or someone else’s
Statistics tied to the account: its sign-up day, landing page, referring site, campaign tags, country, kind of device, language, whether it tried before signing up, its first paying day and first plan, and its totals of revenue, cost and credits; or, if you refuse them, only the date of that refusalMeasuring sign-ups and margin, and honoring your refusalUntil you turn them off (they are then erased, only the date of the refusal stays) or delete the account
Service health: for each server error, the route template (for example /api/chat, never the real address nor its parameters), the HTTP status, the error class and the provider, counted per minuteSeeing a route that breaks, and being alerted30 days; no account, no id, no message
Provider spend: an amount in dollars per minute, per provider and per kind of action, with no account behind itBeing alerted when our costs spike35 days
Feature switches and alert log: which feature is paused, by whom (an administrator or the automatic cut-off) and the figures of each alertPausing one feature without a deploy, and keeping a trace of itSwitches: as long as the site exists; alerts: 90 days

“Delete my account”, in Settings, erases all of this: the subscription is canceled, the Stripe customer and its cards are deleted, then the backup, the synced copy, links, keys, counters (trial counters included), costs and finally the account. The authorizations given to Google, Notion, Slack or GitHub are revoked at their end; if one of them does not answer, our copy of the access is erased all the same and you can remove the authorization from your account there. What remains: the anonymous vote counters; the admin log, without the account’s id; the accounting records the law requires (orders paid in crypto and the proof of their receipts, detached from you); usage statistics, detached from the account, for up to 90 days; counters tied to the fingerprint of an IP address, which erase themselves (48 hours, or at the end of the month for trials). Outside our database: the sending log of our emails at Resend, Supabase’s technical backups for as long as they are kept, and the invoices Stripe keeps on its side.

Supabase’s technical backups keep a copy of the database, and so of any deleted row, for as long as Supabase keeps them.

What our servers never keep

To answer you, your message goes through our servers to the model, and the reply streams back to your browser. None of the following is written in readable form to the database or to the logs (the sync, if you turn it on, only stores a copy your browser has encrypted):

  • the text of your messages and of the replies, and the model’s reasoning;
  • your custom instructions, your memories and the sheets of the characters you create, which go with each message;
  • your attachments: a PDF is read in memory and dropped, a text file is read by your browser itself;
  • the images you send: checked, then re-encoded without metadata (location, camera) before they go to the provider;
  • the images you create: they come back from the provider and go straight to your browser, which encrypts them;
  • your Studio descriptions, your dictated voice and the texts read aloud;
  • your web searches: the query leaves our server with no identifier and is not logged by us; depending on your plan it goes through Exa, which may keep it (see “Web search” below).

Our error logs only note technical markers: a model or provider name, an error code, a credit operation number. An account only appears there under a tag computed with a secret key, which reveals nothing on its own; only deleting an account notes its id, never its email. Elsewhere, some providers keep what they receive for a while: see “Who reads your messages”.

Usage statistics, without content

To know what to improve, we count how NeverNo is used, with our own tool on our own servers (/api/analytics): no cookie, no third-party tracker, no fingerprinting script.

A visitor is counted under a fingerprint of the day: a keyed hash of the site, the IP address and the browser, whose key is random and erased every night shortly after midnight (UTC: at the first visit of the day, and at 00:07 at the latest). Neither the address nor the browser is kept, and nobody, us included, can link one day’s visit to the next day’s once the key is erased; it may remain in our database’s technical backups for as long as they are kept.

What is counted

  • the page seen, as a template (/chat/:id, never an id), the site that sent you (its domain only) and the campaign tags utm_source, utm_medium, utm_campaign;
  • the country (from our host’s header), the kind of device (phone, tablet, computer) and the page’s language;
  • events from a fixed list: a message sent, an image or a video made, a feature used, a payment started, with a model’s id and yes/no options only;
  • the speed of the page as your browser measured it (display, reaction to a tap, layout stability: LCP, INP, CLS), rounded, with only the kind of page (home, chat, studio…) and the network class, and only while sharing is on;
  • for an account: its sign-up day, where its first visit came from, when it first paid, and what it brought and cost in total, to measure sign-ups, return visits and margin;
  • for the Confessional: your device notes, week by week, the mode or modes you talked in; that detail never leaves the device and is erased there 35 days after the week ends. All that is sent, without account or cookie, is an anonymous report: “one mode” or “two modes”, never which, and whether you came back the following week or a month later. Nothing is sent when sharing is off.

What is never counted

  • your messages, prompts, file names, conversation titles, searches or anything you type: no event can carry free text, and the server drops what is not on its list;
  • an ephemeral chat: it sends nothing at all;
  • the IP address or the full signature of your browser.

Raw events are erased after 90 days; only anonymous daily totals remain. Turn “Share anonymous statistics” off in Settings, or let your browser send Global Privacy Control or Do Not Track: you are still counted, with no fingerprint and nothing tied to your account, and what was tied to it is erased. Deleting the account erases its part too.

What is masked before an anonymized model

When you pick a model marked “Anonymized” (Claude, GPT, Gemini, Grok), the company that made it reads your request. Before the message leaves your browser for one of them, a short list of personal data is replaced by placeholders such as [EMAIL_1], and the reply comes back with the real values put back. None of this reaches our servers: the detection, the replacement and the mapping table live in the page, and the table is never stored (it is derived again from the conversation at each message).

It is a closed list, built to break as few questions as possible: no open-ended recognition of names. What it covers, and what it does not, exactly:

Replaced by a placeholder

  • email addresses;
  • phone numbers written in an international form (+33 6 12 34 56 78) or a national form with separators (06 12 34 56 78, (555) 123-4567, 090-1234-5678);
  • IBANs (checksum verified) and payment card numbers (Luhn check verified);
  • IP addresses (IPv4, and IPv6 written in full or with ::);
  • postal addresses written in full in one of a few common shapes: “12 rue de la Paix, 75002 Paris”, “221B Baker Street, London NW1 6XE”, “Hauptstraße 5, 10115 Berlin”, “123 Main Street, Springfield, IL 62704”;
  • the first name you gave when you started, and the names you add in Settings › Data (whole words, case kept).

Left as written

  • in what you type: every other name, and pseudonyms; places, dates of birth, employers, job titles, social security numbers, license plates, social media handles, links (in an attached file, ID numbers and dates of birth are masked and the names it announces are offered to you before sending);
  • digit runs without separators or country code, dates, times, amounts, versions and order numbers, so that a sum or a reference is never taken for a phone number;
  • addresses without a postcode, on several lines, or in Japanese, Chinese, Arabic or Russian order;
  • the subject of the conversation, your style, rare words: a language model can recognize a person from them, and masking does not claim to prevent it;
  • the images you attach (a one-line notice says so when you send one to an anonymized model); the text of an attached PDF or Word document is masked like your message, plus its ID numbers and dates of birth, and the names it announces once you accept them;
  • group chats and the public API, which do not go through this masking. Missions and the agents’ work are masked by our server before an anonymized model.

The switch is in Settings › Data, on by default; off, your messages reach anonymized models as written. Private models are never masked: nothing is kept there, and a wrong mask would cost more than it protects. Below the message box, “3 items masked” lists what was replaced for the last message. Measured on sealed cases, set aside and never used to tune the detectors: postal addresses are found in 72% of cases, phone numbers in 94%, IBANs in 100%, and across 160 look-alike traps (text that resembles personal data without being it) there was no false alarm. These are results from our own tests, not a guarantee: a detail written in an unusual way can slip through, so reread what you send to an anonymized model. A third improvement pass is planned after launch.

Clean Room: nothing is sent

Clean Room (/clean-room) makes a redacted copy of a PDF, a Word file or a text file. The file is read, searched, shown and rewritten in your browser: no route of ours receives it, its text or the list of what you hide. The only things the page loads are the site’s own files, from our address (the PDF reader, and for scanned pages the OCR engine and its language models). It works offline once it is open.

What is found automatically is the same closed list as the masking above: email addresses, phone numbers, IBANs, card numbers, IP addresses, postal addresses written in full, the names on your list. Nothing else; you add the rest by hand, and you review every box before the export.

  • The PDF export is flattened: each page is drawn as a picture with opaque boxes painted over the hidden spans, and a new file is written from those pictures alone, without any object of the original. No text layer, no font, no metadata (title, author, producer, XMP), no attachment, no annotation, no script, no earlier revision: the file never had them.
  • Before the download, the page checks the file it wrote: none of the hidden values and none of the forbidden structures may appear in it, or the export stops and nothing is downloaded.
  • The Markdown and text exports replace each hidden span with a numbered token ([EMAIL_1]) or a block of █, your choice, with an optional report that gives counts by kind, never a value.
  • The page counts, through the browser’s own measurements, the requests it makes from the moment you drop the file, the site’s files aside; the figure stays at 0 and is shown next to the export button.
  • Nothing is kept: no file, no text, no detection, in this browser or elsewhere. The copy is named document-redacted, never after the original. A signed-in account can choose, afterward, “Keep in my vault”: that is the usual vault, described above.

The promise is “the file never leaves your device, and you review before exporting”, not a guarantee: a detector finds nothing it does not know (a name not on your list, a date, a place), and a scanned page depends on what OCR managed to read. The review step is there for that.

Who reads your messages

A model has to read your message to answer it. This table shows who receives it and whether they keep it. It is generated from the model catalog and the routes to the providers: it changes by itself when the code changes.

No provider receives your email, your account id or your IP address: our server calls them, with its own key. They receive the text of the current conversation and, if you have them, your instructions, your memories and the character sheet. If you write who you are, they read it. At OpenRouter, we also refuse, with every request, to let it be used for training.

“Private”: an open model, served by DeepInfra or by OpenRouter with its zero-retention option, that does not keep requests. “Anonymized”: a closed model; the company that made it reads the text, without knowing who you are, and applies its own rules.

ModelLabelWho receives the textRetention
AutoNeverNoPrivate, no limitsDeepInfra and OpenRouterNothing, under their zero-retention commitments
NeverNo UncensoredNeverNoPrivate, no limitsA third-party zero-retention host, via OpenRouterNothing, under their zero-retention commitments
DeepSeek V4 FlashDeepSeekPrivateOpenRouter, then DeepInfra as a fallbackNothing, under their zero-retention commitments
GLM 5.3 FlashZ.aiPrivateDeepInfra, then OpenRouter as a fallbackNothing, under their zero-retention commitments
Qwen 3.5 35BAlibabaPrivateDeepInfra, then OpenRouter as a fallbackNothing, under their zero-retention commitments
Mistral Small 3.2MistralPrivateDeepInfra, then OpenRouter as a fallbackNothing, under their zero-retention commitments
GLM 5.2Z.aiPrivateDeepInfra, then OpenRouter as a fallbackNothing, under their zero-retention commitments
DeepSeek V4 ProDeepSeekPrivateDeepInfra, then OpenRouter as a fallbackNothing, under their zero-retention commitments
Euryale 70BSao10KPrivate, no limitsDeepInfra, then OpenRouter as a fallbackNothing, under their zero-retention commitments
Kimi K3MoonshotPrivateDeepInfra, then OpenRouter as a fallbackNothing, under their zero-retention commitments
Claude Fable 5.2AnthropicAnonymizedOpenRouter, then AnthropicNo zero-retention route exists: Anthropic may keep the request under its policy
Claude Opus 5.5AnthropicAnonymizedOpenRouter, then AnthropicNothing at OpenRouter; Anthropic applies its own policy
Claude Sonnet 5.5AnthropicAnonymizedOpenRouter, then AnthropicNothing at OpenRouter; Anthropic applies its own policy
Claude Haiku 5.5AnthropicAnonymizedOpenRouter, then AnthropicNothing at OpenRouter; Anthropic applies its own policy
GPT-6 AstraOpenAIAnonymizedOpenRouter, then OpenAINothing at OpenRouter; OpenAI applies its own policy
GPT-6.1 SolOpenAIAnonymizedOpenRouter, then OpenAINothing at OpenRouter; OpenAI applies its own policy
GPT-6.1 TerraOpenAIAnonymizedOpenRouter, then OpenAINo zero-retention route exists: OpenAI may keep the request under its policy
Gemini 4 ArgonGoogleAnonymizedOpenRouter, then GoogleNothing at OpenRouter; Google may keep a request flagged by its abuse monitoring for up to 90 days
Grok 4.7xAIAnonymizedOpenRouter, then xAINothing at OpenRouter; xAI applies its own policy

Auto uses private models; some exchanges go through an anonymized model, after masking. Auto’s private models: DeepSeek V4.1 Flash, DeepSeek V4.1 Flash, DeepSeek V4.1 Flash, DeepSeek V4.1 Flash, DeepSeek V4.1 Flash, DeepSeek V4.1 Flash, DeepSeek V4 Flash, DeepSeek V4 Pro, GLM 5.2, NeverNo Uncensored, Qwen 3.5 35B, and Mistral Small 3.2. Outside those exchanges and the political questions below, an anonymized model only answers if you choose it, or if you click the suggestion to ask it under a reply. On some political questions that Chinese models refuse, Auto answers with Claude (Anthropic), an anonymized model, after masking and on zero-retention hosts, instead of DeepSeek, GLM, Kimi or Qwen.

Images, videos and sounds

The Studio goes through Runware. Descriptions leave our server with no identifier. This table is generated from the code too.

ModelTypeHosted byNote
Z-Image TurboTongyiImageRunwareSent straight back to your browser
FLUX 3 KleinBlack Forest LabsImageRunwareSent straight back to your browserfiltered by its makeranonymized
NeverNo UncensoredZ-ImageImageRunwareSent straight back to your browser
Z-ImageTongyiImageRunwareSent straight back to your browser
Qwen Image 2.1 TurboAlibabaImageRunwareSent straight back to your browserfiltered by its maker
Qwen Image 3.0 ProAlibabaImageRunwareSent straight back to your browserfiltered by its maker
FLUX 3Black Forest LabsImageRunwareSent straight back to your browserfiltered by its maker
Nano Banana 2.1GoogleImageRunwareSent straight back to your browserfiltered by its makeranonymized
GPT Image 2.6OpenAIImageRunwareSent straight back to your browserfiltered by its makeranonymized
GPT Image 2.6 FlareOpenAIImageRunwareSent straight back to your browserfiltered by its makeranonymized
Muse ImageMetaImageRunwareSent straight back to your browserfiltered by its makeranonymized
LTX 2.3 FastLightricksVideoRunwarePlaced on Runware’s CDN, from where your browser downloads it
P-Video 2 ProPruna AIVideoRunwarePlaced on Runware’s CDN, from where your browser downloads itfiltered by its makeranonymized
MiniMax H3 MaxMiniMaxVideoRunwarePlaced on Runware’s CDN, from where your browser downloads itfiltered by its makeranonymized
HeyGen Video 1HeyGenVideoRunwarePlaced on Runware’s CDN, from where your browser downloads itfiltered by its makeranonymized
Veo 3.1 FastGoogleVideoRunwarePlaced on Runware’s CDN, from where your browser downloads itfiltered by its makeranonymized
Kling 4.0 FlashKuaishouVideoRunwarePlaced on Runware’s CDN, from where your browser downloads itfiltered by its makeranonymized
Wan 3.0AlibabaVideoRunwarePlaced on Runware’s CDN, from where your browser downloads itfiltered by its makeranonymized
Seedance 2.5ByteDanceVideoRunwarePlaced on Runware’s CDN, from where your browser downloads itfiltered by its makeranonymized
LTX 2.3LightricksVideoRunwarePlaced on Runware’s CDN, from where your browser downloads it
P-Video 2 ProPruna AIVideoRunwarePlaced on Runware’s CDN, from where your browser downloads itfiltered by its makeranonymized
Veo 3.1 LiteGoogleVideoRunwarePlaced on Runware’s CDN, from where your browser downloads itfiltered by its makeranonymized
ACE-Step 1.5 TurboACE StudioMusicRunwarePlaced on Runware’s CDN, from where your browser downloads it
ACE-Step 1.5ACE StudioMusicRunwarePlaced on Runware’s CDN, from where your browser downloads it
MiniMax Music 2.6MiniMaxMusicRunwarePlaced on Runware’s CDN, from where your browser downloads itfiltered by its maker
Seed Audio 1.0ByteDanceSound effectRunwarePlaced on Runware’s CDN, from where your browser downloads itfiltered by its maker
Mirelo SFX 1.5MireloSound effectRunwarePlaced on Runware’s CDN, from where your browser downloads it

The other services that see something pass

Web search
For subscribers, Exa receives the query (a short query drawn from your message) and returns the results; a free account gets one Exa search a day, then goes through Serper; without an account, it is Serper. Exa may keep the query and use it to improve its services and train its models: we have not subscribed to any zero-retention option. Depending on their subject, some searches are never sent to it. Serper returns Google’s results; Jina Reader reads the pages found, or the address you paste. None of the three receives an identifier or your IP address. In deep research, the “Premium writer” option has GPT 6.1 Sol search the web itself (OpenAI’s built-in search, through OpenRouter, on Microsoft Azure, zero retention requested): it receives your question masked as for an anonymized model. When an original page has become unreadable, deep research sends its address to the Internet Archive to read an archived copy. If the research runs on “all sources”, queries written from your question also go to arXiv, OpenAlex and the SEC’s EDGAR database. None of them receives an identifier or your IP address.
Voice
Dictation and the Confessional are transcribed by Whisper at Groq, with zero retention, or at DeepInfra when Groq is slow; the Kokoro, Inworld and Qwen voices go through DeepInfra; the xAI and MiniMax voices through Runware. Your voice is transcribed, then forgotten. With Pro+ and Max, replies read aloud are voiced by ElevenLabs (voice Jessica): contact details are masked before sending, each reading is deleted from our account’s history right after, and some replies never go there, nor does a voice you picked.
Makers of anonymized models
Anonymized models go through OpenRouter with its zero-retention option: the host that answers commits to keeping nothing. The few models without a zero-retention route are marked in the table above; their maker then keeps the request under its own rules (Anthropic up to 30 days, OpenAI 30 days). Gemini is served by Google, which may also keep a request flagged by its abuse monitoring for up to 90 days (without using it to train its models).
Relay to an anonymized model
For some requests, if our private model does not answer, the reply may be written by an anonymized third-party model (Grok, xAI), reached with no retention: your personal data (name, email, phone, address…) is masked before it sees it, exactly as for the third-party models you can choose.
Confessional
The Confessional answers with Anthropic’s Claude Sonnet, served by Google Vertex or Amazon Bedrock through OpenRouter with the zero-retention option: nothing is kept at the host. If Sonnet does not answer, Claude Haiku takes over under the same conditions, then GLM 5.2, a private model, as a last resort. For some exchanges, the reply comes from Grok 4.20 at xAI (personal data masked, zero retention), then from DeepSeek V4 Pro at DeepInfra, then from Dolphin at a third-party zero-retention host, via OpenRouter, two private models. Its voice is described just below.
Confessional voice
The voice you pick in the Confessional is produced by ElevenLabs, which acts on our behalf (as a processor) and receives only the text of the reply to read, never your voice or your account. Before it is sent, the email addresses, phone numbers, postal addresses, bank details, card numbers and IP addresses in a sentence are replaced by neutral words (“your email address”); first names and names stay, so the voice can say them. ElevenLabs keeps each sentence in our account’s history: we erase it a few seconds after it is spoken, and every 5 minutes anything still there after 10 minutes is erased. What ElevenLabs keeps for its own abuse monitoring follows its own rules. Some sentences, and all of them when ElevenLabs does not answer, are read by one of the voices listed above.
Memory
For every account, free included, a private model (DeepSeek V4 Flash at DeepInfra) picks out the facts to remember and computes their vectors; the result comes back to your browser, which encrypts it.
Safety
Our hard limits are checked by private models from our catalog, which read an image request or an image you send, then forget it.
Anti-bot
A visitor without an account passes the Cloudflare Turnstile check once, which receives their IP address and technical signals from the browser.
Payment
Stripe receives your email and your account id to link the payment, and your card details, which we never see.
Hosting
The site runs at Vercel, which sees your requests pass. The database, the accounts, the encrypted backup and the encrypted sync copy are at Supabase, which also sends your sign-in code by email.
Vault
The passages of your vault documents and your questions get their vectors from a private model at DeepInfra (Qwen3-Embedding-0.6B); the vectors come back to your browser, which encrypts them.

The encryption, in detail

Your history

A AES-256-GCM key created by your browser, non-extractable, and a random 12-byte vector for each piece of content. Text is encrypted before it is written, and decrypted only to be shown. Everything goes through the browser’s Web Crypto API, with no third-party library.

  • src/lib/db/crypto.ts
  • src/lib/db/schema.ts
See the code

The backup

Your passphrase becomes a key through PBKDF2-SHA-256: 600,000 iterations, with a random 16-byte salt. The whole file is then encrypted with AES-256-GCM. The passphrase never leaves your browser, and the file goes straight to storage through a signed link.

Without the passphrase, nobody can open the file, us included: a wrong passphrase is simply refused. If you forget it, the backup is lost.

  • src/lib/backup-crypto.ts
  • src/lib/backup.ts
See the code

Sharing

Each link has its own AES-256-GCM key, created in your browser. We only receive the encrypted text; the key is written after the link’s #, a part browsers never send to a server. Whoever has the full link can read it; we cannot.

The link expires after 1, 7 or 30 days, or as soon as you delete it.

  • src/lib/share.ts
  • src/lib/share-format.ts
See the code

Source code

Here is the code that encrypts in your browser, as it is in our repository when this page was built. Nothing is summarized or rewritten: these are the files themselves, read-only.

/** * Local-only encryption for the Zero-Log store. * * One AES-256-GCM key per browser, generated on first use as a non-extractable * CryptoKey and kept in IndexedDB: it never leaves the device and cannot be read * back as raw bytes, even by our own scripts. */import { requestPersistentStorage } from "./storage";export type Sealed = { v: 1; iv: Uint8Array<ArrayBuffer>; ct: Uint8Array<ArrayBuffer> };const encoder = new TextEncoder();const decoder = new TextDecoder();export type KeyStore = {  load: () => Promise<CryptoKey | undefined>;  /** Stores the key unless one is already there (the first stored wins). */  save: (key: CryptoKey) => Promise<void>;};let keyPromise: Promise<CryptoKey> | null = null;let activeStore: KeyStore | null = null;/** Point the module at the table that holds the key. Called once by the database. */export function configureKeyStore(store: KeyStore) {  activeStore = store;  keyPromise = null;}
  • src/lib/db/crypto.ts (85 lines)
  • src/lib/backup-crypto.ts (51 lines)
  • src/lib/share.ts (165 lines)

Our repository is still private. A public repository will follow, so you can compare this code with the code your browser runs.

What you can check yourself

No need to take our word for it: your browser’s developer tools are enough (F12, or right-click then “Inspect”, on a computer).

  1. Your encrypted data

    Application tab (Chrome, Edge) or Storage (Firefox), then IndexedDB › neverno › messages. The content field of each message is a { v, iv, ct } object: unreadable bytes. In keys, the key shows extractable: false.

  2. What leaves when you type

    Network tab, then send a message: one chat request leaves, with the current conversation and your current settings. No other conversation leaves.

  3. The small requests that follow

    Memory on: two memory requests then send this last exchange to pick out the facts to remember. New conversation: one chat/title request also sends your first question and the start of the reply, once, to give it a title. Suggestions on (Settings, Content): after a reply, one chat/follow-ups request sends your last question and the start and end of the reply, to suggest what to ask next; nothing is kept. Sync on: sync/push and sync/pull requests carry items your browser has encrypted, whose ct field is unreadable. Your session cookie goes with each of them, the chat request included, as on any site where you are signed in.

  4. A share link’s key

    Open a share link with the Network tab open: the shares/… request only holds the link’s id. What follows the # appears nowhere.

  5. Who the page may talk to

    On neverno.ai, the page’s Content-Security-Policy header lists the only addresses it is allowed to contact: our servers, Supabase, the Runware CDNs for your media, Cloudflare for the anti-bot check, and two addresses reserved for the Confessional’s real-time voice conversation (api.elevenlabs.io and our server rt.neverno.ai), listed ahead of time: as long as that feature is not open, the page never connects to them. No third-party analytics, no ads.

Our limits, honestly

What NeverNo’s privacy does not do, or not yet:

  • NeverNo is not an anonymity network. Our host sees your IP address, as with any site: we record it in none of our own tables, but its technical logs may keep a trace under its own rules, and Supabase, which handles account sign-in, keeps the IP address of each open session. To hide it, use a VPN or Tor.
  • To pick the model, decide on a search and apply our hard limits, our server reads your message in memory while the reply is made. It writes it nowhere, but it does see it pass.
  • With each message, the current conversation goes too (its recent messages), because a model remembers nothing from one call to the next.
  • The “Private” label rests on DeepInfra’s commitments and on OpenRouter’s zero-retention option. We cannot inspect their servers.
  • An “Anonymized” model is read by the company that made it (Anthropic, OpenAI, Google, xAI), which may keep the request for a while under its own rules. Your email addresses, numbers and the names you marked are masked before they reach it (see above); the rest of the text is not. For a sensitive conversation, stay on a private model.
  • Local encryption stops anyone from reading your conversations by opening the database as it is, and no script can extract the key. It does not protect you from a person or a program with access to your device or your open session: lock your device.
  • A few markers stay readable in your browser (dates, models, media types), and your interface preferences are in plain text there.
  • Videos and sounds you create wait on Runware’s CDN until your browser downloads them; how long they stay there is up to Runware: up to 7 days for a clip, going by the expiry its address states (measured on 11 November 2026).
  • Our code is not public yet: you cannot yet compare for yourself the published code with the code your browser runs.
  • The sync lets some metadata show: how many items, their rounded size and the time of each write, and so the rhythm of your activity. An approved device that is no longer yours keeps the key until you change it.
  • If you forget your backup passphrase, or clear your browser without a backup or sync, your data is lost: we have no way to recover it.

Change history

Every change that touches your privacy, dated. Part of the facts on this page (models, providers, durations, encryption parameters) is checked by automated tests: if the code changes, they fail until the page is corrected.

  1. Where to see and close your open sessions is now said in the table of what our database keeps: Settings › Security.
  2. Long creations: our database now also records, for a video, whether it starts from an imported image (a plain flag, with no description and no image). How long Runware keeps a clip is now stated: up to 7 days, measured.
  3. A visitor’s counters and cost amounts are now erased after 48 hours, with no exception; trial counters tied to an IP address at the end of the month; the inactivity trail in the admin log no longer keeps the account’s id; a mission’s results are erased by an hourly purge.
  4. The “Continue in the Studio” link under an image in a chat no longer puts the image’s description in the page’s address; before this date, it could appear in our host’s technical logs.
  5. Deleting an account now also erases its trial counters and revokes the authorizations given to Google, Notion, Slack or GitHub. Our logs now note an account only under a keyed tag, and anonymized models only go through the hosts this page names.
  6. This page was reread line by line against the code and corrected: Supabase keeps the IP address and the browser of each open session; the table of what our database keeps is completed, family by family; the security header also lists two addresses reserved for the Confessional’s real-time voice (since early November); the services deep research contacts and the Confessional’s fallback models are named.
  7. An account’s usage counters are now kept 31 days (numbers only, never content) so the 30-day calendar in “My subscription” is complete; a visitor’s are still erased after 48 hours.
  8. Auto: on some political questions that Chinese models refuse, it now answers with Claude (Anthropic), an anonymized model, instead of Mistral Small: personal details are replaced before sending and put back in the answer, on zero-retention hosts. A model you pick yourself is never replaced.
  9. Auto: on some political questions that Chinese models refuse, it answers with another private model (Mistral Small, or Dolphin if needed) instead of DeepSeek, GLM, Kimi or Qwen. A model you pick yourself is never replaced.
  10. Web search: Exa serves subscribers (one search a day with a free account, then Serper and Jina; without an account, Serper and Jina). Exa may keep the query (with no identifier or IP address), which none of our logs does.
  11. Sync: project files up to 200 KB each already followed you, and the page now says so; a plan with less space than you use stops new syncs, text included, until you delete enough.
  12. The Confessional’s voice is now produced by ElevenLabs: personal details are replaced before sending, and each sentence is erased from our account’s history a few seconds after it is spoken.
  13. Added what happens to requests to anonymized models and to the Confessional (zero retention, and the marked exceptions).
  14. IP fingerprints used for limits and free trials now cover the whole /64 network of an IPv6 address (the block of addresses of one connection), so rotating addresses no longer multiplies the limits. It is still a keyed fingerprint, never the address itself.
  15. End-to-end encrypted sync for accounts: an unreadable copy on our servers, which only your passkey, your recovery key or your approved devices can open. Media are not synced.
  16. Page speed (LCP, INP, CLS) measured in your browser and added to the usage statistics, rounded and by kind of page only. Nothing is sent while sharing is off.
  17. Memory between chats for every account, free plan included. Visitors without an account still have none.
  18. Usage statistics without content: our own counting, no cookie, a fingerprint of the day, a switch in Settings.
  19. Private vault: documents kept encrypted in this browser; only the passages a question needs leave, with that question.
  20. Ephemeral chats: a conversation kept in the tab’s memory only, never written to this browser.
  21. The cost amounts of your included usage are now erased automatically after 35 days.
  22. This page and the code that encrypts are published.
  23. Web search: the query leaves our server with no identifier and no IP address, and is not logged.
  24. Your accent color is saved on your profile, like your avatar since the day before (a seed, never a photo).
  25. Images you send are checked, then re-encoded without metadata before they go to a provider.
  26. Automatic erasure every hour: usage counters older than 48 hours, expired share links.
  27. Account deletion from Settings: subscription, Stripe customer, backup, keys, counters and costs erased.
  28. Votes on replies: plain anonymous counters, with no account and no text.
  29. Backup encrypted with a passphrase (PBKDF2, 600,000 iterations, AES-256-GCM).
  30. Encrypted share links, key in the link’s #; images are encrypted in them with the same key.
  31. Security headers: the page can only contact our servers, Supabase, the media CDNs and Cloudflare.
  32. API keys: only a SHA-256 fingerprint is kept.
  33. Sign-in with an email code; the trial without an account is tied to a fingerprint of the IP address, never to the address itself.
  34. History encrypted in the browser (AES-256-GCM, one non-extractable key per browser).
Read the privacy policy