shadcn/ui Production Troubleshooting - AI Knowledge Base
Critical Production Failures
Calendar Component TypeScript Errors
Failure Mode: Type error: Object literal may only specify known properties, and 'IconLeft' does not exist in type 'Partial<CustomComponents>'
- Frequency: Random occurrence with high impact
- Root Cause: react-day-picker type definitions break on version updates (particularly v8.10+)
- Consequence: Complete build failure preventing deployment
- Time Investment: Can destroy production deploys if not caught
Resolution:
rm -rf components/ui/calendar.tsx
npx shadcn@latest add calendar
Prevention Configuration:
{
"dependencies": {
"react-day-picker": "8.10.1"
}
}
Next.js 15 + React 19 Compatibility Failures
Breaking Components:
- Dialog components → hydration errors
- Form components → focus management loss
- Toast notifications → immediate disappearance
- Theme providers → SSR mismatches
Working Configuration:
// next.config.js
module.exports = {
reactStrictMode: false,
experimental: {
ppr: false
}
}
Decision Criteria: Use Next 15 + React 19 only if you need bleeding-edge features; stick with Next 14 for production stability
Build System Failures
ESLint Version Incompatibility
Failure Point: ESLint 9+ breaks shadcn/ui CLI
- Error:
Module not found: Can't resolve '@typescript-eslint/parser'
- Production Impact: Build pipeline failures
- Safe Version: ESLint 8.x (do not upgrade to v9 until compatibility confirmed)
TypeScript Module Resolution
Configuration Requirements:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"],
"@/components/*": ["./src/components/*"],
"@/lib/*": ["./src/lib/*"]
},
"moduleResolution": "node"
}
}
Failure Consequence: Complete inability to import components with @/
aliases
Bundle Size Explosion Thresholds
Critical Warning: shadcn/ui + Tailwind can reach 2MB+ bundle size
- Primary Cause: Full icon library imports
- Performance Impact: Significant load time degradation
Bundle Optimization:
// next.config.js
module.exports = {
experimental: {
optimizePackageImports: ['lucide-react', '@radix-ui/react-icons']
}
}
Hydration Error Resolution
Theme Provider SSR Mismatch
Root Cause: next-themes
attempts localStorage access during SSR
Consequence: Complete UI hydration failure
Working Fix:
<html lang="en" suppressHydrationWarning>
<body>
<ThemeProvider
attribute="class"
defaultTheme="system"
enableSystem
disableTransitionOnChange
>
{children}
</ThemeProvider>
</body>
</html>
Dialog Component Client-Side Only Solution
When to Use: When dialog state persistence causes hydration failures
const Dialog = dynamic(
() => import('@/components/ui/dialog').then(mod => mod.Dialog),
{
ssr: false,
loading: () => <div className="animate-pulse h-10 bg-gray-200" />
}
)
Trade-off: Lose SEO benefits but gain functional components
Form Focus Management Recovery
Problem: Input fields lose focus post-hydration
Solution: Use React's useId()
for stable server/client ID matching
import { useId } from 'react'
export function FormField({ children }) {
const id = useId()
return (
<div>
<label htmlFor={id}>Name</label>
<input id={id} name="name" />
</div>
)
}
CSS Production Failures
Tailwind Purge Configuration
Critical Setting: Prevent Tailwind from stripping dynamic classes
module.exports = {
content: [
'./src/**/*.{js,ts,jsx,tsx,mdx}',
'./components/**/*.{js,ts,jsx,tsx,mdx}',
],
safelist: [
'data-[state=open]:animate-in',
'data-[state=closed]:animate-out',
]
}
Failure Mode: Components render without styling in production builds
Environment-Specific Issues
Node.js Version Compatibility Matrix
- Recommended: Node.js 18.x
- Problematic: Node.js 20+ with npm 10+
- CI/CD Impact: Build failures in Docker/GitHub Actions using newer Node versions
Docker Configuration:
FROM node:18-alpine
GitHub Actions Configuration:
- uses: actions/setup-node@v4
with:
node-version: '18.x'
CLI Certificate Failures
Workaround for Node 20+ SSL issues:
npm config set strict-ssl false
npx shadcn@latest add button
npm config set strict-ssl true
Performance Optimization Thresholds
Bundle Analysis Requirements
npx @next/bundle-analyzer
Icon Import Optimization
Performance Impact: 500KB+ reduction possible
// Inefficient - imports entire library
import * as Icons from '@radix-ui/react-icons'
// Efficient - imports single icon (~2KB)
import { CheckIcon } from '@radix-ui/react-icons'
Critical Decision Points
When to Disable SSR
Criteria:
- Hydration errors persist after configuration fixes
- Deployment deadlines require immediate functionality
- Component state complexity exceeds SSR compatibility
Implementation:
const ClientOnly = dynamic(() => Promise.resolve(({ children }) => <>{children}</>), {
ssr: false
})
Version Pinning Strategy
High-Risk Dependencies:
- react-day-picker (pin to working version)
- ESLint (stay on v8.x)
- Next.js (evaluate 15.x carefully)
Framework Migration Considerations
Next.js 14 → 15 Migration Risks:
- React 19 compatibility issues
- Stricter hydration validation
- Changed Suspense boundary behavior
- Concurrent rendering timing changes
Emergency Debugging Workflow
- Build Failure: Check Calendar component TypeScript errors first
- Hydration Error: Verify ThemeProvider configuration
- Styling Missing: Confirm Tailwind safelist includes dynamic classes
- Bundle Size: Analyze icon imports with bundle analyzer
- CI/CD Failure: Verify Node.js version consistency
Resource Requirements
Time Investment Estimates
- Calendar TypeScript Fix: 15-30 minutes
- Hydration Error Resolution: 1-3 hours depending on complexity
- Bundle Optimization: 2-4 hours for comprehensive analysis
- Next.js 15 Migration: 1-2 days with potential breaking changes
Expertise Requirements
- Essential: Understanding of SSR/hydration concepts
- Helpful: Experience with Tailwind CSS purging
- Advanced: Knowledge of React 19 concurrent features for Next.15 migration
Operational Intelligence
Most Common Production Breaks (in order of frequency)
- Calendar component TypeScript errors
- Theme provider hydration mismatches
- Tailwind CSS class purging
- Bundle size from icon imports
- Next.js version compatibility
Hidden Costs
- Bundle analysis time: Often overlooked until performance issues surface
- SSR debugging complexity: Can require significant React knowledge
- CI/CD environment differences: Node version mismatches cause deployment failures
Community Support Quality
- GitHub Issues: High quality, most production errors already documented
- Official Docs: Good for basic setup, insufficient for production troubleshooting
- Community Discussions: Essential for edge cases and real-world solutions
Useful Links for Further Investigation
Essential Debugging Resources
Link | Description |
---|---|
shadcn/ui GitHub Issues | Search existing issues before creating new ones. Most production errors are already reported. |
shadcn/ui Discussions | Community troubleshooting and solutions. Good for edge cases not covered in docs. |
React 19 Compatibility Guide | Essential reading if you're upgrading to Next.js 15. Shows what's broken and what works. |
shadcn/ui CLI Documentation | CLI commands and configuration options. Useful when npx shadcn@latest add fails. |
Next.js Hydration Troubleshooting | Official Next.js guide to fixing hydration mismatches. Essential for SSR issues. |
Vite + shadcn/ui Path Configuration Issues | Common Vite path configuration problems and solutions. |
Laravel + Inertia.js Integration | Setup guide for Laravel projects using shadcn/ui. |
Radix UI GitHub Issues | Underlying component issues. Check here if shadcn/ui components behave unexpectedly. |
Tailwind CSS Purging Documentation | How to prevent Tailwind from breaking your component styles in production. |
next-themes Hydration Issues | Theme provider problems and server/client mismatches. |
@next/bundle-analyzer | Shows exactly what's bloating your Next.js bundle. |
webpack-bundle-analyzer | For non-Next.js projects. Visualizes bundle composition. |
Bundle Phobia | Check the real size impact of shadcn/ui dependencies before adding them. |
shadcn/ui Community Examples | Real developers sharing shadcn/ui production issues and solutions. |
Stack Overflow shadcn-ui Tag | Specific error messages and their solutions. |
Cursor Rules for shadcn/ui | Best practices and common patterns to avoid issues. |
Related Tools & Recommendations
Migrating CRA Tests from Jest to Vitest
integrates with Create React App
Stop Stripe from Destroying Your Serverless Performance
Cold starts are killing your payments, webhooks are timing out randomly, and your users think your checkout is broken. Here's how to fix the mess.
Supabase + Next.js + Stripe: How to Actually Make This Work
The least broken way to handle auth and payments (until it isn't)
Claude API + Next.js App Router: What Actually Works in Production
I've been fighting with Claude API and Next.js App Router for 8 months. Here's what actually works, what breaks spectacularly, and how to avoid the gotchas that
Migrate from Webpack to Vite Without Breaking Everything
Your webpack dev server is probably slower than your browser startup
Vite + React 19 + TypeScript + ESLint 9: Actually Fast Development (When It Works)
Skip the 30-second Webpack wait times - This setup boots in about a second
Remix - HTML Forms That Don't Suck
Finally, a React framework that remembers HTML exists
React Router v7 Production Disasters I've Fixed So You Don't Have To
My React Router v7 migration broke production for 6 hours and cost us maybe 50k in lost sales
Fix Astro Production Deployment Nightmares
integrates with Astro
Which Static Site Generator Won't Make You Hate Your Life
Just use fucking Astro. Next.js if you actually need server shit. Gatsby is dead - seriously, stop asking.
Astro - Static Sites That Don't Suck
integrates with Astro
Thunder Client Migration Guide - Escape the Paywall
Complete step-by-step guide to migrating from Thunder Client's paywalled collections to better alternatives
Fix Your Slow-Ass Laravel + MySQL Setup
Stop letting database performance kill your Laravel app - here's how to actually fix it
Fix Prettier Format-on-Save and Common Failures
Solve common Prettier issues: fix format-on-save, debug monorepo configuration, resolve CI/CD formatting disasters, and troubleshoot VS Code errors for consiste
I've Been Using Tailwind + Headless UI + Next.js 15 for 8 Months - Here's the Brutal Truth
Fuck those "quick start" tutorials. Here's what actually happens when you try to ship with this stack.
Headless UI - Components That Don't Look Like Ass
CSS frameworks make every app look the same. Your designer hates Material-UI's blue buttons. Headless UI handles the keyboard navigation nightmares so you don't
Get Alpaca Market Data Without the Connection Constantly Dying on You
WebSocket Streaming That Actually Works: Stop Polling APIs Like It's 2005
Fix Uniswap v4 Hook Integration Issues - Debug Guide
When your hooks break at 3am and you need fixes that actually work
How to Deploy Parallels Desktop Without Losing Your Shit
Real IT admin guide to managing Mac VMs at scale without wanting to quit your job
Fast React Alternatives That Don't Suck
depends on React
Recommendations combine user behavior, content similarity, research intelligence, and SEO optimization