Decision — icons and type
Status: accepted 2026-10-09.
The decision
- Icons are Lucide. Every icon in MixOS applications and the desktop
comes from the Lucide set: 24 px grid, round caps and
joins, a single stroke colour. Icons are taken unmodified from a pinned
upstream release and ship with Lucide's licence (ISC, with MIT for the
icons derived from Feather) and a
NOTICEline. A component ships only the icons it uses. - Type is Inter and JetBrains Mono. Interface text is Inter; numbers, code and JSON are JetBrains Mono. Both are SIL OFL 1.1 and ship as unmodified static faces from their upstream releases.
- The shipped desktop sizes are Inter Regular at 12.5 px for body text, 10.5 px for small text, Inter SemiBold at 15 px for headings, Inter Medium for emphasis, and JetBrains Mono at 12 px.
- Weight is a design token. Each typography role names a weight, and the renderer selects the static face of that weight (300 Light, 400 Regular, 500 Medium, 600 SemiBold). A light profile, with body text at 300, is a change to the design's weights and nothing else.
- Icon stroke is a design token. The design metric
icon.stroke_widthsets the stroke every icon is drawn with (default 1.5, the approved baseline; a session choice may override it, see session icon stroke and type), so a lighter icon set accompanies a lighter type profile without new assets. - Colour comes from the theme. Icons take the colour of the text around them; no icon carries a colour of its own.
Why
One icon family and one type family give every MixOS application, and the external applications that run alongside them, the same look. Making weight and stroke tokens keeps the visual weight of the whole desktop adjustable in one place.
Consequences
libs/toolkitembeds the faces and icons and applies them from the theme.- A new icon is added by copying its SVG from the pinned Lucide release into the component that uses it and listing it there.