Skills
Grouped by domain rather than listed as forty badges. Every group links to the project that demonstrates it, because a claim without evidence is just a claim.
Frontend
I build interfaces where the hard part is state, not layout. Server rendering, data fetching and the accessibility details that separate a demo from something a real user depends on.
- React
- Component design and the rendering model, including SSR and hydration.
- TypeScript
- strict mode, no exceptions. Types as a design tool, not a lint pass.
- TanStack Router
- Type-safe routing, loaders, search params and SSR integration.
- TanStack Query
- Server state, caching and invalidation — the only client state layer I reach for.
- Tailwind CSS
- Design tokens in CSS variables, then utility classes over them.
- shadcn/ui
- Owning the component source rather than importing a black box.
- Accessibility
- Semantic HTML first, focus management, labels tied to inputs.
Backend
Services that stay up: bounded lifecycles, real error paths, and the discipline to write the awkward tests instead of the flattering ones.
- Go
- Goroutines, context cancellation, and HTTP servers that shut down cleanly.
- Node.js
- Server functions, streaming responses, deployment to an edge runtime.
- API design
- Idempotency, versioning, and errors a client can actually act on.
- JSON-RPC
- aria2's engine boundary — batching calls so one poll is one request.
- MCP
- Model Context Protocol servers in Go: tools, schemas, stdio and streamable HTTP.
- Testing
- Tests on the failure paths and on money, not on snapshot sprawl.
Infrastructure
Enough of the deployment story to reason about what runs where, and to keep the boundary between a platform and a framework machine-checked.
- Cloudflare Workers
- Edge runtime, Vite plugin, and what having no filesystem forces you to rethink.
- Vite
- Plugins, build-time globbing, and environment config.
- Git
- Submodules, lock files, and a sync script that rolls back on a red gate.
- CI
- Typecheck, lint and tests blocking a deploy.
- Observability
- Structured logs and the errors worth alerting on.
Systems and architecture
I care most about the seams: where one thing stops being able to depend on another, and how you make that boundary hold over time.
- Boundary design
- A platform seam enforced by a script, not by convention.
- Dependency isolation
- A framework pinned to a verified revision, with automatic rollback.
- Domain modelling
- Ubiquitous language written down before the UI exists, and kept honest.
- Decision records
- ADRs for the choice and the reasoning, not the task list.
- Pure functions
- Scheduling as `(rules, conditions, now, state) -> Effect` so it is testable.
Learning in public
I keep working notes on the things that surprised me. Most of what I know about a tool came from being wrong about it first.
- V
- Currently learning. Writing a desktop framework and an app on it.
- Writing
- Notes and essays, mostly about the edges of tools.