Developer Relations · Technical Content · Community

I build AI developer tools —
and the story around them.

Shipping Claudot, a Claude Code integration for the Godot engine, taught me the whole job: the MCP tools, the bridge daemon, the docs, the trailer, the brand.

Fifteen years of writing and producing before that — off-Broadway theater, then League of Legends content seen by hundreds of millions of players. Now I point all of it at helping developers get real work done with AI.

Featured

Selected work

BLANK the spire

C# · Python · Flask · Slay the Spire 2

Forge a playable Slay the Spire 2 character class from a single sentence. Three pieces working together: a data-driven C# mod runtime (Harmony + the community SDK) that turns a class defined as pure data into a real character, a multi-stage LLM generation pipeline that writes cards, relics, and mechanics, and a Flask site that ships it to players.

The interesting constraint: generated content has to be guaranteed playable. A published card/relic/status vocabulary bounds what the model may invent, and schema validation rejects anything the runtime can't execute.

  • C#
  • Harmony
  • Python
  • LLM pipeline
  • Schema validation
  • Flask

Holmes

Private

Python · spaCy · LLM orchestration

Point it at a pile of text, name a character, and get back a structured bundle for teaching an LLM to play them: dialogue pairs, memories, a voice profile, relationships, reputation, and chat-format JSONL ready for training.

Format-agnostic on both axes — PDF, DOCX, plain text, JSON going in, and novels, screenplays, historical documents as the kind of thing it reads. The design principle is the cost story: code reads everything; the model reads only what requires comprehension. Parsing, quote extraction, and vocabulary statistics are deterministic and free; the paid stage touches only the scenes the character appears in, once.

  • Python 3.11
  • spaCy
  • NLP
  • OCR
  • Training data
  • CLI

Private repo — happy to walk through the architecture.

Trainything

In progress

Human-in-the-loop tooling

Most teams know they need humans in their training and feedback loops. What stops them is the plumbing: wiring up review queues, collecting judgments in a usable shape, and getting that signal back into the model.

Trainything is the tool I want to exist for that — get humans into the loop as quickly and effectively as possible, so the bottleneck goes back to being the quality of the judgment rather than the cost of collecting it.

  • Evals
  • RLHF / feedback loops
  • Annotation UX

Early stage — in active development.

Background

I came to developer tooling the long way around. Before I was writing MCP servers I was writing scripts — for theater, then for video, then for games.

That turns out to matter more than I expected. The hard part of developer relations isn't the demo, it's the explanation: figuring out what a developer already knows, where they'll get stuck, and what order the ideas need to arrive in. I spent fifteen years learning that in front of live audiences and at League of Legends scale, and now I get to apply it to tools I also build.

These days I work in an agentic coding workflow of my own design, every day — which means I have hands-on, unsentimental opinions about where Claude Code shines and where developers actually get stuck.

Based in San Francisco. Organized a GDC meetup on AI in games.

  • 2024–now Story GamesCreative Director — generative AI practice, prompt-engineering standards, character LoRAs, ElevenLabs partnership
  • 2019–2024 Riot GamesWriter & Content Producer — League of Legends video seen by hundreds of millions; shipped Tellstones: King's Gambit
  • 2010–2019 The Puppet Shakespeare PlayersFounder & Creative Lead — nine-year off-Broadway run; Puppet Titus Andronicus was a New York Times Critics' Pick