local-only processing

See it before you share it

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.

1

Get the sandbox

A small local app that does the actual detection and blurring on your machine.

2

Pair this tab

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.

reference

Docs

How pairing works, what gets detected, how to embed the detector in your own project, and every option in the UI.

What the detector sees

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.

NudeNet only has classes for human body regions (genitalia, breasts, buttocks, feet, face, belly, armpits). There are no classes for anything else, so there's nothing for the app to detect outside that list.

Pairing & connection codes

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.

Images

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.

Video queue

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.

Censor styles

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.

  • Gaussian blur — smooths the region; strength scales with box size.
  • Pixelate — mosaics the region into large flat blocks.
  • Frosted glass — a heavier blur plus a translucent wash, so shape reads but detail doesn't.
  • Glitch — fractured color slices for an aggressive digital censor effect.
  • Rainbow — bold gradient tint over the region, blended with the original image.
  • Dot grid — dense dotted coverage for a stylized censor look.
  • Scanlines — horizontal bands plus overlay, like old-school video distortion.
  • Negative — inverts region colors for a striking, high-contrast treatment.
  • Emboss — edge-driven fill with dark/light depth for a graphic, sculpted block.
  • Black box / solid — opaque coverage when you want maximum privacy.

Integrate NudeNet in your own project

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:

  • Classes. The full label set is 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.
  • Thresholding. Drop anything under roughly 0.25 score to cut false positives; raise it if you'd rather miss borderline detections than flag clean ones.
  • Batching. For many frames/images, detector.detect_batch(list_of_frames) is far faster than calling detect() in a loop.
  • GPU. NudeNet runs on 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.
  • Reference implementation. app.py in this repo is a complete Flask wrapper around the same calls, including video sampling/interpolation — copy from it freely.

Privacy model

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.

for developers

Run it from source

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.

  1. Install the sandbox. Requires Python 3.9+ and ffmpeg on your PATH.
    # from the toolkit folder
    pip install -r requirements.txt
  2. Start it. This opens a small window, boots the local detector, and opens a tunnel to it.
    python connect_launcher.py
  3. Click Start sandbox in the window that opens. Nothing runs or is exposed until you do.
  4. Copy the pairing code it shows once ready, and paste it on the Home tab.
About the masked URL: the /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.

Running fully local (no tunnel)

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.

Files in the toolkit

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.