Back to blog

Dev Diary #21

Extracted two coupled tools out of dotfiles into standalone repos and unified their state under a single TICKETS_DIR.

May 21, 2026

Dev Diary #21

The dotfiles repo had two things tangled together that shouldn't have been: lane orchestration for worktrees, and a ticket TUI. Both started as scripts under `scripts/` and grew until they had their own CLAUDE.md files inside a repo that was supposed to be about shell config. So I spent the day cutting them out. `wt-lanes` came out first. Moved `bin/wt`, `bin/wt-gc`, `bin/ralph-bootstrap`, and the state-write hooks into a standalone repo, tagged v0.1.0. The dotfiles side now just symlinks against whatever's installed. The agent-board tmux script was the trickiest part — it had been labeling lanes by inspecting the cockpit window title, which broke the moment a nested lane spawned its own children. Switched it to read from a sentinel file the `wt` script writes on entry. Cleaner, but I'm not thrilled that the sentinel is plain text in `/tmp` — if two lanes race on cleanup the state column flickers. `tix` came out second and was the bigger surgery. It had a bundled sync module that knew about a specific external ticket system, which is exactly the kind of coupling that kills a tool's reusability. Ripped it out and replaced with a `TIX_PRELOAD_HOOK` env var — point it at a script, the script populates the local tree before the TUI opens, tix doesn't care what you ran. Published to PyPI as v0.1.0 with badges, a CHANGELOG, and a schema doc. Then the part I actually wanted: `$TICKETS_DIR`. Every project gets a tree under `~/.claude/tickets//`, and `tix ` resolves against that. `wt` honors the same env var so a worktree lane and the ticket TUI agree on where state lives. This is the piece that's been bugging me for weeks — tickets scattered across repo-local `.tickets/` dirs meant grep was useless across projects. Also shipped a small Rust thing, `monkeytype-tui`, mostly to have a low-stakes Rust project sitting on my disk that isn't a toy. CI is green, README is honest about what it does. Still unresolved: the git-watch CI column reservation fix works but I don't trust it on rows that flip merged→reopened. Need to actually reproduce that case.

Home
About
Resume
Projects
Blog
Press
Search