| Crates.io | svgtidy |
| lib.rs | svgtidy |
| version | 0.1.4 |
| created_at | 2026-01-13 00:11:34.443125+00 |
| updated_at | 2026-01-13 03:11:44.049339+00 |
| description | High-performance SVG optimizer written in Rust |
| homepage | |
| repository | https://github.com/honkinglin/svgtidy |
| max_upload_size | |
| id | 2039091 |
| size | 600,578 |
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.
xmlparser and rayon.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);
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
Install the dedicated Vite plugin:
npm install vite-plugin-svgtidy
Usage (vite.config.js):
import svgtidy from 'vite-plugin-svgtidy';
export default {
plugins: [svgtidy()]
}
Install the Webpack loader:
npm install svgtidy-loader
Usage (webpack.config.js):
module.exports = {
module: {
rules: [
{
test: /\.svg$/,
use: [
{ loader: 'svgtidy-loader' }
]
}
]
}
}
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
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...)
| 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 |
To build the WASM package for web usage (NPM):
wasm-pack build --target bundler --out-dir npm/svgtidy-wasm
cargo testcd npm && npm run test:suiteContributions are welcome!
This project is licensed under the MIT License - see the LICENSE file for details.