Tallgrass
Go, on a Raspberry Pi 4 with RetroArch
The problem
I play Pokemon romhacks on a Raspberry Pi running RetroPie. Romhacks are hard: they have custom trainers, new encounters and rules that change from game to game, and the emulator tells you nothing about any of it.
I wanted a second screen: a full companion that updates as I play. My party with its levels, natures, stats, IVs, EVs and movesets; the route I'm on and which Pokemon I can meet there, by time of day; a log of my run for Nuzlockes. All of it on my phone, without leaving the game.
What I chose
A small web server on the Pi
A Go agent runs next to the emulator, reads the game's memory and save data as it plays, and serves a small web app from the Pi. Anyone on my local wifi opens it on a phone or laptop and sees the game live, with nothing to install on their device. I chose Go because it builds to a single binary that is easy to put on a Pi, and because I wanted to learn it properly by building something real.
Games as JSON profiles
Each supported game is a profile of memory addresses and table locations, not code. Adding a game doesn't need a rebuild, and anyone can try a profile by dropping a file in a folder. I made the profiles CC0 and the code GPL v3, so the community can build on both.
No game data, ever
Tallgrass never ships anything from the games. Everything it shows is read from the player's own copy. That keeps it a fan tool and keeps it safe to share.
One-line install, self-updating
If someone has to fight with setup, they won't use it. A single install command sets it up on the Pi, and it keeps itself up to date, so I could ship fixes without anyone redoing anything.
The result
Tallgrass works with Pokemon Radical Red and Unbound on RetroArch (mGBA), and HeartGold Generations on DraStic, on a Raspberry Pi 4 or a Linux PC. There is also a separate docs site for each game, generated from the game itself so it can't drift from what the game actually does.
It's the project where I learned the most about reading binary data, and about shipping something other people can install.