← back to Dear Bubbe Nextjs
next.config.ts
116 lines
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
// Configuration options
// output: 'standalone', // disabled: pm2 runs `next start`, which needs a normal build + auto-loads .env.local
// Stray lockfiles in $HOME (Mac2 and Kamatera /root) make Turbopack mis-infer
// the workspace root; pin it or the build fails locally and warns on prod.
turbopack: { root: __dirname },
outputFileTracingRoot: __dirname,
poweredByHeader: false,
compress: true,
// SEO and Performance optimizations
experimental: {
optimizeCss: true,
optimizePackageImports: ['react-icons'],
},
// Image optimization
images: {
formats: ['image/avif', 'image/webp'],
deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
minimumCacheTTL: 60 * 60 * 24 * 30, // 30 days
},
// Security headers
async headers() {
return [
{
source: '/(.*)',
headers: [
{
key: 'X-Frame-Options',
value: 'DENY',
},
{
key: 'X-Content-Type-Options',
value: 'nosniff',
},
{
key: 'Referrer-Policy',
value: 'origin-when-cross-origin',
},
{
key: 'Content-Security-Policy',
value: "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://www.googletagmanager.com https://www.google-analytics.com https://static.cloudflareinsights.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data: blob: https:; media-src 'self' data: blob:; connect-src 'self' https://api.anthropic.com https://api.elevenlabs.io https://www.google-analytics.com https://*.google-analytics.com https://www.google.com https://cloudflareinsights.com; frame-ancestors 'none';",
},
],
},
{
source: '/api/(.*)',
headers: [
{
key: 'Cache-Control',
value: 'no-store, max-age=0',
},
],
},
{
source: '/bubbe.png',
headers: [
{
key: 'Cache-Control',
value: 'public, max-age=31536000, immutable',
},
],
},
{
source: '/(favicon.ico|apple-touch-icon.png|android-chrome.png)',
headers: [
{
key: 'Cache-Control',
value: 'public, max-age=31536000, immutable',
},
],
},
];
},
// Rewrites for SEO-friendly URLs
async rewrites() {
return [
{
source: '/chat',
destination: '/',
},
{
source: '/advice',
destination: '/',
},
{
source: '/bubbe-chat',
destination: '/',
},
];
},
// Redirects for SEO
async redirects() {
return [
{
source: '/home',
destination: '/',
permanent: true,
},
{
source: '/index',
destination: '/',
permanent: true,
},
];
},
};
export default nextConfig;