svgtidy

Crates.iosvgtidy
lib.rssvgtidy
version0.1.4
created_at2026-01-13 00:11:34.443125+00
updated_at2026-01-13 03:11:44.049339+00
descriptionHigh-performance SVG optimizer written in Rust
homepage
repositoryhttps://github.com/honkinglin/svgtidy
max_upload_size
id2039091
size600,578
Kyrie (honkinglin)

documentation

README

Logo

CI License Crates.io Version NPM Version

svgtidy is a high-performance SVG optimizer written in Rust.

It removes redundant information from SVG files (like comments, metadata, and hidden elements) and creates a minimized, cleaner version without affecting rendering.

Compared to SVGO, svgtidy is fastโ€”up to 100x faster for single icons and 50x faster for complex files.


โšก Features

  • Blazing Fast: Built with Rust, xmlparser and rayon.
  • Batch Processing: Parallel directory scanning and optimization.
  • AST-based: Robust DOM-like mutations.
  • Configurable: Toggle plugins, set precision, and precision formatting.
  • Cross-Platform: Runs on CLI, Node.js, and in the browser (WASM).

๐Ÿš€ Installation & Usage

๐Ÿ“ฆ Node.js / Web (WASM)

Use svgtidy directly in your JavaScript/TypeScript projects.

npm install svgtidy

Usage:

import { optimize } from 'svgtidy';

const svg = '<svg>...</svg>';
const optimized = optimize(svg);
console.log(optimized);

๐Ÿฆ€ CLI (Command Line)

Install the binary tool using Rust's cargo:

# Install from crates.io (Recommended)
cargo install svgtidy

# Or build from source
git clone https://github.com/honkinglin/svgtidy.git
cd svgtidy
cargo install --path .

Usage:

# Optimize a single file
svgtidy input.svg -o output.svg

# Optimize a directory (recursive)
svgtidy icons/ -o dist/

# Set precision and disable specific plugins
svgtidy input.svg -o output.svg -p 5 --disable removeTitle

โšก Vite

Install the dedicated Vite plugin:

npm install vite-plugin-svgtidy

Usage (vite.config.js):

import svgtidy from 'vite-plugin-svgtidy';

export default {
  plugins: [svgtidy()]
}

๐Ÿ“ฆ Webpack

Install the Webpack loader:

npm install svgtidy-loader

Usage (webpack.config.js):

module.exports = {
  module: {
    rules: [
      {
        test: /\.svg$/,
        use: [
          { loader: 'svgtidy-loader' }
        ]
      }
    ]
  }
}

โš™๏ธ Configuration (CLI)

Usage: svgtidy [OPTIONS] <INPUT>

Arguments:
  <INPUT>  Input file or directory

Options:
  -o, --output <OUTPUT>    Output file or directory
  -p, --precision <PRECISION>  Set numeric precision [default: 3]
      --enable <ENABLE>    Enable specific plugins (comma-separated)
      --disable <DISABLE>  Disable specific plugins (comma-separated)
      --pretty             Pretty print output
  -h, --help               Print help

๐Ÿ”Œ Plugins

svgtidy enables these plugins by default to ensure maximum reduction:

Plugin Name Description
removeDoctype Removes <!DOCTYPE> declaration.
removeXMLProcInst Removes <?xml ... ?> instructions.
removeComments Removes comments.
removeMetadata Removes <metadata> elements.
removeTitle Removes <title> elements.
removeDesc Removes <desc> elements.
removeEditorsNSData Removes editor namespaced attributes (Inkscape, etc.).
cleanupAttrs Trims attribute whitespace.
mergePaths Merges adjacent paths with same attributes.
convertShapeToPath Converts basic shapes (rect, circle) to path.
convertPathData Optimizes path commands (relative, precision).
convertTransform Collapses multiple transforms into one.
removeHiddenElems Removes hidden elements (display="none").
removeEmptyText Removes empty text nodes.
convertColors Converts colors (rgb to hex, etc.).
collapseGroups Removes redundant <g> tags.
moveGroupAttrsToElems Moves attributes from groups to elements.
moveElemsAttrsToGroup Moves common attributes from elements to groups.

(And more...)

๐Ÿ“Š Benchmarks

Scenario Input Size svgtidy Time vs SVGO (Node)
Simple Icon ~0.5 KB ~16 ยตs ~100x Faster
Complex SVG ~30 KB ~1 ms ~50x Faster

๏ฟฝ Development

Build WASM locally

To build the WASM package for web usage (NPM):

wasm-pack build --target bundler --out-dir npm/svgtidy-wasm

Running Tests

  • Rust: cargo test
  • JS/WASM: cd npm && npm run test:suite

๐Ÿค Contributing

Contributions are welcome!

  1. Fork the repository.
  2. Create a feature branch.
  3. Submit a Pull Request.

๐Ÿ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

Commit count: 54

cargo fmt