Crafting games are a small obsession in our house. My son discovered Neal Agarwal's Infinite Craft a year ago, showed it to me, and we've been combining elements together ever since. It's still one of our favorite games.
Daily Alchemy is our take on the genre — same DNA as the crafting games we love, but with a few things we kept wishing for ourselves: a co-op mode for playing together without fighting over the same screen, Wordle-style daily puzzles with a shared target and a shareable result, and a recipe book built right into the app so you can revisit everything you've discovered without leaving the game.
The front end is Next.js 14 with React, Tailwind, and Framer Motion. Game state lives in Zustand. Accounts, discoveries, and leaderboards persist in a Postgres database.
When you combine two elements, the result is generated by Meta's Llama 4 Maverick. But most of the time, you don't actually hit the model. The first time anyone in the world combines a particular pair, the result gets written to two places — a Redis cache for fast reads, and Postgres for the long term. Every later request for that pair resolves in milliseconds against the cache. It's also what powers the first-discovery leaderboard: only combinations no one has produced before count for credit.
A few smaller touches that make the system feel right:
Fire + Water and water + FIRE are the same combination.Every name the model returns passes through two filters before it reaches the screen: a slur filter that catches racial and other identity-based slurs, and a separate filter for content that sexualizes or endangers children. If a result trips either filter, the combination is rejected and you'll be asked to try something different.
We don't filter much beyond that. Crafting games naturally surface oddball, weird, and occasionally crude combinations, and over-filtering tends to feel arbitrary. The filters are scoped to the things that should never make it through, period.
This is built and maintained as a side project, not a business. If you find a bug, have a feature idea, or just want to share a wild combination, the contact link in the footer goes straight to my inbox.