Skip What You Already Have: Duplicate Detection Without a Database

Here’s a problem that sounds harder than it is. New files arrive on the cutting board every hour. I sort them in passes, over several days. The automatic check keeps copying. So how does the same photo never get imported twice? No database. One small ledger, plus a cheap shortcut, do the whole job. The Ledger Does the Real Work When the hourly check copies a file onto the cutting board, it writes one line in a small record — a plain text ledger I’ve been calling R throughout this series. ...

July 16, 2026 · 3 min · VibePapa

The File System Is the Database

There’s no database behind my daughter’s archive. No table of photos, no index, no metadata store. When the app needs to know what’s in “July 2026,” it opens the July 2026 folder and looks. That sounds lazy. I’d argue it’s the opposite — it’s the one decision that keeps the whole system simple enough for one person to maintain. How It’s Organized The archive is just folders on the NAS: ...

July 16, 2026 · 3 min · VibePapa

One Button: Shrink the Video, Sort It by Month, Done

By this point in the pipeline, the boring parts are done. New files have been copied to the cutting board. I’ve picked out the ones that are my daughter. What’s left is the step that turns “a pile of selected files” into “a browsable month in her archive.” That’s one button. By now the picker has already moved my chosen files into a hand-off folder. In the app’s My Records tab, there’s a count of what’s waiting in that folder, and next to it a button that says, in effect, bring these in. I press it, and the rest happens on its own. ...

July 16, 2026 · 4 min · VibePapa

10 Seconds to Zero: Rebuilding My Translator on Gemini's Streaming API

The old version of TransLee worked. People used it. It just made you wait. The Old Pipeline: Record, Wait, Stitch The original app was built in Flutter, with a Node.js server in the middle talking to OpenAI’s Whisper for speech-to-text and GPT for translation. The flow looked like this: [Record 5-15 seconds] -> [Whisper: speech to text] -> [GPT: translate text, using the tail of the previous chunk for context] -> [Text-to-speech] -> [Play the translated audio] ⬑ repeat, waiting the full cycle each time ⬏ Five to fifteen seconds isn’t a random number. It was a setting I chose on purpose, because shorter chunks meant the translation kept losing the thread mid-sentence, and longer chunks meant a longer wait before you heard anything at all. The fix for the “losing the thread” problem was to keep the last bit of the previous chunk’s text and glue it onto the front of the next one before sending it off to be translated, so GPT had enough context to know what was going on. It worked. It also meant every single sentence arrived several seconds after it was actually spoken. ...

July 14, 2026 · 5 min · VibePapa

Translee : A Real-Time Translator I Built on Gemini Live Translate

I put my phone next to a TV playing a Kenyan news broadcast in Swahili, low volume. My translator picked up the sound and started speaking the English translation back to me as the newscaster kept talking. No 5-second wait. No 15-second wait. The words just kept coming. It’s a Progressive Web App: open the link on a phone, add it to the home screen, and it behaves like a native app, no App Store or Play Store involved. ...

July 14, 2026 · 3 min · VibePapa

Your Phone Saves H.265. The Browser Wants H.264.

The photos were easy. The videos nearly stopped the whole project. A video of my daughter would back up to the NAS perfectly, and then, when I tried to play it in the browser, I’d get sound but no picture. Or a black rectangle. Or, for the big ones, an endless spinner while it buffered. The file was fine. It just wouldn’t play. Two separate problems were hiding here, and it took me a while to see they were separate. ...

July 14, 2026 · 3 min · VibePapa

The AI Couldn't Recognize My Own Daughter

Here’s the plan I was sure would work: point an AI at a folder of thousands of mixed photos, give it a few pictures of my daughter, and let it pull out every photo of her automatically. No more manual sorting. It didn’t work. And the reason it didn’t work is interesting enough that I want to tell it straight, including the part where I was wrong. The Idea Face recognition is a solved problem, right? Phones do it. The plan was: ...

July 13, 2026 · 4 min · VibePapa

A Browser Gallery for Choosing Which Moments to Keep

Everything else in this pipeline runs by itself. This is the one part that needs me: looking at the day’s new files and choosing which ones are actually my daughter, worth keeping in her archive. For that I built a small browser gallery. It shows the files waiting on the cutting board, I tap the keepers, and press a button. That’s the whole job. But a few small choices made it pleasant enough to actually use every day. ...

July 13, 2026 · 4 min · VibePapa

The Hourly Check That Quietly Does the Boring Part

There’s a boring step in the middle of this pipeline, and it’s the step that used to kill the whole thing. Photos land on the NAS from two phones. Before I can sort them, someone has to copy the new ones onto the working folder — the cutting board — while skipping everything already handled. That’s dull, repetitive, and easy to forget. For two years, “I’ll copy them over later” was where the process died. ...

July 13, 2026 · 4 min · VibePapa

Two Phones, One NAS: Automatic Photo Backup with Synology Drive

The whole archive starts with one simple rule: every photo either of us takes should land on our home NAS by itself, with no monthly cloud fee. Two phones, one box in the house, automatic. That’s the first stage of the pipeline. It mostly “just works” — until, one day, it quietly doesn’t. This post covers both: how to set it up, and how I noticed one phone had stopped. ...

July 12, 2026 · 3 min · VibePapa