PUBLIC WORK
Open Source
Tools and libraries built to fill real gaps. A few have found real adoption; all were built because I needed them.
BifrostMCP
A VS Code extension that acts as an MCP server, exposing language server features directly to AI tools. Go-to-definition, find-all-references, call hierarchies, rename-symbol, and more — accessible to Claude, Cursor, and any MCP-compatible tool. AI tools can ask VS Code exactly where a symbol is defined instead of guessing.
AI coding tools work by reading text files and making guesses about code structure. VS Code already knows all of this precisely. This bridges that gap.
Generate a complete, organized C# API client project from a Postman collection. Interfaces, concrete implementations, all request/response types, zero external dependencies. Runs entirely in the browser — no data leaves your machine. Configurable serializer, nullability, error handling, retry logic, and more.
Writing C# API clients by hand from a Postman collection is tedious and error-prone. I needed this and could not find a free tool that did it well.
NanoGPT .NET
A C# port of Andrej Karpathy's nanoGPT. Full attention paper architecture, trained on Shakespeare's complete works. Built to understand transformers from the inside — implementing it yourself is a different kind of understanding than reading about it.
The best way to understand how attention and transformers actually work is to implement one from scratch. Karpathy's nanoGPT is the cleanest reference; porting it to C# forced every detail.
EasyCsv-Dotnet
A library to make reading, writing, and manipulating CSVs easier in C#, built on top of CsvHelper. Reduces boilerplate for common CSV operations.
CsvHelper is excellent but verbose for simple operations. This wraps it with a cleaner API for the 80% case.
OneOf.TypeExtensions
A source generator for the OneOf discriminated union library. Generates extension methods so you can write IsInt() and AsString() instead of IsT0() and AsT1(). Small ergonomic improvement that makes OneOf significantly more readable in practice.
IsT0() and IsT1() are unreadable at callsites. Type-named methods cost nothing at runtime and make code much clearer.