Repository navigation
Releases
v0.6.0
[0.6.0] - 2026-11-11
Added
-
vdt composeconverts an SVG file or directory to a Jetpack Compose
ImageVectorin Kotlin (arrow-left.svgbecomesArrowLeft.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 orVDT004note. Drawings too
large for the JVM's 64 KB method limit are written as path data strings so they
still compile. Runvdt guide composefor usage details. -
vdt compose --drawconverts an SVG to a ComposePainterthat draws
directly ontoDrawScope, unlocking artwork thatImageVectorand
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 asvdt compose, emitsVDT004when a blend mode requires API
29, and rejects drawings that would exceed the JVM method size limit with
VDT027instead of producing Kotlin that fails to compile. Onlyscreen,
overlay,darken, andlightenblend 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, andci, andvdt explain <code>
explains any diagnostic code (such asVDT019, or all codes with
vdt explain), withvdt --helppointing to both. Documentation and fix
guidance now travel with the binary for offline and agent use. -
adaptive --legacynow 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-approximateonconvert,optimize,notification,adaptive,
check, andinspect(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 warningVDT003andapproximatecompatibility instead of
blocking conversion. -
Optional Codicons stress suite (
tools/check-codicons.py) verifies conversion
coverage, deterministic output,VDT004reporting, 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
VectorDrawableandImageVectoras
output targets so rejections fromvdt composeread as accurately as those
fromconvert, without changing diagnostic codes, severities, locations, or
suggestions. - The agent skill in
skills/vdt/SKILL.mdnow delegates tovdt guideand
vdt explainso an agent's instructions never drift from the installed
binary. - Diagnostic codes now use the
VDTprefix (VDT001throughVDT026,
replacingSVGVD001–SVGVD026) acrossinspect, generator warnings, JSON
reports, and the WebAssembly bindings to match thevdtcommand name.
Fixed
- Large SVGs with many groups,
<use>elements, or<style>blocks no longer
appear to hang while resolving diagnostic locations andcolor()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 runningoptimize. - Strokes distorted by a skew or non-uniform scale in a large
viewBoxscaled
down to icon size are now reliably rejected withVDT012instead of silently
rendering with a uniform stroke width. - Unsupported or malformed CSS
color()values now fail withVDT013instead
of silently turning fills black or dropping strokes, whilecolor()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, ornotificationon 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 asclass) export as valid resource filenames
(ic_class.xml) thataapt2accepts. - 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 toconsole.error, making Figma plugin bugs diagnosable from the
browser console instead of showing onlyRuntimeError: 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
v0.4.0
What's Changed
Full Changelog: v0.3.0...v0.4.0
v0.3.0
What's Changed
Full Changelog: v0.2.0...v0.3.0
v0.2.0
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
Full Changelog: v0.1.0...v0.2.0
v0.1.0
Full Changelog: https://github.com/c5inco/svg2vd/commits/v0.1.0