<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>David Gomez - Devblog</title>
<link>https://davidgomez.cc/devblog.html</link>
<description>Working notes on building Loupe, side projects, and learning in tech.</description>
<item>
<title>July 13 - putting my notes under version control without breaking the sync that copies them everywhere</title>
<link>https://davidgomez.cc/devblog/notes-under-version-control.html</link>
<guid>https://davidgomez.cc/devblog/notes-under-version-control.html</guid>
<pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate>
<description>My entire knowledge base had no undo, and adding one turned out to be a real distributed-systems puzzle because the same files live on four machines at once.</description>
</item>
<item>
<title>July 11 - Loupe&#39;s machine-learning pipeline runs entirely on your own hardware</title>
<link>https://davidgomez.cc/devblog/loupe-ml-pipeline-on-your-own-hardware.html</link>
<guid>https://davidgomez.cc/devblog/loupe-ml-pipeline-on-your-own-hardware.html</guid>
<pubDate>Sat, 11 Jul 2026 00:00:00 GMT</pubDate>
<description>For an app that looks at your private photos, the machine learning cannot phone home, so every model in Loupe runs on your own machine, on a single consumer graphics card.</description>
</item>
<item>
<title>July 10 - how Loupe decides what to keep: labels nominate, scores order, people protect</title>
<link>https://davidgomez.cc/devblog/how-loupe-decides-what-to-keep.html</link>
<guid>https://davidgomez.cc/devblog/how-loupe-decides-what-to-keep.html</guid>
<pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate>
<description>Culling a hundred-thousand-photo library should never come down to one mysterious score, so I split the decision into three plain roles that each answer a different question.</description>
</item>
<item>
<title>July 9 - the dashboard learned to reach my phone: an installable app with tiered alerts</title>
<link>https://davidgomez.cc/devblog/dashboard-learned-to-reach-my-phone.html</link>
<guid>https://davidgomez.cc/devblog/dashboard-learned-to-reach-my-phone.html</guid>
<pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate>
<description>Turned the fleet dashboard into an installable phone app with alerts tiered by urgency, a critical channel that survives the app itself failing, and a dead-man&#39;s switch that can announce its own death.</description>
</item>
<item>
<title>July 9 - a compute box hitting 115°C, and the safety net that let it run hot but safe</title>
<link>https://davidgomez.cc/devblog/compute-box-thermal-safety-net.html</link>
<guid>https://davidgomez.cc/devblog/compute-box-thermal-safety-net.html</guid>
<pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate>
<description>My busiest compute machine was cooking itself under real load, so instead of just turning the work off, I built layers of protection that let it keep running without frying.</description>
</item>
<item>
<title>July 8 - searching my notes by meaning, not by keyword</title>
<link>https://davidgomez.cc/devblog/searching-notes-by-meaning.html</link>
<guid>https://davidgomez.cc/devblog/searching-notes-by-meaning.html</guid>
<pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate>
<description>I taught my notes to answer questions by meaning, so I can ask what I decided about X and why and land on the right note even without remembering a single word from it.</description>
</item>
<item>
<title>July 7 - a knowledge base that rebuilds and reorganizes itself every night</title>
<link>https://davidgomez.cc/devblog/knowledge-base-rebuilds-itself.html</link>
<guid>https://davidgomez.cc/devblog/knowledge-base-rebuilds-itself.html</guid>
<pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate>
<description>I write a lot of scattered notes across a lot of projects, and instead of ever organizing them by hand, I built a pipeline that rebuilds and reorganizes the whole thing every night while I sleep.</description>
</item>
<item>
<title>July 6 - running my own models so the routine work costs nothing</title>
<link>https://davidgomez.cc/devblog/running-my-own-models.html</link>
<guid>https://davidgomez.cc/devblog/running-my-own-models.html</guid>
<pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate>
<description>A lot of the small jobs I was paying a hosted model to do did not need a frontier model at all, so I started running open-weight models on my own GPU box and let the routine work run for free.</description>
</item>
<item>
<title>July 5 - handing a job to whichever machine should run it, then walking away</title>
<link>https://davidgomez.cc/devblog/handing-work-to-any-machine.html</link>
<guid>https://davidgomez.cc/devblog/handing-work-to-any-machine.html</guid>
<pubDate>Sun, 05 Jul 2026 00:00:00 GMT</pubDate>
<description>I stopped doing my machines&#39; work at the keyboard and built a way to hand a task to whichever machine should run it, let it run on its own, and pick up the result later.</description>
</item>
<item>
<title>July 4 - the night my control-plane machine died and I failed the homelab over to a standby</title>
<link>https://davidgomez.cc/devblog/control-plane-outage-failover.html</link>
<guid>https://davidgomez.cc/devblog/control-plane-outage-failover.html</guid>
<pubDate>Sat, 04 Jul 2026 00:00:00 GMT</pubDate>
<description>I caused an outage by running a heavy job on the one machine that holds everything together, then spent the night proving my failover plan actually works.</description>
</item>
<item>
<title>July 3 - a dashboard that became a second brain: fleet health, my notes, and search over my own work</title>
<link>https://davidgomez.cc/devblog/a-dashboard-that-became-a-second-brain.html</link>
<guid>https://davidgomez.cc/devblog/a-dashboard-that-became-a-second-brain.html</guid>
<pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate>
<description>Pulled fleet health and my entire notes vault onto one gated dashboard, then added semantic search over my own work by borrowing an embedding model already running elsewhere on the network.</description>
</item>
<item>
<title>July 2 - reads that fell from 96 to 12 MB/s on a link that swore it was fine</title>
<link>https://davidgomez.cc/devblog/storage-link-throughput-mystery.html</link>
<guid>https://davidgomez.cc/devblog/storage-link-throughput-mystery.html</guid>
<pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate>
<description>Every cheap health check told me my storage link was perfectly healthy while it was actually running at a tenth of its speed, and the real work was proving which piece was lying.</description>
</item>
<item>
<title>July 2 - every machine can now reach every other, with no passwords and no key juggling</title>
<link>https://davidgomez.cc/devblog/every-machine-reaches-every-other.html</link>
<guid>https://davidgomez.cc/devblog/every-machine-reaches-every-other.html</guid>
<pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate>
<description>Turned the fleet into a full mesh where every machine can reach every other one directly, passwordless, without hand-managed keys, laying the groundwork for running work anywhere in the fleet.</description>
</item>
<item>
<title>June 30 - moving the front door off the busy machine so a reboot cannot take the site down</title>
<link>https://davidgomez.cc/devblog/moving-the-front-door.html</link>
<guid>https://davidgomez.cc/devblog/moving-the-front-door.html</guid>
<pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
<description>Moved the public tunnel entrance off the busy compute box onto its own dedicated Raspberry Pi with its own uplink, so a reboot of any other machine can no longer take the whole public site down.</description>
</item>
<item>
<title>June 27 - a Swiss redesign, a GPU box on CUDA, and a wiki over all my notes</title>
<link>https://davidgomez.cc/devblog/swiss-redesign-gpu-box-and-a-wiki-over-my-notes.html</link>
<guid>https://davidgomez.cc/devblog/swiss-redesign-gpu-box-and-a-wiki-over-my-notes.html</guid>
<pubDate>Sat, 27 Jun 2026 00:00:00 GMT</pubDate>
<description>Reskinned davidgomez.cc into a Swiss/International typographic system, stood up a GPU box and proved face-embedding on CUDA, and hand-built a regenerable wiki over every one of my notes.</description>
</item>
<item>
<title>June 26 - the demo stops faking it: every view wired, real face crops, live in production</title>
<link>https://davidgomez.cc/devblog/the-demo-is-the-app.html</link>
<guid>https://davidgomez.cc/devblog/the-demo-is-the-app.html</guid>
<pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate>
<description>The marketing demo stopped being a screenshot tour and became the actual Loupe app running over a hand-authored fixture, every view wired in owner mode, real detected face crops, a library full of believable junk frames, and a production deploy.</description>
</item>
<item>
<title>June 25 - faking a whole photo library, teaching the demo to act like the app, and mapping it as a graph</title>
<link>https://davidgomez.cc/devblog/demo-library-and-graph.html</link>
<guid>https://davidgomez.cc/devblog/demo-library-and-graph.html</guid>
<pubDate>Thu, 25 Jun 2026 00:00:00 GMT</pubDate>
<description>Built a reusable image generator to manufacture a synthetic photo library for the public cull demo, wired the static demo to behave like the real app across several views, and ran a graphify pass to map the app&#39;s architecture and data flow.</description>
</item>
<item>
<title>June 25 - breadcrumbs: exporting my own grocery orders, one logged-in page at a time</title>
<link>https://davidgomez.cc/devblog/breadcrumbs-reading-my-own-grocery-pages.html</link>
<guid>https://davidgomez.cc/devblog/breadcrumbs-reading-my-own-grocery-pages.html</guid>
<pubDate>Thu, 25 Jun 2026 00:00:00 GMT</pubDate>
<description>breadcrumbs is a free, open-source browser extension I built to read my own logged-in grocery order pages and export a clean, itemized file, every item by name, with the price, so my budget knows what the basket actually held. Two store integrations work, the Chrome version is verified end to end, and a Safari port is in progress. This is what it is, why I built it, and what&#39;s still open.</description>
</item>
<item>
<title>June 24 - Tandem: turning my two-seat Claude habit into a repo anyone can clone</title>
<link>https://davidgomez.cc/devblog/tandem-two-seats-as-a-repo.html</link>
<guid>https://davidgomez.cc/devblog/tandem-two-seats-as-a-repo.html</guid>
<pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
<description>I already wrote up the idea of running two Claudes in tandem, one to think and one to build. This is the project cut: what Tandem actually is as a toolkit, why I bothered packaging a personal habit into an MIT repo, how the pieces fit, and what&#39;s still rough.</description>
</item>
<item>
<title>June 24 - a demo that ships without a backend, and a render pull that lied about succeeding</title>
<link>https://davidgomez.cc/devblog/demo-without-a-backend-and-a-render-pull-that-lied.html</link>
<guid>https://davidgomez.cc/devblog/demo-without-a-backend-and-a-render-pull-that-lied.html</guid>
<pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
<description>Built a static, backend-free demo of the Loupe cull UI, untangled an edited-render pull that reported success while writing nothing, fixed an importer that choked on Live Photos, and reorganized all my project notes into one place.</description>
</item>
<item>
<title>June 23 - Loupe&#39;s first offsite backup, lazy render lookups, and getting my notes out of iCloud&#39;s way</title>
<link>https://davidgomez.cc/devblog/first-offsite-backup-lazy-renders-and-moving-my-notes.html</link>
<guid>https://davidgomez.cc/devblog/first-offsite-backup-lazy-renders-and-moving-my-notes.html</guid>
<pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate>
<description>The whole project finally lives somewhere other than my one machine: I pushed a private backup of the repo. Then a small but careful change to how the app resolves edited renders so it stops statting thousands of network files on every restart, plus a power-outage readiness check and a move of my project notes vault out of the folders iCloud sweeps.</description>
</item>
<item>
<title>June 22 - three ways to ship the wrong thing to Cloudflare Pages</title>
<link>https://davidgomez.cc/devblog/three-ways-to-break-a-deploy.html</link>
<guid>https://davidgomez.cc/devblog/three-ways-to-break-a-deploy.html</guid>
<pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate>
<description>Adding a devblog to my site took three tries to deploy: a nested zip, a misplaced git init, and a commit Cloudflare refused to stop rebuilding. All three were the same mistake wearing different hats.</description>
</item>
<item>
<title>June 22 - folding two repos into one, then scrubbing my git history clean before the first push</title>
<link>https://davidgomez.cc/devblog/one-repo-and-scrubbing-history.html</link>
<guid>https://davidgomez.cc/devblog/one-repo-and-scrubbing-history.html</guid>
<pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate>
<description>I merged Loupe&#39;s pipeline repo into the app repo as a subtree, untangled a code-vs-data path coupling that would have quietly broken everything, and then (right before the first push to a private GitHub repo) ran a full-history audit that came back dirty. It found a home address, GPS coordinates, and a dump of my home network&#39;s internal layout buried in old commits. The rest of the day was rewriting history to purge all of it, normalizing my commit identity, and collapsing everything to a single clean branch.</description>
</item>
<item>
<title>June 21 - glass on the surface, plumbing underneath</title>
<link>https://davidgomez.cc/devblog/daily-log.html</link>
<guid>https://davidgomez.cc/devblog/daily-log.html</guid>
<pubDate>Sun, 21 Jun 2026 00:00:00 GMT</pubDate>
<description>A wide day: shipped a dormant glass redesign and a fully responsive header, chased a stats box that kept clipping, root-caused six photo-pairing mis-binds down to a filename suffix, sorted out the faithful way to pull edited photos, relocated my notes vault, and ran a security review I&#39;m keeping vague on purpose.</description>
</item>
<item>
<title>June 20 - a portable enrichment import, a console that runs the pipeline, and a brand pinned down</title>
<link>https://davidgomez.cc/devblog/portable-import-and-a-brand-pinned-down.html</link>
<guid>https://davidgomez.cc/devblog/portable-import-and-a-brand-pinned-down.html</guid>
<pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate>
<description>A long, many-threaded day. I built the full path that lets a second person&#39;s Apple-photo metadata become my app&#39;s enrichment database, turned the setup console into something that can actually start the pipeline stages itself, split the frontend out of the monolith, unified the brand across app and marketing site, stood up real email, and fixed a couple of bugs that had been silently breaking the photo pipeline for a while.</description>
</item>
<item>
<title>June 19 - the day Loupe got its name, its face, and its front door</title>
<link>https://davidgomez.cc/devblog/rename-connect-faces-brand.html</link>
<guid>https://davidgomez.cc/devblog/rename-connect-faces-brand.html</guid>
<pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate>
<description>A long, many-threaded day: renamed both repos to loupe, shipped the Map and Cutting Room pages, built the in-app People view on top of face embeddings, redrew the brand mark down to the favicon, and stood up the onboarding front door.</description>
</item>
<item>
<title>June 18 - the motif gets deeper the closer you zoom</title>
<link>https://davidgomez.cc/devblog/contact-sheet-deepens-by-zoom.html</link>
<guid>https://davidgomez.cc/devblog/contact-sheet-deepens-by-zoom.html</guid>
<pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate>
<description>Redesigned the month view&#39;s day cards into a contact-sheet film motif, polished the marketing site&#39;s desktop nav, survived a concurrent-edit collision that wiped my work off disk, and finally figured out what machine I&#39;ve actually been building on.</description>
</item>
<item>
<title>June 17 - making Loupe leave my box: portability, a brand, and a public site</title>
<link>https://davidgomez.cc/devblog/from-my-box-to-a-product.html</link>
<guid>https://davidgomez.cc/devblog/from-my-box-to-a-product.html</guid>
<pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate>
<description>The day Loupe stopped being a thing that only runs on my machine. I reframed it as a self-hostable product, made the pipeline portable through environment variables, scrubbed both repos clean for publishing, finalized a brand and header, fixed the photobook&#39;s repetition problem, and registered loupeculling.com for a marketing site.</description>
</item>
<item>
<title>June 16 - a kernel reboot, two apps becoming one, and an enrichment layer pulled from Apple</title>
<link>https://davidgomez.cc/devblog/one-app-called-loupe.html</link>
<guid>https://davidgomez.cc/devblog/one-app-called-loupe.html</guid>
<pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate>
<description>The day the project got a name and a spine: I came back to a box that had silently rebooted, merged two sibling photo-review apps into one productionized service called Loupe, added a cloud backup and AI-written period summaries, and built an enrichment layer that joins Apple&#39;s own labels, people, and scores back onto my library by UUID.</description>
</item>
<item>
<title>June 15 - the 462 GB move that took 0.09 seconds, and two review tools</title>
<link>https://davidgomez.cc/devblog/the-move-that-moved-nothing.html</link>
<guid>https://davidgomez.cc/devblog/the-move-that-moved-nothing.html</guid>
<pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate>
<description>A long day: turning a 462 GB copy into an instant rename by understanding the filesystem, catching two backup processes about to trample each other, and building two browser tools to actually review ~91,000 photos without ever deleting one by accident.</description>
</item>
<item>
<title>June 14 - a dependency cascade, and matching files back to a list</title>
<link>https://davidgomez.cc/devblog/a-dependency-cascade-and-matching-files.html</link>
<guid>https://davidgomez.cc/devblog/a-dependency-cascade-and-matching-files.html</guid>
<pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate>
<description>An aggressive package cleanup quietly broke my storage box&#39;s admin UI through a dependency I didn&#39;t know was load-bearing. Then a filename-normalizer bug taught me to trust byte sizes over names when matching files back to a database.</description>
</item>
<item>
<title>June 12 - culling rules that find nothing, and a bucket that wasn&#39;t what it looked like</title>
<link>https://davidgomez.cc/devblog/rules-that-find-nothing.html</link>
<guid>https://davidgomez.cc/devblog/rules-that-find-nothing.html</guid>
<pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate>
<description>With the metadata database built, I started writing rules to surface delete-candidates. Two of the rules found nothing, one was secretly broken, and the biggest &#39;junk&#39; bucket turned out to be footage I&#39;d never delete. The lesson of the day: rules lie, pixels don&#39;t.</description>
</item>
<item>
<title>June 9 - building a photo-metadata pipeline with no sudo and a flaky network</title>
<link>https://davidgomez.cc/devblog/building-a-metadata-pipeline-no-sudo.html</link>
<guid>https://davidgomez.cc/devblog/building-a-metadata-pipeline-no-sudo.html</guid>
<pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate>
<description>Day one of the photo project: build an ingest tool that reads ~91,000 photos and videos into a SQLite database so I can cull systematically. The build went fine. The environment fought me, and the performance lessons were not where I expected.</description>
</item>
<item>
<title>May 10 - my cloud capstone: pricing, deploying, and auto-scaling a web app on AWS</title>
<link>https://davidgomez.cc/devblog/cloud-capstone-aws.html</link>
<guid>https://davidgomez.cc/devblog/cloud-capstone-aws.html</guid>
<pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate>
<description>My cloud course capstone made me do the whole job, price an architecture before building it, stand it up on AWS, make it survive load, and move its data to a second cloud.</description>
</item>
</channel>
</rss>
