Stack
What I use, and why each thing earns its slot. Updated when something changes, not on a schedule.
Hardware
- MacBook Pro 14β³ (M3 Max), daily driver. Big enough for two Claude Code sessions and a dev server at once.
- Mac Mini in Singapore (M2), always-on. Runs the personal OpenClaw fleet and a couple of crons. Tailscale for remote access.
- iPhone, for testing mobile (most of our customers are WhatsApp-first) and Telegram, which is where most of my agents live.
AI as a daily collaborator
- Claude Opus 4.7, default model. I keep Claude Max paid, so the marginal cost of a heavyweight model on a small task is zero. See cost is a product feature for why I default like this personally but never for production agents.
- Claude Code, AI pair programmer. The site you are reading is mostly built with it. Audit of my own use: claude-code-audit. Tokens through Claude Code: /usage/.
- Claude Sonnet 4.6, production agent inference at Voltade. Right balance of latency, capability, cost for live customer conversations.
- Claude Haiku 4.5, cheap async work. Triage, summarisation, log-line classification.
- ChatGPT, occasional second opinion when I want a different prior.
Agent infrastructure
- OpenClaw, the harness I run my personal fleet on. Workspace-per-agent, persistent memory, multi-bot routing. Open source.
- Vobase, the app framework underneath Voltade. Bun + TypeScript + Drizzle, with an agent harness baked in. Self-learning loop covered in how Vobase agents learn.
- Telegram, primary surface for personal agents. Lawrence, Happy, and friends all run as Telegram bots.
- WhatsApp Cloud API, primary surface for Voltade customer agents.
- Postgres, every agentβs long-term memory. Drizzle for schema and queries.
- WIMAUT, my own agent observability dashboard. Built after a cron job silently burned $300.
Production stack at Voltade
- Bun, runtime. Fast, native test runner, ships TypeScript without a separate build step.
- Hono, HTTP framework. Typed RPC client end to end.
- Drizzle, ORM. The schema is the source of truth.
- TanStack Query on the frontend, never raw fetch. Realtime invalidation via pg_notify.
- shadcn/ui + Tailwind, frontend components. OKLCH colours.
- better-auth, authentication. Plugins for org + role management.
- Railway, deployment. Push to main, it ships.
- Bifrost, LLM gateway. Per-tenant virtual keys, no provider-key sprawl.
Dev workflow
- Cursor, IDE when I want a tighter inline loop than Claude Codeβs CLI.
- iTerm2 + zsh, terminal. Catppuccin Mocha theme.
- Git, version control. gh for everything GitHub.
- Vim keybindings, everywhere they will install.
- OrbStack for Docker, when needed.
PM toolkit
- Notion, specs, decision docs, weekly customer feedback log.
- Linear, task tracking when work crosses two people.
- Figma, lightweight prototyping. Most product decisions get sketched here before code.
- Loom, async walkthroughs and async customer demos.
Writing + this site
- Node.js, the entire server. Single file (
server.js), no framework, no build step. - marked, markdown to HTML.
- Typst, CV typesetting. Compiles
cv/cv.typto PDF. - Buttondown, newsletter. Posts with
newsletter: truein frontmatter go out automatically. - Umami, privacy-first analytics. No cookies.
Personal-agent ecosystem (macOS scripts)
- osascript, the bridge from agents to Apple Mail, Calendar, and Notes. Surprising how far this goes.
- icalBuddy, calendar reads. Cleaner output than scripting Calendar.app directly.
- memo, Apple Notes CLI.
- Mindbody API, gym booking source of truth for Lawrence.
See the full site-internals breakdown on the colophon. The named patterns I have converged on live on the frameworks page.