Our Next.js 15 Journey
After 3 months and 5 production deployments, we have thoughts. Strong thoughts.
The Good
Partial Prerenderingis a game-changer. Our initial page loads are now 60% faster on average. The ability to stream static shells while dynamic content loads in the background creates a perceived performance that feels instant.
React 19 Integrationbrings server actions that actually work. No more API route boilerplate for simple mutations.
// Server actions are finally useful
'use server'
export async function submitForm(formData: FormData) {
const email = formData.get('email')
await db.subscribers.create({ email })
revalidatePath('/subscribers')
}
The Bad
Cachingis still confusing. The new caching semantics broke 3 of our 5 apps during migration. Documentation exists, but the mental model takes time to build.
Build timesincreased by 40% for our monorepo. The new compiler is powerful but hungry.
"The caching changes alone cost us two sprints of debugging. Worth it in the end, but painful."
The Verdict
✅ Migrate if:
- You need better streaming/PPR
- You're starting a new project
- You have time to learn new caching patterns
❌ Wait if:
- Your current app is stable
- You're on tight deadlines
- Your team is already stretched thin
Code Examples
Here's how we're using the new after
API for non-blocking operations:
import { after } from 'next/server'
export async function POST(request: Request) {
const data = await request.json()
// Do the critical work first
await saveToDatabase(data)
// Non-blocking analytics - runs after response
after(() ={
trackEvent('form_submission', data)
notifySlack('New submission received')
})
return Response.json({ success: true })
}