Skip to main content

4.5.0 (2026-08-12)

Featuresโ€‹

  • babel: read the alias registry this package tells people to use (#23) (1a422d6)

4.4.0 (2026-08-12)

Featuresโ€‹

  • cli: drop the names doctor --prune can prove are redundant (#22) (108245e)

4.3.0 (2026-08-12)

Featuresโ€‹

  • babel: follow the icon type written onto the field (#21) (162a079)

4.2.0 (2026-08-12)

Featuresโ€‹

  • babel: find icons wherever the source already proves them (1f28bd3)

4.1.0 (2026-08-12)

Featuresโ€‹

  • sync icon sets with Iconify API (#2) (d8ab97c)

4.0.1 (2026-08-11)โ€‹

Bug Fixesโ€‹

  • docs: stop parsing the changelog as MDX (#16) (019d1b0)

4.0.0 (2026-08-11)

  • Ship the native module, fix type resolution, and close the gaps that hid both (#15) (6c47eb1)

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โ€‹

  • cache: stop the disk cache growing without end (#12) (8b7d788)

3.2.1 (2026-08-11)โ€‹

Bug Fixesโ€‹

  • icons: ask for an unrecognised name as itself, not as undefined (#11) (e604eed)

3.2.0 (2026-08-11)

Bug Fixesโ€‹

  • ci: stop our own hook from blocking releases (#9) (b130a6b)

Featuresโ€‹

  • make icons fetched at runtime visible, and declarable (#8) (a4b785f)

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 โ€” useReducer state machine replaces 4 independent useState calls. SVG colorization regex removed in favor of SvgXml native color prop (multi-color icons now render correctly).
  • Rotate prop โ€” IconRotation type widened from 0 | 90 | 180 | 270 to number (any degree value).
  • Dev exports moved โ€” IconExplorer and PerformanceMonitor runtime exports moved to rn-iconify/dev. Type-only exports remain in main entry.
  • Typed errors โ€” onError callback now receives IconLoadError (with .code: 'NOT_FOUND' | 'NETWORK' | 'TIMEOUT' | 'INVALID_SVG') instead of generic Error.

Featuresโ€‹

  • React.memo + forwardRef โ€” All icon components (createIconSet, createIconAliases) wrapped with React.memo and React.forwardRef for 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 via hitSlop.
  • O(1) LRU cache โ€” MemoryCache rewritten with Map insertion-order LRU. Eviction no longer requires O(n log n) sort.
  • Typed errors โ€” New IconLoadError class with code property 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/dev for IconExplorer and PerformanceMonitor (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 โ€” isInvertColorsEnabled replaces incorrect isBoldTextEnabled proxy for high contrast detection.

Bug Fixesโ€‹

  • Theme infinite loop โ€” useState + useEffect anti-pattern replaced with useMemo approach. Inline theme props no longer cause infinite re-renders.
  • Animation rotate โ€” Interpolation now uses config.from/config.to instead of hardcoded [0, 360].
  • Animation sequence โ€” __DEV__ warning instead of silent null for unsupported sequence type.
  • CacheManager โ€” loadBundle() wrapped in try/finally to ensure isLoadingBundle flag is always reset.
  • Network abort โ€” Abort signal isolation for concurrent fetch deduplication.
  • Babel plugin โ€” Stale build detection (>60s auto-reset) with try/finally cleanup in post() hook.
  • Scanner โ€” O(n) single-pass regex replaces nested iteration.
  • CLI โ€” Version reads from package.json instead 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/require types 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, onPressOut props
  • Press Feedback - New pressedStyle prop for custom visual feedback when pressed
  • Disabled State - New disabled prop to disable press interactions
  • NativeWind Support - New className prop 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 Pressable when onPress or onLongPress is provided (no wrapper needed otherwise)
  • Updated components.mdx documentation with new props and examples
  • Improved JSDoc documentation for IconProps interface

Fixedโ€‹

  • alias/Icon.tsx now correctly passes animation and press props to IconRenderer

[2.0.1] - 2025-12-04โ€‹

Changedโ€‹

  • Cache Location - Default cache output path changed to node_modules/.cache/rn-iconify (no more .rn-iconify-cache in 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 - IconThemeProvider and useIconTheme for global icon styling
  • Icon Aliases - createIconAliases and IconAliasProvider for custom icon name mappings
  • Animated Icons - AnimatedIcon component with 6 presets (spin, pulse, bounce, shake, ping, wiggle)
  • React Navigation Integration - createTabBarIcon, createDrawerIcon, createHeaderIcon helpers
  • 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 bundle and npx rn-iconify analyze commands
  • Config Manager - configure() for API, cache, and performance settings
  • Bundle System - loadOfflineBundle for offline icon support
  • Documentation Website - Full docs at rn-iconify.vercel.app

Changedโ€‹

  • Simplified README (detailed documentation moved to website)
  • Enhanced CacheManager with bundle support and improved cache layers
  • Improved IconifyAPI with 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+