Uses
The tools I use updated as things change.
Hardware
My main machine is a MacBook Pro 16-inch (2023) w/ an Apple M2 Max. Enough memory to run models like gpt-oss-20b with reasonable throughput for local work.
When I travel and want a decent keyboard experience, I use a Lenovo ThinkPad X1 Carbon (6th gen) running Debian 13. ThinkPads are tanks. I’ve been using Debian on one machine or another for almost thirty years.
Speaking of keyboards: HHKB. Once you go Topre, you don’t go back.
AI Tools
I subscribe to ChatGPT Plus and Claude Max.
My preferred model right now is Opus 4.5. It’s what I reach for when I need something to actually think.
For coding, I use a mix:
OpenCode is my daily driver
GitHub Copilot in VS Code with autocompletions turned off
Still some use of Claude Code
Codex CLI with GPT-5.2-Codex (xhigh) for long running tasks
For general purposes:
ChatGPT web, mobile, and desktop
Claude web, mobile, and desktop
Some use of OpenCode Desktop
Occasional Gemini or Grok
My daily driver here would be Claude, but ChatGPT still has the best voice integration and is great at searching. Voice is something that matters to me a lot, and I don’t do real time voice either normally as I tend to keep the reasoning effort levels high in most cases.
Terminal & CLI
I use fish as my shell because of the delightful out of the box experience with syntax highlighting, tab completion, autosuggestions, history substring search, abbreviations, and vi mode. I use Ghostty as my terminal editor because I need one that is reliable and great performance with GPU acceleration. Starship for a fast, minimal prompt with useful context.
These tools aren’t just faster for me. They’re also what AI coding agents use under the hood. Faster search means lower latency. Cleaner output means better context and better results. If you’re using AI tooling heavily, these pay for themselves:
ripgrep - grep, but fast. This is what your AI is actually calling when it searches your codebase.
fd - find, but sane defaults and faster. Same story.
eza - modern ls with tree view and git status.
bat - cat with syntax highlighting and line numbers. Line numbers matter as agents reference them.
fzf - fuzzy finder. Interactive selection for humans; scriptable filtering for agents.
tree - directory structure visualization. Critical for agents orienting in unfamiliar codebases.
jq - JSON Swiss Army knife. Essential for parsing tool output and configs.
yq - jq for YAML. Agents need to parse config files.
ast-grep - search by syntax tree, not regex. When an agent needs to find “all async functions that call X,” this is how.
difftastic - structural diffs that understand code. Catches semantic changes regex-based diffs miss.
delta - git pager with syntax highlighting. Makes diff output cleaner for both you and agents parsing git output.
tokei - code statistics by language. Helps agents quickly understand project scope.
watchexec - file watcher that runs commands on change. Tighter feedback loops.
tldr - community-driven man pages. Quick reference when you (or your agent) need a reminder.
GNU coreutils, gnu-sed, gnu-tar, gawk - consistent behavior across macOS and Linux. Agents don’t have to deal with BSD quirks.
Languages & Tooling
My preference order: Rust, then Go, then Python. I end up in Python a lot because of AI work.
For Python, it’s uv for everything package-related. It’s magical. Ruff for linting and formatting, pyright for type checking (keeping an eye on ty for when it stabilizes). FastAPI and Pydantic for APIs, typer for CLIs.
For Rust, I lean on the usual cargo extensions: cargo-outdated, cargo-update, cargo-udeps, and cargo-sort to keep things tidy. Axum for APIs, clap for CLIs, ratatui when I need a TUI.
