# Pic Smaller: browser-side batch image compression with WebAssembly codecs

> Pic Smaller is an MIT-licensed Next.js app that compresses JPEG, PNG, WebP, AVIF, SVG and GIF files locally in the browser. It is easy to self-host, but the browser build is the whole product, and the README pushes heavier work toward a separate paid desktop edition.

**joye61/pic-smaller** — Pic Smaller – Compress JPEG, PNG, WEBP, AVIF, SVG and GIF images intelligently

- Repository: https://github.com/joye61/pic-smaller
- Website: https://picsmaller.com
- Stars: 2,879 · Forks: 396
- Language: TypeScript
- License: MIT
- Published: 2026-09-28 · Updated: 2026-09-28 · Language: en
- Canonical page: https://hysenlabs.com/projects/joye61-pic-smaller

## The problem Pic Smaller solves, and who it is for

Most online image compressors ask you to upload files to a server you do not control. Pic Smaller inverts that: the README states that images are processed locally with Web Workers, WebAssembly, Canvas, and browser codecs, and that files are never uploaded to an application server. The hosted app at picsmaller.com is the reference deployment, but the repository is the point for anyone who wants the same tool on their own infrastructure.

The audience is narrow and specific. It fits teams that handle client images, internal documents, or user uploads and cannot send them to a third party. It also fits engineers who want a small, self-contained web tool they can run behind a reverse proxy. It does not fit pipelines. There is no CLI, no REST endpoint, and no server-side batch job described in the README. The unit of work is a browser tab and a person dragging files into it.

## How the browser does the compression

The mechanism is a client-side pipeline. Files enter through a picker, a folder picker, drag and drop, or clipboard paste. From there, src/engines/ holds the browser codecs, workers, transforms, and the compression queue; the README lists Web Workers, WebAssembly, Canvas and browser codecs as the processing stack. Output settings, comparison, and download live in the same view.

The codecs are not written from scratch. The acknowledgements name Squoosh Kit for AVIF, ImageQuant, and OxiPNG, heic-to for browser-side HEIC and HEIF decoding, SVGO for SVG optimization, and gifsicle-wasm-browser for GIF compression. That is a sensible division: the project owns the queue, the UI, and the format routing, and leans on established encoders for the actual byte crunching. It also means the quality of your results depends on those upstream packages, and the README does not document how they are pinned beyond the versions in package.json.

HEIC and HEIF are decode-only. The README says those inputs are decoded locally and exported as JPEG, PNG, WebP, or AVIF. If you need HEIC output, this is not the tool.

## Installing Pic Smaller and compressing your first batch

The README requires Node.js 22 LTS or newer and npm 10 or newer. package.json pins engines to node >=22 <25, so Node 24 is the ceiling. Clone the repository and install with npm ci, not npm install, because a lockfile is committed.

```bash
git clone https://github.com/joye61/pic-smaller.git
cd pic-smaller
npm ci
npm run dev
```

The dev script triggers predev, which runs prepare:codecs first. That step matters: the README says public/ holds browser codec and WebAssembly assets prepared during builds, so a plain checkout without it will not have the encoders. Once the dev server is up, open the workspace, drop in a few JPEGs or PNGs, and use the split view to compare original and compressed results before downloading individual files or the batch as a ZIP.

For a private deployment, the Docker path is the documented alternative. The image uses Next.js standalone output, runs as the unprivileged node user, and includes a health check.

```bash
docker build --pull -t pic-smaller:latest .

docker run -d \
  --name pic-smaller \
  --restart unless-stopped \
  --read-only \
  --tmpfs /tmp:rw,noexec,nosuid,size=64m \
  --cap-drop ALL \
  --security-opt no-new-privileges \
  -p 127.0.0.1:3000:3000 \
  pic-smaller:latest
```

Open http://127.0.0.1:3000. The Dockerfile sets PORT=3000 and HOSTNAME=0.0.0.0, and the health check probes the root path every 30 seconds. The README advises keeping the 127.0.0.1 bind prefix unless direct network exposure is intentional, and putting the container behind a TLS-terminating reverse proxy such as Caddy, nginx, or Traefik.

## Where Pic Smaller stops being the right tool

The biggest limitation is stated by the project itself. A prominent block in the README promotes Pic Smaller Desktop as the flagship edition, with native processing for massive files and entire folder libraries, support for 16+ image formats, and AI tools for background removal, watermark removal, and image upscaling. That is a paid product on a separate site. The open-source browser app is not positioned as the equal of it, so anyone expecting folder-scale throughput from this repository should read that block before filing an issue.

The second constraint is the browser. Compression runs in a tab, which means memory and CPU are whatever the visitor's device provides. A large batch on a low-end machine will stall the interface or fail, and the README does not document queue limits, memory ceilings, or per-file size caps. Anything you need to run unattended, on a schedule, or from a build script has no documented entry point here.

Licensing is worth a look too. The repository is MIT, but the codec dependencies carry their own terms, and the README does not analyze those. If you redistribute a build, check them yourself rather than assuming the MIT label covers everything bundled into public/.

## Pic Smaller against server-side compressors

The obvious alternative is a server-side tool such as a Sharp or ImageMagick based service, where the browser uploads a file and an API returns a smaller one. The difference is architectural, not cosmetic. Server-side tools can process files no browser could hold in memory, run headless, and slot into a CI job or an upload endpoint. Pic Smaller cannot do any of that, because there is no server-side compression path in the README.

What Pic Smaller buys in return is privacy and deployment simplicity. There is no upload endpoint to secure, no storage bucket to clean up, and no per-image compute bill on your side. The README also notes that the web application does not require API keys. For a team that just wants a private compressor on an internal network, that trade is reasonable. For a team that wants compression as a step in a pipeline, the server-side approach is the only one that fits, and Pic Smaller is the wrong shape entirely.

## Maintenance, upgrades, and what the licence does not settle

The repository is not archived, and the last push was on 2026-08-16. That is recent enough to suggest the project is still being worked on, but the README does not publish a release cadence, a support window, or a changelog, so upgrade risk is hard to estimate from the repository alone.

Upgrading is mostly a matter of dependency drift. The app runs on Next.js 16 and React 18, and the codecs are versioned packages from Squoosh Kit, heic-to, SVGO, and gifsicle-wasm-browser. A major Next.js bump or a codec change can alter output quality or break the worker pipeline, and the test suite is the documented safety net: npm test runs the Node.js test suite, npm run lint enforces zero warnings, and npm run build produces the standalone server. The contributing guide asks contributors to run all three before opening a pull request, which is the same sequence a self-hoster should follow before rolling an upgrade into production.

The MIT License covers the project's own code. It says nothing about the bundled codec assets, and the README does not address that. Treat licence review of the dependencies as your own task.

## Conclusion

Adopt Pic Smaller if you need a private, self-hosted batch compressor for JPEG, PNG, WebP, AVIF, SVG and GIF, and you are comfortable running a Next.js 16 app on Node.js 22 with Docker or Cloudflare Pages. Do not adopt it if you need server-side processing of HEIC at scale, headless automation, or folder-library throughput, because the README routes that work to the separate desktop edition. Before committing, verify that the codec assets land in public/ after npm run prepare:codecs, that the container answers its health check on port 3000, and that the formats you need survive a round trip in your own browser.

## FAQ

### Does Pic Smaller upload my images to a server?

No. The README states that images are processed locally with Web Workers, WebAssembly, Canvas, and browser codecs, and that files are never uploaded to an application server. The web application also does not require API keys.

### Which image formats can Pic Smaller compress?

The README lists JPEG, PNG, WebP, GIF, SVG, and AVIF for compression. HEIC and HEIF are supported as inputs only: they are decoded locally and exported as JPEG, PNG, WebP, or AVIF.

### How do I self-host Pic Smaller with Docker?

Build the image with docker build --pull -t pic-smaller:latest . and run it with port 3000 published, for example -p 127.0.0.1:3000:3000. The README recommends a TLS-terminating reverse proxy such as Caddy, nginx, or Traefik for public access.

### What Node.js version does Pic Smaller need?

The README requires Node.js 22 LTS or newer and npm 10 or newer. package.json pins engines to node >=22 <25, so Node 24 is the upper bound.

### Is Pic Smaller free to use?

The repository is licensed under the MIT License, and the hosted app at picsmaller.com is free to use. The README separately promotes a paid Pic Smaller Desktop edition with native processing and AI tools, which is not part of this repository.

## Sources

- [Issues](https://github.com/joye61/pic-smaller/issues)
- [joye61/pic-smaller on GitHub](https://github.com/joye61/pic-smaller)
- [License: MIT](https://github.com/joye61/pic-smaller/blob/master/LICENSE)
- [Project website](https://picsmaller.com)
- [README](https://github.com/joye61/pic-smaller/blob/master/README.md)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/joye61-pic-smaller
