← All posts

Python

Aug 14, 2026
August 14 - ten readiness gates instead of one number
A single readiness percentage is a number you can fool yourself with. Waypoint replaced it with ten independent gates that each pass or fail on their own evidence.
Aug 10, 2026
August 10 - the submission that failed twice and saved everything both times
A live practice-exam submission returned a 502 and the retry said 'already submitted', leaving a permanent error in front of a button that could never succeed. The proxy had a five-second default nobody had questioned, the submit path took 29 seconds, and the first optimization made it slower. The fixes preserved output exactly or were reverted.
Aug 9, 2026
August 9 - treating the listing database as a cache, not the record
Listing sites edit and pull their own pages. Homestead keeps every capture as immutable evidence and rebuilds the searchable database from it, so a delisted house keeps its record.
Aug 9, 2026
August 9 - a test suite that proved it could fail, and the search that had been dead for two days
Loupe got its first real test suite. Writing it found two things: one of the new tests could not fail, and the search feature had been silently broken since a move two days earlier while the service reported healthy the whole time.
Aug 7, 2026
August 7 - the prompt budget that could only get worse
Every mode of my study assistant returned a server error before the model was ever called. The context packet's fixed part had grown past the safety limit on its own, and one unbounded field guaranteed it would keep growing. The fix went into the shared layer three different callers depend on, with caps chosen by measurement and a degrade path before any error.
Jul 28, 2026
July 28 - getting a local model to follow an exact plan
The free model on my own hardware kept failing halfway through jobs. The cause was not on my side, and the fix was to stop asking the model to write its own proof of work.
Jul 27, 2026
July 27 - searching what I actually did, not just what I wrote down
My notes could answer what I decided but not what I actually did, so I built a second searchable layer over the working history itself, and a rule for when it is allowed to be used.
Jul 27, 2026
July 27 - letting the fleet choose which AI model runs each job
I stopped picking which AI model runs each job by hand and built a router that scores the options on what each one has left, reserves the winner, and writes down why it chose.
Jul 21, 2026
July 21 - four ways a worker reported success without doing the work
The harness that runs my local model was reporting success unconditionally, no matter what happened. Hardening it went in four phases, each one proving the defect on the unmodified code before patching, and ended with a single terminal contract that maps every way a run can end to an honest status and exit code.
Jul 10, 2026
July 10 - how Loupe decides what to keep: labels nominate, scores order, people protect
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.
Jul 3, 2026
July 3 - a dashboard that became a second brain: fleet health, my notes, and search over my own work
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.
Jun 27, 2026
June 27 - a Swiss redesign, a GPU box, and a wiki over all my notes
Reskinned davidgomez.cc into a Swiss/International typographic system, stood up a GPU box and proved face-embedding runs on it, and brought up a regenerable wiki over every one of my notes, run by hand for now.
Jun 26, 2026
June 26 - the demo stops faking it: every view wired, real face crops, live in production
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.
Jun 25, 2026
June 25 - faking a whole photo library, teaching the demo to act like the app, and mapping it as a graph
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 code-mapping tool over the app to chart its architecture and data flow.
Jun 23, 2026
June 23 - Loupe's first offsite backup, lazy render lookups, and getting my notes out of iCloud's way
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 checking 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.
Jun 22, 2026
June 22 - folding two repos into one, then scrubbing my git history clean before the first push
I merged Loupe's pipeline repo into the app repo as a folder with its history intact, 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'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.
Jun 21, 2026
June 21 - glass on the surface, plumbing underneath
A wide day: shipped a dormant glass redesign and a fully responsive header, chased a stats box that kept clipping, traced 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'm keeping vague on purpose.
Jun 20, 2026
June 20 - a portable enrichment import, a console that runs the pipeline, and a brand pinned down
A long, many-threaded day. I built the full path that lets a second person's Apple-photo metadata become my app'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.
Jun 19, 2026
June 19 - the day Loupe got its name, its face, and its front door
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.
Jun 18, 2026
June 18 - the motif gets deeper the closer you zoom
Redesigned the month view's day cards into a contact-sheet film motif, polished the marketing site's desktop nav, survived a concurrent-edit collision that wiped my work off disk, and finally figured out what machine I've actually been building on.
Jun 17, 2026
June 17 - making Loupe leave my box: portability, a brand, and a public site
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's repetition problem, and registered loupeculling.com for a marketing site.
Jun 9, 2026
June 9 - building a photo-metadata pipeline with no sudo and a flaky network
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.