/** @type {import('next').NextConfig} */ const nextConfig = { // Enable standalone output for Docker output: 'standalone', // API Proxy to FastAPI backend async rewrites() { const apiUrl = process.env.FASTAPI_URL || 'http://localhost:8000/api'; return [ { source: '/api/:path*', destination: `${apiUrl}/:path*`, }, ]; }, // Image optimization images: { remotePatterns: [ { protocol: 'https', hostname: '*.tile.openstreetmap.org' }, { protocol: 'https', hostname: 'tile.openstreetmap.org' }, { protocol: 'https', hostname: 'cdnjs.cloudflare.com' }, ], formats: ['image/avif', 'image/webp'], minimumCacheTTL: 60, }, // Performance optimizations compiler: { // Remove console logs in production removeConsole: process.env.NODE_ENV === 'production', }, // Compression compress: true, // React strict mode for better error detection reactStrictMode: true, // Power optimizations poweredByHeader: false, // Production source maps (disable for smaller bundles) productionBrowserSourceMaps: false, // Experimental features for performance experimental: { // Optimize package imports optimizePackageImports: ['chart.js', 'react-chartjs-2', 'leaflet'], }, // Headers for caching and security async headers() { return [ { source: '/:path*', headers: [ { key: 'X-DNS-Prefetch-Control', value: 'on', }, { key: 'X-Frame-Options', value: 'SAMEORIGIN', }, { key: 'X-Content-Type-Options', value: 'nosniff', }, { key: 'Referrer-Policy', value: 'origin-when-cross-origin', }, ], }, { source: '/favicon.svg', headers: [ { key: 'Cache-Control', value: 'public, max-age=31536000, immutable', }, ], }, ]; }, }; module.exports = nextConfig;