Projects

Things I built end to end because I needed them to exist. Each one started as a concrete problem that caught my curiosity and shipped past the demo stage.

Nihongo Sensei

A Japanese learning app with AI conversation practice, spaced repetition, and an immersion reader.

Problem. Most language apps stop at flashcards. I wanted something that combines vocabulary drill with real reading and conversation practice in one place.

Outcome. Shipped a full-stack React/TypeScript app with SM-2 spaced-repetition vocabulary, kana drills, progress tracking, and a client-side immersion reader (kuromoji.js tokenization + furigana). Released as a web app and packaged Electron desktop app.

React · TypeScript · Vite · Tailwind · Electron · kuromoji.js

LLM Judge Eval Harness

A portfolio evaluation harness for calibrating an AI judge with bootstrap confidence gating.

Problem. A single accuracy number can hide a lot of sampling uncertainty. I wanted a small, reproducible way to calibrate a quality threshold and refuse to declare success when the confidence interval is too wide.

Outcome. Built a stdlib-only Python harness with stratified splits, threshold calibration on development data, held-out precision with bootstrap CIs, and an intentional failing gate that shows why a promising point estimate is not enough.

Python · Evaluation · Bootstrap CIs · unittest

Webhook Lab

Capture, verify, retry, and replay HTTP webhooks with a delivery inspector UI.

Problem. Debugging webhook integrations is painful when signatures fail, retries disappear, and payloads are hard to re-run.

Outcome. Built a TypeScript tool with signature verification for GitHub and Stripe payloads, a delivery inspector UI, SQLite-backed job queue, and Docker packaging.

TypeScript · SQLite · Docker · Node.js

Baka-Tsuki LNReader Plugin

An LNReader plugin for Baka-Tsuki that uses the MediaWiki API instead of fragile page scraping.

Problem. Fan-translation wikis are awkward to read in a novel app when plugins scrape HTML that changes whenever the skin or layout moves.

Outcome. Contributed a Baka-Tsuki source plugin for LNReader: browse and search against the wiki API, recent-changes based latest updates, document-order chapter lists, and a public install repo for the plugin list.

TypeScript · MediaWiki API · LNReader

Anime Atlas

Similarity mapping from collaborative filtering on MyAnimeList rating co-occurrence.

Problem. I wanted a transparent way to see which titles sit near each other based on how people actually rate them, not marketing genres.

Outcome. Built a Python data pipeline from rating co-occurrence, documented the methodology in a design spec, and deployed an interactive visualization on GitHub Pages.

Python · Collaborative filtering · GitHub Pages