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. |
Showcase
Everything below is generated from JSON specs — same seed, same pixels, every time.
blob_walk — 8-frame walk cycle (specs/demo.json) |
particles/spark — one-shot animated burst (specs/particles.json) |
terrain + 47-variant autotile: island assembled from mask → frame lookups
(specs/autotile.json, canonicalMask in the generated index.ts).
props — 5 kinds × deterministic variants, each frame with an anchor point
(specs/props.json).
ui — button states, slider progress + knob, 9-patch panel (specs/ui.json).
font — bitmap font rasterized from the bundled TTF, with advance metrics for
text layout (specs/font.json).
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
# New here? 10-minute walkthrough: docs/starter-tutorial.md
# Fastest start: writes starter.json + generates its atlas
sprout init --out ./assets/starter
# 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,
across Python 3.10–3.13.
Publishing to PyPI is manual (.github/workflows/publish.yml, trusted
publishing via OIDC) — see CHANGELOG.
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.2.0
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.2.0.tar.gz | 254.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sprout_toolkit-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 496.9 kB
Release files / sprout_toolkit-0.2.0.tar.gz
| Download URL | sprout_toolkit-0.2.0.tar.gz |
|---|---|
| Size | 254.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d85c56ea5090070b31e7351c2b9e31e7801bebd21ecaccf0020698f42df107dd
|
|
BLAKE2b-256 checksum How to use checksums |
0785fd1f3d5a3b097494a9c00670e75aee038a5a836b217327c9075fb7244458
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logRelease files / sprout_toolkit-0.2.0-py3-none-any.whl
| Download URL | sprout_toolkit-0.2.0-py3-none-any.whl |
|---|---|
| Size | 242.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
361b488ce93b61e0dc296937afcdd0626ed976ab6a0c6c0c65ba02b1934c8f14
|
|
BLAKE2b-256 checksum How to use checksums |
2bb5320901f16c2d4f3de1217298ed89752d309501e87f469f529c6a1dcef889
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency log