I work primarily across .NET and the modern web, but I’m much more interested in solving problems than being defined by a particular stack. I enjoy moving between languages, ecosystems, and paradigms, absorbing the best ideas from each along the way.

An effectively infinite experiment

every-deck-of-cards

  • Solid
  • Web Workers
  • Arbitrary-precision math

Scroll through a trillion decks a second for a trillion trillion years, and you still wouldn’t put a dent in all the possible arrangements of 52 cards.

everydeckof.cards lets you browse all 80 unvigintillion of them—if you can find the time. A one-to-one mapping between arbitrary-precision integers and deck permutations lets you jump straight to any arrangement without generating the ones before it.

Making that impossibly large collection feel effortless is the real challenge. Hand-rolled virtualization renders only what’s on screen, Solid keeps those renders efficient, and a Web Worker handles the heavy math so scrolling never has to compete with computation.

Underneath are pure, testable domain functions and clear boundaries between the math and the interface. The whole application ships as a static bundle on Cloudflare’s global CDN, keeping hosting simple and inexpensive.

Bringing ideas across ecosystems

RazorScopedStyleElements

  • Blazor
  • MSBuild
  • NuGet

Finding a great idea in one ecosystem and bringing it to another.

RazorScopedStyleElements brings component-scoped <style> elements—familiar from frameworks like Astro, Svelte, and Vue—to .NET’s Blazor.

It’s distributed as a NuGet package and transforms components at build time, doing just enough work to hand the result off to the .NET SDK’s existing MSBuild scoped-CSS pipeline rather than reinventing it.

A little friendly competition

bzzr

  • React
  • RedwoodSDK
  • Cloudflare Durable Objects

A free, frictionless buzzer system for Jeopardy-style games.

bzzr supports real-time rooms of up to 60 players and is built with React, RedwoodSDK, Tailwind CSS, and Storybook. It’s deployed on Cloudflare, with Durable Objects coordinating real-time multiplayer state.

An agentic digital garden

AgentPlayground

  • .NET
  • PostgreSQL
  • AI agents

Part playground, part useful personal software, and an excuse to keep experimenting with what modern AI systems can actually do.

It started as a chat interface and has grown to include file uploads, speaker-aware voice transcription, web search, semantic-search RAG, real-time and scheduled tasks, push notifications through a mobile companion app, and role-based access control around tool execution with social login.

Underneath, it’s a distributed .NET application composed of three services on a private network, with asynchronous messaging, relational data, and vector search consolidated into PostgreSQL with automated backups.

No public deployment for this one—unless you ask really nicely. 😉