By Samuel Erb
A Strapi v5 custom field plugin that provides an intuitive icon picker for Lucide icons. Icons are stored as kebab-case strings and accessible via the Strapi API.
released September 3, 2026
npm install @samuel-erb/strapi-plugin-lucide-icon-pickerA Strapi v5 custom field plugin that provides an intuitive icon picker for Lucide icons. Icons are stored as kebab-case strings and accessible via the Strapi API.

Starting with 2.0.0, this plugin uses lucide-react ^1.x. Lucide 1.0 renamed several
icons (e.g. check-circle → circle-check, x-circle → circle-x) and removed all
brand icons (GitHub, Slack, Figma, etc.) entirely — see Lucide's
upgrade guide for the full list. If your existing
content uses one of those names, it will silently fall back to a placeholder icon after
upgrading, since that icon no longer exists.
If you have existing content and aren't ready to deal with that yet, stay on the last
release built on lucide-react 0.x:
npm install @samuel-erb/strapi-plugin-lucide-icon-picker@^1.3.0npm install lucide-icon-pickerconfig/plugins.js:module.exports = () => ({
'lucide-icon-picker': {
enabled: true,
},
});npm run build
npm run developThe icon picker provides an intuitive interface where you can:
Icons are returned as kebab-case strings in your API responses:
{
"data": {
"id": 1,
"attributes": {
"title": "My Article",
"icon": "arrow-down",
"publishedAt": "2024-01-15T10:00:00.000Z"
}
}
}Wrap the kebab-case strings in one component that does validation, lazy-loading and a fallback.
// components/ApiIcon.tsx
import { DynamicIcon, dynamicIconImports } from "lucide-react/dynamic";
import type { LucideProps } from "lucide-react";
// Same set of names lucide-react actually ships — used to validate Strapi input.
type IconName = keyof typeof dynamicIconImports;
function isValidIconName(name: string): name is IconName {
return name in dynamicIconImports;
}
interface ApiIconProps extends LucideProps {
name: string; // raw, unvalidated string as it comes from Strapi
}
export default function LucideIcon({ name, ...props }: ApiIconProps) {
// Guard against renamed/removed/typo'd icon names from Strapi so a bad
// value can't crash rendering — fall back to a neutral placeholder icon.
if (!isValidIconName(name)) {
return <DynamicIcon name="circle-help" {...props} />;
}
// DynamicIcon code-splits and lazy-loads only the icons actually used,
// instead of bundling all ~1800 lucide icons.
return <DynamicIcon name={name} {...props} />;
}This plugin supports all icons from the Lucide icon library, including:
# Install dependencies
npm install
# Download latest Lucide icons and build the plugin
npm run build
# Or update icons manually
npm run update:lucide-data
# Run TypeScript checks
npm run test:ts:front
npm run test:ts:back
# Watch for changes during development
npm run watchThe plugin can be tested locally using Yalc:
# In the plugin directory
npm run build
npx yalc publish
# In your Strapi project
npx yalc add lucide-icon-picker
npm install
npm run developContributions are welcome! Please feel free to submit issues and enhancement requests.
If you find this plugin helpful, consider supporting its development:
MIT License - see LICENSE file for details.
Share your work with the community and get it listed in the Strapi ecosystem for everyone to discover and use.
Submit
