← Projects

UMA Companion

A game companion that grew from a support-card manager into a Rust and TypeScript desktop ecosystem, with an optimiser, local data, and live OCR tools.

Sunset 2025–2026 · Rust / TypeScript / SQLite / Python

Archived project site ↗

The problem

Choosing six support cards from a large catalogue in Uma Musume: Pretty Derby is a real optimisation problem. I wanted a tool that could work with my collection and make that decision explainable and repeatable.

How it evolved

The early Python application moved from CustomTkinter to PySide6. It proved the idea, exposed the awkward boundaries, and eventually led to a Rust core with a TypeScript/TSX interface.

The project expanded into collection and deck management, a 541+ card catalogue, track tools, community sharing, packaged desktop releases, and a web platform. Beam search drove the optimiser. OCR and live capture explored ways to bring game state into the tool without typing it all in by hand.

Where it ended

Active development ended in August 2026. Maintaining the application, changing game data, OCR, releases, and update infrastructure had become a substantial commitment. Official game improvements changed the value of the surrounding companion features, even though the optimiser remained distinct.

This is now a preserved case study. The linked project site and releases are historical; compatibility with later game updates is not promised.

What stayed useful

Separating catalogue data from user data. Treating OCR results as uncertain input. Making optimisation results explainable. Recognising when maintenance costs more than the remaining benefit.

The retrospective keeps the detailed story, including the rewrites and mistakes.

Project notebook