Moments: The Photo App I Built to Win an Argument
A phone call with a mate turned into a wager: could AI actually build a real application from scratch? Five months, 898 commits and 40,000 lines of Rust later, here's the verdict — and the app.
Recent content on From The Architect
A phone call with a mate turned into a wager: could AI actually build a real application from scratch? Five months, 898 commits and 40,000 lines of Rust later, here's the verdict — and the app.
Clicking a sidebar row still just logs a line to stderr. Stand up a second executor for Tokio alongside GTK's single-threaded main loop, fetch and parse real RSS feeds off the UI thread, and learn exactly where the one seam between them is allowed to cross.
GTK4 retired the row-at-a-time way of showing data without much fanfare. Before any specific list widget, the mental shift that has to happen first — and the one case where the old instinct is still correct.
A PIN prompt that failed before the one that worked, but only when the backup key was in the port. The fix is four lines of ssh_config, and the interesting part is what it takes to answer 'which key is plugged in' quickly enough to run on every connection.
Pointing an LLM at undocumented SAP BODS XML produces confident fiction. Splitting the job into a deterministic fact store and an agent layer that reads from it produces migration specs you can actually sign off.
Every GNOME app starts with a window — and the toolkit hands you two of them. Which to use, why AdwApplicationWindow has no titlebar, and how AdwHeaderBar and AdwToolbarView build the chrome that makes an app feel native.
The GTK reference tells you what every widget is. It rarely tells you which one to reach for, or why the obvious choice will bite you. This series is the field guide I wish I'd had.
Clicking a sidebar row finally does something. Build a real Feed GObject, bind a list to a model, define a custom signal, and learn where state lives in a GTK Rust app — and why Rc<RefCell<T>> almost never belongs there.
A follow-up. The architecture is sound. The first six weeks of running it were not. Here are four bugs the round-trip taught me — two about the abstraction, two about the substrate underneath.
A week ago I would have told you the open source community rejected AI for four obvious reasons. Then I tried defending each one properly. Most of them collapse under scrutiny — and what's left is a much more tractable conversation.
An offline-first photo manager whose library code has no idea it has a sync backend. One enum, one trait, three implementations behind it, and the architectural property they buy together.
We designed an event bus, had it externally reviewed, shipped it, and a month later deleted it. Here's why direct service-to-client channels turned out to be the honest answer.
Replace GTK's verbose XML templates with Blueprint, wire it into Meson, and grow the Hello-World window into the real Gazette layout — sidebar, content pane, and a placeholder feed list.
Why GNOME's stack looks the way it does in 2026 — a short tour of the licence fight, the component dream that didn't pan out, the GNOME 3 reset, the libadwaita split, and the Flatpak runtime model.
Create a GTK4 + libadwaita application with GNOME Builder, understand every file it generates, and upgrade to the latest GNOME platform
Three Home Assistant alerts built on a single smart-plug power signal — offline, stuck on, and door open — plus the patterns that make them reliable.
Before we build a GNOME app, we need to understand GObject — the type system underneath everything in GTK. Here's how it works in Rust.
Why GNOME, why Rust, and how to set up a development environment that will carry you from first widget to Flathub submission
What Extreme Programming taught us about collaboration — and why it maps perfectly onto working with LLMs
About Justin and From The Architect.