The problem
Three kids and twenty years of accumulated stuff — clothes worn once, toys
loved to death, school projects nobody could quite throw away. My wife didn't want
to let go of any of it. Not because of the things, but because of what the things
represented: first steps, first day of school, the random Tuesday that turned out
to be a moment worth keeping. Storage has limits. The purge was coming. The
question was how to make it feel okay.
A photo of a onesie is just a photo of a onesie. Without the story attached, it's
inventory. So the goal became: for every item we let go, capture not just the
object — but the memory. The item, paired with a real photo of the kid actually
using it. A few sentences about why it mattered. A quote if we had one. A
timestamp. A name. That's what this app does.
What I built
A static archive site — clean HTML, CSS, and vanilla JavaScript with no framework,
no build step, no server. Memory data lives in a single structured
memories.js file, separated from the presentation layer so the site
stays maintainable by anyone, not just a developer. Hosted on GitHub Pages so it's
free, versioned, and accessible to the whole family from any device. Adding a
memory is one object appended to an array — and one git commit.
The interesting part — and why this one is different
The site is the easy half. The hard half — and the part that makes this project
a different category from the others on this page — is that the photos of the
kids actually using the items live in Google Photos, which has
no public API for programmatic search and download. The only way in is through
the browser, as a logged-in user.
That's exactly how this works. Claude takes direct control of the local
Chrome browser, navigates to Google Photos, and runs intelligent searches —
not just keyword lookups, but contextual queries calibrated to the item, the
child, and the approximate time period. It evaluates the visual results the
same way a human would, and selects the photo that actually matches the memory.
When the right moment is buried inside a video clip — which happens constantly,
because parents capture a lot of video — Claude injects JavaScript directly into
the page to locate the authenticated image frame Google Photos is already
rendering, fetches it with full session credentials, and triggers a download as
a JPEG. No API key. No OAuth flow. No third-party integration.
Just the live, logged-in browser session doing what a human would do — at a speed
and consistency a human couldn't sustain across hundreds of items.
The AI-native piece
This is the project where the boundary between "AI as coding tool" and "AI as
operator" disappears. The other apps in this portfolio were built with Claude
writing code I asked for. This one is built with Claude doing the work —
operating a real browser, evaluating real search results, making judgment calls
about which photo matches which memory, downloading the right frame from a
video, writing the description, and updating the data file. The whole pipeline
runs on natural-language instruction, not custom integration code.
And that scale is the actual reason this needed to exist. Manually searching
Google Photos for every donated item is feasible for ten things. It is not
feasible for hundreds. You'd give up, and the memories would go with the items.
Automation is what makes the project completable — and what turns a good idea
into something that ships.
Why it has to run locally
This isn't a cloud app and can't be. Taking control of an authenticated browser
session requires local execution — Claude Cowork runs on my
own machine, with access to my local Chrome instance and my already-logged-in
Google account. No credentials are ever handed to a remote service. The photos
never leave my environment until I choose to publish them.
That architecture is also why this is genuinely replicable. Anyone running
Claude Cowork on their own PC could run this exact workflow for their own
family. The website template is portable. The data format is simple. The
automation logic is driven by natural language, not custom code that has to
be maintained. It's a shippable pattern, not a one-off project.