I posted about my life for nearly three decades across websites and social platforms, some of which no longer exist or matter. This project collected more than 28,000 scattered memories and organizes into a searchable archive to drive research for a book I'm planning to write.
A Mac desktop app pulls together archived materials from many places an individual or family has posted over the years: Facebook, Instagram, Tumblr, a personal blog, old travel journals, and a website guestbook: source material spanning nearly three decades.
Once the material is imported, AI reads it, writing a caption for each photo and sorting posts by topic so tens of thousands of items become searchable and organized instead of a pile of files. The photos are matched to high-resolution versions in a local Lightroom library so the posted photos and best, high-resolution version are kept together in one place on the user's machine.
From there, the app works like a simple story editor. In addition to the original posts, AI-written image captions become a starting point the user can edit, memories can be browsed by date and rated based on layered spaces called "projects". Ratings and manual tags decide what makes the final project (in this case, my planned print book). A companion app previews how the finished book will read before it is exported.
Features
- Imports nearly three decades of posts (about 28,000, 1997 to 2025) from seven sources, including Facebook, Instagram, Tumblr, WordPress, old travel journals, and a website guestbook
- AI writes a caption for every photo and sorts every post by topic, so tens of thousands of items become searchable and organized; roughly 11,800 images and 27,000 posts process in single sessions
- Everything runs on your own computers; nothing leaves the house
- Search the whole archive by keyword or by meaning
- Story editor where AI-written titles and captions are a starting point; edit freely, the originals are never lost
- Browse tens of thousands of memories smoothly by date
- Matches posted photos to their original high-resolution versions in a Lightroom library, so the story and the best copy of each photo stay together
- Rate memories with stars to decide what makes the print book, the digital edition, or stays in the draft pool, then export the finished selection
- Videos from old social media exports play correctly in-app
- A companion app simulates how the finished book will be delivered and read, for pacing review before committing to layout
Under the hood
- —Distributed inference scheduler fans captioning and classification across heterogeneous workers on the local network (Ollama hosts plus an Apple-silicon MLX worker), with per-worker concurrency slots and capability-aware dispatch; once a worker finishes vision work it swaps the vision model out for the text model in place, workers marked down after consecutive failures auto-recover, and responses that hit token limits retry with a doubled budget
- —Posted photos match to Lightroom originals by perceptual hash, scored into confident, review, and unmatched tiers so a human only reviews the ambiguous middle; about two thirds of ~14,800 images match confidently
- —Editing is layered and non-destructive: the archive layer holds AI output, each book project overlays its own edits, and display resolves human edit over project edit over AI original, so the same archive supports multiple books and nothing AI-written is ever overwritten
- —Semantic search runs in-process in Rust (a small local sentence-embedding model via ONNX Runtime), with embeddings cached on disk and searched brute-force in about 5 ms across ~27,000 stories; staleness is tracked per story, so only new or changed stories re-embed
- —The companion delivery app maps a child's age onto the archive timeline as a pure function: delivery runs accelerated until the reader catches up to the writer's age, then locks to real time, with timezone-aware morning send windows and pauses that shift the whole future schedule rather than skipping entries
- —Three quarters of Facebook and Instagram video exports carry an audio codec macOS cannot decode, which silently kills the whole clip; a one-pass remux rewrites just the audio track while copying video losslessly, so thousands of videos fix in about an hour
- —Per-format parsers unify every source (including two generations of Facebook export markup and three guestbook formats) into one local SQLite store with stable source-id dedup and content-hash collision handling; the Rust backend reads it directly, no server process
- —Tests across TypeScript, Python, and Rust cover the import parsers, worker pool logic, embeddings, and book export selection
