nextjs-neon-performance-optimizer
Comprehensive performance analysis and optimization for Next.js applications using Neon Postgres. Identifies bottlenecks across frontend, backend, and database layers.
When & Why to Use This Skill
The Next.js + Neon Postgres Performance Optimizer is a specialized technical agent designed to conduct deep-dive audits and implement high-impact optimizations for full-stack applications. It systematically identifies bottlenecks across the frontend, backend, and database layers—focusing on Core Web Vitals, bundle size reduction, and SQL query efficiency—while strictly adhering to visual preservation rules to ensure performance gains never compromise the existing UI/UX design.
Use Cases
- Core Web Vitals Optimization: Analyzing and improving LCP, FID, and CLS scores by refactoring image loading strategies and font delivery without changing the site's appearance.
- Database Query Tuning: Identifying slow Neon Postgres queries, implementing missing indexes, and resolving N+1 problems to drastically reduce server response times.
- Full-Stack Architecture Review: Refactoring Next.js App Router logic to utilize Server Components and parallel data fetching for optimal efficiency.
- Pre-Deployment Performance Auditing: Generating comprehensive performance reports and implementation plans to ensure applications are production-ready and scalable.
| name | nextjs-neon-performance-optimizer |
|---|---|
| description | Comprehensive performance analysis and optimization for Next.js applications using Neon Postgres. Identifies bottlenecks across frontend, backend, and database layers. |
Next.js + Neon Postgres Performance Optimizer
Comprehensive performance analysis and optimization for Next.js applications using Neon Postgres.
When This Skill Activates
- User mentions "optimize", "performance", "slow", "faster", "bottleneck"
- User asks about Core Web Vitals, page speed, or load times
- User requests database query optimization
- User mentions Neon, PostgreSQL performance
- Before deployment reviews
⚠️ CRITICAL: UI/Visual Preservation Rules
NEVER modify or suggest changes to:
- Visual design (colors, spacing, typography, layouts)
- UI components appearance (buttons, cards, forms)
- Animations or transitions (unless explicitly impacting performance)
- User experience flows
- Design system choices
- Brand identity elements
ONLY optimize:
- Technical implementation (code structure, not appearance)
- Loading strategies (how content loads, not what it looks like)
- Data fetching patterns
- Bundle delivery methods
- Database query efficiency
Example - CORRECT: ❌ "Remove this animation, it's slow" ✅ "Use CSS animations instead of JS for better performance - keeps same visual effect"
❌ "Simplify this design to load faster" ✅ "Load images progressively with blur-up placeholder - preserves exact design"
❌ "Remove these gradients" ✅ "Use CSS gradients instead of image gradients - identical appearance, faster load"
Performance Audit Process
1. Frontend Analysis
Bundle Size Check:
npm run build
# Look for JavaScript chunks > 200KB
# Total bundle should be < 250KB
Common Issues:
- Unoptimized images (not using next/image)
- Large dependencies loaded synchronously
- Font not using next/font/google
- Too many client components ('use client')
Quick Fixes (Visual-Preserving):
// Images: Use next/image (SAME appearance, faster loading)
import Image from 'next/image'
// IMPORTANT: Keeps exact dimensions, quality, and positioning
<Image
src="/hero.jpg"
width={1200}
height={600}
priority
alt="Hero"
quality={100} // Preserve visual quality
placeholder="blur" // Smooth loading, no layout shift
/>
// Fonts: Use next/font/google (IDENTICAL rendering, faster load)
import { Inter } from 'next/font/google'
const inter = Inter({ subsets: ['latin'] })
// Font looks exactly the same, just loads optimally
// Dynamic imports (Component looks identical, loads when needed)
const Chart = dynamic(() => import('./Chart'), {
ssr: false,
loading: () => <ChartSkeleton /> // Matches chart dimensions exactly
})
2. Next.js App Router Optimization
Data Fetching:
// ❌ Sequential (slow)
const user = await fetchUser()
const posts = await fetchPosts(user.id)
// ✅ Parallel (fast)
const [user, posts] = await Promise.all([fetchUser(), fetchPosts()])
Caching:
// Static pages
export const revalidate = 3600 // ISR 1 hour
// Dynamic pages
export const revalidate = 0
// Tag-based revalidation
fetch(url, { next: { tags: ['posts'], revalidate: 60 } })
Server vs Client Components:
- Default to Server Components
- Only use 'use client' for: useState, useEffect, onClick, browser APIs
- Keep client components small, at leaf nodes
3. Neon Postgres Database Optimization
Connection Pooling:
import { Pool } from '@neondatabase/serverless'
const pool = new Pool({ connectionString: process.env.DATABASE_URL })
// NOT: new connection per request
Critical Indexes:
-- Postgres doesn't auto-index foreign keys!
CREATE INDEX idx_posts_user_id ON posts(user_id);
CREATE INDEX idx_orders_user_id ON orders(user_id);
-- Frequently filtered columns
CREATE INDEX idx_users_email ON users(email);
-- Composite for multi-column queries
CREATE INDEX idx_orders_user_status ON orders(user_id, status);
Query Optimization:
-- Check query performance
EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 123;
-- Look for "Seq Scan" (bad) vs "Index Scan" (good)
-- Execution time should be < 100ms for simple queries
Prevent N+1 Queries:
// ❌ N+1 problem
for (const user of users) {
user.posts = await db.query('SELECT * FROM posts WHERE user_id = ?', [user.id])
}
// ✅ Solution: JOIN or batch
const users = await db.query(`
SELECT u.*, json_agg(p.*) as posts
FROM users u LEFT JOIN posts p ON p.user_id = u.id
GROUP BY u.id
`)
4. Measurement & Monitoring
Install Tools:
// app/layout.tsx
import { SpeedInsights } from '@vercel/speed-insights/next'
import { Analytics } from '@vercel/analytics/react'
export default function RootLayout({ children }) {
return <html><body>{children}<SpeedInsights /><Analytics /></body></html>
}
Run Lighthouse:
npm run build && npm run start
npx lighthouse http://localhost:3000 --view
Core Web Vitals Targets:
- LCP (Largest Contentful Paint): < 2.5s
- FID (First Input Delay): < 100ms
- CLS (Cumulative Layout Shift): < 0.1
Performance Audit Report Template
When conducting an audit, generate this report:
# Performance Audit Report
## Current Metrics
- Load Time: [X]s
- LCP: [X]s
- FID: [X]ms
- CLS: [X]
- Bundle Size: [X] KB
## Issues Found
### 🔴 Critical
1. [Issue name] ([Count] instances)
- Impact: [Performance impact]
- Location: [Files]
- Fix: [Solution]
### 🟡 Warnings
[...]
## Estimated Impact
- Load Time: [Before] → [After] (-X%)
- LCP: [Before] → [After]
- Bundle: [Before] → [After]
## Implementation Plan
1. [Task 1] (X min)
2. [Task 2] (X min)
[...]
Quick Wins Checklist
Generate this checklist for the user:
- Replace all
<img>with<Image> - Use
next/font/googlefor fonts - Add indexes to all foreign key columns
- Convert non-interactive components to Server Components
- Use
Promise.all()for parallel fetching - Add
loading.tsxto slow routes - Enable connection pooling for database
- Replace
SELECT *with specific columns - Add Suspense boundaries for slow components
- Check for N+1 query problems
Commands to Suggest
After analysis, offer to:
- Create database migration for indexes
- Generate bundle analyzer config
- Create performance test suite
- Add monitoring tools
Success Criteria
✅ Optimized when:
- LCP < 2.5s ✅
- FID < 100ms ✅
- CLS < 0.1 ✅
- Bundle < 250KB ✅
- Database queries < 100ms (simple) ✅
- All images using next/image ✅
- All fonts optimized ✅
- Connection pooling enabled ✅
- No N+1 queries ✅
🎨 Works With frontend-design Skill
If the user has the frontend-design skill installed, this skill complements it:
frontend-design → Creates beautiful, distinctive UIs nextjs-neon-performance-optimizer → Makes those UIs load fast
Workflow:
- User: "Build a portfolio site" → frontend-design creates design
- User: "Optimize performance" → This skill optimizes WITHOUT changing design
Example:
// frontend-design creates this beautiful component:
<div className="hero bg-gradient-to-r from-purple-600 to-pink-600 p-20">
<motion.h1>Beautiful Title</motion.h1>
<Image src="/art.jpg" />
</div>
// This skill optimizes it (SAME appearance):
<div className="hero bg-gradient-to-r from-purple-600 to-pink-600 p-20">
<motion.h1>Beautiful Title</motion.h1> {/* Keeps animation */}
<Image
src="/art.jpg"
width={800}
height={600}
quality={100} // Maintains visual quality
priority // Faster LCP, same appearance
/>
</div>
Never suggest:
- Changing colors, fonts, spacing for performance
- Removing animations/transitions
- Simplifying designs
- Altering brand elements
Always maintain:
- Exact visual appearance
- All animations (just optimize implementation)
- Design system integrity
- User experience quality