OxiMedia

Photos carry more than pixels — GPS coordinates, the camera model, the moment they were taken. This page removes that data, blacks out what you choose, and cleans up voice notes before you share them. Everything runs in your browser, and the page measures its own network traffic to prove it.

Choosing a file, recording, and exporting make no network requests. The counter at the bottom of the page measures this.

oximediav— (Pure Rust, Apache-2.0)
targetwasm32-unknown-unknown
wasm size236 KB (gzip 105 KB)
external requests
server round-trips0
C / C++ / Fortran0 bytes

External requests since the page finished loading:

The counter starts at zero only after this page has finished loading its own assets — the wasm module, the bundled samples, and the fonts. From that moment it records every request the browser makes for this page, whatever the destination. Requests to this site's own server count too: the claim being tested is that your file never leaves this device, and a same-origin upload breaks that claim just as a third-party upload does. So the measurement is deliberately broader than the label. Choose a file, record, redact, download — the number does not move. Your browser's Network tab shows the same thing.

Implementation code

// crates/oximedia-wasm/src/document.rs:292-310 — verbatim, the code running above
pub fn redact_fill_inner(
    &mut self,
    x: u32,
    y: u32,
    width: u32,
    height: u32,
) -> Result<(), OxiMediaWasmError> {
    let rect = self.clip_rect(x, y, width, height)?;
    let stride = u32_as_usize(self.width) * 4;
    for row in rect.top..rect.bottom {
        for column in rect.left..rect.right {
            let index = row * stride + column * 4;
            if let Some(pixel) = self.rgba.get_mut(index..index + 3) {
                pixel.copy_from_slice(&INK_RGB);
            }
        }
    }
    Ok(())
}

This is the code running above, right now.