Projects
This project trains a generative adversarial network on MNIST, then exports the trained generator weights so the portfolio can reconstruct the model in the browser.
The browser demo runs a fully connected generator that maps a 128-dimensional noise vector through linear layers with batch normalization and LeakyReLU activations before producing a 784-value (28x28) MNIST image. The model uses a final Tanh output and contains 2,449,680 trainable parameters.
Awaiting generation.
This project mutates binary inputs for compiled test programs until a segmentation fault is found. The original command-line fuzzer uses a deterministic PRNG seed, extends the payload every 500 iterations, mutates each byte with a 13% probability, and writes both the crashing input and the seed/iteration pair needed to reproduce it.
The browser version below ports the core mutation loop to JavaScript and runs against lightweight target predicates, while the comparison table shows the native crash artifacts produced by the original fuzzer.
00
Native Crash Finds
This browser demo hides and recovers text messages in uploaded images by storing data in the two least-significant bits of each red, green, and blue channel of fully opaque pixels. Start and end markers, a message length, and a checksum identify the hidden payload, determine how many pixels it occupies, and detect damaged messages.
Embed a message and download the resulting PNG, or upload a marked image to reveal its message and see how many pixels store it. Images are processed locally in your browser.
Your image will appear here.
- Image dimensions
- —
- Message capacity
- —
- Pixels storing data
- —
Choose an image to get started.
Keep the downloaded PNG unchanged: resizing, color edits, or JPEG compression can destroy the message. Anyone with this decoder can read it.
How the watermark works
The message is stored as UTF-8 text between start and end markers. A length field identifies the payload boundary, and a checksum detects damaged messages. The pixel count includes this framing as well as the text.
Each fully opaque pixel stores six bits in the two lowest bits of its red, green, and blue channels. Transparent and partially transparent pixels are skipped, and image dimensions stay unchanged. Detection recognizes this demo’s format.