01 / Work
What I build and run
Static hosting looks simple from the outside. The hard parts are issuing and renewing certificates at scale, handling DNS on domains you don't control, and making a deploy atomic so nobody ever loads half a site.
You upload a folder or a ZIP and get a live URL with SSL and a free domain. No build step, no pipeline to configure. I work across the stack that holds that up:
- Deploy pipeline and REST API
- Code editor and media library
- Desktop sync app for macOS and Windows
- GitHub Action for deploy-on-push
- MCP server, so AI agents publish and update sites directly
- static-form: turns an existing HTML form into a working endpoint with one attribute and no backend
- Teams and workspaces, webhooks, short links, password-protected pages, analytics
Sends push notifications from your scripts, cron jobs, and CI to your phone in under a second.
- REST API and webhooks
- Native iOS and Android apps
- Single-binary CLI
- Delivery tracking
A native Mac app for translating into 112 languages with whatever model you want behind it.
- Swap OpenAI for Claude, or a frontier model for a small fast one, mid-sentence and without a restart
- OpenRouter, OpenAI, Claude, a local Ollama, or any OpenAI-compatible endpoint
- One key per provider, stored in the Keychain. No account, no subscription
- Auto-detects the source, translates on ⌘↩ or as you type
- Logs prompt and completion tokens per translation, and what they cost
A userspace driver for the T300RS wheel on Apple Silicon. 16-bit steering, force feedback, 40 to 1080 degrees of range. Written because nothing else worked.
02 / Tools
Small utilities, free, no signup
Things I needed once and kept. They run entirely in the browser.
- Matrix Designer
- Draw a grid, get the array Pixel layouts for LED matrix displays. Toggle cells, pick a preset, copy a JS array straight into an Arduino or Raspberry Pi sketch.
- Color Picker
- RGB values that survive an LED panel 54 colors that stay readable on a Waveshare P2.5 64×32 and similar panels, with a live preview and 0x output.
- Grafana Calculator
- Units to raw values for alert thresholds Grafana wants bytes. You think in gigabytes. This converts between the two, plus percentages of a total, so a threshold lands where you meant it.
03 / Contact
Say hello
The form goes straight to my inbox. For anything work-related, LinkedIn works too.