Projects

Most of my side work lives at the intersection of music production and developer tooling — building Model Context Protocol servers that let an LLM do useful work against real music libraries and DAWs.

drummer-library

A TypeScript MCP server that indexes roughly 35,900 Groove Monkee drum MIDI files and makes them searchable by musical intent rather than filename.

Grooves are classified into a Turso/libSQL database with the MIDI stored inline, and embedded into ChromaDB for semantic search — so a query like “driving half-time groove around 95 BPM” returns real candidates instead of a directory listing. It exposes tools for searching, filtering, and inspecting grooves, plus a set of composition-focused prompts that encode reasoning workflows: semantic search first, then structured filtering when confidence is low.

Indexed facets include tempo, feel, bar count, and the GM instruments actually present in each file, so results can be narrowed to what will fit a given song section.

Stack: TypeScript · MCP (stdio transport) · Turso/libSQL · ChromaDB · Python for the classification pipeline · vitest

songcraft

A Python MCP server for composing songs end to end — structure, harmony, lyrics, drums, and audio rendering — built on FastMCP.

Songs are modelled as validated Pydantic structures (parts, chord progressions, drum patterns) persisted as JSON, with music21 handling Roman numeral analysis, progression validation, and transposition. It consumes drummer-library upstream for groove search and assignment, and renders through Spotify’s Pedalboard for VST-hosted audio, exporting MIDI, WAV, and MP3 alongside stems and DAW-ready bundles.

The interesting constraint was inter-MCP composition: songcraft calls drummer-library and music21-mcp as upstream servers rather than reimplementing either.

Stack: Python · FastMCP · Pydantic · music21 · Pedalboard (VST3) · pytest · mypy strict

obs-toys

A collection of browser-source overlays for OBS, served from a single containerised Express app.

Each “toy” is its own endpoint the streaming software can point a browser source at — a VU meter with logo, lower thirds, a Spotify now-playing banner, animated socials, and live speech-to-text captioning running client-side via transformers.js. A Socket.IO layer pushes state to overlays in real time and speaks the OBS WebSocket protocol, with a controller page for toggling toys mid-stream.

Stack: TypeScript · Express · Socket.IO · React · Ractive · transformers.js · Docker · Kustomize

This site

Built with Hugo and a hand-rolled theme, bundled with webpack, and deployed to Cloudflare Pages.

Stack: Hugo · React · SCSS · webpack · Cloudflare Pages