Date: 2026-02-14
Status: Fixed deployment error + migrated to Next.js 16
Changes Made
1. Removed MDX Dependencies (Root Cause of Build Error)
Why: The project wasn't using .mdx files - only .md files with the marked library.
Removed:
@mdx-js/loader@mdx-js/react@next/mdxremark-gfmrehype-highlight
Error Fixed:
Error: loader /app/node_modules/@next/mdx/mdx-js-loader.js for match "{*,next-mdx-rule}"
does not have serializable options.
2. Upgraded Next.js
- Before:
15.6.0-canary.60(unstable canary) - After:
^16.1.6(stable release)
3. Updated next.config.mjs
Before:
import createMDX from '@next/mdx'
import remarkGfm from 'remark-gfm'
import rehypeHighlight from 'rehype-highlight'
const withMDX = createMDX({
extension: /\.mdx?$/,
options: {
remarkPlugins: [remarkGfm],
rehypePlugins: [rehypeHighlight],
},
})
export default withMDX(nextConfig)
After:
const nextConfig = {
typescript: { ignoreBuildErrors: true },
images: { unoptimized: true },
experimental: {
optimizePackageImports: ['lucide-react', '@radix-ui/react-icons'],
},
}
export default nextConfig
4. Updated Dependencies
- ✅
baseline-browser-mapping:^2.9.14→latest - ✅ All other deps remain compatible with Next.js 16
Server vs Client Components (Next.js 16 Best Practices)
✅ Current Implementation is Correct
Server Components (Default):
app/articles/page.tsx- ✅ Server component (reads markdown files)app/articles/[slug]/page.tsx- ✅ Server component (SSG withgenerateStaticParams)lib/markdown.ts- ✅ Server-side only (uses Node.jsfsmodule)
No Changes Needed: Your current setup already follows Next.js 16 best practices!
Key Rules (from Next.js docs):
- Server Components (default) - Use for data fetching, file reading, DB queries
- Client Components (
'use client') - Use for interactivity (useState, onClick, etc.) - Don't mix: Server functions (fs, DB) in client components = build error
Reference: https://nextjs.org/docs/app/getting-started/server-and-client-components
Deployment Status
Pushed to GitHub: ✅ Commit bb76931
Vercel Status: Building...
Expected result:
- ✅ Build error fixed
- ✅ Articles pages live
- ✅ Faster builds with Next.js 16 Turbopack
What Uses Markdown Now?
File: lib/markdown.ts
Library: marked (17.0.2) + gray-matter (4.0.3)
Workflow:
.mdfiles stored in/articles/directorygetArticleSlugs()→ Reads filenamesgetArticleBySlug(slug)→ Parses frontmatter + content withmarkedapp/articles/[slug]/page.tsx→ Renders HTML
Why not MDX?
- MDX = React components in markdown (overkill for blog articles)
- Markdown = Simpler, faster, no build complexity
marked= Battle-tested, 50k+ weekly downloads
Performance Improvements (Next.js 16)
- Turbopack Production Builds - Up to 8x faster builds
- Static Optimization - Automatic static generation for articles
- Package Import Optimization - Tree-shaking for
lucide-react+ Radix UI
Testing Checklist
After deployment completes (2-3 min):
- Visit
livevolatile.com/articles→ Should show all 16 articles - Click any article → Should render full content
- Check build logs → No MDX errors
- Performance → Should load faster (Turbopack improvements)
Next Steps:
Monitor Vercel deployment → Test articles pages → If successful, close this migration! 🚀