Repository navigation
Release v3.0.0 - Next.js 16 & React 19 Upgrade
Released: December 2, 2025
⚠️ BREAKING CHANGES
This is a major version release with significant framework upgrades and architectural changes:
- Next.js 14.1.4 → 16.0.6: Turbopack is now stable and the default bundler
- React 18.2.0 → 19.2.0: Latest React with new features and improved performance
- Async Params API: All dynamic routes now use the new async params pattern
- Node.js Requirements: Minimum Node.js version is now 20.9.0
Migration Notes:
- If you're running this locally, ensure Node.js ≥20.9.0 and npm ≥10.0.0
- The site is fully compatible and deployed - no action needed for visitors
- All breaking changes have been resolved in this release
🎉 What's New
- Next.js 16 with Turbopack: Upgraded to the latest Next.js version with stable Turbopack bundler for 5-10x faster builds
- React 19: Upgraded to React 19.2.0 with improved performance and new features
- Async Params Migration: All dynamic routes (projects, experience, education, talks) migrated to Next.js 16's async params pattern
- Enhanced Email System: Migrated to Resend v6 with React Email components for better email rendering
💅 Code Improvements
- Zod Validation: Added Zod schema validation to contact API route for type-safe form submissions
- Type Safety: Improved TypeScript types across all dynamic routes with proper async/await patterns
- Code Cleanup: Removed unused subject field from ContactSchema
- Hydration Fix: Resolved React 19 hydration mismatch with theme provider
🔧 Maintenance
- Engine Requirements: Added Node.js (≥20.9.0) and npm (≥10.0.0) version requirements to package.json
- ESLint Plugin: Added eslint-plugin-react-hooks v6.0.0 for React 19 compatibility
- TypeScript: Updated to TypeScript 5.9.3
- ESLint: Updated to ESLint 9 with improved linting capabilities
📦 Dependencies
Major Updates:
next: 14.1.4 → 16.0.6react: 18.2.0 → 19.2.0react-dom: 18.2.0 → 19.2.0resend: 5.x → 6.5.2zod: 3.x → 4.1.13typescript: 5.4.3 → 5.9.3eslint: 8.x → 9.x
New Dependencies:
@react-email/components: ^1.0.1@react-email/render: ^2.0.0eslint-plugin-react-hooks: ^6.0.0
Component Updates:
- All Radix UI components updated to React 19 compatible versions
@radix-ui/react-avatar: ^1.1.6@radix-ui/react-dialog: ^1.1.15@radix-ui/react-dropdown-menu: ^2.1.11@radix-ui/react-label: ^2.1.5@radix-ui/react-navigation-menu: ^1.2.14@radix-ui/react-slot: ^1.2.4@radix-ui/react-tabs: ^1.1.5@radix-ui/react-toast: ^1.2.10
🚀 Deployment
This release was automatically deployed via Vercel:
- Build: Next.js 16 production build with Turbopack
- Deployment: Vercel edge network
- Production: https://navarrolajous.com
- Secondary: https://www.navarrolajous.com
📁 Files Changed
13 files changed across the application:
API Routes:
app/api/contact/route.ts- Added Zod validation
Dynamic Routes (Async Params Migration):
app/projects/[slug]/page.tsxapp/experience/[slug]/page.tsxapp/education/[slug]/page.tsxapp/talks/[slug]/page.tsx
Layout & Theme:
app/layout.tsx- Added suppressHydrationWarningcomponents/theme-provider.tsx- Updated import path
Email Templates:
components/emails-templates/ContactEmailTemplate.tsx- Migrated to React Email
Assets:
app/favicon.ico- Deleted (replaced with PNG)app/icon.png- Added (Turbopack compatible format)
Configuration:
package.json- Dependencies and engine requirementspackage-lock.json- Dependency lock filetsconfig.json- TypeScript configuration
🔍 Technical Details
Dynamic Route Migration:
All dynamic routes now use the new async params API required by Next.js 16:
// Before (Next.js 14)
export default function Page({ params }: { params: { slug: string } }) {
const project = findProject(params.slug);
}
// After (Next.js 16)
export default async function Page({ params }: { params: Promise<{ slug: string }> }) {
const { slug } = await params;
const project = findProject(slug);
}Email System Migration:
Migrated from basic HTML rendering to React Email components for better compatibility with Resend v6:
// Now using @react-email/components
import { Html, Body, Container, Heading, Text } from "@react-email/components";Full Changelog: v2.2.1...v3.0.0