import type { NextConfig } from 'next'; // ── Content Security Policy ──────────────────────────────────── // Locks down the public-facing site to only trusted sources. const cspDirectives = [ "default-src 'self'", "script-src 'self' 'unsafe-inline'", "style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://unpkg.com", "font-src 'self' https://fonts.gstatic.com", "img-src 'self' data: https://*.basemaps.cartocdn.com https://a.basemaps.cartocdn.com https://b.basemaps.cartocdn.com https://c.basemaps.cartocdn.com https://d.basemaps.cartocdn.com https://unpkg.com", "connect-src 'self'", "frame-ancestors 'none'", "base-uri 'self'", "form-action 'self'", ].join('; '); const nextConfig: NextConfig = { output: 'standalone', images: { loader: 'custom', loaderFile: './lib/immichLoader.ts', }, async headers() { return [ { source: '/(.*)', headers: [ { key: 'Content-Security-Policy', value: cspDirectives }, { key: 'X-Content-Type-Options', value: 'nosniff' }, { key: 'X-Frame-Options', value: 'DENY' }, { key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' }, { key: 'Permissions-Policy', value: 'camera=(), microphone=(), geolocation=()', }, { key: 'Strict-Transport-Security', value: 'max-age=31536000; includeSubDomains', }, { key: 'X-DNS-Prefetch-Control', value: 'off' }, ], }, ]; }, }; export default nextConfig;