Doop
Doop is an open-source multiplayer design canvas and design MCP for Claude Code, Codex, and any AI agent. Design side by side with agents — free in beta.
pngdeer finds the smallest palette PNG that still looks like your image. Open source, runs in your browser, nothing is uploaded. By HeyDeer.
DesignRust · PythonGitHub @heydeerOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Smaller images, same picture. Compress PNGs to PNG or WebP with automatic quality. PNG output is 8–12% smaller than TinyPNG at equal quality on the median image. Command line and browser.
Taken from the repository README
Loading the full README.
Read the full README ↗Smaller PNGs. Same picture. pngdeer is a lossy PNG compressor with no quality slider: for each image it searches palette sizes from 2 to 256 colors, with and without dithering, scores each result with a perceptual metric, and keeps the smallest file that still looks right. At the same quality, the median image comes out 8–12% smaller than with TinyPNG, the best result of any open-source compressor we've measured.
Try it in your browser → Nothing is uploaded: images are compressed on your device.
brew install heydeer/tap/pngdeer
pngdeer input.png -o output.png
We ran pngdeer, TinyPNG and eight open-source quantizers on 180 PNGs: icons, UI screenshots, illustrations, photos, cut-outs and 3D renders. Every output was scored against its original with SSIMULACRA2, a perceptual metric where 90 means indistinguishable at 1:1. TinyPNG is the yardstick:
Each cell gives the held-out set (71 images) / the tuning set (109 images):
| Compressor | Points | Reaches |
|---|---|---|
| pngdeer | +1.7 / +2.0 | 67 / 106 |
| TinyPNG (the yardstick) | 0 | 71 / 109 |
| pngquant | 0.0 / +0.3 | 53 / 87 |
| quantizr | −0.1 / −1.0 | 39 / 53 |
| exoquant | −3.7 / −5.1 | 19 / 24 |
| NeuQuant | −6.5 / −9.8 | 4 / 5 |
| FFmpeg | −7.0 / −8.8 | 16 / 15 |
| quantette | −7.6 / −9.6 | 18 / 21 |
| ImageMagick | −11.3 / −14.5 | 3 / 8 |
| Pillow | −16.8 / −19.5 | 4 / 4 |
At TinyPNG's quality, pngdeer's files are 12% smaller on the held-out set and 8% smaller on the tuning set (median image).
pngdeer also writes WebP (an output name ending in .webp, or the switch in the browser): the smaller of its palette image stored losslessly and the lowest lossy quality that keeps the target (a JPEG photo: below). Against TinyPNG's WebP on 120 of the images, the size each tool needs to match TinyPNG's quality (median image / in total), and how many images it can bring up to that quality:
| Compressor | Size at TinyPNG's quality | Reaches |
|---|---|---|
| pngdeer | 95.0% / 93.9% | 118 |
| TinyPNG (the yardstick) | 100% | 120 |
| cwebp, best of 27 settings | 97.9% / 110.2% | 120 |
| pngquant + cwebp, best of 10 | 135.0% / 212.1% | 115 |
pngdeer also takes JPEG photos (pngdeer photo.jpg -o smaller.jpg, or drop them in the browser) and writes a smaller JPEG: re-encoded with mozjpeg at the lowest quality that keeps the target, never bigger than the photo. On 60 photos from Wikimedia Commons, 30 web-size copies and 30 camera originals, the size each tool needs to match TinyPNG's quality (median photo / in total), and how many photos it can bring up to that quality:
| Compressor | Size at TinyPNG's quality | Reaches |
|---|---|---|
| pngdeer | 87.8% / 85.4% | 60 |
| TinyPNG (the yardstick) | 100% | 60 |
| jpegli, best of 12 settings | 89.2% / 87.2% | 60 |
| mozjpeg, best of 7 qualities | 94.2% / 89.1% | 59 |
pngdeer photo.jpg -o photo.webp, or the switch in the browser): turned upright, at the same automatic quality. At TinyPNG's WebP quality it needs 95.3% / 91.3% of TinyPNG's WebP size; cwebp, given its best of 13 settings per photo, about the same. At equal quality it is no smaller than pngdeer's own JPEG (99% on the median photo), so it is there for sites that want WebP.pngdeer also writes AVIF (an output name ending in .avif, or the switch in the browser), from PNGs and JPEG photos: libaom's lowest quality that keeps the target as Chrome shows the file. On 54 images, 30 of the photos above and 24 PNGs of every kind, every file decoded by Chrome, the size each tool needs to match TinyPNG's AVIF's quality (median image / in total), and how many images it can bring up to that quality:
| Compressor | Size at TinyPNG's quality | Reaches |
|---|---|---|
| pngdeer | 77.3% / 77.9% | 54 |
| TinyPNG (the yardstick) | 100% | 54 |
| avifenc, best of 33 settings | 89.3% / 83.3% | 54 |
| rav1e, best of 11 qualities | 102.0% / 97.3% | 54 |
The research notes follow every step, from the first comparison with TinyPNG to today's defaults.
pngdeer input.png -o output.png # automatic quality
pngdeer input.png -o output.png --target 85 # a fixed SSIMULACRA2 quality
pngdeer input.png -o output.webp # WebP, automatic quality
pngdeer photo.jpg -o photo.min.jpg # JPEG, automatic quality
pngdeer photo.jpg -o photo.webp # a JPEG as WebP
pngdeer input.png -o output.avif # AVIF, from a PNG or a JPEG
pngdeer --help
From source: cargo build --release, and the binary is target/release/pngdeer.
The web app runs the same code compiled to WebAssembly. To run it locally (web/build.sh lists the toolchain it needs):
sh web/build.sh
python3 web/serve.py # http://localhost:8770
MIT. Dependencies keep their own licenses (web/THIRD_PARTY_LICENSES.txt), as do the test and sample images (the SOURCES.md next to them). JPEG output is encoded with mozjpeg: this software is based in part on the work of the Independent JPEG Group. AVIF output is encoded with libaom.