{ "buildCommand": "npm run build", "outputDirectory": "build", "rewrites": [ { "source": "/stats/:match*", "destination": "https://cloud.umami.is/:match*" }, { "source": "/api/(.*)", "destination": "/api/index" }, { "source": "/((?!api/).*)", "destination": "/index.html" } ], "headers": [ { "source": "/((?!api/|stats/).*)", "headers": [ { "key": "Content-Security-Policy", "value": "default-src 'self'; script-src 'self' https://challenges.cloudflare.com https://s3.tradingview.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data: https://coin-images.coingecko.com; connect-src 'self' https://challenges.cloudflare.com https://fonts.googleapis.com https://gateway.umami.is; frame-src https://challenges.cloudflare.com https://s.tradingview.com https://www.tradingview.com; frame-ancestors 'none'; base-uri 'self'; form-action 'self'; object-src 'none'" }, { "key": "X-Frame-Options", "value": "DENY" }, { "key": "X-Content-Type-Options", "value": "nosniff" }, { "key": "Referrer-Policy", "value": "strict-origin-when-cross-origin" }, { "key": "Permissions-Policy", "value": "camera=(), microphone=(), geolocation=(), payment=(), usb=()" }, { "key": "Strict-Transport-Security", "value": "max-age=63072000; includeSubDomains" } ] } ], "crons": [ { "path": "/api/cron/refresh-user-averages", "schedule": "0 3 1 * *" }, { "path": "/api/cron/delete-users", "schedule": "0 2 * * *" } ], "functions": { "api/index.ts": { "maxDuration": 60 } } }