Get started

Download the toolchain, write a prop in a few lines of .ips and render it from any seed.

Infinite Props is a portable binary format and toolchain for seed-based procedural 2D assets. You author an asset in the .ips language, compile it to a self-contained .iprop binary, and any backend renders it deterministically from a seed and declared input values.

Download the SDK

Tagged releases ship SDKs with command-line tools (bin/), the C header and libraries (include/, lib/) and documentation/examples (share/iprop/). Choose a published version and its checksums on the releases page.

This documentation describes product 0.7.1. Build the current source using Source to use the current format and the features in this handbook. Earlier SDKs follow their own tagged documentation.

The tools

toolwhat it does
ipccompile .ips → .iprop
ipgenrender a .iprop to a PNG and print the result JSON (outputs and fuel)
ipsheetrender a consecutive seed grid
ipdisdisassemble a binary, optionally with source lines
ipvalvalidate a binary
ipaassemble .ipa → .iprop

Every tool prints its exact options with -h / --help.

Your first asset

Write rock.ips:

asset rock {
  size 64x64
  origin 32,56
  input  color tint = #808d74
  output rect  collider

  draw {
    w = 20 to 30
    h = 14 to 24
    rect(32 - w / 2, 56 - h, w, h, tint)
    rect(32 - w / 2, 56 - h, w, 3, color.shade(tint, 3))
    if (index(3) == 0) {
      rect(32 + w / 2 - 6, 56 - h - 4, 8, 6, color.shade(tint, -4))
    }
    collider = {32 - w / 2, 56 - h, w, h}
  }
}

Compile it, then render a seed:

ipc rock.ips -o rock.iprop
ipgen rock.iprop --seed 7 -o rock.png

ipgen writes the image and prints the result: the structured outputs your game reads next to the pixels, and the fuel the run spent.

"fuel": {"budget": 5000000, "spent": 868},
"outputs": [
  {"name": "collider", "kind": "rect", "list": false,
   "values": [{"x": 18, "y": 36, "w": 28, "h": 20}]}
]

The same seed always renders the same pixels, on every platform and backend. The compiler writes stripped, packed production files by default; add --debug for source maps and symbols or --no-compress for an expanded file to inspect.

Seeds and declared inputs

The seed initializes the root random stream. Authors declare any controls they need with input, including colors, dimensions or selection indices. Hosts can override these values by name; omitted inputs keep their defaults. There are no implicit variant/archetype controls. v and a are ordinary names.

The editor

The VS Code extension (editor/ in the repository) adds syntax highlighting, inline compiler diagnostics, a live preview with seed controls, an atlas browser, a bytecode inspector and one-click exports:

cd editor
sh install.sh

Reload VS Code and open any .ips file. The integrated terminal doubles as a console for coding agents: they edit the sources and the extension recompiles.

Next steps