Skip to content
Changelog
Edit
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 --help header, 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

  • **--help says 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 for build, pack, init and watch, packed.json for pack -o, the current directory for unpack -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-run bool flag now requires explicit --no-dry-run to 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 with scripts/stamp_format_version.py); use elements must carry an explicit type; 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.lock previously carried a local path for strictcli, breaking installs and CI outside the author's machine. It now resolves from PyPI (strictcli 0.24.0).
  • **The predraw CLI works again on strictcli 0.36.0.** build --dry-run is 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.** predraw declares strictcli>=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 — place pipeline step now supports above, left, right in addition to below
  • Schemas moved into package — predraw validate now works after pip install
  • Stroke support (stroke, strokeWidth, strokeDasharray, strokeLinecap, strokeLinejoin, strokeOpacity)
  • Gradient fills — linear-gradient and radial-gradient as fill/stroke objects, rendered as SVG <defs>
  • predraw init — create a starter project with main.json + config.json
  • predraw watch — auto-rebuild on file changes (mtime polling, 0.3s debounce)
  • predraw --version flag
  • predraw 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 validate documented 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 — place pipeline 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 — use elements can override fill (replaces) and opacity (multiplies) on referenced components

#0.1.0

Declarative JSON format for describing visual assets (rect, path, text, group, background)

#Features

  • Component system: imports + use with property overrides (fill, opacity cascade)
  • text-to-paths pipeline 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)
  • $style tokens 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 file
  • predraw pack — convert directory project to single portable JSON file

More tools from this site

  • claudestream Drive Claude Code from Python: run it as a subprocess and read its output as typed events, with async and sync sessions, sandbox policies, and tools you define in Python
  • claudewheel A TUI Claude Code Launcher that lets you have more than one profile, manage sessions lifecycle, pick the exact CC version, model to use (even older unlisted ones), pick which GitHub account to use, etc.
  • dirstat Fast, single-binary directory statistics CLI: every file under a tree grouped by format, with counts, sizes, and lines of code, as a colored terminal table or as JSON
  • fastware A batteries-included ASGI framework: msgspec JSON, a managed Granian server, dependency injection, SSE, WebSockets, auth, and a test client
  • go-toml-edit Zero-dep TOML editing library for Go with comment preservation
  • howmuchleft The fastest Claude Code statusline: context window, 5-hour, and weekly limit usage as three customizable gradient bars, rendering in about 6 ms
  • orxtra
  • pgdesign
  • reposummary Turn a git repository's history into a Markdown journal: pick a time window or revision range and get a readable digest of what changed, optionally narrated by an LLM
  • rlsbl Release orchestration and project scaffolding CLI that bumps versions, validates a structured JSONL changelog, tags only the commit CI verified, and publishes to npm, PyPI, Go and more
  • safegit git wrapper CLI that gives each commit its own temporary index and retries ref updates on conflict, so concurrent agents share one repository
  • saferm Command-line replacement for rm that archives every deletion with a mandatory reason and the context it ran in, so deleted files can be listed, inspected and restored
  • selfdoc Static Site Generator that builds a project's documentation site directly from its source code, so the docs can never drift from the code they describe, with SEO/AEO, first-class blog, search, and cross-project linking built in
  • strictcli
  • stricttest An always-on test-isolation floor: a pytest plugin and a Go env-hygiene module that make a test suite structurally unable to reach real credentials, the real HOME, the network, or the development repository.
  • wesktop A Python framework that turns an ASGI web app into a desktop application, serving it from a local Granian server and displaying it in a native OS window via pywebview
Search