Staff TypeScript engineer. Outside work I build open source developer tools, games and plugins for TRMNL e-ink displays, and Grand Prix Picks, an F1 prediction game.
An F1 prediction game. Pick the top 5 for every session and call the teammate head-to-heads, then compete in private leagues all season. Web, iOS and Android, built with TanStack Start, Expo, Convex and Clerk.
A multiplayer office RPG that plays itself on your TRMNL e-ink display. Every 15 minutes your hero explores, finds gear, survives mishaps and climbs a global leaderboard. A companion site handles the occasional decision.
Report writing for neuropsychologists. It helps clinicians produce clear, accurate and consistent clinical reports in less time, so they can spend more of it with their clients.
| Plugin | What it does |
|---|---|
| Formula 1 Race Weekend | The current F1 weekend on your desk: sessions, weather, grid and results. Powered by Grand Prix Picks. |
| Daily Bread | A daily Bible verse in English, French or Spanish, grouped by theme. |
| Obsidian TRMNL Screens | An Obsidian plugin that pushes your vault to TRMNL: today's tasks, due tasks, Dataview queries, writing stats and more. |
More in the trmnl-plugins repo.
| Project | What it does | npm |
|---|---|---|
| MSW Panel | Framework-agnostic devtools for Mock Service Worker. Shows the handlers on your worker or server and lets you toggle them on and off. |
|
| convex-inspect | A development panel for Convex apps. | |
| Patch Pulse | Notifies you when your npm dependencies ship new versions, via a CLI, a VS Code extension, a Slack bot or a Discord bot. | |
| supabase-react-query-codegen | Generates typed TanStack Query hooks from your Supabase schema. | |
| investec-openapi | A TypeScript wrapper for Investec's programmable banking API. |
- Flint: a fast, friendly hybrid linter for JavaScript and TypeScript. I'm on the committer team, working on rule fixes, rule data and the end-to-end test setup. (my PRs)
- trmnlp: TRMNL's official local dev server and linter for plugins. I added a set of lint rules (Framework classes, screen prefixes, filters, webhook fields and more), source locations with JSON output, and update notices. (my PRs)
- Elsewhere: smaller fixes to T3 Code, eslint-plugin-expect-type, DefinitelyTyped, Nx and others. (all merged PRs)






