guava/filament-icon-picker
Filament Icon Picker adds an icon picker form field and matching table column to Filament panels. Choose from any installed blade-icons kit, Heroicons included by default—ideal for custom navigation, model, and frontend icons. Token-secured endpoints, configurable caching.
/_icon-picker, a publishable config for prefix/middleware/cache, a required custom Filament theme with an @source directive, and a required filament:assets step. These are real onboarding costs that belong in your release checklist and installer docs, not surprises in QA.Consider it when all of the following hold:
@source line is the most common self-inflicted "styles don't load" bug.filament-icon-picker.cache.*, CanBeCacheable removed, getSetJs() / getIconsJs() / getIconSvgJs() removed in favor of the new routes, and getIcon() now returning null for missing files. Any custom code touching those APIs needs a migration ticket.Look elsewhere or build deliberately when:
Select with hardcoded options is less surface area than a plugin, two routes, config, and a theme build step.A reasonable adoption path: pilot on one surface (e.g., navigation item icons), pin the version, publish the config so route prefix and cache settings are under your control, and only then expand to tenant-level custom icon uploads.
For executives (one paragraph): We can offer customers customizable iconography — their own brand icons, or a curated set on menus, categories, and dashboards — for roughly the cost of a Composer dependency rather than a development cycle. It is a mature, MIT-licensed, actively maintained plugin for our admin framework that handles the picker UI, search, secure icon delivery, and caching. The commercial angle is plan-tier differentiation: icon sets can be gated per customer without new engineering. The risk is low and bounded — small open-source package, single maintainer, easy to fork — and the main cost is a short setup step in our theme build, not ongoing maintenance.
For engineering: Drop-in Filament form field and table column (IconPicker::make('icon') / Guava\IconPicker\Tables\Columns\IconColumn). Works with any installed blade-icons kit, Heroicons by default. Requires filament:assets and an @source line in our custom theme CSS — put both in the installer runbook. The 5.x line is the one to take: it serves icons over two token-authorized endpoints under /_icon-picker instead of Livewire, caches icon listings server-side, batch-fetches SVGs, and replaces fuse.js with uFuzzy for search. Publish the config so we own the route prefix, middleware, and cache TTL. Note the 5.0.0 breaking changes (config namespace, removed getSetJs/getIconsJs/getIconSvgJs, getIcon() returning null) before any upgrade. We should pin the version, cover the upgrade path in our own changelog, and keep our usage behind our own wrapper component so a fork or replacement stays cheap.
For design/product ops: The field supports scoped, limited icon sets and user uploads with SVG sanitization, so we can expose "your brand icons" to tenants while keeping the default experience curated. Preview and search behave as a proper picker, not a raw dropdown.
Ask: Approve a one-surface pilot (navigation icons) with a version pin and a documented upgrade path; revisit a broader rollout — and premium icon packs as a paid tier — after one release cycle of real usage.
How can I help you explore Laravel packages today?