IcoMoon alternative
An IcoMoon alternative for repository-managed Flutter icons
IcoMoon’s current app already imports folders, works offline, edits glyphs visually, and exports a Dart class for Flutter. GlyphPact is for a different boundary: SVG sources, codepoint history, generated artifacts, typed reports, and a CI check kept together in the repository.
Offline-first appicomoon.jsonExport pack
Visual project workflow
SVG directoryCommitted lockCI check
Repository build workflow
Short answer
Choose by the work that must be repeatable
Choose IcoMoon when
- You want to inspect, edit, align, and curate glyphs visually.
- You need web fonts, CSS, SVG exports, or other broad formats.
- You want an offline-first browser app and saved visual projects.
- You want Flutter output without adding a Python CLI toolchain.
Choose GlyphPact when
- The SVG folder is already part of the repository.
- Existing IconData codepoints must survive every later batch.
- CI must fail when committed output is stale.
- An agent or script needs typed audit and build results.
What the current IcoMoon app already does
Comparisons based on the old IcoMoon app are now misleading. The current app is an offline-first progressive web app. It can import files and folders, generate a Dart class for Flutter, edit vectors, and handle strokes, masks, clip paths, gradients, and even-odd geometry more fully during import.
Its current project format is icomoon.json.selection.json belongs to the old app. The current app also offers Replace by Matching Names so revised artwork can keep the matching glyph’s metadata.
Privacy and offline use are not reasons to reject IcoMoon. The relevant difference is whether the pipeline is a visual project a person exports or a compiler contract that a repository can verify.
The repository contract is the differentiator
GlyphPact writes iconfont.lock.json beside the generated font and Dart provider. Existing assignments are reused automatically. Removed icons become permanent tombstones, and a content-preserving rename retains the original identity.
IcoMoon can preserve codes when its project file is retained and its matching-name workflow is used correctly. GlyphPact makes that state a normal reviewed file, then adds a first-party staleness check:
glyphpact --config icon_font.json --check
IcoMoon’s current documentation does not describe a repository-native command that compares committed output with sources and fails CI when they differ. GlyphPact’s --check exists specifically for that case.
Where IcoMoon remains the broader tool
IcoMoon has a visual editor and broader export surface. It generates web font packs and CSS, and offers formats GlyphPact does not. GlyphPact emits an OpenType/CFF font, a lock, a report, attribution, and a Dart provider. It does not generate WOFF2, CSS, React, or Vue output.
If the main task is drawing, visually normalizing, or exporting for the web, use IcoMoon. If the task is compiling an existing SVG pack for Flutter with reviewable state and CI enforcement, GlyphPact is the narrower fit.
Side by side
Current capabilities, without the old-app myths
| GlyphPactLocal CLI compiler | IcoMoonOffline-first browser app | |
|---|---|---|
| Existing codepoints survive a pack changeIf an assignment moves, shipped application code renders the wrong glyph. | Supported: Committed lock file`iconfont.lock.json` is generated into the output tree and read on every later build. Removed icons leave a tombstone in `retired` instead of freeing the codepoint. | Conditional: Project file plus matching-name replacementThe current app stores its project in `icomoon.json`. Its Replace by Matching Names workflow can update matching glyphs without changing their metadata. Stability depends on retaining the project and using that workflow correctly. |
| CI can prove committed output is currentGenerated artifacts drift from sources silently unless something fails the build. | Supported: `--check` exits 3 when staleRebuilds a candidate artifact set and compares it without rewriting the owned output tree. Verified: exit 0 on current output, exit 3 after a source edit. | Not documented: No documented repository staleness checkCurrent first-party documentation describes an offline-first browser app, project files, and exports. It does not document a command that compares committed output with sources and fails CI when they differ. |
| Runs entirely on your machineUnreleased or licensed artwork often cannot leave the building. | Supported: Local CLI, no network stepA Python command-line compiler. No website step, no project service, no server that receives artwork. | Supported: Offline-first PWAThe current app is documented as an offline-first progressive web app. Imported files and generated assets are processed locally unless the user opts into account-backed project storage. |
| Byte-identical rebuildsNon-reproducible artifacts turn every rebuild into an unreviewable diff. | Supported: Same bytes across worker countsSame inputs, config, lock, and compiler version produce byte-identical artifacts. Verified: identical SHA-256 across default, 1, and 4 worker processes. | Not documented: Not documented |
| Explicit policy for SVG a font cannot holdAn icon font stores monochrome coverage. Something has to decide what happens to a blur or a half-transparent fill. | Supported: Two policy axes, both strict by default`lossy` and `unrepresentable` each default to `error`. Approximations and omissions require explicit opt-in and are reported as typed, coded issues. | Not documented: Import support, no typed build policyThe current app documents broader import support, including strokes and even-odd geometry without manual conversion. It does not publish GlyphPact-style lossless, lossy, and unrepresentable build outcomes with coded report entries. |
| Generates a Flutter IconData APIHand-written IconData constants are the place codepoint drift actually bites. | Supported: Const provider plus optional catalogEmits a tree-shakeable `@staticIconProvider` class, optional same-file name-keyed enumeration, `fontPackage` handling, and layered-icon widgets. | Supported: Dart class for FlutterThe current IcoMoon app exports a Dart class for Flutter. |
| Web assets: WOFF2 and CSSThe honest place GlyphPact is behind. If you need a web icon font today, these tools already do it. | Not supported: OpenType/CFF onlyEmits a `.otf` font and the lock registry. No WOFF, no WOFF2, no generated CSS. Web use means converting the font and writing the CSS yourself. | Supported: Fonts plus CSSDocumented export targets include a web font pack and further asset types. |
| Generates an attribution recordThird-party icon licences usually require attribution, and audits ask for it. | Supported: `ATTRIBUTION.md` per buildCarries declared author, licence, and source URL per glyph, and counts emitted icons with no declared provenance. It does not verify ownership. | Not documented: Not documented |
| Required runtimeA toolchain you do not already run is a toolchain you have to maintain. | Supported: Python 3.10+Dart 3+ only to consume the generated provider. | Supported: A browser |
| Coding-agent integrationIcon work is increasingly delegated, and an agent needs typed results rather than screenshots. | Supported: Local stdio MCP serverClaude Code and Codex can install the full plugin. Other stdio MCP clients can configure the published server directly. It exposes four tools plus the config, report, and inner CLI-result schemas. | Not supported: Not offered |
The tools can share a workflow
Use IcoMoon for visual curation when that editor helps, export the SVG sources, and make those sources the input to a checked-in GlyphPact config. The design task stays visual. The Flutter build becomes local, deterministic, and reviewable.
Try locally
Point GlyphPact at an SVG folder
uv tool install glyphpactInstalls the latest stable release from PyPI, currently v1.1.0. Already installed? Run uv tool upgrade glyphpact. Release notes.
IcoMoon behaviour verified on 2026-07-27against current IcoMoon docs, the current app overview, andIcoMoon’s Flutter and Dart announcement. This page should be corrected when the product changes.