This is a submission for the Hacktoberfest Open-Source AI Challenge Week 4 : Ghost in the Machine
What I Built
Ghostroll opens the trunk of photos you forgot you kept. You pick some old pictures, a local vision model describes each one, and a local language model writes a short nostalgic chapter for every period. The result is a polaroid-style album on a timeline that you can correct, print, or download as a single HTML file.
For the theme, the "ghosts" are the memories sleeping on your hard drive: thousands of photos nobody looks at anymore. The tool brings them back, gently
Demo
The video was recorded with my Wi-Fi switched off, so you can see it working offline.
Code
Sara1-builds
/
Ghostroll
A private photo album written by local open-source AI.
👻 Ghostroll
Wake up the photos sleeping on your hard drive. Pick old pictures, and two open-weight models running on your own laptop describe each one and write a short, warm chapter for every period of your life, as a polaroid album on a timeline. No cloud, no account, no API key. Works with the Wi-Fi off.
Built for the Hacktoberfest 2026 Open-Source AI Challenge, Week 4: Ghost in the Machine The "ghosts" are the memories nobody looks at anymore.
Demo video: https://youtu.be/RfDWvNV5_Ds
How it works
your photos ──▶ Moondream (the eyes) ──▶ one plain sentence per photo
│
dates from EXIF (exif.js) ── sort by time ─────────┤
â–¼
Llama 3.2 (the writer) ──▶ a short chapter per period
│
â–¼
polaroid album ──▶ edit anything ──▶ download as ONE .html file
- Moondream (tiny vision model) looks at each photo and describes only what is visible, in one sentence.
- …
How I Built It
Models: Ollama serves two open-weight models: moondream (a tiny vision model) to describe photos, and llama3.2:3b to write the chapters. Both are chosen from dropdowns, so they can be swapped for bigger ones.
Server: about 170 lines of standard-library Python bound to 127.0.0.1. It only forwards requests to your own Ollama.
Dates: a small EXIF reader (exif.js), written from scratch, pulls the capture date from each JPEG, so the album follows the real timeline, with the file date as a fallback.
Prompting: photo descriptions are short and factual (no guessing names or places), and the chapter prompt tells the model to use only those descriptions and never invent events or feelings.
Interface: one HTML page with no CDN and no web fonts. Photos are shrunk to thumbnails in the browser, and the album is built with the DOM API, so nothing is injected as HTML. Every description and chapter stays editable, because small models make mistakes.
Low memory mode: documented settings keep a single model loaded at a time so it runs on modest laptops.
Tests: Python tests run the server against a stub Ollama, Node tests cover the EXIF reader, and I ran the whole flow in a headless browser with a fake model, checking the album, the export and that the page makes no external requests.
How it performed on my laptop (a regular Windows laptop, no GPU setup): in my recording, 4 photos plus one chapter took about a minute: roughly 9 seconds per photo and about 24 seconds for the chapter. Moondream's descriptions were rough. On my test photos it described a sand beach as "urns of water, boat, people, sunset, sky", and the chapter picked up the mistake. That is why every sentence is editable before you save.
Why Does Open Innovation Matter?
Personal photos are among the most private data we have: faces of family, homes, places. Cloud "memories" features need you to upload them to someone else's servers. With open-weight models running locally, the photos never leave the machine, there is no account or API key, nothing is billed per image, and the whole thing works offline.
It is also not locked in. The vision model and the text model are two dropdowns, and the exported album is plain HTML with the photos embedded, so it will still open decades from now, long after any hosted service has disappeared.
The trade-off is honest: a small local model on a laptop is slower and less accurate than a cloud service. For photos like these, I'll take that trade for privacy.
Top comments (0)