Censor finds exposed regions in a photo or video and blurs, boxes, or pixelates them — on your own computer. Nothing you upload ever reaches a server we run.
A small local app that does the actual detection and blurring on your machine.
Free, runs locally. Prefer macOS/Linux or running from source? →
Nothing gets analyzed on a server we run. Detection happens on your own machine — download the app, click Start, and paste the connection code it shows below.
Don't have the app yet? Grab it in step 1.
Drop an image for instant region detection, or queue mp4s — each video processes independently on your sandbox.
How pairing works, what gets detected, how to embed the detector in your own project, and every option in the UI.
The sandbox runs NudeNet, an object detector that returns bounding boxes for specific body regions — not a single whole-image score. That's what lets the UI censor only the regions you've selected instead of blacking out the whole frame.
The sandbox app starts a detector process on your machine, then opens a tunnel so this page can reach it, and shows a short code. Entering that code (or the full URL it also shows) on the Home tab is the only way this site ever learns where your sandbox lives — nothing is registered or stored anywhere else.
Codes are single-session: closing the app, or restarting it, invalidates the old one.
The address bar can also carry a code directly, as
/u/<code> — useful
for re-opening a tab without retyping it, not for sharing your sandbox with anyone else.
Upload one image at a time. Before it's sent, the browser scales large photos down to a reasonable size for detection — this keeps the analysis fast even over a tunnel connection with limited bandwidth. Boxes come back in that scaled space and are mapped back onto the full-resolution image, so what you see (and download) is never downscaled.
Everything after detection — blur radius, style, which regions are active — is redrawn instantly in the browser with no further round trip. Use the toolbar above the preview to download or copy the finished image.
Each mp4 becomes its own job with its own progress bar and runs independently, so queuing a second video doesn't block the first. The sandbox samples every N frames (you're asked per video), runs detection only on those, and interpolates boxes for the frames in between so the censor doesn't flicker. Frames are streamed straight into the video encoder instead of being written to disk one at a time, which is what keeps longer videos from crawling. The sandbox caps how many videos run detection at once — extras wait their turn automatically, decoding and encoding still happen in parallel.
Choose from a huge palette of censor effects, from blur and pixelation to outlines, glitch, rainbow overlays, dot grids, scanlines, negative inversion, and embossed fills.
The sandbox's detection logic is just the open-source nudenet
Python package — there's no proprietary model or API here. If you're building your own tool,
you can call it directly:
# pip install nudenet opencv-python from nudenet import NudeDetector import cv2 detector = NudeDetector() image = cv2.imread("photo.jpg") results = detector.detect(image) for r in results: # r == {"class": "FEMALE_BREAST_EXPOSED", "score": 0.87, "box": [x, y, w, h]} print(r["class"], r["score"], r["box"])
A few things worth knowing before you build on it:
FEMALE_GENITALIA_EXPOSED,
MALE_GENITALIA_EXPOSED,
ANUS_EXPOSED,
FEMALE_BREAST_EXPOSED,
MALE_BREAST_EXPOSED,
BUTTOCKS_EXPOSED,
FEET_EXPOSED,
BELLY_EXPOSED,
ARMPITS_EXPOSED,
FACE_FEMALE,
FACE_MALE. Some versions also return matching
"_COVERED" classes for clothed regions — filter on score and class
the same way app.py does.0.25 score
to cut false positives; raise it if you'd rather miss borderline detections than flag clean ones.detector.detect_batch(list_of_frames)
is far faster than calling detect() in a loop.onnxruntime under the hood — install
onnxruntime-gpu instead of the CPU package and it picks up CUDA automatically if a
compatible GPU/driver is present.app.py in this repo is a complete
Flask wrapper around the same calls, including video sampling/interpolation — copy from it freely.Detection and censoring both happen on your machine. This page only ever talks to the address behind your connection code — it has no separate backend of its own and keeps no copy of anything you upload.
Most people should just grab the app from the home page. This page is for macOS/Linux, or anyone who'd rather run the Python directly.
# from the toolkit folder
pip install -r requirements.txt
python connect_launcher.py
/u/<code>
link is a cosmetic address for this static site — it decodes to your sandbox's real tunnel
address entirely in your own browser. It isn't a hidden relay server run by us; nobody but you
and whoever you hand the code to can use it, and the tunnel only lives as long as the app
is running.
If the browser and the sandbox are on the same machine, you don't need a tunnel at all —
choose Local only in the app window, set "local": true
in config.json, and pair with
127.0.0.1:5000 directly. This is also the fastest option
since there's no tunnel latency at all.
app.py — the Flask
detector (NudeNet), image + video endpoints.
connect_launcher.py —
the desktop app: starts app.py, opens the
tunnel, shows your pairing code. This is also the source packaged into the .exe on the home page.
requirements.txt —
everything pip install -r needs.
See README.md for how the
packaged .exe itself is built.
Run detection every how many frames?
1 = every frame — most accurate, slowest. Higher = faster, interpolates between samples.