Migrate from Lucide
Switch from Lucide to Vadivam with one codemod. Every icon keeps its Lucide name, and each framework package mirrors the Lucide API.
Vadivam covers every current Lucide icon name, redrawn on the same 24px grid with the same 2px stroke. Each framework package mirrors the matching Lucide package, so most projects switch by renaming the package and the Lucide prefix. Layouts stay the same because the canvas, stroke, and props are unchanged.
Run the codemod
From your project root, preview the changes, then apply them:
npx vadivam migrate-lucide
npx vadivam migrate-lucide --write
Pass paths to limit the run, such as npx vadivam migrate-lucide src --write. It skips node_modules, build output, and framework caches. It then:
- rewrites Lucide imports, dynamic
import()calls,require()calls, and test mocks to the matching Vadivam package - maps
/dynamic,/dynamicIconImports, and per-icon paths such aslucide-react/dist/esm/icons/bellto their Vadivam equivalents - renames
Lucidenames imported or required from Lucide, and their uses outside strings (a re-export keeps its public name, as inVadivamBell as LucideBell):LucideBellbecomesVadivamBell,LucidePropsbecomesVadivamProps, andcreateLucideIconbecomescreateVadivamIcon - imports deprecated Lucide aliases from their current name under the old local name, such as
CircleAlert as AlertCircleandHouse as Home, so the rest of the file stays as written - replaces Lucide dependencies in each
package.jsonwith the matching Vadivam package - changes
data-lucideattributes todata-vadivam, and.lucideCSS classes to.vadivamin stylesheets and component<style>blocks
Without --write the codemod only lists what would change. Afterwards, reinstall dependencies so your lockfile drops Lucide.
The codemod also lists what it left for you to check: imports Vadivam does not export, test mock factories whose keys name Lucide exports, and packages that need a hand migration. Icon names held in strings, such as a DynamicIcon name from data, are not renamed; check old aliases there against Dynamic icons.
Package map
| Lucide | Vadivam |
|---|---|
lucide-react |
vadivam-react |
lucide-react-native |
vadivam-react-native |
lucide-vue-next, @lucide/vue |
vadivam-vue |
lucide-svelte, @lucide/svelte |
vadivam-svelte |
lucide-solid |
vadivam-solid |
lucide-preact |
vadivam-preact |
@lucide/astro |
vadivam-astro |
lucide |
vadivam |
lucide-angular, @lucide/angular |
vadivam-angular (by hand) |
lucide-static |
vadivam assets (by hand) |
What stays the same
- Icon names:
arrow-rightandArrowRightexist in both, andArrowRightIconworks too. - Props:
size,color,strokeWidth,absoluteStrokeWidth,className, and any native SVG attribute. - Dynamic icons:
DynamicIcon,iconNames, anddynamicIconImportsfrom the/dynamicand/dynamicIconImportsentry points. See Dynamic icons. - Browser JavaScript:
createIcons({ icons })fromvadivamreplaces<i data-vadivam="menu">elements like Lucide’s does withdata-lucide.
Rendered icons carry vadivam vadivam-<name> classes instead of lucide lucide-<name>, so the codemod updates CSS selectors that target them.
Angular
vadivam-angular uses one standalone directive per icon instead of a lucide-icon component. Replace each icon by hand:
import { Component } from "@angular/core";
import { ArrowRight } from "vadivam-angular";
@Component({
selector: "app-next",
imports: [ArrowRight],
template: `<svg vadivamArrowRight size="20"></svg>`,
})
export class NextComponent {}
Use provideVadivamConfig() for app-wide defaults. See Angular.
Static assets
For lucide-static files, use the matching vadivam assets: vadivam/icons/<name>.svg for files, vadivam/strings/<name> for SVG strings, vadivam/sprite.svg for a sprite, and vadivam/font/vadivam.css for the icon font. See Core SVG.
Compare the drawings
Each icon page, such as /icons/arrow-right, shows the Vadivam drawing next to the Lucide one, plus an overlay of the two. Vadivam follows a stricter design guide: whole-pixel lines, smoothed corners, and consistent keylines.