The tools I actually reach for, on the machine I’m actually sitting in front of. Updated when the setup changes, not sooner. Inspired by uses.tech. For what I’m actively focused on this month, see /now/.
Machine
- Apple silicon Mac, macOS 15 Sequoia.
- Deliberately unopinionated about laptop skins, keyboard tenting, and monitor arm mounts. Whatever’s on the desk this month.
Editor
- Neovim with Yoda — my own modular distribution. Every piece under the hood (window management, logging, diagnostics, terminal, adapters) is its own installable plugin, so I use Yoda-as-a-whole here and Yoda-piece-by-piece in every other Neovim-adjacent project.
vim.packfor plugin management — the Neovim-native option. Nolazy.nvim, nopacker, no third-party loading wrapper.
Shell
zsh— default on macOS since Catalina, no reason to switch.- Homebrew for package management (Apple silicon prefix at
/opt/homebrew/). - GNU Stow for dotfile linking — the
~/.claude/configuration inocrosby/claude-configis a Stow package that symlinks its top-level items into$HOME/.claude/.
AI
- Claude Code as my primary CLI-based coding assistant. This site was built on it; every commit on
mainhas a Claude Code fingerprint somewhere in its authorship. - Personal configuration — agents, skills, rules, commands, hooks, output styles — lives in
ocrosby/claude-config. Stow makes it portable across machines.
Languages (day-to-day)
- Go — most of my open-source infrastructure work. See the Code Quality and Distributed Systems pillars for what that looks like in practice.
- Python — trading tools (Market Bridge, Strike Pilot) and the sports-data pipelines.
- Rust — reached for when the domain benefits from it. NASM Lint is the current example.
- Lua — the Neovim plugin surface. Idiomatic Lua, not “JavaScript in Lua clothing.”
- TypeScript + Next.js — the day job at The Weather Company.
- NASM x86 assembly — because it stays fun, and because building NASM Lint required understanding a language deeply enough to lint it.
This site
- Hugo (pinned to 0.160.1 in the
Dockerfileand CI). - PaperMod theme — kept as a submodule, never edited in place. All customizations live at the site root and shadow the theme’s copies. See
.claude/rules/theme-immutable.md. - Docker + nginx for local preview and the production image — one multi-stage
Dockerfileproduces the deployable artifact. - Fly.io for hosting — single-region (
iad), single machine, Anycast IP. - AWS Route 53 for DNS.
Release workflow
- Conventional Commits everywhere —
feat,fix,docs,chore,refactor,style,test,build,ci,perf. jedi-knights/go-semantic-releaseas the release tool. Everyfeatorfixmerge tomaincuts a new tag and a Fly deploy. Non-release types merge cleanly but the release workflow no-ops.jedi-knights/detect-semantic-releaseas the GitHub Action wrapper that exposesreleased/version/tagoutputs.
Version control & CI
- GitHub for hosting, PRs, and CI.
- GitHub Actions for the CI pipeline — Hugo build, lychee link check, markdownlint, and typos on every PR; semantic-release + Fly deploy on
main. - GitGuardian as the secrets scanner on PRs.
Everything else
- ImageMagick for the per-post OG image generator (
scripts/generate-og-images.py) — see the seo commit that shipped them. typosas the CI-parity spell check.lycheefor broken-link scanning against every rendered page.
What’s not here
Deliberate omissions. If the question is “what keyboard, what mouse, what desk, what headphones” — those change too often to be worth pinning down here. If the question is “what productivity/note-taking app,” I keep that separate: notes live in an Obsidian vault, tasks in the ambient stream of GitHub issues and TODO comments.