On this page
#Changelog
#0.4.3
The tool describes itself with one sentence everywhere, and its documentation moved onto selfdoc's .stricttools/ layout.
#Fixes
- **The tool describes itself with one sentence everywhere, including
--help.** The--helpheader, README, docs site, PyPI and npm metadata now carry the same line.
#0.4.2
Documentation frontmatter converted to TOML for the current selfdoc; no user-facing change.
#Infrastructure
- Documentation frontmatter converted to TOML for the current selfdoc; no user-facing change.
#0.4.1
The project describes itself consistently on PyPI, npm and in its README, and its documentation base is the unified site.
#Fixes
- The project describes itself consistently on PyPI, npm and in its README. The registry listings carried a terse tagline with no project URLs, no classifiers and no homepage, and the README opened without saying what predraw is.
- Documentation links point at the unified site. The declared docs base was the retired per-project host; it is
https://smmh.dev/predraw/now, so generated sitemaps, feeds and llms.txt name the address that serves the pages.
#0.4.0
Every argument and flag says whether it is required, and --schema no longer takes the empty string.
Context
strictcli 0.41 makes presence a declaration rather than something the framework infers, and forbids a value default on a command that writes. Five of predraw's six commands write, and each of them took a path or an output location the framework filled in.
Those fallbacks have not changed -- predraw build with no argument still builds the current directory, predraw pack still writes packed.json -- but the handler applies them now and each declaration's help states the one it applies, so a reader of --help learns it from the flag rather than from the source.
validate --schema loses its third choice. The empty string was both a legal value and the flag's default, and it meant "detect the schema from the file", which is also what omitting the flag means. One request had two spellings, and the value-shaped one is gone: --schema "" is now refused, and the two remaining choices each carry a line of help.
#Breaking
- **
predraw validate --schema ""is refused instead of meaning "detect it".** The flag's third choice was the empty string, which was also its default, so absence was a value the caller could type -- two spellings of one request. The choices are the two real schemas now, each with a line of help in--help; omit the flag to have the schema detected from the file, as before.
#Features
- **
--helpsays whether each argument and flag is required.** Every positional and every flag renders[required]or[optional], and the fallbacks that used to be framework-supplied defaults -- the current directory forbuild,pack,initandwatch,packed.jsonforpack -o, the current directory forunpack -o-- are stated in each declaration's own help. Every command line that worked before works unchanged.
#0.3.0
strictspec validation for scene and config documents, a working CLI on strictcli 0.36.0, and an enforced strictcli floor.
Context
Two breaking changes ship together. Scene and config documents are now validated by strictspec instead of jsonschema: every document must carry a top-level integer format_version, use elements must name their type, and a field may not be spelled both canonically and in snake_case. Separately, --dry-run became a framework-owned flag, so disabling it requires the explicit --no-dry-run spelling.
The release also repairs installs. predraw's CLI could not register against strictcli releases before 0.36.0; the manifest now declares that floor so a fresh install fails loudly at resolution time instead of producing a CLI that cannot start.
#Breaking
- Breaking.
--dry-runbool flag now requires explicit--no-dry-runto disable. - Breaking. Scene and config documents are now validated by strictspec with hard errors instead of jsonschema. Every document must carry a top-level integer
format_version(stamp existing files once withscripts/stamp_format_version.py);useelements must carry an explicittype; and a field may not use both its canonical and snake_case alias spelling. Documents previously tolerated (missing version, ambiguous alias pairs, numerically unrepresentable values, unknown keys) are now rejected.
#Fixes
- Fix pack command to use camelCase for stroke properties; watch excludes local-only files
- CI fix. Resolved dependency resolution failure by removing local path override for strictcli.
- Dependency installation no longer requires a machine-local checkout:
uv.lockpreviously carried a local path forstrictcli, breaking installs and CI outside the author's machine. It now resolves from PyPI (strictcli 0.24.0). - **The
predrawCLI works again on strictcli 0.36.0.**build --dry-runis unchanged for callers -- the flag is now supplied by the framework rather than declared by predraw, which is what the new version requires. - **Installs now refuse an incompatible
strictcli.**predrawdeclaresstrictcli>=0.36.0, so a fresh install can no longer resolve an older framework release that the CLI cannot register against.
#0.2.1
Fix CI: Node shim test activates venv so Python deps are available
- No user-facing changes.
#0.2.0
Stroke support (stroke, strokeWidth, strokeDasharray, strokeLinecap, strokeLinejoin, strokeOpacity)
#Features
- Place directions —
placepipeline step now supportsabove,left,rightin addition tobelow - Schemas moved into package —
predraw validatenow works after pip install - Stroke support (
stroke,strokeWidth,strokeDasharray,strokeLinecap,strokeLinejoin,strokeOpacity) - Gradient fills —
linear-gradientandradial-gradientas fill/stroke objects, rendered as SVG<defs> predraw init— create a starter project withmain.json+config.jsonpredraw watch— auto-rebuild on file changes (mtime polling, 0.3s debounce)predraw --versionflagpredraw build --dry-run— preview output plan without rendering
#0.1.2
npm dual-publish — installable via npm i -g predraw (Node shim delegates to Python)
#Features
- npm dual-publish — installable via
npm i -g predraw(Node shim delegates to Python) predraw validatedocumented in README
#0.1.1
Bounding box calculation for paths — place pipeline step now uses real geometry instead of font-size heuristic
#Features
- Bounding box calculation for paths —
placepipeline step now uses real geometry instead of font-size heuristic - Local
fonts/directory support — project-local fonts searched before system fonts for reproducible rendering - Component property overrides —
useelements can overridefill(replaces) andopacity(multiplies) on referenced components
#0.1.0
Declarative JSON format for describing visual assets (rect, path, text, group, background)
#Features
- Component system:
imports+usewith property overrides (fill, opacity cascade) text-to-pathspipeline step via fonttools (converts text to SVG path outlines)- Output formats: SVG, PNG (via cairosvg), WebP (via Pillow)
predraw unpack— convert packed file back to directory with components- JSON Schema for scene and config formats
predraw validate— validate scene/config files against the JSON Schema- Declarative JSON format for describing visual assets (rect, path, text, group, background)
$styletokens with light/dark mode variants, resolved at render time- Per-character text styling via
charStyles - Pipeline steps:
center,place,group,text-to-paths - Config-driven outputs with per-output mode selection (
config.json) predraw build— render all outputs from a project directory or single filepredraw pack— convert directory project to single portable JSON file