Building Greenhouse: the first screens
The UI arc: a wizard shell built before its steps existed, a capture flow torn out for being wrong, and the gap between green checkmarks and the truth.
Notes on the software, games, and music coming out of Imperfect Systems.
RSS feedThe UI arc: a wizard shell built before its steps existed, a capture flow torn out for being wrong, and the gap between green checkmarks and the truth.
118 green tests, a clean simulator pass, and dead buttons on a real phone. The bug was a @MainActor service doing synchronous work between awaits.
The folder layout that outlives the app: zones versus stages, a config that refuses to overwrite itself, a database printout, and adopt-in-place import.
A full Rust rules engine and 22 tests, written before Greenhouse had a UI or even a working Rust toolchain, and what broke the moment it finally compiled.
Why Imperfect Systems is keeping a public dev log, and how the blog is wired up under the hood.
You can't extract a blog, but you can extract its components: a token contract for two palettes, and the two CI bites that never happen on a laptop.
A rules engine that looked finished hid a status nothing ever set, backwards sorts, an unenforced constraint, and a settings file that could brick the app.
Medium's native integration was a museum exhibit. A browser bridge, an article whose body is a URL, and minus 1,603 lines.
@MainActor eliminates data races, not interleaving races. A generation token, a stale-failure guard, and a deterministic race test with no sleeps.
A whole dark theme by redefining CSS variables under one class, and 45 minutes spent proving a five-line toggle innocent.
Page 10 of 14