Built from my blog post on Why you might not need an icon library, iconmate is a Rust-powered CLI for developers who want the speed and control of plain files without icon-package bloat.
Use icones.js.org, a direct SVG URL, or raw SVG markup. iconmate drops the icon straight into your project and keeps your exports tidy.
Why iconmate?
- Made with Rust๐ฆ: Fast TUI that you can use on any IDE (powered by ratatui, nucleo).
- AI-ready automation ๐ค: Let your coding agents get icons and add it to your project! A CLI is basically an MCP, just let AI use
iconmate --helpand it should be able to get everything running! - Zero dependencies ๐ฆ: No icon library runtime added to your app
- Framework-native output ๐งฉ: Generate files for React, Vue, Svelte, Solid, or plain SVG
- Interactive by default ๐ฎ: Run
iconmateand have a pleasant interactive TUI - Multiple sources ๐: Pull icons from Iconify names, URLs, or even raw SVG (which means it works with your private icon packs i.e. Anron)
- Fast workflow โก: Generate file + export line in one step
- Prototype-friendly ๐๏ธ: Create empty SVG placeholders when needed
Quick Start
# Install
# Run the TUI in your project ๐
โจ That's it. The interactive TUI guides you through adding icons to your project.
// ๐ Then, you can just easily use any icon on your project like this!
import { IconHeart } from "@/assets/icons";
function MyApp() {
return <IconHeart />;
}
Configuration
You can also add sensible defaults by passing flags as configs:
Iconmate now includes config schemas + TS type definitions in the repo:
- Local config schema (repo):
iconmatelocal.schema.json - Global config schema (repo):
iconmateglobal.schema.json - Local config schema (raw):
https://raw.githubusercontent.com/Blankeos/iconmate/main/iconmatelocal.schema.json - Global config schema (raw):
https://raw.githubusercontent.com/Blankeos/iconmate/main/iconmateglobal.schema.json - Schema source:
config-gen/src/schema.ts - TS type definitions:
config-gen/src/types.ts
Regenerate schemas from project root:
just config-schema installs config-gen deps and generates both schema files.
Local Config (iconmate.config.json)
Use the raw URL for $schema so editors can fetch JSON directly.
Local config keys:
folder(default:src/assets/icons)preset(default:normal, meaning plain.svgmode)output_line_template(default:export { default as Icon%name% } from './%icon%%ext%';)svg_view_cmd(supports%filename%token)
Allowed preset values:
normal(plain SVG mode)reactsveltesolidvueemptysvg
Global Config (user-level)
Global config is for user-wide defaults and currently documents svg_view_cmd.
Suggested paths:
- macOS:
~/Library/Application Support/iconmate/config.json - Linux:
~/.config/iconmate/config.json - Windows:
%APPDATA%\\iconmate\\config.json
Example global config:
[!NOTE] This release adds config schemas and generated docs/types. Runtime loading/precedence wiring in the CLI/TUI is tracked in
folder-system-plan.md.
Installation
NPM ๐ฆ
# Install globally with either:
# Use without installing with either:
Install from Cargo ๐ฆ
# Or clone and install from source:
Framework Presets
Determines the output filetype and the contents inside that file type.
| Preset | File Type | Framework |
|---|---|---|
normal |
.svg |
Vanilla HTML/CSS |
react |
.tsx |
React Components |
svelte |
.svelte |
Svelte Components |
solid |
.tsx |
Solid Components |
vue |
.vue |
Vue Components |
emptysvg |
.svg |
Placeholder |
[!IMPORTANT] If you want to use
.svgfile types, make sure to setup svgr for your js apps. I covered how to do this in:
- SolidJS (Vite)
- React (Vite)
- React (NextJS)
- Vue - contribution welcome!
- Svelte - couldn't find an svgr integration. Just use the svg preset.
Command Line
Interactive TUI Mode (Recommended)
This section is helpful for AI:
Add Specific Icon
With URL
Raw SVG Content
You can also pull raw SVG directly from the Iconify API:
Custom Export Template
Delete icons
Iconify API Commands
# Search by keyword (text: one prefix:icon per line)
# Search with pagination and JSON output
# Include collection metadata in JSON search output
# List all available collections
# List icons from one collection prefix
# Get one icon as raw SVG (default)
# Get one icon as raw Iconify JSON
iconmate iconify get <prefix:icon> --format json uses Iconify's JSON endpoint format,
for example https://api.iconify.design/mdi.json?icons=heart.
AI-Ready Workflows
iconmate is designed to be easy for AI agents and scripts to drive end-to-end.
# 1) Search in machine-readable JSON
# 2) Add an icon non-interactively from prefix:name
# 3) Or fetch raw SVG from Iconify API and add directly
This means an AI can search, choose, and add icons without opening a browser.
Package.json Scripts
Best practice: Add sensible defaults to your script runner.
"scripts": {
// Usage: npm run iconmate (usually this is the only command you need)!
"iconmate": "iconmate --folder src/assets/icons/"
}
Supported Platforms
- macOS (Intel & Apple Silicon) ๐
- Linux (x64 & ARM64) ๐ง
- Windows (x64) ๐ช
How It Works
- Find your icon: Use https://icones.js.org or
iconmate iconify search <query>. - Pick the icon id: For example
heroicons:heart. - Add with iconmate: Interactive (
iconmate) or direct (iconmate add ...).
![]()
Why this structure?
- Copy-paste workflow: Find icon on icones.js.org โ copy name โ paste into iconmate
- Organized by default: Everything goes into
index.tsexports automatically and just typing<Iconwill autosuggest from your current collection. Just regular TS behavior. - TypeScript ready: Generated code is fully typed. Pass custom width, height, fills, you name it.
- Customizable ๐จ: Want to add a default Tailwind class on every icon? custom props? Just add it to the file!
- Git-friendly: Plain SVG files, no binary assets
- Lightning fast: Native Rust binary, no Node.js startup time
Contributing
Contributions are welcomeโpull requests for bug fixes, new framework presets, or improvements are appreciated.
๐ฑ Repo: github.com/Blankeos/iconmate - Star it if you love it โญ
What's Completed from the Roadmap
- โ Interactive prompt mode
- โ Framework presets (React, Vue, Svelte, Solid)
- โ URL and raw SVG support
- โ Custom export templates
- โ Zero-config installation
Roadmap & Out-of-scoped
- An empty command. Creates an .svg, adds it to the index.ts with a name you can specify.
- Paste an actual svg instead of an icon
name. - Presets (
normal,react,solid,svelte,vue,emptysvg) override output templates and file types. - Prompt Mode via
iconmate- Interactive mode so you won't need to pass arguments. - Delete an icon using
iconmate delete - An interactive TUI instead of prompt-mode.
- Rename in the TUI (but recommended for you to just use the LSP to do it)
- A lot of TUI functionalities wokr
-
iconmate iconify --helpcommands for AI to easily look for icons itself. - Search and add Iconify icons directly inside the TUI (no need to open https://icones.js.org).
- Other frameworks i.e. --preset=flutter or Go/Rust GUI apps? (Not sure how they work yet though).
-
Zed or VSCode Extension(seems unnecessary now, it's just a CLI)
Near-Term Roadmap
Made with Rust ๐ฆ | Based on my blog post