A terminal alchemy crafting game with a 755-element recipe book, and pixel-art sprites.
- What is Alchemy?
- Quick start
- User guide
- How the screen works
- How to play
- Tutorial: make Steam
- Responsive layouts
- Maintain the project
- Release checklist
Alchemy games are discovery puzzles. You start with a tiny set of elements, combine two at a time, and unlock new ingredients when the pair has a recipe.
tui-alchemy starts with the four classical elements:
| Starter | Use it to discover |
|---|---|
Air |
weather, motion, atmosphere, pressure |
Earth |
minerals, terrain, tools, life chains |
Fire |
heat, energy, lava, steam, metal chains |
Water |
mud, steam, oceans, life, weather chains |
The core rule is always:
ingredient + ingredient = result
Early examples:
Water + Fire = Steam
Water + Earth = Mud
Earth + Fire = Lava
Air + Earth = Dust
Air + Fire = Energy
Every discovery is added to the atlas immediately, so the puzzle expands from four starters into a 755-element catalog.
Install the latest release:
curl -fsSL https://i.tui-alchemy.sh | shThe installer uses prebuilt binaries first, so Rust, Cargo, Python, Git, and a compiler toolchain are not required. It checks for small runtime tools such as tar plus curl or wget; when one is missing, it asks before installing it with the available package manager. If you already have Cargo, the published package is also available with cargo install tui-alchemy --locked; see docs/install.md.
Then run:
tui-alchemyCommand-line help and package metadata:
tui-alchemy --help
tui-alchemy --versionFor local development from this repository:
cargo runPress q to quit.
The player-facing README lives at docs/README.md. It includes the minimal in-game menu, the controls submenu, reset flow, and screenshot tables for the main play loop and responsive layouts.
Use it as a three-step loop: select an element → select a second element → get a result.
The left rail tracks progress, the center atlas holds discovered ingredients, and the right workbench resolves ingredient + ingredient = result.
- Move through the atlas.
- Select the first ingredient.
- Select the second ingredient.
- Watch the recipe table resolve the pair.
- Use the newly discovered result as another ingredient.
| Key | Action |
|---|---|
Arrow keys |
Move through the atlas |
h, j, k, l |
Vim-style atlas movement |
Enter |
Select the highlighted element |
1-9 |
Select a visible atlas slot directly |
PageUp, PageDown |
Move atlas pages |
[, ] |
Move atlas pages |
Home, End |
Jump to the first or last visible discovery |
Esc, c |
Clear the current selection |
m |
Open the game menu; use controls for key help or reset game to restart discoveries |
q |
Quit |
- Click or drag an atlas card.
- Drop it into the first or second recipe-table slot.
- Drop a second ingredient into the remaining slot.
- If the pair is a recipe, the result appears and joins the atlas.
Start from a fresh game:
- Select
Water. - Select
Fire. - The workbench resolves
Water + Fire = Steam. Steamappears in the result slot.Steamis added to the atlas and can be used in later recipes.
After Steam, keep branching through low-level recipes:
Water + Earth = Mud
Earth + Fire = Lava
Air + Earth = Dust
Air + Fire = Energy
Water + Water = Puddle
Earth + Earth = Land
If a pair does nothing, keep experimenting. Some elements become useful only after you discover deeper ingredients.
The UI is designed to remain playable across narrow, short, wide, and tall terminal sizes. The release screenshots in docs/screenshots/ are deterministic visual QA fixtures.
| Narrow terminal | Large terminal |
|---|---|
![]() |
![]() |
Additional layout captures:
src/ Rust application, renderer, layout, catalog, and sprite code
assets/pixel-sprites/ Runtime pixel-art sprite atlas and manifest
data/little_alchemy.json
Canonical 755-element recipe catalog
docs/screenshots/ Curated screenshots used by this README and release notes
scripts/ Screenshot, website build, installer, and Cloudflare deployment scripts
tests/ Gameplay, layout, rendering, and regression tests
website/ Standalone site source for tui-alchemy.sh
Use the narrowest check that covers your change, then run the complete release lane before publishing.
cargo test
cargo ci-clippyRuntime sprites are checked in under assets/pixel-sprites/. Treat them as release assets unless a dedicated sprite workflow is added back to the project.
Run this after UI, layout, theme, sprite-fit, visual-effect, or renderer changes:
scripts/update-readme-screenshots.shThe script renders fresh README images into docs/screenshots/ and refreshes the marked screenshot sections in this file.
The standalone site lives in website/. Build the Cloudflare Pages output locally with:
scripts/build-website.sh
node scripts/test-website.mjsThe install button copies:
curl -fsSL https://i.tui-alchemy.sh | shFor Cloudflare Pages, custom domains, R2 provisioning, and one-time DNS setup, copy .env.example to .env, fill the tokens, then run:
scripts/deploy-website.sh
node scripts/configure-cloudflare-dns.mjsPushes to master run the same website build and deploy path through .github/workflows/deploy-website.yml.
Before a release, verify crate metadata and included files:
cargo package --list
cargo package- Update
versioninCargo.toml. - Add a matching entry to
CHANGELOG.md. - Regenerate README screenshots with
scripts/update-readme-screenshots.sh. - Build and test the website with
scripts/build-website.shandnode scripts/test-website.mjs. - Review the updated images in
docs/screenshots/. - Run
cargo test. - Run
cargo ci-clippy. - Run
cargo package. - Commit the release changes.
- Tag the release commit, push it, and create the GitHub release from
docs/release-v0.2.0.md.
MIT. See LICENSE.





