Uses
This is a rough list of the products I use daily as a software engineer. Check out uses.tech for a list of other people's /uses pages!
There was a time in my early 20s when I used to enjoy building my own desktop and OS from scratch. I still enjoy tinkering with new tech, but I depend on a simple setup so that I can focus more on my work.
Hardware
-
Laptop: MacBook Pro M3 Max 14"
-
Desktop: an always-on Ubuntu machine that I use from the Mac over SSH
-
Monitor: Dell S2722QC 27-inch 4K UHD
-
Keyboard: NuPhy Air75 V3
-
Mouse: Logitech MX Master 4
-
Shortcut keys: Elgato Stream Deck MK.2
-
Headphones: Philips SHP9500 wired headphones and Technics EAH-AZ100 wireless earphones
Two machines
I work from the Mac, and an Ubuntu desktop runs around the clock beside it. My dotfiles set up both, so the shell, editors, launcher and hotkeys match.
-
Connection: OpenSSH over Tailscale, not Tailscale SSH, which drops sessions when tailscaled restarts. The desktop accepts only keys, and only from private ranges and the tailnet.
-
Sessions: tmux starts at boot on Ubuntu and brings back its sessions after a reboot. tmux and Vim copy to the Mac's clipboard through OSC 52, and agents' notifications reach Ghostty on the Mac over SSH.
-
What runs there: the T3 Code server, as a service that T3 Code on the Mac and my phone share, with Claude Code, Codex and Docker for its agents
-
Desk: a USB switch moves the keyboard, mouse and Stream Deck between the two machines, and the monitor's input follows over DDC/CI. Elgato's app doesn't run on Linux, so on Ubuntu a daemon draws the same Stream Deck keys, and GNOME gets the hotkeys Hammerspoon sets on the Mac.
-
Uptime: suspend is off, a UPS shuts the desktop down on low battery and starts it when power returns, and security updates install daily. Disk health, a daily check and each boot push alerts to my phone through ntfy.
Development tools
-
IDE: Zed
-
Coding agents: Claude Code in T3 Code
-
Shell: zsh with starship for the prompt and atuin for history
-
Terminal multiplexer: tmux, with tmux-sessionizer to open a session for a project
-
Terminal editor: Vim
-
Git: lazygit, difftastic for diffs and git wt for worktrees
-
Code management: GitHub
-
Packages and runtimes: Homebrew for CLI tools and apps, mise for Node and Go, rustup for Rust, uv for Python and pnpm for JavaScript
AI coding setup
T3 Code runs the Claude Code and Codex CLIs, so their settings and skills apply there too. The ai_tools folder in my dotfiles sets them up on both machines.
-
Worktrees: every T3 Code thread works in its own git worktree. Claude Code's subagents and background sessions make theirs with git wt under
~/.worktrees. -
Instructions: one user-level file, copied to
~/.claude/CLAUDE.mdand~/.codex/AGENTS.md. It tells agents to work through to done without check-ins, ask before adding a dependency, never weaken a test to make it pass and commit only when asked. This site and my dotfiles keep their conventions inAGENTS.md, which theirCLAUDE.mdimports. -
Skills: shared by Claude Code and Codex. The engineering ones take a feature from spec to design, tickets, implementation and review, and the productivity ones cover writing and questioning a plan. Most are modified copies from Matt Pocock's skills and poteto's pstack.
-
Defaults: Claude Opus 5.5 at medium effort in auto mode
Productivity tools
-
Browser: Google Chrome
-
Command centre: Vicinae on both machines, for apps, clipboard history and Raycast extensions
-
Hotkeys: Hammerspoon
-
Window management: Rectangle
-
Dictation: Wispr Flow
-
Knowledge base: Notion
-
Task management: Linear
-
Email: Gmail
-
Calendar: Google Calendar
-
File management and backup: Google Drive and Dropbox
Design tools
Misc
-
DNS: Cloudflare 1.1.1.1
-
VPN: Mullvad
-
Break reminders: Time Out
-
Blue light filter: f.lux
-
CLI tools and configs: dotfiles
This site
This site is built with Astro, Markdown, React islands and Tailwind CSS. It runs on a Cloudflare Worker, and Convex backs its private tools. The source is on GitHub.