A linear programming web tool for Ale Abbey that optimizes ingredient blends to target brewing virtues across flavor, color, strength, and foam.
When Ale Abbey - Monastery Brewery Tycoon launched on Steam, I immediately wanted to build an automated helper to bypass its trial-and-error mechanics. The primary hurdle in the game is finding the precise blend of ingredients to satisfy tight numerical bounds across four key traits: flavor, color, strength, and foam.
Instead of dealing with manual in-game guesswork, I saw a clear Operations Research optimization problem. I initialized a modern TypeScript codebase to translate the game's underlying brewing values into a strict linear programming system capable of calculating flawless ingredient permutations on demand.
The engine is built on TypeScript and React, with Vite for fast modern bundling. To compute the math constraints, I integrated javascript-lp-solver directly into the core execution flow.
The engine translates the target beer virtue boundaries (Bad, Neutral, Good) into algebraic constraints and treats ingredient values as integer variables. Users configure the system through a step-by-step wizard interface styled with Tailwind CSS, allowing them to optimize for multiple objectives like lowest total cost or fewest distinct ingredients. The underlying data structures, constraints, and solver configurations are isolated and fully verified using Jest.
This project was a fantastic exercise in translating arbitrary video game mechanics into structured software constraints. I never actually finished playing the game or entirely finalizing the application, but it reminded me how rewarding it is to build practical developer tools out of raw engineering curiosity.
I learned how to integrate an external linear programming library into a typed React component lifecycle, map complex real-time user selections into an objective mathematical matrix, and maintain a strict test-driven workflow using Jest. It proved that a project doesn't need to be complete to be an excellent playground for sharpening domain-modeling and optimization skills.