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, but a normal mouse feels wrong to me now.
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. It’s fast and does what I want from an editor these days, mostly reviewing the code changes Claude Code or Codex made. Ghostty is my terminal, GPU-accelerated and native on macOS, with the config in a text file. I run zsh with a starship prompt, plus zsh-autosuggestions and zsh-syntax-highlighting. Most of my time now is in Claude Code, Codex, and GitHub.
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, and there was 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.
The three I reach for every day:
commit is the one I’d keep if I could only keep one. /commit --pr does the whole thing: atomic conventional commits grouped by architectural layer, GPG-signed, pushed, PR opened. A PreToolUse hook blocks force-push, --no-verify, and GPG bypass so I don’t accidentally ship something dirty. --push and --merge PR# work standalone.
teams runs multiple Claude Code sessions in parallel and gives each one its own 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.
qmd extends @tobilu/qmd into an MCP server with 21 /qmd:* commands wired up for both Claude Code and Codex. Clones GitHub repos, indexes them with BM25 + vector + hybrid search, and exposes a query tool so the model checks the source before guessing. Convex, Expo, AI SDK, Better Auth, RevenueCat, Remotion, Ghostty, and the Claude Code docs all indexed locally. SQLite for storage, GGUF models for embeddings. The point is to give Claude and Codex more real source to read on every task instead of having them guess.
Stack
I’m full-stack TypeScript. I default to Bun for runtime, package manager, and test runner. When Bun hits a bug or a library or platform doesn’t support it (not abnormal), I fall back to pnpm, then npm, and only yarn if I have to. uv for Python, which is rare these days.
Expo is the top of my stack. Every new project starts here, on canary, because the future is Expo across all platforms: iOS, Android, and web from one codebase.
For web-only work, TanStack Start on Convex, Better Auth, and shadcn/ui handles pretty much everything. Tailwind v4 for styling, TanStack for routing, state, and queries. Astro for static sites like this one.
Backend is Convex. Real-time, no infra to manage, and the DX is the best I’ve used. Better Auth via @convex-dev/better-auth because I got tired of rolling my own.
Desktop is Tauri with Rust. Small binaries and a native webview instead of Electron.
Linting is Oxlint and Oxfmt for TypeScript, Ruff for Python. Type checking with tsgo or tsc for TypeScript, ty for Python.
CLI Tools
I’ve replaced most of the default Unix tools with faster Rust alternatives. I’ll usually try the Rust version of a tool when I see one.
delta for diffs, gh for GitHub, fzf for fuzzy finding, tlrc for tldr pages. 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.
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 my favorite. Recently been into Promethium and their wild omni-roast blends. I tend to gravitate toward bags with fruit-leaning tasting notes.