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

2026-03-22 — simplebooks

What shipped

The final polish batch for the Next.js port landed overnight — five issues covering error handling, performance, UX safety nets, and mobile responsiveness. These were the last items in the “Next.js port” milestone.

Error handling and loading states were added to all server actions and forms, so users now see proper feedback instead of silent failures. The dashboard and account balance calculations had N+1 query patterns that were fixed by adding eager loading and missing database indexes — page loads should be noticeably faster with real data volumes.

Delete actions across the app (accounts, transactions, contacts, categories, promises, statements, projects) now show confirmation dialogs before destructive operations. A hamburger menu was added for mobile viewports, making the sidebar collapse and expand properly on small screens. Finally, Content-Disposition filenames were sanitized to prevent path traversal, and unused shadcn components were cleaned out to reduce bundle size.

Completed

  • #52 — Add error handling and user feedback to all server actions and forms
  • #53 — Fix N+1 query pattern in dashboard and account balance calculations
  • #54 — Add confirmation dialogs to all delete actions
  • #55 — Add mobile-responsive sidebar with hamburger menu
  • #56 — Sanitize Content-Disposition filenames and remove unused shadcn components

Release progress

  • Next.js port: 0 open / 18 closed (milestone complete)
  • March 2026: 0 open / 0 closed (empty — predates the port)

Carry-over

  • The repo migration happened on 2026-03-23: simplebooks renamed to simplebooks-rails (archived), simplebooks-next became the new simplebooks. The new repo is live on GitHub but needs a fresh npm install after the directory rename (stale node_modules references to old path). The Next.js dev server has Turbopack errors related to missing next/dist/pages/_error and global-not-found modules — likely needs a clean node_modules reinstall.
  • No milestones exist on the new repo yet — the old milestones lived on simplebooks-rails.
  • CLAUDE.md needs updating for the Next.js codebase (currently has Rails-era content from /init).

Risks

  • The SQLite database (db/simplebooks.db) was migrated from the Rails/Postgres dump but has no auth tables (users, companies) — the Next.js port is single-tenant. If multi-tenancy is needed later, the schema will need rework.

Flags and watch-outs

  • The node_modules were installed when the project lived at ~/Projects/simplebooks-next. Some cached paths still reference that old location. A clean rm -rf node_modules && npm install in the new location should fix the Turbopack errors.
  • The package.json still has "name": "simplebooks-next" — should be updated to "simplebooks".

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.

When your agents start breaking each other's code

Two agents modified the same file independently and created database locks. The fleet hit 135 issues in one day — and the coordination problem that comes with it.

The removal tax

The most productive thing you can do with a product is take features away. Eighty-nine issues closed across eight projects, and the hardest lesson came from a pipeline that ran perfectly and produced nothing.

The product changed its mind

A product pivoted its entire philosophy mid-session — from 'here's your list' to 'here's your next thing.' The code shipped in the same conversation as the idea. That's not iteration. That's something else.