Work

Everything I’ve built

Client and research work first, then the apps, tools, and games I’ve made along the way.

Client and research work

Paid work and research collaborations.

Case study · Music research

Melody Search Index (Live site) (Backend on GitHub)

Full-stack melody-similarity search, with OCR and RAG, over 10k+ records for music researchers worldwide.

Elasticsearch · Java · TypeScript · Python · OCR · RAG

Read the case study

Search · Live

FMC Research Assistant (Live site)

Search over 4,033 documents of 19th-century French music press, by keywords or by semantic meaning, running entirely on local GPUs.

Semantic search · PostgreSQL · Embeddings · Reranking · Local GPUs

Read the case study

LLM evaluation · Talk, Dec 2026

AI vs. human sentiment analysis

An LLM pipeline that codes newspaper coverage the way trained research assistants do, and measures how closely it matches them.

LLMs · Classification · Evaluation · Python

Read the case study

Mobile · In progress

Yellowstone field guide app

An offline Android field guide, built from a 40-page microbiology guidebook, that tells you what's alive in the water you're standing over.

Android · Java · Offline-first · Automated testing

Read the case study

Auto-cropper

Cropped 7k+ images automatically: 25× faster, with 96% less manual editing for a team of five.

Computer vision · OpenCV · Java

Biosignal research

EEG and heart-rate features, built with FFT and statistical modeling, that separate state anxiety from trait anxiety.

Signal processing · Statistics · Python

AI and data

Models, embeddings, data, and signals, for research and for my own use and curiosity.

  • Vector embeddings and RAG

    Vector embeddings, hybrid search, reranking, and RAG over research collections, from the FMC Research Assistant to my Venice talk, “A Cohesive Look at RAG for Research.”

    Vector embeddings · RAG · Semantic search · Reranking · bge-m3

  • Local transcription

    Private audio and video transcription with faster-whisper on two local GPUs, with no cloud and no uploads.

    Speech-to-text · GPUs · Python

  • AI text extractor

    A command-line tool for extracting text with AI.

    CLI · LLMs

  • Episodic storytelling analyses

    The rules of storytelling in shows like Avatar, Buffy, Death Note, and Rick and Morty.

    Storytelling · Python

  • Holiday party planner

    Ask it for a party and AI plans one around an obscure holiday or anniversary. It draws on 19 holiday scrapers, with an email digest and a phone app for plans and invites.

    LLMs · React Native · Expo · Python · Scraping

Web and mobile

Apps for the web and for Android.

  • Apartment and rent portal

    A web portal for apartments and rent.

    Web · Java · JavaScript

  • Tweeter (GitHub)

    A Twitter clone in TypeScript.

    TypeScript · Web

  • Assassin

    An Android game with a Java server and an automated test rig.

    Android · Java · Testing

  • Bank scorekeeper

    An Android scorekeeper for the dice game Bank, plus a Python simulator that pits banking strategies against each other.

    Android · Kotlin · Python · Simulation

  • Hack Tank

    An app for focus and routines, with work cycles, check-ins, and a searchable library of 423 tips distilled from neuroscience research.

    React Native · Expo · SQLite · Semantic search

  • Family Map

    An Android app that maps family-history events, with its own server.

    Android · Java

  • GeoQuiz

    An Android quiz app.

    Android · Java

  • Animal game

    A mobile game with a Kotlin backend.

    Mobile · Kotlin

Tools and games

Command-line tools, solvers, games, and mods.

  • Toki pona parser

    A grammar and syntax tree for a minimalist language.

    Parsing · Python · Linguistics

  • Roommate assigner

    Integer linear programming that matches roommates from survey answers.

    Optimization · Python

  • Campfire

    A storytelling horror game in Godot.

    Godot · Game design

  • West Marches Discord bot

    A Discord bot for a 100-player D&D campaign. A query language I wrote (tokenizer, parser, AST) searches the world's notes, first through the Notion API, now through Obsidian, with role-gated edits and a weather simulator.

    Python · Discord · Query language · ASTs · Notion API · Obsidian · Access control

  • Wii Tanks editor

    A decompiler, graphical editor, and recompiler for Wii Play's Tanks. Edit enemy values, hero tank values, level tank configuration, and level block placements.

    Modding · Python

  • Ultimate tic-tac-toe

    A modular, well-tested Python implementation of ultimate tic-tac-toe.

    Python · Testing · Game

  • Real-time chess

    Multiplayer chess, played in real time from the command line.

    CLI · Networking

  • MUD

    A text-based multiplayer world for the terminal.

    CLI · Game design

  • Personal Anki

    Spaced-repetition flashcards for the terminal.

    CLI · Python