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

Work log: Textorium TUI — March 12, 2026

What shipped today

Today was a full pipeline sweep — 8 PRs merged, clearing the CLI essentials milestone and fixing several visual bugs in the TUI.

The biggest chunk of work was implementing the three CLI commands that were stubbed since the project started: textorium new, textorium list, and textorium publish. These transform the tool from a TUI-only experience into something scriptable. new creates SSG-aware posts with proper frontmatter and opens $EDITOR. list outputs a filterable table (or JSON) of posts with draft/category filtering. publish flips draft: false by slug match while preserving the rest of the frontmatter byte-for-byte. All three commands are SSG-aware — Hugo, Jekyll, and Eleventy each get the right file paths, naming conventions, and directory structures.

Two bugs in the editing workflow got fixed. The stale original_frontmatter bug (#32) meant that after saving, the dirty indicator would show false positives because the baseline wasn’t being refreshed. The fix re-reads the file after save to update the baseline. Building on that, the unsaved changes indicator (#33) adds a * suffix to modified post titles and a quit confirmation when there are dirty posts — a small but important guardrail against accidental data loss.

The content pane got three fixes in sequence: text wrapping (#39), removing the whitespace margin caused by the wrapping/scrolling conflict (#41), and fixing light theme legibility (#40). The wrapping fix added .wrap(Wrap { trim: false }), but that broke scrolling because the old code was manually slicing source lines while ratatui was wrapping them into more visual rows. The margin fix replaced manual line slicing with Paragraph::scroll(), letting ratatui handle both wrapping and scrolling together. The light theme fix changed the default metadata field color from Color::White to Color::Reset so custom frontmatter fields are visible on any terminal background.

Completed

  • #29 — Implement textorium new command (PR #34)
  • #30 — Implement textorium list command (PR #35)
  • #31 — Implement textorium publish command (PR #36)
  • #32 — Fix stale original_frontmatter after save (PR #37)
  • #33 — Add unsaved changes indicator to TUI (PR #38)
  • #39 — Wrap text in content pane (PR #42)
  • #41 — Fix whitespace margin in content pane (PR #43)
  • #40 — Fix light theme metadata field legibility (PR #44)
  • #45 — Duplicate of #39, closed during triage

Release progress

  • CLI essentials: 0 open / 3 closed — milestone complete
  • TUI on Homebrew: 1 open / 5 closed (only #8 email signature remains, backlogged pending blog syndication work)

Carry-over

Nothing active. All issues in the queue are backlogged:

  • #1 — Submit to homebrew-core (waiting for traction after launch)
  • #8 — Dynamic email signature (blocked on blog syndication)

Risks

None. The codebase is clean, all tests pass (12/12), clippy is clear.

Flags and watch-outs

  • The content pane scrolling now uses content_scroll as u16 — this could theoretically overflow for files with >65535 lines, but that’s not a realistic concern for blog posts.
  • The Color::Reset fix assumes terminal emulators properly support the reset escape code. All modern terminals do, but very old or minimal terminals might not.

Next session

  • Run /scout to discover new issues — the codebase has grown significantly and there may be improvements to surface.
  • Consider creating a milestone for “first external user” work — the CLI essentials milestone is done, and the next push should focus on documentation, error messages, and polish that matters for someone who isn’t the author.
  • The textorium serve and textorium build CLI commands are still stubbed — these could be quick wins for a future sprint.

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.