Open the web address
The browser downloads the app, the small language model used for indexing (about 129 MB, first visit only, then cached) and a ready-made index of the six ANX-4471 workshop files.
second-cortex.vercel.app · static files only
Second Cortex · data flow
Second Cortex · parcours des données
…
Second Cortex is a web page, not a service. Reading, indexing and searching your documents all happen inside your own browser. The one thing that travels is a single request per question, and this page shows exactly what is in it.
Your files, the extracted text, the passages, their vectors, the search itself, your notes and your question history.
Your question plus up to 10 excerpts of about 190 words each, to OpenRouter and on to the model, with zero data retention enforced.
The page's security policy lets the browser connect to two places only: the app's own site and openrouter.ai. No server of ours, no accounts, no analytics.
Before anything
Downloads only
Your browser, on your laptop
The network
The internet
The browser downloads the app, the small language model used for indexing (about 129 MB, first visit only, then cached) and a ready-made index of the six ANX-4471 workshop files.
second-cortex.vercel.app · static files only
Hands out files, like any website. There is no backend behind it and nowhere to upload to.
Receives an ordinary page request. Nothing from your documents, ever.
Kept in this browser's local storage, in plain text. In the room, the key is one we supply, so requests are not tied to an account of yours.
localStorage · secondCortex.openRouterKey
Confirms the key, and returns its public list of models that can be served with zero data retention. That list fills the model menu.
Receives the key. No question, no document content.
Phase 1
Nothing leaves your browser
Your browser, on your laptop
The network
The internet
PDF, Word, Markdown or plain text. "Upload" here means the browser reads the file from your own disk. A fingerprint of the file spots one you have already loaded.
File API · SHA-256 via crypto.subtle
Every piece of text keeps its page number. A scanned PDF with no text layer is refused with a clear message rather than indexed as empty.
pdf.js · mammoth (Word) · TextDecoder
Up to 190 words each, overlapping by 25 so a sentence is never lost at a seam. Each passage remembers its file and page.
chunker v1 · 190 words · 25 overlap
Nothing crosses
This whole phase makes no network request. Once the app has loaded, you can add documents with the Wi-Fi switched off.
The small language model downloaded in step 1 runs inside the browser and converts each passage into 384 numbers that capture its meaning, in English, French or German.
transformers.js · paraphrase-multilingual-MiniLM-L12-v2 · WebAssembly · remote models disabled
Passages and their numbers go into a small database held in the browser's own storage, with a copy of the original file so a citation can open it later. Optionally, the same data is mirrored to a folder you pick on your own disk.
sql.js (SQLite in WebAssembly) · IndexedDB · File System Access API for the optional folder
Phase 2
Question + excerpts leave
Your browser, on your laptop
The network
The internet
Same in-browser model as step 6. The question has not gone anywhere yet.
embedTexts(question) · 384 dimensions
The question's numbers are compared with every stored passage, in the browser. The 10 nearest in meaning are kept. This covers the workshop files, your own files and your notes.
cosine similarity in JavaScript · k = 10
Still nothing
The question and those 10 excerpts, with an instruction to answer only from them and to say so plainly when they do not contain the answer. No earlier questions go with it.
POST openrouter.ai/api/v1/chat/completions · direct from the browser
A routing service. The request tells it: send this only to an endpoint with zero data retention, and if there is none, refuse. It fails closed with an error; the app never retries without that rule.
Receives the request shown below.
Claude Sonnet 5 by default. OpenRouter picks the hosting endpoint: in our check on 18 September it was Amazon Bedrock. The menu offers only zero-retention-eligible models from Anthropic, OpenAI and Google.
Receives the question and excerpts, under OpenRouter's credentials. It does not receive your key.
It streams in word by word. Under it, all 10 passages the model was given are listed with file and page. Clicking one opens your own local copy at that page.
server-sent events · citations resolved from IndexedDB
Question, answer and sources are stored in this browser only, so you can return to them. They are never sent with a later question.
IndexedDB · history store
Zoom in on the red arrow in step 10
POST https://openrouter.ai/api/v1/chat/completions Authorization: Bearer <OpenRouter key> { "model": "anthropic/claude-sonnet-5", "provider": { "zdr": true }, // zero data retention, or refuse "temperature": 0.2, "stream": true, "messages": [ { "role": "system", "content": "You are Second Cortex ... Answer ONLY using the numbered excerpts below. If the excerpts do not contain the answer, say so plainly ... [1] (ANX-SPH-003 ..., p. 14) <excerpt, up to 190 words> ... [10] (ANX-TX-004 ..., p. 31) <excerpt, up to 190 words>" }, { "role": "user", "content": "<your question>" } ] }
Once a real document is loaded, excerpts of it go to the model provider with your question. The Library box says so. Published guidance, your own papers, a protocol template: yes. Anything under confidentiality: no.
"Nothing leaves your machine" would be the wrong sentence. The accurate one: the file never leaves; up to ten short excerpts per question do.
| What | Where it lives | Does it ever leave the browser? |
|---|---|---|
| Files you load | IndexedDB in this browser, and your chosen folder if you turn that on | No |
| Passages and their numbers | The same in-browser database | Only the 10 closest passages, per question. The numbers themselves never do. |
| Notes | IndexedDB in this browser. Notes are indexed like documents. | Only when a note is among the 10 closest passages to a question |
| Question history | IndexedDB in this browser | No |
| OpenRouter key | This browser's local storage, in plain text | To OpenRouter, with each request. "Log out" removes it from the browser. |
| Export file | Wherever you save it | Only if you move it. It contains everything above, the key included in plain text, so treat it like a password. |
| Second Cortex | The two-prompt file | |
|---|---|---|
| Runs from | A web address (static files on Vercel) | One HTML file on your desktop |
| Reads | PDF, Word, Markdown, plain text, plus your notes | PDF only |
| Finds passages by | Meaning: an in-browser language model compares vectors, across English, French and German | Keywords: the words you typed must appear on the page |
| Sent per question | Question + up to 10 excerpts of at most 190 words | Question + the full text of up to 8 pages |
| Model | Claude Sonnet 5 by default; short menu of zero-retention-eligible models | Claude Sonnet 5, fixed |
| Zero data retention | Enforced on every request; refuses rather than fall back | Not requested; depends on the key owner's OpenRouter settings |
| Where the browser may connect | Its own site and openrouter.ai only, enforced by the page's security policy | cdnjs (for pdf.js) and openrouter.ai; no policy restricts it |
| Kept between visits | Library, notes, history and key, in this browser | The key only. Documents are reloaded each time. |
Second Cortex est une page web, pas un service. La lecture, l'indexation et la recherche dans vos documents se font entièrement dans votre propre navigateur. La seule chose qui voyage, c'est une requête unique par question, et cette page montre exactement ce qu'elle contient.
Vos fichiers, le texte extrait, les passages, leurs vecteurs, la recherche elle-même, vos notes et l'historique de vos questions.
Votre question et jusqu'à 10 extraits d'environ 190 mots chacun, vers OpenRouter puis vers le modèle, avec la rétention zéro des données imposée.
La politique de sécurité de la page ne permet au navigateur de se connecter qu'à deux endroits : le site de l'application et openrouter.ai. Aucun serveur à nous, aucun compte, aucun outil d'analyse.
Avant tout
Téléchargements seulement
Votre navigateur, sur votre portable
Le réseau
Internet
Le navigateur télécharge l'application, le petit modèle de langue qui sert à l'indexation (environ 129 Mo, à la première visite seulement, puis mis en cache) et un index tout prêt des six fichiers ANX-4471 de l'atelier.
second-cortex.vercel.app · fichiers statiques seulement
Distribue des fichiers, comme n'importe quel site web. Il n'y a aucun serveur applicatif derrière, et nulle part où téléverser quoi que ce soit.
Reçoit une demande de page ordinaire. Rien de vos documents, jamais.
Elle est conservée dans le stockage local de ce navigateur, en texte clair. Dans la salle, c'est nous qui fournissons la clé : les requêtes ne sont donc liées à aucun compte à vous.
localStorage · secondCortex.openRouterKey
Confirme la clé et renvoie sa liste publique des modèles qui peuvent être servis avec la rétention zéro. Cette liste remplit le menu des modèles.
Reçoit la clé. Aucune question, aucun contenu de document.
Phase 1
Rien ne quitte votre navigateur
Votre navigateur, sur votre portable
Le réseau
Internet
PDF, Word, Markdown ou texte brut. Ici, « téléverser » veut dire que le navigateur lit le fichier sur votre propre disque. Une empreinte du fichier repère celui que vous avez déjà chargé.
File API · SHA-256 via crypto.subtle
Chaque morceau de texte garde son numéro de page. Un PDF numérisé sans couche de texte est refusé avec un message clair, plutôt que d'être indexé vide.
pdf.js · mammoth (Word) · TextDecoder
Jusqu'à 190 mots chacun, avec un chevauchement de 25 mots pour qu'aucune phrase ne se perde à une jointure. Chaque passage retient son fichier et sa page.
chunker v1 · 190 mots · chevauchement de 25
Rien ne traverse
Toute cette phase ne fait aucune requête réseau. Une fois l'application chargée, vous pouvez ajouter des documents avec le Wi-Fi coupé.
Le petit modèle de langue téléchargé à l'étape 1 s'exécute dans le navigateur et convertit chaque passage en 384 nombres qui en captent le sens, en anglais, en français ou en allemand.
transformers.js · paraphrase-multilingual-MiniLM-L12-v2 · WebAssembly · modèles distants désactivés
Les passages et leurs nombres vont dans une petite base de données tenue dans le stockage du navigateur, avec une copie du fichier d'origine pour qu'une citation puisse l'ouvrir plus tard. En option, les mêmes données sont recopiées dans un dossier que vous choisissez sur votre propre disque.
sql.js (SQLite en WebAssembly) · IndexedDB · File System Access API pour le dossier optionnel
Phase 2
Question + extraits sortent
Votre navigateur, sur votre portable
Le réseau
Internet
Le même modèle dans le navigateur qu'à l'étape 6. La question n'est encore allée nulle part.
embedTexts(question) · 384 dimensions
Les nombres de la question sont comparés à chaque passage enregistré, dans le navigateur. Les 10 plus proches par le sens sont retenus. Cela couvre les fichiers de l'atelier, vos propres fichiers et vos notes.
similarité cosinus en JavaScript · k = 10
Toujours rien
La question et ces 10 extraits, avec la consigne de répondre uniquement à partir d'eux et de le dire clairement s'ils ne contiennent pas la réponse. Aucune question précédente ne l'accompagne.
POST openrouter.ai/api/v1/chat/completions · directement depuis le navigateur
Un service d'acheminement. La requête lui impose ceci : n'envoyer qu'à un point de terminaison à rétention zéro, et s'il n'y en a pas, refuser. La requête échoue alors avec une erreur; l'application ne réessaie jamais sans cette règle.
Reçoit la requête montrée plus bas.
Claude Sonnet 5 par défaut. OpenRouter choisit le point d'hébergement : lors de notre vérification du 18 septembre, c'était Amazon Bedrock. Le menu ne propose que des modèles admissibles à la rétention zéro, d'Anthropic, d'OpenAI et de Google.
Reçoit la question et les extraits, sous les identifiants d'OpenRouter. Il ne reçoit pas votre clé.
Elle s'affiche mot à mot. En dessous, les 10 passages remis au modèle sont listés avec fichier et page. Un clic ouvre votre propre copie locale à cette page.
server-sent events · citations résolues depuis IndexedDB
La question, la réponse et les sources sont conservées dans ce navigateur seulement, pour que vous puissiez y revenir. Elles ne sont jamais envoyées avec une question ultérieure.
IndexedDB · magasin history
Gros plan sur la flèche rouge de l'étape 10
POST https://openrouter.ai/api/v1/chat/completions Authorization: Bearer <clé OpenRouter> { "model": "anthropic/claude-sonnet-5", "provider": { "zdr": true }, // rétention zéro, sinon refus "temperature": 0.2, "stream": true, "messages": [ { "role": "system", "content": "You are Second Cortex ... Answer ONLY using the numbered excerpts below. If the excerpts do not contain the answer, say so plainly ... Réponds en français (français québécois si naturel). ... [1] (ANX-SPH-003 ..., p. 14) <extrait, jusqu'à 190 mots> ... [10] (ANX-TX-004 ..., p. 31) <extrait, jusqu'à 190 mots>" }, { "role": "user", "content": "<votre question>" } ] }
Dès qu'un vrai document est chargé, des extraits partent vers le fournisseur du modèle avec votre question. La zone de dépôt de la Bibliothèque le dit. Des lignes directrices publiées, vos propres articles, un gabarit de protocole : oui. Tout ce qui est sous confidentialité : non.
« Rien ne quitte votre machine » serait la mauvaise phrase. La bonne : le fichier ne la quitte jamais; jusqu'à dix courts extraits par question, oui.
| Quoi | Où ça se trouve | Est-ce que ça quitte le navigateur? |
|---|---|---|
| Les fichiers que vous chargez | IndexedDB dans ce navigateur, et le dossier de votre choix si vous activez cette option | Non |
| Les passages et leurs nombres | La même base de données dans le navigateur | Seulement les 10 passages les plus proches, par question. Les nombres eux-mêmes, jamais. |
| Les notes | IndexedDB dans ce navigateur. Les notes sont indexées comme des documents. | Seulement quand une note fait partie des 10 passages les plus proches d'une question |
| L'historique des questions | IndexedDB dans ce navigateur | Non |
| La clé OpenRouter | Le stockage local de ce navigateur, en texte clair | Vers OpenRouter, avec chaque requête. « Se déconnecter » la retire du navigateur. |
| Le fichier d'exportation | Là où vous l'enregistrez | Seulement si vous le déplacez. Il contient tout ce qui précède, y compris la clé en texte clair : traitez-le comme un mot de passe. |
| Second Cortex | Le fichier à deux invites | |
|---|---|---|
| S'exécute depuis | Une adresse web (fichiers statiques chez Vercel) | Un fichier HTML sur votre bureau |
| Lit | PDF, Word, Markdown, texte brut, et vos notes | PDF seulement |
| Trouve les passages par | Le sens : un modèle de langue dans le navigateur compare des vecteurs, en anglais, en français et en allemand | Les mots-clés : les mots tapés doivent figurer sur la page |
| Envoyé par question | Question + jusqu'à 10 extraits de 190 mots au plus | Question + le texte intégral d'au plus 8 pages |
| Modèle | Claude Sonnet 5 par défaut; court menu de modèles admissibles à la rétention zéro | Claude Sonnet 5, fixé |
| Rétention zéro des données | Imposée à chaque requête; refuse plutôt que de se rabattre ailleurs | Non demandée; dépend des paramètres OpenRouter du titulaire de la clé |
| Où le navigateur peut se connecter | Son propre site et openrouter.ai seulement, imposé par la politique de sécurité de la page | cdnjs (pour pdf.js) et openrouter.ai; aucune politique ne le restreint |
| Conservé d'une visite à l'autre | Bibliothèque, notes, historique et clé, dans ce navigateur | La clé seulement. Les documents sont rechargés chaque fois. |