Skip to content

Releases

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 11 Nov 09:59

[0.6.0] - 2026-11-11

Added

  • vdt compose converts an SVG file or directory to a Jetpack Compose
    ImageVector in Kotlin (arrow-left.svg becomes ArrowLeft.kt), accepting
    --name, --package, --size, --optimize, --strict, and
    --allow-approximate. Compose projects (Min SDK 23) can now generate icons
    directly as Kotlin source instead of loading XML drawables at runtime, and
    because Compose renders the vector itself, gradients, even-odd fills and clip
    paths carry no Android API level requirement or VDT004 note. Drawings too
    large for the JVM's 64 KB method limit are written as path data strings so they
    still compile. Run vdt guide compose for usage details.

  • vdt compose --draw converts an SVG to a Compose Painter that draws
    directly onto DrawScope, unlocking artwork that ImageVector and
    VectorDrawable have to reject: group opacity, dashed strokes, blend modes,
    multi-shape and even-odd clip paths, and alpha or luminance masks. It takes
    the same flags as vdt compose, emits VDT004 when a blend mode requires API
    29, and rejects drawings that would exceed the JVM method size limit with
    VDT027 instead of producing Kotlin that fails to compile. Only screen,
    overlay, darken, and lighten blend on every API level; below API 29 any
    other mode paints its group normally instead of blending it. Radial gradient
    focal points, pattern paints, SVG filters, non-uniformly scaled strokes, and
    unoutlined text remain rejected.

  • vdt guide [topic] prints built-in usage guides for the workflow, adaptive,
    notification, drawables, diagnostics, and ci, and vdt explain <code>
    explains any diagnostic code (such as VDT019, or all codes with
    vdt explain), with vdt --help pointing to both. Documentation and fix
    guidance now travel with the binary for offline and agent use.

  • adaptive --legacy now writes its API 21–23 density fallbacks as lossless
    WebP instead of PNG when the composed icon needs API 24, shrinking fallback
    assets without quality loss and removing legacy PNGs from earlier runs.

  • Elliptical and rotated radial gradients now convert instead of being rejected,
    including on paths that also carry a uniform stroke. SVGs with non-square
    gradient bounds or rotated and stretched radial fills now work in
    VectorDrawable output; elliptical radial gradients on strokes remain rejected.

  • --allow-approximate on convert, optimize, notification, adaptive,
    check, and inspect (and in the WebAssembly bindings) opts into lossy
    conversion for constructs VectorDrawable cannot represent exactly. Radial
    gradients with off-center focal points now convert by centering the focal
    point with warning VDT003 and approximate compatibility instead of
    blocking conversion.

  • Optional Codicons stress suite (tools/check-codicons.py) verifies conversion
    coverage, deterministic output, VDT004 reporting, and Android resource name
    collisions across the VS Code icon set.

Changed

  • Estimated XML size is now computed on demand from the current asset rather
    than stored during initial analysis, while CLI JSON, inspect, and
    WebAssembly outputs keep their existing fields and post-optimization or
    post-fit XML size values.
  • Compatibility diagnostics now name both VectorDrawable and ImageVector as
    output targets so rejections from vdt compose read as accurately as those
    from convert, without changing diagnostic codes, severities, locations, or
    suggestions.
  • The agent skill in skills/vdt/SKILL.md now delegates to vdt guide and
    vdt explain so an agent's instructions never drift from the installed
    binary.
  • Diagnostic codes now use the VDT prefix (VDT001 through VDT026,
    replacing SVGVD001–SVGVD026) across inspect, generator warnings, JSON
    reports, and the WebAssembly bindings to match the vdt command name.

Fixed

  • Large SVGs with many groups, <use> elements, or <style> blocks no longer
    appear to hang while resolving diagnostic locations and color() values, and
    now convert in linear time.
  • Deeply nested SVGs no longer overflow the stack and crash the CLI, the
    WebAssembly bindings, or the Figma plugin, and instead return a normal input
    error.
  • Small SVGs whose <use>, mask, clip, filter, pattern, or marker references
    expand exponentially no longer exhaust gigabytes of memory before failing, and
    are now rejected upfront with an input error while leaving large
    reference-free drawings unaffected.
  • Long chains and cycles of SVG references no longer crash with a stack overflow
    or silently drop cyclic elements, and now return a clear input error.
  • Strongly elliptical radial gradients no longer vanish from the rendered
    drawable after running optimize.
  • Strokes distorted by a skew or non-uniform scale in a large viewBox scaled
    down to icon size are now reliably rejected with VDT012 instead of silently
    rendering with a uniform stroke width.
  • Unsupported or malformed CSS color() values now fail with VDT013 instead
    of silently turning fills black or dropping strokes, while color() values in
    <style> CDATA blocks are now resolved and those inside CSS comments or
    strings are ignored. Notification icons still whiten opaque fills and reject
    only strokes or lost opacity.
  • Running convert, optimize, or notification on a single input with -o
    pointing to an existing directory or a path ending in a slash now writes
    inside that directory instead of creating a file named after the directory
    path.
  • Raster layer images that exceed Android's 100 MB bitmap limit are now rejected
    immediately instead of allocating gigabytes of memory to decode an image
    Android would refuse to draw.
  • Notification icons exported through the WebAssembly bindings and the Figma
    plugin now flatten uniform-alpha gradients to solid white like the CLI,
    instead of rejecting them or marking them as approximate.
  • The Figma plugin now applies the CLI's Android resource naming rules so layers
    named after Java keywords (such as class) export as valid resource filenames
    (ic_class.xml) that aapt2 accepts.
  • An internal panic in the Figma plugin is now reported as an internal error
    rather than a broken SVG layer, and resets the converter so the rest of the
    batch and later exports continue working instead of failing every subsequent
    layer.
  • Crashes in the WebAssembly bindings now log the panic message and source
    location to console.error, making Figma plugin bugs diagnosable from the
    browser console instead of showing only RuntimeError: unreachable.

What's Changed

  • Support elliptical radial gradients and --allow-approximate focal centering by @c5inco in #20
  • Fix Tier 1 correctness bugs from the library review by @c5inco in #26
  • Recover the Figma plugin from WebAssembly crashes and test the plugin in CI by @c5inco in #27
  • Add vdt guide and vdt explain, and slim the agent skill by @c5inco in #28

Full Changelog: v0.5.0...v0.6.0

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 19 Sep 15:00

What's Changed

  • Let inspect report raster adaptive layers without writing them by @c5inco in #19
  • Refuse raster files before SVG conversion by @c5inco in #23
  • Hide vector-only fields from raster inspect JSON by @c5inco in #24

Full Changelog: v0.4.0...v0.5.0

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 18 Sep 08:09

What's Changed

  • Take raster adaptive icon layers, and measure the safe zone as a circle by @c5inco in #16

Full Changelog: v0.3.0...v0.4.0

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 15 Sep 07:51

What's Changed

  • Emit SVGVD004 naming what raises the minimum API to 24 by @c5inco in #15

Full Changelog: v0.2.0...v0.3.0

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 15 Sep 06:37

What's Changed

  • Gradient support, content bounds, and resilient directory runs by @c5inco in #1
  • Rename project to vdtoolkit with a vdt binary by @c5inco in #3
  • Clarify in README that vdtoolkit is not on crates.io yet by @c5inco in #4
  • Add adaptive launcher icon generation by @c5inco in #5
  • Add notification icon generation by @c5inco in #8
  • Add --optimize to adaptive and stop printing f32 noise digits by @c5inco in #9
  • Give generator findings diagnostic codes and let inspect report them by @c5inco in #10
  • Write valid Android resource names and add --size to convert by @c5inco in #14
  • Add a complex-illustration corpus with a visual comparison by @c5inco in #12
  • Sign and notarize macOS release binaries by @c5inco in #11

New Contributors

  • @c5inco made their first contribution in #1

Full Changelog: v0.1.0...v0.2.0

v0.1.0

Choose a tag to compare

@github-actions github-actions released this 10 Sep 07:32