PixPack converts any file into a lossless PNG image and restores it byte-for-byte using a small, documented, open container format.
pixpack encode project.zip project.png
pixpack decode project.png restored.zipThe resulting PNG looks like colored noise, but every byte of the original file is preserved in the RGB pixel channels. PNG's own lossless DEFLATE compression is applied to the image data.
- Encode any file (ZIP, PDF, image, audio, video, executable, source code, text, etc.) into a PNG
- Decode the PNG back to the original file, byte-for-byte
- Inspect metadata without extracting the payload
- Verify payload integrity without extracting
- Cross-platform: Windows, Linux, macOS
- No external dependencies: single, statically-compiled binary
- SHA-256 integrity verification with constant-time comparison
- Safe filename handling: directory traversal and unsafe names are rejected
- Overwrite protection: refuses to overwrite existing files unless
--overwriteis specified
PixPack reads the input file as raw bytes and stores them in the RGB channels of each pixel:
- Red channel = byte 1
- Green channel = byte 2
- Blue channel = byte 3
The byte stream is prefixed with a binary header containing the original filename, payload length, and SHA-256 checksum. The combined data is converted to pixels, then encoded as a lossless PNG.
For a detailed technical specification, see docs/FORMAT.md.
git clone https://github.com/DraxonV1/PixPack.git
cd pixpack
go build -o pixpack ./cmd/pixpackDownload the latest release from the Releases page:
| Platform | Architecture | Archive |
|---|---|---|
| Linux | amd64 | pixpack_<version>_linux_amd64.tar.gz |
| Linux | arm64 | pixpack_<version>_linux_arm64.tar.gz |
| Windows | amd64 | pixpack_<version>_windows_amd64.zip |
| Windows | arm64 | pixpack_<version>_windows_arm64.zip |
| macOS | amd64 | pixpack_<version>_darwin_amd64.tar.gz |
| macOS | arm64 | pixpack_<version>_darwin_arm64.tar.gz |
Each release includes a SHA-256 checksum file for verification.
pixpack encode secret.zip secret.pngWith custom width:
pixpack encode secret.zip secret.png --width 512Overwrite existing output:
pixpack encode secret.zip secret.png --overwritepixpack decode secret.pngThis restores the file using the original filename. To specify a different output path:
pixpack decode secret.png --output restored-secret.zippixpack inspect secret.pngExample output:
PixPack image
Format version: 1
Filename: secret.zip
Payload size: 174,080 bytes
Image size: 241 x 241
Checksum: SHA-256
SHA-256: 3c88...
pixpack verify secret.pngOutput for a valid file:
Integrity check passed.
pixpack --help
pixpack --version| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | General error |
| 2 | Invalid CLI usage |
| 3 | Invalid or unsupported PixPack image |
| 4 | Checksum verification failure |
PixPack supports any file representable as bytes — there are no format restrictions:
- ZIP, TAR, GZIP archives
- Source code (any language)
- PDF documents
- Images (PNG, JPEG, GIF, WebP, etc.)
- Audio (MP3, FLAC, WAV, etc.)
- Video (MP4, MKV, AVI, etc.)
- Executables (PE, ELF, Mach-O)
- JSON, XML, YAML
- Text files
- Databases
- Any other file
- PixPack is NOT encryption. The data is stored as-is in PNG pixels. Anyone with PixPack can restore the file. Encrypt sensitive data separately before encoding.
- PixPack is NOT steganography. The image looks like colored noise and clearly contains structured data. It is not designed to hide the presence of data.
- Resizing the PNG will destroy the payload. Pixel dimensions must remain unchanged.
- Cropping or editing pixels will likely cause checksum failure.
- Converting to JPEG or any lossy format will destroy the payload. Only lossless PNG is supported.
- Some websites and chat applications may recompress uploaded images. Uploading the PNG as a document/file is safer than uploading it as a photo.
- The resulting PNG may be larger than the original file. PNG's lossless compression adds overhead, especially for already-compressed data (ZIP, video, encrypted data).
- Huge files produce huge image dimensions and require substantial memory. A 100 MB file may produce an image around 6000x6000 pixels (~36 megapixels), requiring significant RAM during encoding and decoding.
- Go 1.24 or later
go build -o pixpack ./cmd/pixpack # Build
go test ./... # Run tests
go test -race ./... # Run tests with race detector
go vet ./... # Static analysis
go fmt ./... # Format code
go test -bench=. ./... # Run benchmarksgo build -o pixpack ./cmd/pixpack
echo "Hello, PixPack!" > testdata/hello.txt
./pixpack encode testdata/hello.txt hello.png
./pixpack inspect hello.png
./pixpack verify hello.png
./pixpack decode hello.png --output restored.txt
# Compare (Unix)
cmp testdata/hello.txt restored.txt
# Compare SHA-256 (Unix)
sha256sum testdata/hello.txt restored.txtMIT License — see LICENSE.
See CONTRIBUTING.md.
See SECURITY.md for reporting vulnerabilities.