close

DEV Community

Gavin Liu
Gavin Liu

Posted on

How I Built a Live Photo Converter That Works Entirely in Your Browser (No Upload, No App)

I've been building small web tools with AI coding for the past few months. Here's one that people actually use: LivePhotoKit — a free, browser-based converter for iPhone Live Photos, HEIC images, and more.

The Problem

iPhone users shoot millions of Live Photos and HEIC images every day. But when they try to:

  • Send a Live Photo to an Android friend → doesn't work
  • Upload HEIC to a web form → rejected
  • Convert Live Photo to GIF → need a paid app
  • Open HEIC on Windows → nothing happens

Existing solutions either require you to install an app, upload your private photos to someone's server, or pay a subscription.

What LivePhotoKit Does

Drop a file in. Get what you need. Done.

  • HEIC to JPG/PNG/WebP/PDF — instant, no upload
  • Live Photo to GIF — the one thing iOS can't do natively
  • Live Photo to MP4 video — extract the video part
  • Open HEIC files — view in browser, no app needed
  • Image compressor — shrink photos without losing quality
  • Batch convert — process multiple files at once

Everything runs locally in your browser. Zero server uploads. Zero sign-ups. Zero watermarks.

Tech Stack (Built Mostly by AI)

  • Next.js 16 (static export) — hosted on Cloudflare Pages
  • Canvas API — image encoding/decoding, GIF generation
  • gifenc — pure JS GIF encoder (no WASM, works on mobile)
  • jszip — unpack .livp Live Photo packages
  • JSZip + jsPDF — PDF generation from images

The entire conversion pipeline runs in the browser. No ffmpeg, no server-side processing. This means it works on iPhones, Androids, and any modern browser.

What I Learned

  1. ffmpeg.wasm is too heavy for mobile — 30MB+ WASM binary crashes Safari. Switched to Canvas + pure JS encoders.
  2. iOS file input is fragile — transparent overlays, hidden inputs, and programmatic click() all fail on Safari. The fix: a native <label htmlFor> wrapping a visible input.
  3. Live Photo's .livp format is just a ZIP — unpack it with JSZip, grab the MOV video + HEIC still, done.
  4. GIF encoding in pure JS works — gifenc does the job at ~3MB per animated GIF.

Try It

livephotokit.com

It's free. No sign-up. Everything stays on your device.

If you've got iPhone photos that won't open somewhere — give it a shot. Would love feedback.

Built with Claude Code + a lot of debugging. 18 pages, 0 dependencies on ffmpeg, 100% client-side.

Top comments (0)