Open Source

Projects I actively build and maintain in public.

I ship these under the MIT license because I use them myself daily, and I'd rather fix bugs in the open than maintain a private fork nobody else benefits from. All of them are under active development.

PDFStudio

The PDF toolkit Adobe doesn't want you to have

PDFStudio is a cross-platform PDF toolkit built on .NET 10 and Avalonia. It handles merging, splitting, redaction, digital signatures and fillable AcroForm generation through a native desktop app and a scriptable CLI that share the same underlying service layer, so anything you can do by hand you can also automate. There's also an author mode that compiles Markdown straight to a styled PDF, including Mermaid diagrams, via a headless Chromium rendering pipeline.

I started building it because Acrobat Pro charges a monthly subscription for operations that the PDF spec (ISO 32000, public since 2008) has documented for well over a decade. PDFStudio gives you the same capability for free: AES-128/256 encryption, PKCS#7 digital signatures with your own self-signed certs, form flattening, metadata editing, watermarking. MIT licensed, no account required.

C#, .NET 10, Avalonia UI, AvaloniaEdit, PdfSharp, PuppeteerSharp, Docnet.Core (PDFium), Markdig, YamlDotNet, SkiaSharp, Mermaid.js, xUnit, GitHub Actions

Agentic Memory

Long-term memory for AI coding agents

Every coding assistant I've used forgets everything the moment the session ends, so it re-reads and re-explains the same codebase to itself over and over, which wastes tokens and time. Agentic Memory fixes that by giving agents like Claude, Copilot and Cursor a memory that actually persists: a semantic search layer built on SBERT embeddings via ONNX Runtime, where recall strengthens with use and decays when it doesn't, backed by real compiler analysis instead of guesswork. It uses Roslyn for C# and the TypeScript compiler API for JS/TS, so it resolves actual symbols and dependency graphs rather than pattern-matching on text.

It also runs a local Phi-4-mini model, int4-quantized with a 128K context window, entirely on-device for code summaries and chat, so nothing about your codebase has to leave the machine. Everything is exposed through an MCP server, a REST API and a small React dashboard, so it drops into whatever toolchain you're already using.

C#, .NET 10, ASP.NET Core, LiteDB, ONNX Runtime, ONNX Runtime GenAI, Phi-4-mini, SBERT (all-MiniLM-L6-v2), Roslyn, TypeScript Compiler API, ClearScript, Model Context Protocol SDK, React 18, Vite, Tailwind CSS, xUnit

Windows Audio Recorder

Records whatever your PC is playing, no virtual cables

This one grabs system audio straight off the render endpoint using WASAPI loopback capture, an API Windows has shipped since Vista, instead of the usual workarounds: installing a virtual audio cable and rewiring your default playback device, digging through a "Stereo Mix" setting your driver probably doesn't expose, or opening a full DAW to save a two-minute clip. Nothing gets rerouted and your speakers keep working normally while it records. Live peak meters with a clip indicator, WAV output at 16-bit, 24-bit or 32-bit float, MP3 via LAME, global hotkeys, adjustable gain, and it follows the default output device if you switch it mid-recording.

I wrote it after getting tired of reconfiguring Windows audio routing just to save a short clip. A couple of details I cared about getting right: WASAPI stops sending packets entirely when the audio engine goes idle, so a naive recorder ends up with a file shorter than the clock, mine pads the gap with real silence instead. It also owns its capture device directly rather than relying on a cached handle that could get torn down mid-recording if something else disposes it. Buffer overruns drop samples instead of crashing the app, and the UI is laid out to survive 125%, 150% and 200% display scaling instead of clipping. Ships as a self-contained MSI or portable zip, no telemetry.

C#, .NET 10, WinForms, WASAPI (loopback capture), NAudio, NAudio.Lame, WiX v7, GitHub Actions