Why I Built This
Every few weeks I'd find myself needing to convert a PNG to WebP, or a TIFF to JPG — simple stuff. And every time, I'd either open a heavy desktop app, or land on some sketchy website plastered with ads and a "Upload your file to our servers" disclaimer.
I didn't want to upload personal or client images to a random server. I just wanted to drop a file, pick a format, and be done in under five seconds.
So I built PhotoConvert — a browser-based image converter that does the conversion entirely on your device. No server uploads, no accounts, no waiting.
The Core Design Decision: Keep It Simple
The temptation with any tool project is to keep adding features. Batch processing! Compression sliders! Metadata editing! I caught myself sketching out a full-blown image editor at one point.
I deleted all of it.
The thesis became: one job, done well, with zero friction. You arrive, you convert, you leave. That's it.
This shaped every decision — from the UI layout to what options I'd expose. The answer to "should I add X" was almost always "no, not yet."
Tech Stack
-
Vanilla JavaScript + Canvas API — The Canvas API does the heavy lifting for format conversion. Draw the image onto a canvas, call
canvas.toDataURL('image/webp'), done. No third-party conversion library needed for most formats. -
File API + Blob URLs — Reading local files without touching a server is straightforward with
FileReaderandURL.createObjectURL(). This is what keeps everything private and instant. - No framework — I reached for React out of habit, then stopped. The app is simple enough that a framework would add build complexity with no user benefit. Plain JS kept the bundle tiny and load time near-instant.
-
CSS Grid + a bit of drag-and-drop — The drag-and-drop zone was actually one of the more fiddly parts. Getting
dragenter,dragleave, anddropevents to behave consistently across browsers took more iteration than I expected.
Technical Challenges
BMP and TIFF support turned out to be trickier than JPG/PNG/WebP. The Canvas API doesn't natively encode to BMP or decode TIFF in all browsers. I ended up using lightweight JS libraries for those edge cases, which added a small bundle cost — but only loaded on demand.
Safari and WebP has been a journey. Safari's WebP support improved a lot in recent versions, but I still had to test edge cases where decoding worked but encoding behaved unexpectedly. Feature detection and fallbacks were necessary.
File naming sounds trivial but caused real bugs early on. If you upload photo.png and convert to JPG, you expect to download photo.jpg. Stripping and replacing extensions correctly across different OS filename conventions took a small but real amount of care.
Lessons Learned
The Canvas API is underrated. For image manipulation that doesn't require pixel-level processing, it handles a surprising amount with no dependencies.
"Private by default" is a feature worth calling out. I almost didn't mention the no-server-upload aspect prominently. Turns out people care about this a lot, especially designers working with client assets.
Scope discipline is hard. Shipping a small, focused tool feels oddly uncomfortable at first — like you haven't done enough. But users don't want more features, they want the thing they came for to work instantly. Simplicity is the feature.
Try It
If you ever find yourself needing a quick format conversion without the overhead of a desktop app or the privacy concern of uploading files to an unknown server, give it a go:
👉 https://photoconvert.getinfotoyou.com
Supports JPG, PNG, WebP, GIF, BMP, and TIFF. Works in any modern browser, no install, no account.
I'd genuinely love to hear what you think — especially if you hit an edge case I haven't covered yet.
Top comments (0)