About this site
SecureRAG is a static website whose only tool answers questions about your own documents without sending them anywhere: the parsing, indexing and retrieval code runs in the browser tab, and the models that power it are downloaded once into your own browser storage. This page covers why it exists, what it is built from, what it refuses to do, and how to check all of it yourself.
Last updated:
This is a website about a browser-local retrieval tool: static HTML and JavaScript, no backend, no database, no account, and a single outbound request that fetches model weight files by name. It exists because the alternative for most people is uploading a document to a service they cannot inspect, and because the technical pieces needed to avoid that have only recently become good enough to work in a browser tab.
What this site is, and what it is not
| Question | Answer |
|---|---|
| What it is | A set of static files that deliver one tool: ask questions about your own PDF, DOCX or text files, with citations, entirely in the browser |
| What it is not | Not a company, not a service with an account system, not a storage provider, not an API, not a chatbot with memory |
| Where documents go | Nowhere. They are parsed in the tab and stored in your own IndexedDB and Cache Storage |
| What it costs | Nothing. There is no paid tier, no trial and no subscription to cancel |
| How it is funded | Google AdSense on a limited set of pages, loaded personalized only after you agree |
| Who runs it | One developer and a small number of contributors. No company entity, no registered office, no funding round to describe |
Why it was built
The trigger was ordinary. A contract, a report and a set of meeting notes needed answering, and every tool available wanted the file first. Uploading a client contract to a third-party service means deciding that a company you cannot audit may hold it indefinitely, and for a lot of documents that is simply not a decision worth making. The obvious alternative, reading 200 pages by hand, is slow enough that people take the upload instead.
What changed recently is that retrieval no longer needs a server. A small embedding model quantised to int8 is about 23 to 25 MB, a browser can run it through WebAssembly in seconds, and an index of 20,000 chunks fits comfortably in IndexedDB. Once those three facts hold, the server stops being a requirement and starts being a data collection point. This site is what you get when you remove it.
Where the privacy stance comes from
The stance is architectural rather than a promise. There is no upload endpoint to secure, no server-side index to encrypt, no retention period to shorten, because there is no server holding the data. That removes a class of risk that a policy document cannot remove: a subpoena, a breach, an acquihire, a misconfigured storage bucket. It also means we cannot help you recover anything, and that trade is the whole point of this page.
The same logic applies to accounts. An account exists to give a server someone to bill, remember and identify. Remove the server and the account has nothing left to do, which is why there is no sign-up form anywhere on this site.
What it is built from
Every piece is open source and public, which is what makes the claims above checkable by reading code rather than by trusting a sentence.
| Component | Role here |
|---|---|
| Astro, static output | Generates the pages as pre-built HTML with no server-side rendering at request time, which is why the site can be served from any static host |
| Preact islands | Ships only the interactive parts as JavaScript: the workspace, the file drop zone, the settings panel. A documentation page loads no application code |
| Transformers.js | Runs the embedding and generation models in the browser, with the same model files the upstream libraries consume |
| onnxruntime-web | Executes the ONNX model graphs, on WebGPU where available and through WebAssembly on the CPU otherwise |
| PDF.js | Parses PDF files in the browser and keeps page numbers attached to the extracted text, which is what makes a citation point at a page |
| jszip | Reads DOCX, which is a ZIP container of XML parts, and keeps heading levels attached to the text inside it |
| IndexedDB | Stores text chunks and their vectors per knowledge base in your browser |
| Cache Storage | Stores the model weight files, so the download happens once per model rather than once per visit |
The WebAssembly binaries that onnxruntime needs are published with the site itself rather than pulled from a third-party content network, so the number of external hosts involved in the tool stays at one: the model host.
What we deliberately do not do
- No accounts. There is no registration, no login and no email address required to use the tool, so there is nothing to lose in a credential breach.
- No cloud sync. Documents indexed on one machine are not available on another, because syncing them would require a server to hold them. Moving an index means re-importing the files.
- No bring-your-own-key upload. The site does not ask for an API key and does not offer to send your documents to a provider under your credentials. That design would keep the file leaving your device, which is the thing this project exists to avoid.
- No analytics, no tracking pixels and no session recording. There is no third-party measurement script on any page; the only third-party script present is the advertising one, and only where ads exist and personalized only with your consent.
- No training on your content, and no mechanism by which it could happen, because no copy of it leaves the browser.
- No claim of accuracy. The tool retrieves and, optionally, generates; it does not verify. Anything that has to be right gets checked by a person against the cited passage.
How to verify us in about two minutes
Watch the network while you add a file
Open DevTools with F12, go to the Network tab, clear it, filter by Fetch/XHR and drop in a document. No request carries the file. What you see are GET requests for ONNX weight files, with a file name in the path and no request body.
Pull the plug and ask a question
Switch the Network panel to offline and ask something about the document you just imported. The answer arrives with citations, which is only possible if retrieval, chunking and embedding were local all along.
Look at what is stored, and where
In the Application tab, expand IndexedDB and you will find a database called securerag, holding one metadata record per document and, under an index key, the chunk text with its Float32Array vectors; expand Cache Storage on the same origin and you will find the model weights. Clear site data and both are gone, with nothing left for us to delete.
Read the page source for what is missing
View source on any page and search for the usual analytics hosts. There is no measurement script, no font or script pulled from a third-party content network, and no hidden form posting anywhere.
Check the model host yourself
The models page names each model and links to its upstream page, where you can read the parameter count, the quantisation and the licence, and compare them with the figures published here.
Then tell us what you found
If a check above fails, that is a bug worth reporting rather than a wording problem. Write to guweiicy@gmail.com with the browser you used and what you saw.
Known limitations, stated here as well
The tool is deliberately small in scope, and the honest list is: it runs only on current browsers with WebAssembly and writable site storage; it refuses encrypted PDFs, scanned PDFs without a text layer, legacy .doc and any file above 25 MB; a knowledge base holds at most 40 documents, 200 MB and 20,000 chunks, with 10 files on phones; the optional generator is roughly 3 to 8 tokens per second on the CPU path and produces text that still has to be checked against its citations; and indexing lives per browser profile, so a cleared site or a new machine starts from an empty index.
Contact
Corrections, questions and reports go to guweiicy@gmail.com. The contact page describes what to include so that a report can be acted on, and the changelog records what changed once it has been.