By Nasr Aldin
A custom field plugin for Strapi v5 that allows content editors to easily select icons from Lucide Icons and Duo Icons libraries.
released February 1, 2026
npm install strapi-icon-picker-xA custom field plugin for Strapi v5 that allows content editors to easily select icons from Lucide Icons and Duo Icons libraries.

npm install strapi-icon-picker-xyarn add strapi-icon-picker-xpnpm add strapi-icon-picker-xNote: Replace
strapi-icon-picker-xwith your actual npm package name when published.
After installation, register the plugin in your Strapi configuration file:
File: config/plugins.ts
export default () => ({
'icon-picker': {
enabled: true,
},
});Note: Replace
strapi-icon-picker-xwith your actual npm package name when published.
Or if you're using a local development version:
export default () => ({
'icon-picker': {
enabled: true,
resolve: './src/plugins/icon-picker',
},
});Add the icon-picker custom field to any content type or component schema:
Example: src/components/sections/card.json
{
"collectionName": "components_sections_cards",
"info": {
"name": "card",
"displayName": "Card",
"description": "A card component with icon support"
},
"attributes": {
"title": {
"type": "string",
"required": true
},
"icon": {
"type": "customField",
"customField": "plugin::icon-picker.icon-picker",
"required": false
}
}
}Example: src/api/feature/content-types/feature/schema.json
{
"kind": "collectionType",
"collectionName": "features",
"info": {
"singularName": "feature",
"pluralName": "features",
"displayName": "Feature"
},
"attributes": {
"name": {
"type": "string",
"required": true
},
"icon": {
"type": "customField",
"customField": "plugin::icon-picker.icon-picker",
"required": false
}
}
}The icon picker stores icon data in the following format:
library:iconNameExamples:
lucide:Home - Lucide Home iconduo:add_circle - Duo add_circle iconWhen consuming the API, you'll receive the icon value as a string in the format library:iconName. You can parse this and render the appropriate icon:
import { Home, Heart } from 'lucide-react';
import DuoIcons from 'duo-icons';
function IconRenderer({ iconValue }: { iconValue: string }) {
if (!iconValue) return null;
const [library, iconName] = iconValue.split(':');
if (library === 'lucide') {
// Dynamically import Lucide icons
const IconComponent = require(`lucide-react`)[iconName];
return IconComponent ? <IconComponent /> : null;
}
if (library === 'duo') {
// Render Duo icon
const IconSvg = DuoIcons.icons[iconName];
if (IconSvg) {
return <div dangerouslySetInnerHTML={{ __html: IconSvg }} />;
}
}
return null;
}import { Home } from 'lucide-react';
export default function FeatureCard({ feature }) {
const [library, iconName] = feature.icon?.split(':') || [];
return (
<div>
{library === 'lucide' && iconName === 'Home' && <Home />}
<h3>{feature.name}</h3>
</div>
);
}The icon field will be included in your API responses:
{
"data": {
"id": 1,
"attributes": {
"title": "My Feature",
"icon": "lucide:Home",
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2024-01-01T00:00:00.000Z"
}
}
}The plugin includes translations for:
Additional languages can be added by contributing translation files.
git clone <repository-url>
cd strapi-icon-pickernpm install
# or
yarn installnpm run build
# or
yarn buildnpm run watch:link
# or
yarn watch:link// config/plugins.ts
export default () => ({
'icon-picker': {
enabled: true,
resolve: './src/plugins/icon-picker',
},
});npm run buildThis will create the dist folder with the compiled plugin ready for npm publishing.
Contributions are welcome! Please feel free to submit a Pull Request.
MIT
Nasr Aldin
For issues, questions, or contributions, please open an issue on the GitHub repository.
Share your work with the community and get it listed in the Strapi ecosystem for everyone to discover and use.
Submit
