Skip to main content

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 in sprout/assets/fonts/) — Bitstream Vera license, see sprout/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)

Source distribution for sprout-toolkit 0.1.1
File Size Uploaded
sprout_toolkit-0.1.1.tar.gz 251.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for sprout-toolkit 0.1.1
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

0.2.1

2 release files

0.2.0

2 release files

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page