Structure Beats Magic ← All writing

For knowledge workers

Your Photos Are Already a Map (You Just Can't Query Them Yet)

I turned 155,000 photos into a queryable, geo-indexed library. The work wasn't taking pictures. It was reading the metadata I already had.

By Jaco van der Laan · 2026-06-29
Your Photos Are Already a Map (You Just Can't Query Them Yet)
Your photos → hidden structure (locations, time, people, routes) → AI extracts the patterns → a map of your life. AI doesn't invent it; it discovers what's already there.

The folder I couldn't ask anything

I have about 155,000 photos. Fifty years of them, from scanned 1970s prints to last week's phone shots, all sitting in a tidy folder tree organised by year and month. By any normal standard, that's managed. Backed up, sorted, named. A model citizen of a photo collection.

And I couldn't ask it a single useful question.

"Show me every photo I took within walking distance of that restaurant in Ortigia." "Which of these were taken in Sicily versus Sardinia?" "How many photos do I actually have from the 2018 trips?" None of it. The folder knew the date a file was created and nothing else I could act on. Fifty years of where I'd been, what I'd seen, who I was with — and the only thing the system could tell me was the filename.

That's the quiet failure of a photo library. It looks like an asset. It behaves like a drawer.

Archive versus source, again

This is the same trap I keep walking into, in my own systems and in every organisation I've worked with. You treat the records you've piled up as archive — kept, in case — when they're actually source — readable, at scale, to answer questions you haven't asked yet.

The difference is never the content. It's whether anything can read it.

A folder of images is archive. The same images as rows in a table — each with a location, a place name, the tags already attached, the time — are source. Identical photos. Completely different asset. One is a thing you keep. The other is a thing you can use. And as with my bookshelf and my decade of trips, the surprise was that I didn't have to create the information. It was already there. I just hadn't pointed anything at it.

The data was hiding in plain sight

Here's the part that's almost funny. My first attempt to read the collection came back nearly empty. The location data — gone. Tags — gone. Almost every photo looked like it carried nothing but a timestamp. I nearly concluded the collection was a write-off, that the metadata had been stripped years ago in some migration.

It hadn't. I was reading the wrong place.

Every photo had its real metadata sitting in small companion files right next to it — the GPS, the tags, the authorship, the camera details — written there during an earlier migration and never folded back into the images. My first reader only looked inside the image files. The actual gold was in the files beside them, which I'd been walking straight past. The moment I read the companions instead, the collection lit up: tags on 89% of photos, location on far more than I expected, decades of structure that had been one directory-listing away the whole time.

Every photo carries far more than the image: location, time, camera, weather, people, places, objects, even text. The metadata was always there — the work is reading it.
Every photo carries far more than the image: location, time, camera, weather, people, places, objects, even text. The metadata was always there — the work is reading it.

The lesson generalises hard, and it's cost me before: before you decide the data isn't there, make sure you're reading where it actually lives. "We don't have that data" is, more often than anyone admits, "we didn't open the right file."

From raw photos, AI surfaces the hidden structure — locations, time, people, objects, routes, events — and organises it into something meaningful. Not magic; just structure waiting to be seen.
From raw photos, AI surfaces the hidden structure — locations, time, people, objects, routes, events — and organises it into something meaningful. Not magic; just structure waiting to be seen.

The 8% that became 81%

Reading the companions got me real GPS on a big chunk of the library — but not all of it. Plenty of older photos, and plenty of everyday ones, had a time but no location. So I reached for a second source I already owned: my own location history. If I know when a photo was taken, and I have a near-minute-by-minute record of where I was, I can place the photo by matching the two on time.

Simple idea. One vicious detail.

The location history is stored in universal time. The photo's clock is local wall-clock — whatever the camera thought the time was, wherever I was standing. At home those are an hour apart and nobody notices. But on a road trip through the American West, the photo says "noon" meaning local noon, while my location history's "noon" is nine hours away in Amsterdam time. Match them naively and you don't get a small error — you place the photo on the wrong continent. My Oregon hikes would have landed in the Netherlands.

The fix was to stop assuming a timezone and start deriving it: figure out roughly where each trip was from the data itself, infer the offset from that, and let the two clocks line up before matching. Once that was right, the everyday gap closed dramatically — tens of thousands of previously locationless photos snapped onto the map, each one placed within a few minutes of where I actually stood.

By the end: of 155,000 photos, 125,000 carried a location and 122,000 resolved to a named place. A collection that had effectively no queryable geography became one where four out of five photos know where they were taken. None of it from new pictures. All of it from two records I already had, finally pointed at each other.

The honest, boring middle

Two failures worth naming, because a pipeline that hides them is lying.

The everyday photos resisted. My location-matching leaned on trips to work out the timezone — and most location-less photos aren't from trips, they're from ordinary days at home. Those I could only place coarsely, and many I left unplaced rather than guess. I'd rather have a known gap than a confident wrong answer. The travel photos — the ones I actually wanted — matched beautifully, because trips are exactly where the trip-based logic works. The system is honest about where it's strong.

The first version of the naming step nearly killed the machine. Turning coordinates into place names meant comparing every located photo against a global list of cities. My first attempt did it the obvious, naive way and spilled over 300 gigabytes of scratch data before collapsing, half an hour in. The rewrite — collapse the photos to distinct locations first, only compare each against nearby cities — did the same job in six seconds. Same result, four orders of magnitude apart. The naive version wasn't wrong; it just didn't respect the shape of the data. Most performance problems are like that.

Read the companions, match the two clocks correctly, name the places without melting the machine. That's the whole middle.

What you get when the folder can talk

Now the collection is a table, and the table is the product. Not any single photo — the set, sitting where one query can reach all of it at once.

The first thing I did was the question I'd wanted for years. I had a curated little guide to places to eat and stay in a Sicilian town, and a separate pile of 155,000 photos. I asked the two to meet: for each recommended venue, do I have a photo I took within 150 metres of it? Forty-eight matches came back — my own photos, from a trip three years ago, standing 60 metres from restaurants the guide recommends. Not stock imagery. Not someone else's idea of the place. Mine. Proof I was there, automatically attached to the recommendation.

One photo, captured once, is rich with context — and AI links it to a whole graph of your life: place, time, people, objects, activity, memory. A moment becomes a map of meaning.
One photo, captured once, is rich with context — and AI links it to a whole graph of your life: place, time, people, objects, activity, memory. A moment becomes a map of meaning.

That's the difference between a travel page that looks generic and one that's grounded — and the grounding cost me nothing to produce, because the photos already existed. The folder could finally answer the question. It always had the answer. It just couldn't speak.

The move, every time

Three systems now, same shape. A bookshelf that became a knowledge base. A decade of trips that became a database. And now fifty years of photos that became a map. Each time I expected the hard part to be making something — writing summaries, tagging, curating. Each time the hard part was extraction: getting records I already owned out of the shape that hid them and into the shape that could be read.

The records were never the problem. The shape was.

Your photos are the same. They're not an archive of where you've been. They're a map of it — already drawn, already detailed, sitting one read away from being a thing you can actually ask. The pictures aren't the asset. The structure you can finally query is.

The whole thesis in one frame: AI doesn't need magic, it needs structure. Magic is opaque, unreliable, hard to trust. Structure is transparent, reliable, and yours to improve — because it was there all along.
The whole thesis in one frame: AI doesn't need magic, it needs structure. Magic is opaque, unreliable, hard to trust. Structure is transparent, reliable, and yours to improve — because it was there all along.

Structure + Data + AI + Rules + Skills → Systems

← More writing Work with Jaco →