This is a submission for DEV's Summer Bug Smash: Smash Stories powered by Sentry.
The setup
I'm building KingxTech, and specifically K-XpertAI — an AI agent that reads, writes, and deletes files in a live project workspace, then hosts the result instantly. Under the hood it's a React 19 + Vite frontend talking to a TypeScript/Express backend on Cloud Run.
I'd just shipped a big batch of changes to the workspace UI — a proper code editor, a file tree with GitHub import/export buttons, a terminal tab. Pushed to GitHub, Vercel kicked off the deploy... and it failed.
The bug
Error: Command "npm run build" exited with 1
Digging into the build log, the real error was buried a few lines down:
15 │ import { File as FileIcon, Folder, FolderPlus, FilePlus, Trash2, Save,
│ RefreshCw, Undo2, Copy, ExternalLink, Code2, Eye, Rocket,
│ TerminalSquare, Upload, Maximize2, Minimize2, Github, FolderInput,
│ SlidersHorizontal, Info, Plus } from "lucide-react";
│ ───┬──
│ ╰──── Missing export
Vite's bundler (via Rolldown) was telling me Github didn't exist as an export in lucide-react — but only in Vercel's build. It worked fine in local dev. That's the kind of bug that makes you doubt your own eyes: the icon was clearly imported the same way as a dozen others on that same line that worked perfectly.
The investigation
First instinct: check the installed version.
"lucide-react": "^1.23.0"
Nothing obviously wrong there. So instead of guessing at what icon names should exist, I installed that exact version in an isolated sandbox and just asked the module directly:
const icons = require('lucide-react');
const names = ['Github', 'FolderInput', 'SlidersHorizontal', /* ...the rest */];
for (const n of names) {
console.log(n, typeof icons[n] !== 'undefined' ? 'OK' : 'MISSING');
}
Github MISSING
FolderInput OK
SlidersHorizontal OK
...everything else OK
There it was. Every icon in that import worked except Github.
The root cause
lucide-react — like a lot of modern icon libraries — has been progressively removing brand/trademark logos (GitHub, Twitter, etc.) from its default export set, pushing people toward dedicated brand-icon packages instead. Somewhere between versions, the plain Github icon quietly stopped being exported. Local dev didn't catch it because of caching in node_modules from an earlier install; a clean Vercel build (fresh npm install every time) surfaced it immediately.
The fix wasn't "install a different package" — it was small enough to just inline:
// Before: relying on a brand icon that no longer ships
import { Github } from 'lucide-react';
// After: a tiny local SVG component instead
function Github({ size = 14 }) {
return (
<svg width={size} height={size} viewBox="0 0 24 24" fill="currentColor">
<path d="M12 .5C5.7.5.5 5.7.5 12c0 5.1 3.3 9.4 7.9 10.9..." />
</svg>
);
}
Same component name, same usage everywhere else in the file — zero call-site changes needed.
Verifying it, not just eyeballing it
Since the whole failure was "works locally, fails in CI," I didn't trust a visual read of the diff. I ran the actual production build in a clean environment:
npm install
npm run build
✓ 1902 modules transformed.
dist/index.html 1.44 kB
dist/assets/index-*.css 24.68 kB
dist/assets/index-*.js 1,185.88 kB
✓ built in 3.16s
Clean exit code, real dist/ output. Only then did I consider it actually fixed.
What I'm taking away
- A missing export is a build-time contract violation, not a typo — treat it like one. Don't guess at what a package should export; ask it.
-
Local dev green ≠ CI green. Stale
node_modulescan hide exactly this class of bug. A clean install is the only honest test. - Brand icons in open-source icon libraries are not guaranteed to stay. If your UI depends on a company's logo shape, either pin the package version deliberately or just own a tiny inline SVG — it's one function, and it never breaks on you again.
Small bug, but a good reminder that "it built yesterday" is not evidence of anything today.
Top comments (0)