Comparison
GlyphPact and FlutterIcon.com, compared fairly
Both turn SVG artwork into a Flutter icon font and a Dart icon class. FlutterIcon.com does it in a hosted browser session with a library of ready-made icon packs. GlyphPact does it as a local command with a committed codepoint registry. The right answer depends on how often your icon set changes and who changes it.
Hosted selectionconfig.jsonDownloaded bundle
Session-backed workflow
SVG directoryLocal compilerReviewed output
Repository-backed workflow
What FlutterIcon.com is
FlutterIcon.com is a Flutter-focused fork ofFontello, published asilikerobots/polyiconand MIT licensed. You pick icons from more than a dozen bundled open-source webfonts, or drop in your own SVGs, and export a font plus a Dart icon class. Its config.json records your selection, including each glyph's code, and can be imported again later.
That bundled library is a genuine advantage and GlyphPact has no answer to it. If you want a Material-adjacent icon and do not want to source the artwork yourself, FlutterIcon hands it to you in about a minute. GlyphPact only compiles SVG files you already have.
The real difference
A session you operate, or a command your build runs
Hosted session
Icon changes go through a browser: open the site, restore the previous config.json, adjust the selection, export, unzip, copy files into the project. The configuration is posted to the service, which is where the session lives. Correct output depends on someone performing those steps correctly.
A third-party Node CLI, fontello-cli, can install a config against a host, which helps. It still talks to the hosted service, and there is no check that fails when what is committed no longer matches your sources.
Local compile
Icon changes are file changes. Add an SVG, run one command, commit the result. The codepoint registry is a file in the repository, so a reviewer sees assignments in the diff, and CI can rebuild and compare on every push.
Nothing leaves the machine, and rebuilds are byte-identical given the same inputs, so a regenerated font produces no spurious diff.
glyphpact assets/icons \ --output lib/generated/app_icons \ --name AppIcons
Codepoints
Fontello's config.json stores a code per glyph, so re-importing it preserves your assignments. Like IcoMoon'sselection.json, this is a real mechanism whose reliability depends on a human keeping the file and importing it every time.
GlyphPact differs in three ways that matter once more than one person touches the icon set. The registry is written automatically into the output rather than downloaded and re-uploaded. Deleted icons leave permanent tombstones instead of releasing codepoints for reuse. And--check gives CI a way to prove the committed font still matches its sources, exiting 3 when it does not.
The codepoint registry explained, with a real lock file diff
Unsupported SVG features
Neither FlutterIcon.com nor the pub.dev packageicon_font_generatorpublishes a policy for SVG that a monochrome outline font cannot represent. That does not mean they handle it badly; it means the behaviour is not specified, so you learn it by finding out.
GlyphPact specifies it. Every source lands in exactly one of three outcomes, both policy axes default to error, and every approximation or omission is reported with a diagnostic code, a classification, an action, and the feature responsible. A build that would quietly degrade an icon fails instead, until you say otherwise.
This cuts both ways. Strict defaults mean GlyphPact will reject a pack that another generator would happily compile. If you have a pile of decorative SVGs with gradients and filters and you just want something rendered, GlyphPact will feel obstructive. That is the intended trade, not an oversight.
Side by side
The full comparison
icon_font_generator is included because it is the other common answer to this problem: a pure-Dart CLI with no hosted component.
| GlyphPactLocal CLI compiler | FlutterIcon.comHosted Fontello fork | icon_font_generatorDart CLI | |
|---|---|---|---|
| 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: If you re-import config.jsonInherits the Fontello session model, where the downloaded `config.json` records each glyph code and can be imported again. Stability depends on retaining and re-importing that file. | Not documented: No documented mechanismNeither the pub.dev page nor the README documents a lock file or persistence mechanism. Published examples show codepoints running sequentially from `0xe000` in glyph order. |
| 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 supported: No first-party staleness checkThe third-party `fontello-cli` can install a config against a host, but neither it nor the site offers a check that fails on stale committed output. | Not supported: Not offeredThe CLI generates output. No check or verify mode is documented. |
| 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. | Not supported: Hosted service sessionA hosted web application in the Fontello lineage, where the font configuration is posted to the service and held in a server-side session. | Supported: Local CLIRuns locally. Described as written fully in Dart with no external dependency. |
| 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 | 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: No published policy | Not documented: No published policyExposes `--[no-]normalize` and `--[no-]ignore-shapes` flags, but documents no classification of unsupported input. |
| Generates a Flutter IconData APIHand-written IconData constants are the place codepoint drift actually bites. | Supported: Const class, tree-shakeableEmits a `@staticIconProvider` class of `const IconData` values, with `fontPackage` handling and optional layered-icon widgets. | Supported: Dart icon classPurpose-built for Flutter: exports a font plus a Dart icon class. | Supported: Dart icon classGenerates an OTF font and a Flutter-compatible class. |
| 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: Web font packFontello lineage produces web font formats alongside the Flutter output. | Not supported: OTF only |
| 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. | Conditional: Bundled-pack licencesShips licence information for the open-source packs it bundles. Not an attribution file generated from your own artwork metadata. | Not supported: Not offered |
| 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 browserOptional third-party CLI needs Node. | Supported: Dart |
| 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 | Not supported: Not offered |
Try it
Compile a pack you already have
uv tool install glyphpactInstalls the latest stable release from PyPI, currently v1.0.1. Already installed? Run uv tool upgrade glyphpact. Release notes.
If you currently use FlutterIcon.com, export your set once, commit the SVG sources, and compile from those. GlyphPact does not care what drew them.
Verified on 2026-07-25against fluttericon.com,ilikerobots/polyicon,fontello/fontello, andpub.dev/packages/icon_font_generator. If any of this has changed, it should be corrected.