Projects

I build projects to answer a question, remove some friction, or learn a system by making one. They are usually small enough to finish and deep enough to force real decisions. I try to take them past the first demo, into something that can be used, inspected, or learned from.

The evaluation work sits at the center of what I want to keep doing: how to tell whether an AI system is actually good enough to trust, not just whether it can produce an impressive example. LLM Judge Eval Harness is the public project that makes that approach concrete.

A reproducible evaluation harness for deciding whether an AI judge is reliable enough to use.

Problem. An AI judge can produce a clean-looking score while the sample is too noisy to support a decision. I wanted a way to calibrate a quality threshold on development data, measure it on held-out data, and refuse to call the result good when uncertainty is still too wide.

Outcome. Built a stdlib-only Python harness with stratified splits, threshold calibration, held-out precision, bootstrap confidence intervals, and an intentional failing gate. The point is not just to produce a score; it is to make the decision boundary visible and know when the score is not enough.

Python · Evaluation · Bootstrap CIs · unittest

A Japanese learning app built around the part most flashcard apps leave out: using the language in context.

Problem. Flashcards are useful, but they do not make reading or conversation feel connected. I wanted one place to practice vocabulary, read real text, and use AI conversation without losing the structure that makes repetition work.

Outcome. Built and shipped a full-stack React/TypeScript app with SM-2 spaced repetition, kana drills, progress tracking, AI conversation practice, and a client-side immersion reader using kuromoji.js for tokenization and furigana. Packaged it as both a web app and an Electron desktop app.

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

A small operations tool for making HTTP webhook delivery easier to inspect and repeat.

Problem. When a webhook fails, the useful information is split across signatures, retry behavior, payloads, and logs. I wanted one place to see what happened and safely try it again.

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

TypeScript · SQLite · Docker · Node.js

An LNReader plugin that treats Baka-Tsuki as a wiki instead of scraping whatever HTML it happens to render.

Problem. HTML scraping makes a reader plugin fragile: a skin or layout change can break the source even though the underlying content is still there. I wanted the plugin to use the MediaWiki API directly.

Outcome. Contributed browse and search through the wiki API, recent-changes based updates, document-order chapter lists, and a public install repository for LNReader's plugin list.

TypeScript · MediaWiki API · LNReader

An interactive map of anime similarity built from rating behavior rather than genre labels.

Problem. Genre tags are useful for browsing, but they do not always capture which shows feel similar to viewers. I wanted a transparent way to see which titles cluster together based on rating co-occurrence.

Outcome. Built a Python pipeline from MyAnimeList rating co-occurrence, documented the methodology in a design spec, and deployed the resulting visualization to GitHub Pages.

Python · Collaborative filtering · GitHub Pages