sprout-toolkit
SPROUT — Skia Procedural Rendering & Optimization Unified Toolkit
Grow your 2D assets procedurally.
Sprout is an open-source toolkit for deterministic procedural 2D asset generation
targeting Expo + react-native-skia.
It generates atlases, tilemaps, autotiles, bitmap fonts and SkSL shaders from JSON specs.
Architecture
sprout/
├── sprout/ # Python package
│ ├── __init__.py # __version__
│ ├── cli.py # CLI (Typer): generate, batch, watch, info, lint, diff, validate
│ ├── exporter.py # Spritesheet packing, manifest.json, index.ts
│ ├── spec.py # Load/validate JSON specs (schema v0)
│ ├── autotile.py # 8-bit masks, 16/47 lookup
│ ├── sksl.py # Runtime SkSL shaders (FBM value-noise)
│ ├── assets/fonts/ # Bundled font (ships in the wheel)
│ └── generators/ # Generation plugins
│ ├── base.py # FrameData + Generator (contract)
│ ├── terrain.py # Seamless tiles + autotile
│ ├── props.py # Static objects (5 kinds, anchor points)
│ ├── particles.py # Animated bursts with easing
│ ├── ui.py # Button, slider, 9-patch panel
│ ├── font.py # Bitmap font from TTF (one glyph per frame)
│ └── blob_walk.py # 8-frame walk cycle
├── specs/ # Example specs (one per generator)
├── tests/ # 142 tests (determinism, autotile, SkSL, generators, CLI)
├── LICENSE # MIT
└── pyproject.toml
Features
| Feature | Description |
|---|---|
| Deterministic procgen | Numeric seeds → reproducible assets (testable in CI). |
| 8-bit auto-tile | 8-bit autotile mask (N/E/S/W + diagonals), 16 or 47 variants. |
| Bitmap fonts from TTF | Glyph atlas with advance metrics, ready for text layout. |
| Runtime SkSL shaders | Generated Skia shaders (FBM value-noise, tileable), no bundle weight added. |
| Spec introspection | sprout info/sprout lint/sprout diff to inspect, validate quality, and compare builds. |
| Flexible export | PNG8/PNG24, TexturePacker format, atlas mipmaps — all opt-in. |
Installation
pip install sprout-toolkit
# or for development:
git clone https://github.com/Tzinny-dev/sprout-toolkit
cd sprout-toolkit
python -m venv .venv && source .venv/bin/activate
pip install -e ".[test]"
The installed command is sprout (not sprout-toolkit — that's just the PyPI distribution name).
Quick start
Generate assets
# Generate every asset defined under specs/
sprout batch specs/ --out ./out
# Generate a specific spec
sprout generate specs/demo.json --out ./out
# Watch mode: regenerates when files under specs/ change (Ctrl-C to exit)
sprout watch specs/ --out ./out --interval 1.0
# Inspect a spec (human report or JSON)
sprout info specs/particles.json
sprout info --json specs/particles.json
# Analyze spec quality: atlas padding + empty frames
sprout lint specs/ui.json
sprout lint --json specs/ui.json
# Generate a bitmap font atlas (printable ASCII, bundled font)
sprout generate specs/font.json --out ./out
# Compare two specs, or two already-generated output directories
sprout diff specs/props.json specs/ui.json
sprout diff --json ./out/a ./out/b
# Validate a spec
sprout validate specs/demo.json
Export options (generate / batch)
# PNG8 (indexed palette, lighter atlas) or PNG24 (no alpha)
sprout generate specs/ui.json --png-mode png8
sprout generate specs/autotile.json --png-mode png24 # only if the atlas has no transparency
# In addition to manifest.json, emit <name>.tpsheet.json (TexturePacker JSON Hash format)
sprout generate specs/props.json --texturepacker
# Chain of atlas mip levels (@0.5x, @0.25x, @0.125x by default)
sprout generate specs/particles.json --mipmaps
sprout generate specs/particles.json --mipmaps --mipmap-levels 2
--png-mode defaults to rgba (no change). png8 quantizes to 256 colors
while preserving the alpha channel (ideal for pixel-art-style limited
palettes); png24 drops alpha entirely — only use it on atlases with no
real transparency (e.g. terrain). --texturepacker/--mipmaps are
opt-in and don't affect manifest.json/index.ts, except that --mipmaps
adds the mipmaps.levels block to the manifest.
Available generators
generator |
Description | Params |
|---|---|---|
terrain |
Seamless noise tiles + 16/47 autotile | contrast, lift, cells, octaves, bevel, autotile |
blob_walk |
8-frame walk cycle (hero blob) | colors (body, outline, belly, ...) |
props |
Static objects: rock, bush, chest, mushroom, flower — each frame includes an anchor point (frames[].anchor in the manifest, computed from the real alpha bbox) |
kind, fill, outline |
particles |
Animated bursts: spark, smoke, dust, bubble |
kind, particles, core, trail |
ui |
Interface: button (normal/hover/pressed states), slider (progress + knob), panel (9-patch, frames=9) |
kind, fill, outline, accent |
font |
Bitmap font from TTF, one glyph per frame (frames = len(chars)) |
chars, font_path, size, fill |
Example spec using props:
{
"name": "props_atlas",
"seed": 2024,
"layout": { "framePx": 64, "cols": 6, "tileLogical": 32, "sample": "nearest" },
"items": [
{ "id": "rock", "generator": "props", "frames": 6, "params": { "kind": "rock" } },
{ "id": "chest", "generator": "props", "frames": 4, "params": { "kind": "chest", "fill": [160, 110, 50] } }
]
}
Development
pip install -e ".[test]"
pytest -q
CI (.github/workflows/tests.yml) runs the full suite on every push/PR.
Credits
typer+Pillow— CLI and image generation- DejaVu Fonts (
DejaVuSansMono-Bold.ttf, bundled insprout/assets/fonts/) — Bitstream Vera license, seesprout/assets/fonts/DejaVuSansMono-Bold.LICENSE.txt
License
MIT — see LICENSE.
Release files for sprout-toolkit 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sprout_toolkit-0.1.1.tar.gz | 251.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sprout_toolkit-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 493.2 kB
Release files / sprout_toolkit-0.1.1.tar.gz
| Download URL | sprout_toolkit-0.1.1.tar.gz |
|---|---|
| Size | 251.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
45a0191b80b294f1651c5cc767b05e25e160d93dde012b9fc4ef23562ca76a90
|
|
BLAKE2b-256 checksum How to use checksums |
b68bd873ec1ad409546e6af70a22aa78d0543c3756a7fa4ae6b474aa0330eb28
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / sprout_toolkit-0.1.1-py3-none-any.whl
| Download URL | sprout_toolkit-0.1.1-py3-none-any.whl |
|---|---|
| Size | 241.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
414dd7e9fe606557f33d3bbfa3f0cfc82583515312158bf094227e6a6e381943
|
|
BLAKE2b-256 checksum How to use checksums |
8a7080dae1ef306f7d30dc2135b8933e2e57ecef89e4251d18763fd809710a18
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|