Double-click the HTML file
It opens straight from your desktop. There is no website behind it. The page fetches one thing: the open-source library that knows how to read PDFs.
file:// · pdf.js 3.11.174 + its worker
The two-prompt build · data flow
La construction à deux invites · parcours des données
This is the research assistant built live from two pasted prompts: one HTML file on your desktop. It reads your PDFs inside the browser tab, finds passages by keyword, and sends the best-matching pages with your question to a model. This page shows exactly what goes where.
Your PDFs, all their text and the keyword search. Held in the tab's memory only: close or reload the tab and it is gone.
Your question plus the full text of up to 8 best-matching pages, to OpenRouter and on to Claude Sonnet 5. With no key saved, nothing leaves at all.
No server, no accounts, no database, no install. Simple also means fewer guards: no zero-retention rule on the request and no security policy on the page.
Before anything
One download
Your browser, on your laptop
The network
The internet
It opens straight from your desktop. There is no website behind it. The page fetches one thing: the open-source library that knows how to read PDFs.
file:// · pdf.js 3.11.174 + its worker
Run by Cloudflare. Hands out the same library file to everyone who asks.
Receives an ordinary download request. Nothing from your documents, ever.
Remembered in this browser's local storage, in plain text. It is never written into the HTML file, so sharing the file does not share the key.
localStorage · pdfResearchAssistant_openrouterKey
Nothing crosses
Phase 1 · built by prompt 01
Nothing leaves your browser
Your browser, on your laptop
The network
The internet
Several at once is fine. "Upload" here means the browser reads each file from your own disk. PDF only.
File API · file.arrayBuffer()
pdf.js pulls the text out of every page and keeps the page number with it. Each file is then listed with its page count and "Ready to search".
pdfjsLib.getDocument · getTextContent
Nothing crosses
Loading makes no network request. Once pdf.js has arrived, this phase works with the Wi-Fi switched off.
One page of text is one searchable unit. Nothing is cut into smaller passages, nothing is converted to vectors, and nothing is saved. Reload the page and you load the PDFs again.
plain JavaScript arrays · no IndexedDB, no database
Phase 2 · added by prompt 02
Question + whole pages leave
Your browser, on your laptop
The network
The internet
Ordinary keyword ranking, no AI: common words are dropped, and pages score higher when they use your words often and other pages rarely do. The best 30 are listed with file name, page and the matching words highlighted.
BM25 · k1 = 1.5 · b = 0.75 · stop-word list
Still nothing
The question and the top 8 pages, with an instruction to answer only from them and to say plainly what is missing rather than guess. If no key is saved, this step is skipped and you keep the keyword results.
POST openrouter.ai/api/v1/chat/completions · direct from the browser
A routing service. The request does not ask for zero-data-retention routing, so OpenRouter chooses the endpoint under the privacy settings of whichever account owns the key.
Receives the request shown below.
Claude Sonnet 5, fixed in the file, with no model menu. It may be served by Anthropic directly or by a cloud host of the same model; OpenRouter decides.
Receives the question and the pages, under OpenRouter's credentials. It does not receive your key.
The written answer appears first. Under it, every page handed to the model is listed by file name and page number, and the 30 keyword matches stay visible, so any sentence can be checked against its source.
one JSON response · no streaming · nothing saved
Zoom in on the red arrow in step 7
POST https://openrouter.ai/api/v1/chat/completions Authorization: Bearer <your OpenRouter key> { "model": "anthropic/claude-sonnet-5", "messages": [ { "role": "system", "content": "You are a research assistant. You must answer the user's question using ONLY the passages provided below ... If the passages do not contain enough information to answer the question, say so plainly ..." }, { "role": "user", "content": "Question: <your question> Passages: Passage 1 (source: "S7A_Guideline.pdf", page 4): <the whole text of that page> --- ... Passage 8 (source: "S7B_Guideline.pdf", page 11): <the whole text of that page>" } ] }
Whole pages of whatever you load go to the model provider with each search, and this file does not ask for zero data retention. Published guidance, your own papers, a protocol template: yes. Anything under confidentiality: no.
The accurate sentence for this tool: the PDF never leaves; up to eight full pages per search do.
| 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. |
Voici l'assistant de recherche construit en direct à partir de deux invites collées : un seul fichier HTML sur votre bureau. Il lit vos PDF dans l'onglet du navigateur, trouve les passages par mots-clés, puis envoie les pages les plus pertinentes avec votre question à un modèle. Cette page montre exactement ce qui va où.
Vos PDF, tout leur texte et la recherche par mots-clés. Gardés dans la mémoire de l'onglet seulement : fermez ou rechargez l'onglet, et tout disparaît.
Votre question et le texte intégral d'au plus 8 pages parmi les plus pertinentes, vers OpenRouter puis vers Claude Sonnet 5. Sans clé enregistrée, rien ne sort du tout.
Aucun serveur, aucun compte, aucune base de données, aucune installation. Simple veut aussi dire moins de garde-fous : aucune règle de rétention zéro dans la requête et aucune politique de sécurité sur la page.
Avant tout
Un seul téléchargement
Votre navigateur, sur votre portable
Le réseau
Internet
Il s'ouvre directement depuis votre bureau. Il n'y a aucun site web derrière. La page va chercher une seule chose : la bibliothèque à code source ouvert qui sait lire les PDF.
file:// · pdf.js 3.11.174 + son worker
Exploitée par Cloudflare. Remet le même fichier de bibliothèque à quiconque le demande.
Reçoit une demande de téléchargement ordinaire. Rien de vos documents, jamais.
Elle est retenue dans le stockage local de ce navigateur, en texte clair. Elle n'est jamais écrite dans le fichier HTML : partager le fichier ne partage donc pas la clé.
localStorage · pdfResearchAssistant_openrouterKey
Rien ne traverse
Phase 1 · construite par l'invite 01
Rien ne quitte votre navigateur
Votre navigateur, sur votre portable
Le réseau
Internet
Plusieurs à la fois, sans problème. Ici, « téléverser » veut dire que le navigateur lit chaque fichier sur votre propre disque. PDF seulement.
File API · file.arrayBuffer()
pdf.js extrait le texte de chaque page et garde le numéro de page avec lui. Chaque fichier est ensuite listé avec son nombre de pages et la mention « Ready to search » (l'interface du fichier est en anglais).
pdfjsLib.getDocument · getTextContent
Rien ne traverse
Le chargement ne fait aucune requête réseau. Une fois pdf.js arrivé, cette phase fonctionne avec le Wi-Fi coupé.
Une page de texte est une unité de recherche. Rien n'est découpé en passages plus petits, rien n'est converti en vecteurs, et rien n'est enregistré. Rechargez la page, et vous rechargez les PDF.
simples tableaux JavaScript · ni IndexedDB, ni base de données
Phase 2 · ajoutée par l'invite 02
Question + pages entières sortent
Votre navigateur, sur votre portable
Le réseau
Internet
Un classement par mots-clés ordinaire, sans IA : les mots courants sont écartés, et une page marque plus de points quand elle emploie souvent vos mots alors que les autres pages le font rarement. Les 30 meilleures sont listées avec nom de fichier, page et mots trouvés surlignés.
BM25 · k1 = 1.5 · b = 0.75 · liste de mots vides
Toujours rien
La question et les 8 meilleures pages, avec la consigne de répondre uniquement à partir d'elles et de dire clairement ce qui manque plutôt que de deviner. Si aucune clé n'est enregistrée, cette étape est sautée et vous gardez les résultats par mots-clés.
POST openrouter.ai/api/v1/chat/completions · directement depuis le navigateur
Un service d'acheminement. La requête ne demande pas d'acheminement à rétention zéro : OpenRouter choisit donc le point de terminaison selon les paramètres de confidentialité du compte auquel appartient la clé.
Reçoit la requête montrée plus bas.
Claude Sonnet 5, fixé dans le fichier, sans menu de modèles. Il peut être servi par Anthropic directement ou par un hébergeur infonuagique du même modèle; c'est OpenRouter qui décide.
Reçoit la question et les pages, sous les identifiants d'OpenRouter. Il ne reçoit pas votre clé.
La réponse rédigée s'affiche d'abord. En dessous, chaque page remise au modèle est listée par nom de fichier et numéro de page, et les 30 résultats par mots-clés restent visibles : toute phrase peut ainsi être vérifiée à sa source.
une réponse JSON · pas de diffusion en continu · rien d'enregistré
Gros plan sur la flèche rouge de l'étape 7
POST https://openrouter.ai/api/v1/chat/completions Authorization: Bearer <votre clé OpenRouter> { "model": "anthropic/claude-sonnet-5", "messages": [ { "role": "system", "content": "You are a research assistant. You must answer the user's question using ONLY the passages provided below ... If the passages do not contain enough information to answer the question, say so plainly ..." }, { "role": "user", "content": "Question: <votre question> Passages: Passage 1 (source: "S7A_Guideline.pdf", page 4): <tout le texte de cette page> --- ... Passage 8 (source: "S7B_Guideline.pdf", page 11): <tout le texte de cette page>" } ] }
Des pages entières de tout ce que vous chargez partent vers le fournisseur du modèle à chaque recherche, et ce fichier ne demande pas la rétention zéro. Des lignes directrices publiées, vos propres articles, un gabarit de protocole : oui. Tout ce qui est sous confidentialité : non.
La bonne phrase pour cet outil : le PDF ne quitte jamais votre machine; jusqu'à huit pages entières par recherche, oui.
| 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. |