Ratproof

How it actually works

"Runs in your browser" is a claim you're right to be sceptical of. Here's the real mechanism, including the parts that are inconvenient for us.

You don't have to believe any of it. Press F12, open the Network panel, transcribe something. Thirty seconds, and the question is settled.

The short version

OpenAI's Whisper, in its base size, downloads to your computer the first time you visit. It then runs on your processor, inside the tab, on audio read from the file you picked. The transcript is assembled in the page. Nothing is sent anywhere.

Why a browser can do this now

WebAssembly. The model runs through ONNX Runtime Web at close to native speed, instead of the order-of-magnitude penalty JavaScript would pay on this kind of arithmetic.

Threads. WebAssembly can only use several cores if the page has SharedArrayBuffer, and browsers only grant that to cross-origin isolated pages. Ratproof ships the Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy headers that earn it, and gets four threads instead of one. Without them the runtime quietly drops to single-threaded and everything takes four times longer, so the app checks and refuses rather than being mysteriously slow.

Quantized weights. The decoder is stored at 4-bit precision, which is what brings the download to something a web page can reasonably ask for. The encoder stays at full precision, because accuracy is more sensitive there.

What happens when you drop a file in

  1. The browser decodes the audio and resamples it to 16 kHz mono, which is what the model expects.
  2. A voice activity detector (Silero VAD, also local) marks where somebody is speaking.
  3. Only those stretches go to Whisper, in chunks. Silence never reaches the model.
  4. Segments come back timestamped and render as they arrive, so you read while it works.
  5. A detector scans the finished text for repetition loops and flags them.

Why silence gets filtered first

Whisper hallucinates. Given silence or noise it will sometimes produce a fluent, confident sentence nobody said — that's how the model generates text, not a bug awaiting a fix.

A voice detector runs first, so silence never reaches the model, and a check afterward looks for the repetition loops that are its other favourite failure. Neither catches everything — invented text sitting inside real speech is much harder to spot, and that's the gap we measured rather than papered over. The numbers, including what we still miss

How to check us

Watch the network. Open developer tools, go to Network, load the tool. You'll see the app shell and, on a first visit, the model files. Then drop your recording in. Nothing further is requested. Your audio never appears as a request body, because there is no request.

Your browser enforces it. Every page of the app ships connect-src 'self' in its Content-Security-Policy, which tells your browser to block any connection to another origin. If we shipped malicious code tomorrow, your browser would refuse and log the violation. That's a guarantee which doesn't depend on our honesty.

No analytics. No tracking script, no telemetry, no third-party tag, on the tool or this site. Fonts are self-hosted, because a font CDN sees every visitor. Our server sees what any web server sees — that a request happened — and nothing about what you transcribe.

What it's built from

All open source, listed with licences at /licenses.txt: OpenAI Whisper (MIT) via transformers.js (Apache-2.0), ONNX Runtime Web (MIT), and Silero VAD (MIT) through sherpa-onnx (Apache-2.0).

Open Ratproof Check the network panel while you do.

What it costs you

Running the model on your machine doesn't remove the cost, it moves it onto your hardware. A cloud service has none of these costs because it's spending its own. That's a real advantage and we won't pretend otherwise. What you get back is that nobody else ever holds the recording. The measured bill is published here.