Nothing is sent, and you can check it
Klarword does not ask you to believe it. Processing happens in your browser, the browser forbids the page to connect anywhere else, and you can see it for yourself in thirty seconds.
Check for yourself
- Disconnect the network. Load a model, then turn off Wi-Fi or unplug the cable. Drop a file and transcribe: everything works. Even reload the page; it comes back.
- Open the Network tab. In the developer tools (F12), Network tab, drop a file and start transcribing. No request leaves during the work; the first time, only the model files arrive, from this site.
- Read the content security policy. It is in the header of every page and reproduced below. The line connect-src 'self' forbids the browser any connection to another domain. The browser enforces it, not us.
- Compare the fingerprints. Every model file has a SHA-256 fingerprint published below. The tool checks it before use, and you can recompute it yourself on the downloaded file.
The architecture
The site is a set of static files: pages, code, a compute engine and models. The server serves them and does nothing else. There is no server-side application, no database, no account, and no address to which a recording could be sent.
What is downloaded, and from where
When the tool opens, the browser downloads the page, its code and its style sheet. The first time a model runs, it downloads the compute engine and then the files of the chosen model. Everything comes from this site, and nothing else is requested: no font, no third-party script, no analytics.
The library that runs the model (transformers.js) knows how to fetch its files from Hugging Face and its engine from a content delivery network. In Klarword it is not allowed to: its download function is replaced by one that refuses, and it only reads the verified files stored on your computer. An unexpected request fails with a message instead of going out.
What is never sent
Not the audio, not the video, not the transcript, not your corrections, not the names of your files. There is no counter, no usage log, no telemetry. The server does not know you transcribed anything.
This site's server keeps no access log. The hosting provider keeps its own technical logs at machine level, under its security rules.
What is stored on your computer
The models and the engine are stored in the private space the browser keeps for this site (Origin Private File System), after their fingerprint has been checked. This avoids downloading them again, and makes offline work possible. The tool's “On this computer” panel lists them and lets you delete them.
Your recording is never stored there. It is read into memory, in the tab, and forgotten when the tab closes; so is the transcript. That is why the tool asks you to save it.
Only one thing from your work is kept from one visit to the next: the glossary you wrote, in the browser's local storage, on this computer. It does not leave the computer; you export it yourself as a text file to share it.
Recording from the microphone
The tool can record straight from the computer's microphone. The browser asks for your permission first; the sound is then kept in memory in the tab, exactly like a file you had dropped, and transcribed the same way. It is not sent anywhere. If you want to keep it, the tool offers to save it on your computer; otherwise it disappears when the tab closes.
The site's Permissions-Policy header allows the microphone for this site only, and forbids the camera, geolocation and the rest.
Offline mode
A service worker keeps a copy of the tool's pages and code so that it reloads with the network off. It makes no request on its own, queues nothing for later, and only touches this site's files. Pages go to the network first when it is there, so that you always read the content security policy in force.
The spell checker
The browser's spell checker is off by default in the editor. The basic one in Chrome, Edge and Firefox works on the computer; but Chrome's “enhanced spell check” sends the typed text to Google. If you turn it on in Klarword, check your browser's setting first.
What this architecture does not guarantee
- An extension installed in your browser can read the page and make its own requests. For sensitive work, use a profile without extensions.
- A compromised computer stays compromised: Klarword does not protect against spyware installed on the machine.
- The browser itself sends information to its publisher (updates, crash reports) according to its own settings.
- The request list shown in the tool is kept by the page. The browser's Network tab is the check that counts.
An independent audit
The code served can be read in the browser, and the self-hosted package is identical to the site's, with its fingerprint. An organisation can therefore have it audited by the provider of its choice, or ask its security officer to review it before approving it. Write to us to receive the package to audit.
The content security policy
Sent by the server with every page, and repeated in the page itself in case it is placed on another server:
default-src 'self'; script-src 'self' 'wasm-unsafe-eval' blob:; worker-src 'self' blob:; style-src 'self' 'unsafe-inline'; img-src 'self' blob: data:; media-src 'self' blob:; font-src 'self'; connect-src 'self' blob:; object-src 'none'; frame-src 'none'; base-uri 'none'; form-action 'none'
File fingerprints
Every file the tool can download, with its size and SHA-256 fingerprint. The models come from the onnx-community repositories on Hugging Face, pinned to a specific revision, and are served by this site. To check a file: sha256sum on Linux, shasum -a 256 on macOS, certutil -hashfile file SHA256 on Windows.
| File | Size | SHA-256 |
|---|---|---|
| Compute engine (onnxruntime-web) | ||
ort/ort-wasm-simd-threaded.asyncify.mjs | under 1 MB | 0966b6105cd936744498aa60df7a22cbd47af3374dbc64a9ab561c08a71e3611 |
ort/ort-wasm-simd-threaded.asyncify.wasm | 27 MB | 49871f5a4409519797e127440868a6d1923339d9185907f301a5b2a1d90af082 |
Fast · onnx-community/whisper-base · revision 1846881b6b3a | ||
config.json | under 1 MB | f4d0608f7d918166da7edb3e188de5ef1bfe70d9802e785d271fd88111e9cf4b |
generation_config.json | under 1 MB | 61070cf8de25b1e9256e8e102ded49d8d24a8369ed36ef84fdf21549e68125a0 |
onnx/decoder_model_merged_quantized.onnx | 54 MB | fa3ef9902734ce5ae6f9ef2bdb2ba9a6c4b5785b09f4f420ce036573dc9d090b |
onnx/encoder_model_quantized.onnx | 23 MB | 5862993336bf33acd23736071aae2b32261d3b1b2f37780194460d4ef974dd46 |
preprocessor_config.json | under 1 MB | a6a76d28c93edb273669eb9e0b0636a2bddbb1272c3261e47b7ca6dfdbac1b8d |
tokenizer.json | 2 MB | 27fc476bfe7f17299480be2273fc0608e4d5a99aba2ab5dec5374b4482d1a566 |
tokenizer_config.json | under 1 MB | 2e036e4dbacfdeb7242c7d4ec4149f4a16e86026048f94d1637e3a8ee9c6a573 |
Balanced · onnx-community/whisper-small · revision 36050c46d777 | ||
config.json | under 1 MB | 457854d452f17661e197d74aee12b8e74fb75ba30ebfaa7426d0d61ea1e08a18 |
generation_config.json | under 1 MB | f538b28220c6a6d6f1af1458d4141cacb4ef4963df3de98a19490440c412ddf0 |
onnx/decoder_model_merged_q4.onnx | 233 MB | 795c61b344576719c2b249cc9911c78b4cc552c8c6a5407be21a3380a0791b13 |
onnx/decoder_model_merged_quantized.onnx | 157 MB | ec07c3cbb64172c39791e26ee870a65ac22b458c36722bfe2776b3dbf741e0c9 |
onnx/encoder_model_q4.onnx | 66 MB | 9f088ad0fe15ba2cf094c9fb22ac7fe1111fc9ef317c1e4d1f6a3bca38a931ba |
onnx/encoder_model_quantized.onnx | 92 MB | a43a83f3c5361cd591cfa7c36f14b43cf7cb22f47a415cc14a8d557be800fa92 |
preprocessor_config.json | under 1 MB | a6a76d28c93edb273669eb9e0b0636a2bddbb1272c3261e47b7ca6dfdbac1b8d |
tokenizer.json | 2 MB | 27fc476bfe7f17299480be2273fc0608e4d5a99aba2ab5dec5374b4482d1a566 |
tokenizer_config.json | under 1 MB | 2a4c4281cf9f51ac6ccc406fdc711a087afe6530f671fa7b80953edc498275ce |
Accurate · onnx-community/whisper-large-v3-turbo · revision 360ebcde2559 | ||
config.json | under 1 MB | 35cd83669f75bc2867f3b3a4461850392d5e308cd6ea951c3700539883c28df1 |
generation_config.json | under 1 MB | 16f95291d2f47c944d3c2b19390bba7965666555c1ea2a0bdc850d1fab45612f |
onnx/decoder_model_merged_q4.onnx | 334 MB | 8b933ac24074a24a1635084d06a4ed37e387ef22d980f184a5fc27418e9ceeb8 |
onnx/decoder_model_merged_q4f16.onnx | 194 MB | 45981cdd958a4c8e1447839850d2e6e27e30974ccbe31b4a1e5ebe9ad8965a5f |
onnx/encoder_model_q4.onnx | 425 MB | 7e64b20dd7b556cb7a2c1c65d9fbf31af985323c006f993d2a9dd10083547d78 |
onnx/encoder_model_q4f16.onnx | 370 MB | aafd3383f1aa372db0825a885730ebbbae7e34871ec0460428663c69641a63d0 |
preprocessor_config.json | under 1 MB | 7ccc62c6f2765af1f3b46c00c9b5894426835a05021c8b9c01eecb6dfb542711 |
tokenizer.json | 2 MB | 6d8cbd7cd0d8d5815e478dac67b85a26bbe77c1f5e0c6d76d1ce2abc0e5f21ca |
tokenizer_config.json | under 1 MB | 844b642c73a91359722f47b35705f7174686df33d252695d8572cf9ac03a6389 |
Speakers, turns · onnx-community/pyannote-segmentation-3.0 · revision 733a93b6473d | ||
config.json | under 1 MB | 5a4c6bb4f49f1b47c9bd398aac78b8cd4a9f30a0ff91b5c2dc68d05e13e160cf |
onnx/model.onnx | 6 MB | 057ee564753071c0b09b5b611648b50ac188d50846bff5f01e9f7bbf1591ea25 |
preprocessor_config.json | under 1 MB | dfc7d35a3895f8997eb94521e28b1921c03480a34fa9bcbb6bef1f1934f81480 |
Speakers, voice fingerprint · onnx-community/wespeaker-voxceleb-resnet34-LM · revision 6a61a1833ff2 | ||
config.json | under 1 MB | 4a65a1544d2085d7819632f130583d83f6815f49ef6c8ba6c8eb460bd4085041 |
onnx/model.onnx | 27 MB | 3955447b0499dc9e0a4541a895df08b03c69098eba4e56c02b5603e9f7f4fcbb |
preprocessor_config.json | under 1 MB | a81bbded0530b1bf5c3d395d2c5c7c266686e348be5989171290ace960f24ec2 |