Case study · Personal product
Iconic
General design tools don't know Material's rules, so I designed and built Iconic, a vector editor made only for Google Material icons. It runs in the browser on PC and phone and exports the single-path format Google ships.
The problem
Material icons have rules general tools don't know
A Material icon is a 24dp square with 2dp padding, drawn to keylines in Outlined, Rounded or Sharp, and shipped as one filled path on a 960-unit grid. Illustrator and Figma can draw that but don't know it, so I fixed exports by hand: strokes, overlaps and white fake holes shifted or filled in elsewhere. I wanted to draw once and get Google's format out, on PC or phone.
Process
Live in an hour, shaped over 28 commits
I built Iconic with Claude in one day: I made the product calls, Claude wrote and tested the code, and each feature shipped to the live app as its own commit.
- Ship first. A basic editor was live on GitHub Pages in hour one; I reviewed every build by using it.
- Figma panels, Illustrator keys. V, A, P, Ctrl+D and Alt-drag work as expected, so nothing new to learn.
- Fast over pure. TypeScript plus Google's Skia in WebAssembly instead of Rust, with that option kept open.
- Questions before features. Asking first produced the export plan, Roboto Flex as the UI font and a GPL v3 license.
Material mode
The specs are built in
Material rules are defaults in Iconic, not things to remember.
- 24dp artboards, whole-pixel snapping and a keyline template with padding, live area and base shapes.
- One choice of Outlined, Rounded or Sharp sets line ends, corners and corner radius.
- snake_case names, exported as
arrow_back_24dp.svgthe way Material Symbols names them. - A Material mode switch hides it all for other icon work: sizes 16 to 64, no dp suffix.
Booleans and badges
Combined shapes stay editable
Combining shapes never destroys them, so one base icon can carry a whole family of badges.
- Live booleans. Union, Subtract, Intersect and Exclude stay editable, computed by Skia PathOps, Chrome and Android's path engine.
- Components. Any artboard or selection becomes a component; linked copies follow every edit.
- Knockout badges. Plus, minus, check, close, alert and arrows cut a shape-matched gap, exact in export.
- Make variants. Pick bases and badges to generate every combination, named like
file_add.
Export
What you draw is what Google gets
Export outlines strokes, merges every shape and clips to the artboard, giving one filled path on the 960-unit grid while the working file stays editable.
- Pixel check. The working icon and merged path are rendered and compared pixel by pixel before export.
- Warnings. Flags extra colors and off-artboard art, and turns white fake holes into a real Subtract.
- Merged preview (Ctrl+Y) shows every icon as it will export while you keep editing.
- Formats: SVG, Android Vector Drawable, PNG at every Android density, and an OTF/WOFF icon font.
Borrowed from type design
Font tools, pointed at icons
Type designers solved smooth curves and consistent weights long ago, so I picked eight FontLab 8 features and built them for icons.
- Tunni lines. Drag the dashed line between a curve's handles to make it fuller or flatter.
- Power Nudge and Smart Corners. Points move without flattening curves; rounded corners stay one point.
- Audit. Flags flat curves, missing extremes, tiny segments and off-grid points, each with a Fix button.
- Weight masters. Draw a base and bold master, matched point for point, and generate weights 100 to 700.
Normal handles
Each handle is dragged on its own. The two lengths drift apart and the curve goes lopsided.
Tunni line
One drag on the dashed line moves both handles together, so the curve keeps its balance.
PC and phone
One app, installed anywhere
Iconic is a Progressive Web App: install it from Chrome or Edge, or add it to an iPhone or Android home screen. It works offline and saves as you go. On a phone the panels fold behind toolbar buttons, and pinch zoom, touch and stylus all work. There's no server or account, and the font library loads only when you export a font.
Testing
Every feature checked in a real browser
Each feature was tested with scripted mouse and keyboard input and measured results, and the tests caught real bugs.
- Smart Corners: a pen-drawn square rounded to R 2 matched a 2px rounded rectangle exactly.
- Audit: a deliberately messy path got 10 flags, and Fix all cleared every one.
- Icon font: typing
file_adddrew the plain file, so longer names now match first. - Pixel check: it caught badges exporting in the wrong color; they now take the icon's color.
Revisions
What changed since launch
After the first-hour version, the biggest changes were the Figma-style interface, Material specs, live booleans with Google-format export, badges and the type-design tools.
All 17 changes
New features
- Figma-style interface with Illustrator keyboard shortcuts.
- Artboards, grid controls and Material keylines, styles, sizes and naming.
- Smart guides that snap to edges, centers and anchor points.
- Live boolean groups and Google-format single-path export with a pixel check.
- A styled color picker with a Material palette and eyedropper.
- Components, badges with knockout gaps, and the variant generator.
- A Material mode switch for general icon work.
- Tunni lines, Power Nudge, Smart Corners, Audit, Overview, Elements, icon font and weight masters.
Improvements
- Roboto Flex as the interface font, bundled so it works offline.
- The view stays centered on your work when the window resizes.
- Style, line-end and corner choices became icons, all at one stroke weight.
- Material options sit next to their switch and hide when it's off.
- The installed app shows updates right away, not on the next visit.
Fixes
- Cramped icon size row and missing space above label rows.
- Holes cut with Subtract filled back in when exported.
- The Design panel didn't refresh after clicking a switch.
- Badges exported in the wrong color; the icon font matched short names first.
What's next
Things to improve
- SVG import. Iconic exports cleanly to Figma and Illustrator but can't open their files yet, so import with round-trip tests would let me bring existing sets in.
- Fill and optical-size axes. Weight is the only axis today, and the masters system could also cover Material Symbols' fill and optical size.
- Cleaner generated weights. In-between weights land on fractional coordinates that Audit flags, so snapping during Generate would save a Fix all step.
- More export targets. The font has no WOFF2 and there's no iOS asset export yet, and both would round out the developer handoff.
- Real-device testing. Testing used scripted input in a desktop browser, so a pass on an iPhone and an Android tablet with a stylus would show where touch needs work.
Available for work