
Enable seamless icon selection and management with Iconify integration for optimized SVG rendering
released April 19, 2026
npm install @arshiash80/strapi-plugin-iconhub![]()
IconHub is a custom field for Strapi that brings the Iconify catalog into the admin panel. Editors can browse icon sets, search globally, inspect a single set in detail, apply colors, and store either the Iconify name, raw SVG, or both.
The demo covers the picker flow, icon set browsing, icon editing, and color customization.
npm i @arshiash80/strapi-plugin-iconhubRebuild the admin panel after installation:
npm run build
npm run developVerify the plugin in Settings > Plugins.
![]()
Open Content-Type Builder, add a new custom field, and select IconHub.
![]()
The field then appears in the content entry UI like any other Strapi input.
![]()
IconHub supports three storage modes:
iconName: store the Iconify identifier, such as mdi:homeiconData: store raw SVG markupThis is configured in the field settings.
![]()
In Basic Settings, you can decide which Iconify collection categories are available for this field. This is the main control for narrowing the picker to a design system, brand icon family, emoji-only field, and similar editorial use cases.
![]()
The default picker state is built around icon-set discovery. Editors can browse allowed categories first, then open a set when they want a tighter visual search space.
![]()
The discovery view supports metadata-driven filtering for common browsing patterns:
![]()
Editors can search across all allowed sets from the main toolbar, or open a single set for focused browsing and in-set search.
![]()
The set browser keeps the current set context visible:
The picker works well across both monotone and multicolor sets.
![]()
Once an icon is selected, the field shows the chosen icon in the entry form and exposes an edit action for further adjustments.
![]()
The edit modal includes:
![]()
Depending on configuration, IconHub stores some or all of the following fields:
type IconFieldValue = {
iconName: string | null;
iconData: string | null;
width: number | null;
height: number | null;
color?: string | null;
isSvgEditable?: boolean;
isIconNameEditable?: boolean;
};iconNameUse this when you want Iconify to resolve the icon on the frontend:
import { Icon } from '@iconify/react';
type IconValue = {
iconName: string | null;
width: number | null;
height: number | null;
color?: string | null;
};
export function IconFromName({ value }: { value: IconValue }) {
if (!value.iconName) return null;
return (
<Icon
icon={value.iconName}
width={value.width ?? 24}
height={value.height ?? 24}
color={value.color ?? undefined}
/>
);
}iconDataUse this when you want full control over the SVG and do not want runtime icon lookups:
type IconValue = {
iconData: string | null;
width: number | null;
height: number | null;
color?: string | null;
};
export function IconFromSvg({ value }: { value: IconValue }) {
if (!value.iconData) return null;
return (
<svg
width={value.width ?? 24}
height={value.height ?? 24}
viewBox={`0 0 ${value.width ?? 24} ${value.height ?? 24}`}
style={{ color: value.color ?? undefined }}
dangerouslySetInnerHTML={{ __html: value.iconData }}
/>
);
}Useful local commands:
npm run build
npm run watch
npm run watch:link
npm run verify
npm run docs:sync-media
npm run docs:readmeType-checking can be run directly with tsc:
npx tsc -p admin/tsconfig.json --noEmit
npx tsc -p server/tsconfig.json --noEmitDocumentation images and videos are stored in assets/docs/. Update README.source.md, sync changed assets to Cloudinary, then regenerate the published README:
npm run docs:sync-media
npm run docs:readmeThe Cloudinary sync script uploads only changed README assets, stores their content hashes in docs/readme-media-manifest.json, and lets README.md use Cloudinary delivery URLs for marketplace-safe media rendering. Unsynced assets fall back to jsDelivr URLs.
MIT
Share your work with the community and get it listed in the Strapi ecosystem for everyone to discover and use.
Submit
