Skip to main content
Paul Welty, PhD AI, WORK, AND STAYING HUMAN

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. blocked on #36 (needs blog content to exist).

Risks

  • The Hugo conversion dropped two minor CSS classes (.highlight on the privacy summary paragraph, .support-option wrapper 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 existing h2 { 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_VERSION environment variable set to match.
  • The disableKinds = ['taxonomy', 'term'] in hugo.toml suppresses taxonomy warnings. If tags/categories are needed for the blog later, this will need to be reverted.

Next session

  1. /issue prep 36 --auto then /issue exec 36 --auto — add blog section with list/single templates and nav link
  2. /issue prep 37 --auto then /issue exec 37 --auto — document Cloudflare Pages build settings
  3. After #36 and #37 land, unblock #13 (dynamic email signature) — change label from blocked to ready-for-prep
  4. Visual QA of the Hugo site in production once Cloudflare deploys with the Hugo build step
  5. Consider running /scout to 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.