loading webassembly…

blind‑watermark::wasm frequency-domain steganography

Hide a message inside a picture.

Invisible, robust watermarks woven into the DWT-DCT-SVD frequency domain of an image — survives re-saving, recoverable with nothing but the image and a secret. Everything below runs entirely in your browser through WebAssembly. No upload, no server.

carrier image 01
original hold to compare with original carrier preview
Drop an image here or browse · use a sample

Tip — embed a message, hit download, then drag the saved file back in and decode it to prove the watermark survives the round-trip.

payload & secret 02
decode readout 03
> awaiting signal
01

DWT → DCT → SVD

The luminance channel is wavelet-transformed; each block's largest singular value is quantized to carry one bit — imperceptible to the eye.

02

Self-describing

A header (magic + length + CRC-16) is embedded with the payload, so decoding needs only the image — no bit length to remember.

03

Blind & robust

Recovery needs no original image. Redundant, scrambled placement keeps the mark alive through PNG re-saves and moderate JPEG.

  the same call, in your code
// npm i blind-watermark-wasm
import { BlindWatermark } from 'blind-watermark-wasm';

const bwm = new BlindWatermark();
const marked  = await bwm.embed(imageBytes, '© 2026');   // text or Uint8Array
const result  = await bwm.extract(marked);             // no length needed
if (result?.valid) console.log(result.text);       // → '© 2026'