Some tools I built because nothing did the job, and my team now runs them every day. The rest are fixes to projects I rely on, shipped through the feedback loop with their maintainers.

3tools6merged PRs3projects

Tools I maintain

3
01

Maintained

cvx

Multi-account switcher for Convex · used daily by my team

The Convex CLI remembers one logged-in account, stored in a single global file. With personal, work and client accounts, every project switch meant convex logout and convex login, and two accounts could never run side by side.

cvx keeps a vault of account tokens and a map of folders to accounts. A shell hook activates the right account when you cd in, scoped to that shell session, so six projects on six accounts can run convex dev at once. No deploy keys, no tokens in repos. Ships as a compiled Bun binary for macOS, Linux and Windows.

TypeScript · Bun · zsh / bash / PowerShell

02

Maintained

fvx

Per-project Flutter SDK switching · used daily by my team

Run flutter in any folder and get the SDK version that folder pins, from .fvmrc, .tool-versions or a pubspec.yaml range. Two terminals in two projects run two Flutter versions at the same time.

There is no cd hook. fvx setup puts flutter and dart shims first on PATH, and each call resolves the version in about 10 ms. That makes it work where shell hooks never run: scripts, Makefiles, CI and coding agents in non-interactive shells. It reads the same .fvmrc FVM writes, so teammates on FVM get the same pin.

TypeScript · Bun · Flutter

03

Maintained

Coppice

macOS menu bar app for coding agent worktrees

Coding agents create a git worktree for every task and never clean up. After a few weeks one laptop holds dozens of forgotten copies of the same repo, each with its own node_modules, and some still hold uncommitted edits, a local .env or a running agent.

Coppice finds worktrees from Claude Code, Codex, Cursor, T3 Code and others, and marks each one ready, has work, or in use. It sweeps rebuildable output, moves finished worktrees to the Trash, and refuses to touch one an agent or dev server is still running in. Every check runs again at the moment you click. Native Swift and SwiftUI, no third-party dependencies.

Contributions

3
01

Merged

Mole

macOS deep-clean utility by tw93 · 51k+ stars

I added a --list flag to mo uninstall that enumerates installed applications across system, user, Homebrew and Setapp sources, surfacing both the display name and the exact Homebrew cask token needed to uninstall. Written in Bash with 12 bats test cases covering edge cases across every source.

The maintainer said my first design added too much top-level surface to the CLI. He was right. I moved the capability from a standalone mo list command into a flag on the existing uninstall command, keeping the API small, and he merged it after the revision.

Bash · bats · CLI design

02

5 PRs merged

TLDR Pages

Community-maintained simplified man pages

Five merged pull requests adding new platform pages and improving existing CLI documentation, including a swaylock page for the Linux/Wayland ecosystem. Each page follows the project's strict format: concise, example-driven, nothing extra.

Documentation · Linux / Wayland · CLI references

03

Bug reports

TinaCMS

Open-source headless CMS

Filed reproducible bug reports against subsystems where the codebase made a direct fix hard to scope from outside. Each report had minimal reproduction steps, environment details and an analysis of where the issue likely started, so maintainers had a clear place to begin.

Bug reporting · CMS internals · Reproductions

Everything else is on GitHub ↗Things I've shipped →