Work log: Textorium — March 11, 2026
What shipped today
Today was a full pipeline day — 11 issues closed across two major themes: error surfacing and website Hugo conversion.
The bulk of the session focused on systematically eliminating silent failures throughout the app. Issue #19 (“Surface non-git silent failures as user alerts”) was decomposed into three targeted issues covering ContentIndexer (#29), SiteManager (#30), and ImageHandler (#31). Each was prepped, implemented, and merged autonomously. ContentIndexer now tracks files that fail to parse and shows a dismissible warning banner in LibraryView. SiteManager surfaces save/load failures via a published lastError property bound to an alert in ContentView. ImageHandler’s drop errors now bridge from AppKit through the NSViewRepresentable coordinator into SwiftUI alerts — the most architecturally interesting change, requiring a Result<String, Error>? return type and a new delegate protocol method. These join the earlier git error alerts (#16) to give users visibility into every failure path.
The second theme was converting the textorium.app marketing site from static HTML to Hugo. Issue #12 was decomposed into three children (#35, #36, #37). #35 shipped today — the Hugo project is initialized with baseof.html extracting the shared chrome, the homepage as a layout template, and privacy/support converted to markdown content pages. The site builds cleanly and all pages render identically to the previous static version.
Earlier in the session (before context compaction), four code quality issues also shipped: removing a leaking git status timer (#23), cleaning up dead code (#21), fixing main-thread-blocking remote image loads (#20), and adding multi-format date parsing (#22).
Completed
- #16 — Surface git sync/commit failures as user alerts (PR #28)
- #19 — Surface non-git silent failures as user alerts (decomposed → #29, #30, #31)
- #20 — Remote image loading blocks main thread (PR #26)
- #21 — Remove dead code files and unused functions (PR #25)
- #22 — Date parsing only handles ISO8601 format (PR #27)
- #23 — Git status timer leaks in LibraryView (PR #24)
- #29 — Surface ContentIndexer errors in LibraryView (PR #34)
- #30 — Surface SiteManager save/load errors as alerts (PR #33)
- #31 — Surface ImageHandler drop errors in editor (PR #32)
- #35 — Initialize Hugo project and convert existing pages (PR #38)
- #12 — Add Hugo to textorium.app for blog syndication (decomposed → #35, #36, #37)
Release progress
v1.5: 11 closed / 3 open. The remaining issues are all Hugo website work — blog section (#36), Cloudflare deploy config (#37), and the blocked email signature (#13, depends on blog existing).
Carry-over
- #36 — Add blog section with list and single templates.
ready-for-prep. Depends on #35 which just landed. - #37 — Update Cloudflare Pages build settings for Hugo.
ready-for-prep. Also unblocked by #35. - #13 — Dynamic email signature with latest blog post.
blockedon #36 (needs blog content to exist).
Risks
- The Hugo conversion dropped two minor CSS classes (
.highlighton the privacy summary paragraph,.support-optionwrapper on the email support card). The content is fully preserved but spacing may differ slightly from the original static pages. Worth a visual check in production. - The
.content-page section { margin-bottom: 2rem }CSS rule no longer applies since Hugo’s markdown renderer doesn’t produce<section>wrappers. The existingh2 { margin-top: 2rem }partially compensates, but there may be minor spacing differences on privacy and support pages.
Flags and watch-outs
- Hugo v0.157.0 is the version used locally. Cloudflare Pages will need
HUGO_VERSIONenvironment variable set to match. - The
disableKinds = ['taxonomy', 'term']inhugo.tomlsuppresses taxonomy warnings. If tags/categories are needed for the blog later, this will need to be reverted.
Next session
/issue prep 36 --autothen/issue exec 36 --auto— add blog section with list/single templates and nav link/issue prep 37 --autothen/issue exec 37 --auto— document Cloudflare Pages build settings- After #36 and #37 land, unblock #13 (dynamic email signature) — change label from
blockedtoready-for-prep - Visual QA of the Hugo site in production once Cloudflare deploys with the Hugo build step
- Consider running
/scoutto find new issues now that the error surfacing and website conversion work is complete
Why customer tools are organized wrong
This article reveals a fundamental flaw in how customer support tools are designed—organizing by interaction type instead of by customer—and explains why this fragmentation wastes time and obscures the full picture you need to help users effectively.
Infrastructure shapes thought
The tools you build determine what kinds of thinking become possible. On infrastructure, friction, and building deliberately for thought rather than just throughput.
Server-side dashboard architecture: Why moving data fetching off the browser changes everything
How choosing server-side rendering solved security, CORS, and credential management problems I didn't know I had.
The work of being available now
A book on AI, judgment, and staying human at work.
The practice of work in progress
Practical essays on how work actually gets done.
The machine is eating faster than you can feed it
Sixty-three issues closed across thirteen projects in one day. Four milestones completed. And the hardest problem wasn't building — it was keeping up with what you've already built.
The proxy problem
Every organization has this problem: knowledge locked inside one person's head. Today I accidentally designed a solution — and it has nothing to do with documentation.
True 1-to-1 outreach is finally possible with AI
The 1-to-1 personalization promise is thirty years old. It never worked because understanding each person was too expensive. AI changed the economics.