The system uses Lucide — an open-source outline family drawn on a 24×24 grid with a 2px default stroke. Over 1,400 glyphs, one visual voice, zero custom SVGs. Icons are quiet — they support copy, they don't replace it.
Outline, geometric, 24×24 grid. Stroke 2px at default size. Every glyph shares consistent line endings (round caps, round joins) so any combination reads as one system.
Five canonical sizes. Pair icon size to line-height of adjacent text. Never scale an icon below 14px or above 56px — pick the next step instead.
Four ways icons show up in the UI. Inline (currentColor) is the default. Tinted tile for feature rows and alerts; solid fill (coloring the stroke, not adding fills) for emphasis; circle halo for avatar-adjacent meta.
The 40 icons that cover ~80% of product UI. Everything else ships from lucide-react on demand — no need to curate.
How icons show up inside real components.
Icons in buttons use 2.25 stroke to hold weight against button text.
A few rules that keep the system cohesive over time.
Two ways to consume — the CDN script on static pages, or the lucide-react package in apps.
/* 1. Static — drop into any HTML */ <script src="https://unpkg.com/lucide@latest/dist/umd/lucide.min.js"></script> <i data-lucide="arrow-right"></i> <script>lucide.createIcons()</script> /* 2. React — preferred in product */ import { ArrowRight, Bell } from 'lucide-react'; <ArrowRight size={16} strokeWidth={2.25} /> <Bell className="text-iris-700" /> /* Sizing — match the line-height of adjacent text */ .akku-btn svg { width: 14px; height: 14px; stroke-width: 2.25; } .akku-nav svg { width: 16px; height: 16px; stroke-width: 2; } .akku-hero svg { width: 56px; height: 56px; stroke-width: 1.5; }