Setup
Everything I use to build, write, and ship. Updated as things change.
Hardware
I type on a Keychron Q10 Max. Alice layout, wireless, QMK. The split ergo layout fixed the wrist pain I was getting from flat keyboards. When I’m working from a coffee shop I bring the NuPhy Air75 V3, thin enough to fit in my bag without thinking about it.
Mouse is a Logitech MX Vertical. Took a week to get used to the grip. Now a normal mouse feels wrong.
All of this runs on a MacBook Pro 14” M4 Pro. Everything I need fits in an Arc’teryx Aerios 35. Laptop, charger, keyboard, water bottle, and still room for a layer.
Apps
Zed is my editor. Fast. Switched from VS Code and never looked back. Ghostty is my terminal. GPU-accelerated, native on macOS, and the config is just a text file. I run zsh with a starship prompt. Claude Code runs inside it, pretty much where I spend the whole day.
Helium for browsing.
Skills
I built 9 plugins for Claude Code and open sourced them all at ramonclaudio/skills. Context kept vanishing between sessions. Commits took too many steps. No good way to audit a codebase or coordinate parallel agents. So I built the tools I wanted. /plugin marketplace add ramonclaudio/skills installs the whole set.
Honestly handoff is the one I’d keep if I could only keep one. Two hooks (SessionStart and PostCompact) auto-inject resume context. /handoff:end archives session state with build, test, and lint checks. I don’t lose anything between days or machines anymore.
qmd is my second brain for docs. It clones GitHub repos, indexes them with BM25 + vector + hybrid search, and exposes an MCP query tool so Claude checks the source before guessing. Convex, Expo, AI SDK, Better Auth, RevenueCat, Remotion, Ghostty, and the Claude Code docs all indexed locally. All on-device. The CLI is @tobilu/qmd. Node or Bun, SQLite for storage, GGUF models for embeddings. My plugin wraps it as an MCP server with 21 /qmd:* commands.
commit ships atomic conventional commits grouped by architectural layer. GPG-signed. A PreToolUse hook blocks force-push, --no-verify, and GPG bypass so I can’t accidentally ship a dirty commit. --push, --pr, and --merge PR# all work from one command.
polish, audit, and techdebt are my three code-quality sweeps. Polish scores every file 0-10 and refines anything 5+ with up to 5 parallel agents. Audit runs 4 agents in parallel for architecture, bugs, security, and convention compliance. Techdebt runs 3 agents for duplicated code, dead exports, unused deps, stale TODOs, and bloated files. Polish after a feature. Audit periodically. Techdebt at end-of-session.
teams orchestrates multiple Claude Code sessions in parallel with file ownership so they don’t clobber each other. When a task has two or three independent concerns (frontend plus backend, feature plus docs), I use this instead of going sequential. gif and frames are my ffmpeg wrappers. Gif does a two-pass palette for compressed GIFs from screen recordings. Frames extracts 3 to 15 frames from a video so Claude can analyze bug repros visually.
Stack
I’m full-stack TypeScript. Bun runs everything: runtime, package manager, test runner. I tried going back to Node once and it felt slow. I still use uv when I need Python, which is rare now but still happens.
Backend is Convex. Real-time, no infra to manage, and the DX is the best I’ve used. Better Auth for auth because I got tired of rolling my own. Zod for validation because I don’t trust anything that comes over the wire.
Desktop is Tauri with Rust. Small binaries, native webview, no Electron. Web is Astro for content sites (this one) and TanStack Start for apps.
Frontend is Tailwind v4 and shadcn/ui for styling. React and React Native for UI, Expo for mobile, TanStack for routing, state, and queries.
Linting is Oxlint and Oxfmt for TypeScript, Ruff for Python. Type checking with tsgo or tsc for TypeScript, ty for Python.
CLI Tools
I replaced most of the default Unix tools with faster Rust alternatives. Keyboard over mouse, terminal over GUI. If it’s written in Rust and saves me a keystroke I’ll probably try it.
yazi for file management, lazygit for git, delta for diffs, gh for GitHub, fzf for fuzzy finding. fnm for Node versions.
jq and yq for JSON and YAML, jless for viewing JSON.
bat instead of cat, fd instead of find, ripgrep instead of grep, eza instead of ls, zoxide instead of cd.
duf and dust for disk usage, btm for system monitoring, procs instead of ps, trash instead of rm.
hyperfine for benchmarking, git-filter-repo for history rewrites.
Coffee
V60 pour over most days, AeroPress when I want something different. Looking at getting an Orea. I follow the James Hoffmann technique. 1Zpresso ZP6 grinder, Fellow Stagg EKG Pro kettle, Third Wave Water with a dialed-in mineral formula. I drink it out of a KH Wurtz cup I picked up at La Cabra.
The rumors are true, the ZP6 gives you a cup that’s “too clean.” I just raise my dial to 6 and grind a bit coarser. I also had to stop using Cafec ABACA filters because the drawdown was too fast, so I’m back on Hario natural brown V60 filters. Open to suggestions.
I drink Nordic style ultralight roasts. Sey, Native, and Dak are the roasters I keep coming back to. Tim Wendelboe is the goat. Recently been into Promethium and their wild omni-roast blends. If the bag doesn’t have tasting notes that sound like fruit, I’m not buying it.
- Ray