Skip to main content

Declarative rendering pipeline: JSON in, SVG/PNG/WebP out

Project description

predraw

Declarative rendering pipeline: JSON in, SVG/PNG/WebP out.

The missing link between your AI and the SVGs you want to make.

Install

From PyPI:

uv tool install predraw

From npm (requires Python 3.11+):

npm i -g predraw

Quick start

Create a project directory:

my-asset/
  main.json
  config.json

main.json -- the scene:

{
  "width": 400,
  "height": 200,
  "styles": {
    "bg": {"light": "#ffffff", "dark": "#1a1a1a"},
    "fg": {"light": "#000000", "dark": "#ffffff"}
  },
  "elements": [
    {"type": "background", "fill": "$bg"},
    {
      "type": "text",
      "id": "title",
      "content": "hello world",
      "x": 200,
      "y": 110,
      "anchor": "middle",
      "fill": "$fg",
      "font": {"family": "Liberation Sans", "size": 48, "weight": 700}
    }
  ],
  "pipeline": [
    {"action": "text-to-paths", "target": "title"}
  ]
}

config.json -- output targets:

{
  "outputs": [
    {"format": "svg", "path": "hello-dark.svg", "mode": "dark"},
    {"format": "png", "path": "hello-light.png", "mode": "light"},
    {"format": "webp", "path": "hello-dark.webp", "mode": "dark", "quality": 90}
  ]
}

Build:

predraw build my-asset/

Commands

build [path]

Render all outputs defined in config.json. Path can be a directory (looks for main.json) or a file.

predraw build                    # current directory
predraw build path/to/project    # explicit path

pack [path] [-o file]

Convert a directory project into a single portable JSON file. Imports are resolved and inlined as defs.

predraw pack my-asset/ -o packed.json

unpack <file> [-o dir]

Convert a packed JSON file back into a directory project with separate component files.

predraw unpack packed.json -o my-asset/

validate <file> [--schema scene|config]

Validate a scene or config file against the JSON Schema. Auto-detects file type (presence of "outputs" key = config, otherwise = scene).

predraw validate main.json
predraw validate config.json --schema config

Format

Element types

Type Purpose Key properties
background Full-canvas fill fill
rect Rectangle x, y, width, height, fill
path SVG path d, fill, opacity, transform
text Text (can convert to paths) content, font, anchor, charStyles
group Container elements, transform

Use (component instantiation)

Reference a component from imports or defs:

{"use": "logo", "transform": {"translate": [100, 50], "scale": [2, 2]}}

Property overrides cascade to children:

{"use": "logo", "fill": "#ff0000", "opacity": 0.5}

Styles

Define color tokens with light/dark variants:

{
  "styles": {
    "primary": {"light": "#000000", "dark": "#ffffff"},
    "muted": {"light": "#666666", "dark": "#999999"}
  }
}

Reference with $ prefix: "fill": "$primary". Mode is selected per-output in config.json.

charStyles

Style individual characters differently:

{
  "type": "text",
  "content": "releasable",
  "fill": "#ffffff",
  "charStyles": [
    {"chars": "rlsbl", "opacity": 1.0},
    {"chars": "eeaa", "opacity": 0.12}
  ]
}

Pipeline

Ordered postprocessing steps:

Action Fields Description
text-to-paths target Convert text to path outlines via font glyphs
center target, axis (x/y/both) Center element on canvas
place target, below, gap Position element below another
group targets, id Wrap elements into a group

Components

Split reusable parts into separate files:

project/
  main.json
  config.json
  components/
    logo.json

main.json:

{
  "imports": {"logo": "./components/logo.json"},
  "elements": [
    {"use": "logo", "transform": {"translate": [10, 10]}}
  ]
}

Packed format

predraw pack inlines imports as defs:

{
  "defs": {
    "logo": {"type": "group", "elements": [...]}
  },
  "elements": [
    {"use": "logo"}
  ]
}

Config

config.json defines output targets:

{
  "outputs": [
    {"format": "svg", "path": "out.svg"},
    {"format": "png", "path": "out-dark.png", "mode": "dark"},
    {"format": "webp", "path": "out.webp", "mode": "dark", "quality": 90}
  ]
}
Field Required Description
format Yes svg, png, or webp
path Yes Output file path (relative to project dir)
mode No light or dark (default: dark)
quality No WebP quality 1-100 (default: 90)

JSON Schema

Formal schemas for editor validation and LLM structured output:

  • schema/scene.schema.json -- scene format
  • schema/config.schema.json -- config format

Requirements

  • Python 3.11+
  • System fonts for text-to-paths (searches standard font directories)

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

predraw-0.1.2.tar.gz (62.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

predraw-0.1.2-py3-none-any.whl (21.3 kB view details)

Uploaded Python 3

File details

Details for the file predraw-0.1.2.tar.gz.

File metadata

  • Download URL: predraw-0.1.2.tar.gz
  • Upload date:
  • Size: 62.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for predraw-0.1.2.tar.gz
Algorithm Hash digest
SHA256 340a479739e5c8e32a72d6fd731125e7a8984f66cacb8d9682d6b58fc62e184a
MD5 db6c98825f1eab97a4b5322fd54f4a2a
BLAKE2b-256 faec7a67a4117974335e9949a09e5402dbc30c334e663c611bc77068344247e4

See more details on using hashes here.

Provenance

The following attestation bundles were made for predraw-0.1.2.tar.gz:

Publisher: publish.yml on smm-h/predraw

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file predraw-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: predraw-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 21.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for predraw-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 5359a9bbdd17a91b137734392ff7175234a6cd1fe2489cb8344bf595868b0acb
MD5 e29d5f568b4c73cf8eaeda18a520fc17
BLAKE2b-256 7e824493a80654d7de79871f92b278e5e0f552d0ce0f6851c2ce218f0a1b4d8d

See more details on using hashes here.

Provenance

The following attestation bundles were made for predraw-0.1.2-py3-none-any.whl:

Publisher: publish.yml on smm-h/predraw

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page