A small utility, built to not get in the way.
LocalPix converts images between formats. That's the whole product. It runs on your machine, doesn't phone home, and is free for personal or commercial use.
James · zingiber96
LocalPix is built and maintained by one person. It started as WEBPConvert — a single-format command-line tool for a job I needed done — and grew into a small desktop app once I realised I was tired of pasting photos into online converters that wanted my email address and I figured I could build my own utility. Then, I decided to expand on it and that's when LocalPix was born.
The renderer is still a single hand-written HTML file. There is no build step, no React, no framework. The whole product is small enough that you can read it in twenty minutes and decide whether you trust it.
- NameJames Folsom (zingiber96)
- LicenseMIT License
- Repogithub.com/zingiber96/LocalPix
- IssuesGitHub issues
- LanguagesNode.js · Electron · vanilla JS
- Stack
sharp+magick-wasm - Built since2025 (as WEBPConvert), 2026 as LocalPix
- AuditedSource is the audit — read
server.js
Your images never leave your computer. There is no analytics, no telemetry, no "phone home." You can verify by disconnecting from the internet. LocalPix keeps working.
No upload, ever.
The conversion runs locally via native libraries. There is no server endpoint for your files because there is no server.
No accounts, no sign-in.
LocalPix does not collect an email, name, device ID, or anything else. The first launch screen is the app itself.
Metadata stripped by default.
EXIF, GPS coordinates, camera info, XMP — gone unless you opt back in. Pair with "Preserve color profile" if you need accurate colors.
You can read the code.
The renderer is one HTML file. The server is one JS file. No transpilation, no minification, no obfuscation. Audit it yourself.
Online converters upload your image to their server, process it, and let you download the result. That's a reasonable model for some workflows — and a wrong one for photos of your apartment, screenshots of internal dashboards, or anything you wouldn't email to a stranger.
| LocalPix | Typical online converter | |
|---|---|---|
| Where your file goes | Stays on your machine | Uploaded to a third-party server |
| What they log | Nothing — there's no server side | Varies; often opaque, often "for analytics" |
| Account / email required | No | Common above a free tier |
| Speed on a 50 MB RAW | Local CPU only | Upload + queue + download |
| Works on a plane | Yes — fully offline | No |
| Source you can read | Yes — single HTML renderer, one JS server | Closed |
LocalPix is an Electron app wrapping a Node Express server. The conversion engine is a hybrid of two image libraries:
sharp — the hot path
Native libvips bindings for JPEG, PNG, WebP, AVIF, GIF, TIFF. Fast, battle-tested, used by half the internet's image pipelines.
magick-wasm — the long tail
ImageMagick compiled to WebAssembly. Handles HEIC, PSD, BMP, JPEG XL and ~70 other formats. Slower than sharp but vastly broader.
Single-file frontend
The renderer is ~1700 lines of hand-written HTML with no build step. You can open public/index.html in a browser and see exactly what runs.
Builds reproducibly
Releases are produced by GitHub Actions, not a developer laptop. Every .dmg and .exe on the releases page has a green CI check next to it.
- Edit images. No crop, no resize, no filters. There are excellent tools for that — LocalPix is not one of them.
- Write HEIC. The codec has patent licensing issues that don't fit a free, open-source product. LocalPix reads your iPhone photos and writes AVIF instead.
- Write SVG or PSD. SVG is vector; PSD is layered. Converting a photo to either is a different task than format conversion.
- Sync to the cloud. By design. If you want that, run the output folder through Dropbox, Drive, or your sync tool of choice.
- Read PDFs. Yet — on the roadmap for v1.1.x. Requires a separate decoder that we can ship in the Electron bundle.
Bug or feature request?
Open an issue on GitHub. For substantive contributions, open one first to discuss the approach — saves a back-and-forth on the PR.
Reading the source?
Start with server.js for the conversion
dispatch table, then public/index.html for the UI. If
something feels mysterious, that's a documentation bug — let me know.