← Work · built in the open

iPod Photo Extractor

A free script that recovers photos from an old iPod Classic, Video, Photo or Nano. One Python file with no dependencies, plus a plain landing page for people who have never opened Terminal.

Stack Python 3HugoGitLab PagesGitHub

Liveipodphotos.theflyingcoders.dev

Problem

My father-in-law found an iPod from around 2007 with photos nobody had seen in over a decade. iTunes was the old way to get things on and off these, and there is no iTunes on an Apple silicon Mac. I couldn't find an easy way to read them.

Approach

Built with agentic AI in about 30 minutes, where researching the formats by hand would have taken a few weeks. One Python 3 script on the standard library only. It finds the iPod, reads its Photo Database, decodes the raw thumbnail files by hand and writes the PNGs itself. The landing page is Hugo with no theme and no Node, with big readable text and steps for someone new to Terminal.

Outcome

It pulled over 900 photos, more than 500MB, off my father-in-law's iPod, the copies the iPod kept rather than the originals. It is live and free under the MIT licence. The script, the page and the tests are public, and the README says plainly which formats have not been checked on real hardware.

What shipped

Five pieces, one script

  1. 01A single Python 3 script that detects the iPod and needs nothing installed
  2. 02Three passes: full-resolution originals, the Photo Database, and raw carving when there is no database
  3. 03Decoders for RGB565, BGR555, interlaced UYVY and planar YCbCr, with a PNG writer on the standard library
  4. 04A landing page with the disk-mode steps and a FAQ, written for people who have never opened Terminal
  5. 05Tests built on fake iPod files, and a CI check that fails the build if the page breaks its SEO rules

See it live

Photos off an old iPod, in three steps.

It is live and free. There is no sign-up and the script only reads from the iPod.

Open the live site
The iPod Photo Extractor landing page hero, with the Get the script button

Similar shape of problem? The first conversation is a call, not a proposal.

Start a conversation