How
it
works.
Everything happens in your browser. Here is each step, from the file you pick to the file you save, with the real numbers used by the code.
- Openyour file stays on the device
- Read30 images per second
- Detecta face model, in the background
- Followlink detections over time
- Reviewyou fix what is wrong
- Exporta new file, masks painted in
1 · Loading the tool
The page, the fonts, the face-detection model (YuNet, 338 KB) and its engine (ONNX Runtime, compiled to WebAssembly) all come from this one address. A security rule in the page, the Content-Security-Policy, forbids the browser from contacting any other address, so even a bug could not send anything out.
The model runs in background workers: up to 3 (2 on iPhone), always leaving one processor core free so the page stays smooth. If workers are not available, it runs on the page itself, more slowly.
2 · Reading your file
Your file is never uploaded. The browser opens it through a private local address (blob:) that exists only in this tab.
Videos are scaled so the longest side is at most 1920 px, photos 4096 px. A video is analysed at 30 images per second. To do it quickly, Anonymizer plays the video and copies each image as it appears. If the phone skips images, playback slows down automatically. If playback is not possible, it jumps to each image one by one, which is slower but sure.
3 · Finding faces
Each image is given to YuNet, a small face-detection network. The image is padded to a multiple of 32 px, then the network looks at it at three scales (steps of 8, 16 and 32 px) and proposes boxes, each with a score between 0 and 1. Overlapping boxes on the same face are merged (overlap above 30%).
- Dark scenes. If an image is very dark (average brightness under 40 out of 255), it is analysed twice: as is, and brightened with a square-root curve. The model was also retrained on night photos.
- A second look. Every third image, and whenever a box is doubtful, the image is analysed again at one third of the size. Large faces close to the camera are sometimes recognised better when smaller.
- Fast mode. Analyses at 1280 px instead of 1920 px. Quicker on a slow phone, but it may miss very small faces.
4 · Deciding what is a face
A box is kept only if its score is high enough, and the bar depends on its size. Small faces are hard to see, and an extra mask costs little, so the bar is low. Large boxes with a medium score are usually false alarms (a wall, a tree), so the bar is high.
Under 12% of the shorter side, 0.20 is enough. Between 12% and 25%, the bar rises from 0.30 to 0.85. Above 25%, it stays at 0.85. One exception: a box from 0.30 is accepted if the second look at one third of the size finds the same face.
5 · Following faces over time
Detections are linked from one image to the next. A new box continues an existing face if it is close (within about 1.6 times the average size of the two boxes) and of similar size (less than 2.5 times bigger or smaller). A face may disappear for up to 20 images (0.67 s) and still be the same one.
- Gaps are filled. Between two detections, the box is interpolated, so a face missed for a few images is still masked.
- Early and late. Each mask starts 4 images before the first detection and ends 4 images after the last (about 0.13 s), because a face is often hard to see as it enters or leaves.
- Both directions. Once a face is confirmed, the tracker also looks backward in time: weaker detections just before it, at the same place and size, are attached to the same face. A face turning towards the camera or walking into the frame is masked from its first faint trace, not only from the moment it became clear.
- Smoothing. Each box is merged with its neighbours so masks do not shake.
- Margin. The final box is 30% larger than the face, plus a few pixels, so hair, chin and ears are covered.
6 · Your review
You see the result before anything is saved. Tap a mask to remove it (from that image on), or restore it. Tap anywhere else to add a mask by hand, drag it, resize it, or extend it to the whole video. Scrub the timeline or step image by image to check. If there is no mask at all, Anonymizer says so and asks you to confirm before it exports.
The style is a solid black square or an emoji. For an emoji, the black square is always painted first and the emoji on top, so the face can never show through the emoji's rounded edges.
7 · Export
The saved file is built from scratch: every image is redrawn, the masks are painted on it, and the images are encoded again. The original file is never copied, so nothing in it can leak through.
- Fast export. Where the browser supports it (WebCodecs), each image is decoded, masked and encoded again, as H.264 in an MP4 file, or as VP9 in a WebM file on devices without an H.264 encoder. Bitrate is between 2.5 and 10 Mbit/s depending on the size. This runs faster than real time.
- Standard export. Otherwise, the video is played in real time and the masked picture is recorded. The screen must stay on.
- Sound. Kept by default, since a voice can identify someone too. Turn it off with the Sound button and the file has no audio at all.
- Metadata. Location, phone model and original dates are not copied. In the MP4 header, creation dates and handler names are also zeroed.
- Photos. Redrawn and saved as JPEG at 92% quality. Orientation is applied and EXIF data (location, camera) is dropped.
8 · What is kept
Nothing. No cookie, no localStorage, no sessionStorage, no IndexedDB, no service worker, no analytics. Working data lives in memory and disappears when you close the tab or choose another file. The only thing that remains is the file you save yourself.
Limits, honestly
A detector can miss faces: profiles, faces partly hidden by a hand or a hat, very small or very blurry faces, faces at the edge of the image. That is why the review step exists. Watch the whole result before posting.
A mask hides a face, not clothes, tattoos, a distinctive voice, a place or a name said aloud.
Where to read it
app.js· screens, analysis loop, tracking, review, export.detector.js· model call, night pass, overlap merging, score rule.detect-worker.js· runs the detector in the background.vendor/· ONNX Runtime and Mediabunny, unmodified.models/· the YuNet model.
Everything is on github.com/yakuzaax/anonymizer. To check the privacy claims yourself, see Verify Anonymizer.