4.5.0 (2026-08-12)
Featuresโ
4.4.0 (2026-08-12)
Featuresโ
4.3.0 (2026-08-12)
Featuresโ
4.2.0 (2026-08-12)
Featuresโ
- babel: find icons wherever the source already proves them (1f28bd3)
4.1.0 (2026-08-12)
Featuresโ
4.0.1 (2026-08-11)โ
Bug Fixesโ
4.0.0 (2026-08-11)
BREAKING CHANGESโ
-
AnimationConfig no longer accepts type: 'sequence'. Code using it compiled but produced no animation, so this turns a silent no-op into a compile error. Use one of the presets โ spin, pulse, bounce, shake, ping, wiggle โ or a rotate/scale/opacity/translate config.
-
fix(explorer): stop refetching every collection on every render
useExplorer({ iconSets: ['mdi'] }) โ a hook called the way hooks are called โ never stopped fetching. The config object is rebuilt on each render, the memo that selects icon sets was keyed on that object so it produced a new array each time, the effect that fetches collections depends on that array, and the effect sets state. Each render caused a fetch and each fetch caused a render.
In an application that is an unbounded stream of requests to api.iconify.design. Writing the first test that mounted the hook with an inline config took the test process out of memory.
The selection is now keyed on the prefixes themselves rather than the array holding them.
Two smaller defects on the same paths:
- Unmounting aborts every request in flight, and the abort was logged as "Failed to fetch collection" โ once per icon set, for something that worked. Genuine failures are still reported, now behind DEV and prefixed.
- The web clipboard path had no catch. The browser rejects writeText when the document is not focused or the permission was refused, so copying an icon could surface as an unhandled rejection.
The hook had 71% line coverage across fetching, searching, debouncing, aborting, selecting and copying; the tests it did have covered the pure helpers around it. Adds 19 covering what it does rather than what it returns.
- fix(native): ship the native module and compile it
The native module was never published. files listed neither ios/ nor
android/ nor react-native.config.js, so every installed copy of this package
contained no native code at all: isNativeModuleAvailable() returned false for
every consumer, the native prefetch and cache-stats paths were unreachable,
and ten documentation pages described a module that could not exist. CI parsed
the sources with swiftc and ktlint, which is the one kind of check that could
not notice.
Building it in a real app found five more things, none of which a parse could have caught:
- The podspec was inside ios/ and reached through a podspecPath in react-native.config.js. Autolinking looks for it at the package root: "list_native_modules! skipped the react-native dependency 'rn-iconify'. No podspec file was found." Moved to the root, which is the convention, and the config file it existed for is gone.
- codegenConfig was in react-native.config.js. React Native's codegen reads it from package.json, so codegen never ran, and the specs it should have generated were written by hand โ including a header whose comment says "Auto-generated".
- The spec file held two TurboModuleRegistry calls, one of them unused. Codegen refuses that outright. It also has to be named after the module it registers, so NativeIconifyModule.ts became NativeRNIconify.ts and codegen now emits exactly the NativeRNIconifySpec / NativeRNIconifySpecJSI that RNIconify.mm and the Android spec were already written against. Both hand-written spec files are deleted.
- Kotlin compiled at jvmTarget 1.8 against Java 17, which Gradle refuses.
- Swift reached React Native's promise types through a bridging header, and a bridging header cannot be used when the target builds as a framework โ which is how React Native links by default. Only two block types were involved; they are declared in Swift with the same ABI and the header is gone.
- RNIconify.mm imported <React/RCTTurboModule.h>, which does not exist.
The podspec also claimed iOS 13, below what React Native itself supports; it now follows min_ios_version_supported.
CI no longer parses the sources. It builds the example app on both platforms: Gradle assembleDebug on Linux and xcodebuild on macOS, through autolinking and codegen, against React Native's own headers.
Verified locally on the example app: iOS BUILD SUCCEEDED, Android BUILD SUCCESSFUL, with RNIconify autolinked and RNIconifySpec generated.
- docs: import the development-only exports from where they live
The performance monitor and the icon explorer moved to rn-iconify/dev at some point, to keep them out of production bundles. Nine documentation pages went on importing them from 'rn-iconify', where they are not exported โ every one of those snippets fails to compile if it is followed.
The explorer module's own JSDoc pointed at 'rn-iconify/explorer', which is not an entry point this package has.
- chore(example): bring the example app up to the stack it demonstrates
The example was two Expo majors behind and no longer compiled. Its TypeScript failed against the library it demonstrates โ it imported the performance monitor and the icon explorer from 'rn-iconify' after they moved to 'rn-iconify/dev' โ and its iOS build failed outright, because React Native 0.79 bundles a version of fmt that current Xcode rejects.
Now on Expo 54 and React Native 0.81.5, matching the application this package was written for. The library's own entry points are aliased so the example reaches them the way an installed copy would, rather than only the root one.
It also never declared the library as a native dependency: it resolved it through Metro alone, so autolinking never saw it, and the example built and ran with no native module in it. That is a large part of how the native module stayed unlinked without anyone noticing. It is declared now.
Two smaller corrections found by rebuilding: the splash screen moved to its own config plugin in SDK 52 and the top-level key was being ignored, and the peer dependencies npm was auto-installing (nitro-modules, worklets) are now written down.
Coverage thresholds are raised from 80/69/83/80 to 90/77/89/91, just under what the suite reaches, so a real regression fails.
3.2.2 (2026-08-11)โ
Bug Fixesโ
3.2.1 (2026-08-11)โ
Bug Fixesโ
3.2.0 (2026-08-11)
Bug Fixesโ
Featuresโ
3.1.5 (2026-08-11)โ
Bug Fixesโ
- resolve aliases that point at a hidden icon (995752c)
3.1.4 (2026-08-11)โ
Bug Fixesโ
- keep icons Iconify has hidden rather than deleted (68f948c)
3.1.3 (2026-08-11)โ
Bug Fixesโ
- emit generated components already formatted (5d19059)
3.1.2 (2026-08-11)โ
Bug Fixesโ
- keep icon names that Iconify has renamed (6d5a526)
3.1.1 (2026-08-11)โ
Bug Fixesโ
- let bundlers tree-shake the icon sets (1c6fba7)
3.1.0 (2026-08-08)
Featuresโ
- sync icon sets with Iconify API (ba30720)
3.0.3 (2026-08-07)โ
Bug Fixesโ
- network: stop aborts from crashing on Hermes (a3c3669)
3.0.2 (2026-03-15)โ
Bug Fixesโ
- cache: support MMKV v4.x remove() method (replaces deprecated delete()) (739d913)
3.0.1 (2026-03-12)โ
Bug Fixesโ
- ci: ignore attw node10/esm rules for RN library (d3fdc69)
3.0.0 (2026-03-12)
- feat!: core engine rewrite, typed errors, accessibility, performance (d471692)
Bug Fixesโ
- ci: pin react and react-native dev deps for strict npm ci (4518430)
BREAKING CHANGESโ
- IconRenderer rewritten with useReducer state machine. SVG colorization regex removed for native SvgXml color prop. Rotate prop widened to number. Dev exports moved to rn-iconify/dev. onError receives IconLoadError instead of Error.
3.0.0 (2026-03-12)
BREAKING CHANGESโ
- IconRenderer rewrite โ
useReducerstate machine replaces 4 independentuseStatecalls. SVG colorization regex removed in favor ofSvgXmlnativecolorprop (multi-color icons now render correctly). - Rotate prop โ
IconRotationtype widened from0 | 90 | 180 | 270tonumber(any degree value). - Dev exports moved โ
IconExplorerandPerformanceMonitorruntime exports moved torn-iconify/dev. Type-only exports remain in main entry. - Typed errors โ
onErrorcallback now receivesIconLoadError(with.code: 'NOT_FOUND' | 'NETWORK' | 'TIMEOUT' | 'INVALID_SVG') instead of genericError.
Featuresโ
- React.memo + forwardRef โ All icon components (
createIconSet,createIconAliases) wrapped withReact.memoandReact.forwardReffor optimal re-render performance and ref access. - Auto accessibility โ
accessibilityRole="image"and auto-generated labels on all icons.shouldDisableAnimations()respects system reduce motion. Auto 44dp minimum touch target viahitSlop. - O(1) LRU cache โ
MemoryCacherewritten with Map insertion-order LRU. Eviction no longer requires O(n log n) sort. - Typed errors โ New
IconLoadErrorclass withcodeproperty for consumer-friendly error handling. - Deep imports โ
import { Mdi } from 'rn-iconify/icons/Mdi'for per-icon-set tree-shaking. - Dev entry point โ
rn-iconify/devforIconExplorerandPerformanceMonitor(keeps production bundle lean). - Fuzzy matching โ
__DEV__mode shows "Did you mean X?" for misspelled icon names via Levenshtein distance. - Shimmer gradient โ Placeholder shimmer effect upgraded from single solid bar to 3 staggered opacity bars.
- Accessibility โ
isInvertColorsEnabledreplaces incorrectisBoldTextEnabledproxy for high contrast detection.
Bug Fixesโ
- Theme infinite loop โ
useState+useEffectanti-pattern replaced withuseMemoapproach. Inline theme props no longer cause infinite re-renders. - Animation rotate โ Interpolation now uses
config.from/config.toinstead of hardcoded[0, 360]. - Animation sequence โ
__DEV__warning instead of silent null for unsupported sequence type. - CacheManager โ
loadBundle()wrapped intry/finallyto ensureisLoadingBundleflag is always reset. - Network abort โ Abort signal isolation for concurrent fetch deduplication.
- Babel plugin โ Stale build detection (>60s auto-reset) with
try/finallycleanup inpost()hook. - Scanner โ O(n) single-pass regex replaces nested iteration.
- CLI โ Version reads from
package.jsoninstead of hardcoded'1.0.0'. Parser uses full 200+ component prefix map.
Package Qualityโ
- 797 tests across 25 suites (was 523/20 in v2.2.1)
- 81% statement coverage with enforced thresholds
- 38.5 MB unpacked (source maps excluded)
- publint โ 1 warning (bob tooling limitation)
- size-limit โ Full bundle 687 kB, single icon set 36 kB
- ESM/CJS โ Proper dual package with
lib/module/package.json{"type":"module"} - Conditional exports โ Nested
import/requiretypes for correct module resolution
2.2.1 (2026-02-04)โ
Bug Fixesโ
- resolve project root, scanner validation, and multi-worker dedup (ddecd27)
2.2.0 (2026-02-03)
Featuresโ
- babel: add project scanner, incremental bundles, and auto-inject (d9d86f1)
- metro: add dev server plugin, warmup, fade-in, and package exports (e89eb4c)
2.1.1 (2026-01-07)โ
Bug Fixesโ
- add
CLAUDE.md, update test types, improve caching, CLI, and API handling (8505d7a) - bump dependencies and update version (2da32e2)
- bump dependencies and update version (90cde1d)
- enable trusted publishing for npm releases (cca7df5)
2.1.1 (2026-01-07)โ
Bug Fixesโ
- add
CLAUDE.md, update test types, improve caching, CLI, and API handling (8505d7a) - bump dependencies and update version (2da32e2)
- bump dependencies and update version (90cde1d)
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[2.1.0] - 2025-12-05โ
Addedโ
- Pressable Icons - All icons now support
onPress,onLongPress,onPressIn,onPressOutprops - Press Feedback - New
pressedStyleprop for custom visual feedback when pressed - Disabled State - New
disabledprop to disable press interactions - NativeWind Support - New
classNameprop for Tailwind CSS styling with NativeWind - Icon Sets Reference - New documentation page with all icon set prefixes and usage examples
Changedโ
- Icons are automatically wrapped in
PressablewhenonPressoronLongPressis provided (no wrapper needed otherwise) - Updated
components.mdxdocumentation with new props and examples - Improved JSDoc documentation for
IconPropsinterface
Fixedโ
alias/Icon.tsxnow correctly passes animation and press props toIconRenderer
[2.0.1] - 2025-12-04โ
Changedโ
- Cache Location - Default cache output path changed to
node_modules/.cache/rn-iconify(no more.rn-iconify-cachein project root) - Improved documentation build workflow and test coverage
- Added Open Graph and Twitter meta tags for better social sharing
Fixedโ
- Logo image source in README
[2.0.0] - 2025-12-03โ
Addedโ
- Theme System -
IconThemeProvideranduseIconThemefor global icon styling - Icon Aliases -
createIconAliasesandIconAliasProviderfor custom icon name mappings - Animated Icons -
AnimatedIconcomponent with 6 presets (spin, pulse, bounce, shake, ping, wiggle) - React Navigation Integration -
createTabBarIcon,createDrawerIcon,createHeaderIconhelpers - Accessibility Support -
AccessibilityProvider,useAccessibleIcon, high contrast mode, reduced motion - Performance Monitoring -
PerformanceMonitor,getPerformanceReport, cache hit rate tracking - Icon Explorer - Interactive dev tool for browsing and testing 268,000+ icons
- Placeholder System - Built-in loading states (skeleton, pulse, shimmer)
- Babel Plugin - Build-time icon bundling for 0ms first render (
rn-iconify/babel) - CLI Tools -
npx rn-iconify bundleandnpx rn-iconify analyzecommands - Config Manager -
configure()for API, cache, and performance settings - Bundle System -
loadOfflineBundlefor offline icon support - Documentation Website - Full docs at rn-iconify.vercel.app
Changedโ
- Simplified README (detailed documentation moved to website)
- Enhanced
CacheManagerwith bundle support and improved cache layers - Improved
IconifyAPIwith better error handling, timeout, and retry logic - Updated example app with comprehensive feature demos
Compatibilityโ
- React Native 0.60+ (Old Architecture)
- React Native 0.72+ (New Architecture with TurboModules)
- iOS 13.0+
- Android API 21+
[1.0.0] - 2025-11-26โ
Addedโ
- Initial release with 200+ icon sets and 268,000+ icons
- Simple component API (
<Mdi name="home" />) - Full TypeScript autocomplete for all icon names
- MMKV-based disk caching (30x faster than AsyncStorage)
- Memory caching with LRU eviction
- Native module for background prefetching (iOS & Android)
- TurboModule support for React Native New Architecture
- Bridge module fallback for Old Architecture
- Icon transformations (rotate, flip)
- Loading states with fallback components
- Accessibility support
- Cache management utilities (prefetch, clear, stats)
Compatibilityโ
- React Native 0.60+ (Old Architecture)
- React Native 0.72+ (New Architecture with TurboModules)
- iOS 13.0+
- Android API 21+