Monorepo for Aesthetic.Computer aesthetic.computer
at main 2546 lines 80 kB view raw
1[build] 2base = "system" 3publish = "public" 4ignore = "bash ./ignore-index.sh" 5command = "rm -f public/index.html && echo $COMMIT_REF > public/.commit-ref" 6# command = "bash ./github-discord.sh" 7# command = "echo 'Building...'" 8 9# Disable Netlify's post-processing that can cause /:splat redirect issues 10[build.processing] 11skip_processing = false 12[build.processing.html] 13pretty_urls = false 14 15[functions] 16node_bundler = "esbuild" 17directory = "netlify/functions" 18external_node_modules = ["mongodb"] 19 20[functions.apple-developer-merchantid-domain-association] 21included_files = ["public/.well-known/*"] 22included_env_vars = [] 23 24[functions.verify-builds-password] 25included_files = ["backend/**/*.mjs"] 26included_env_vars = ["BUILDS_PASSWORD"] 27 28[functions.claude-token] 29external_node_modules = ["mongodb", "mongodb-connection-string-url"] 30included_files = ["backend/**/*.mjs"] 31included_env_vars = ["AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 32 33[functions.register-build] 34external_node_modules = ["mongodb", "mongodb-connection-string-url"] 35included_files = ["backend/**/*.mjs"] 36included_env_vars = ["BUILDS_API_KEY", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 37 38[functions.get-builds] 39external_node_modules = ["mongodb", "mongodb-connection-string-url"] 40included_files = ["backend/**/*.mjs"] 41included_env_vars = ["BUILDS_PASSWORD", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 42 43[functions.get-build-report] 44external_node_modules = ["mongodb", "mongodb-connection-string-url"] 45included_env_vars = ["BUILDS_PASSWORD", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 46 47[functions.save-build-report] 48external_node_modules = ["mongodb", "mongodb-connection-string-url"] 49included_env_vars = ["BUILDS_API_KEY", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 50 51[functions.reports] 52external_node_modules = ["mongodb", "mongodb-connection-string-url"] 53included_files = ["backend/**/*.mjs"] 54included_env_vars = ["BUILDS_PASSWORD", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 55 56[functions.index] 57included_files = [ 58 "public/aesthetic.computer/*.mjs", 59 "public/aesthetic.computer/disks/**/*.mjs", 60 "public/aesthetic.computer/dep/**/*.mjs", 61 "public/aesthetic.computer/systems/**/*.mjs", 62 "public/aesthetic.computer/lib/**/*.mjs", 63 "backend/**/*.mjs", 64] 65external_node_modules = ["he"] 66included_env_vars = [] 67[functions.delete-erase-and-forget-me] 68external_node_modules = ["@aws-sdk/client-s3", "@atproto/api", "mongodb", "mongodb-connection-string-url"] 69included_env_vars = ["USER_ENDPOINT", "ART_KEY", "ART_SECRET", "USER_SPACE_NAME", "CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "REDIS_CONNECTION_STRING", "NETLIFY_DEV", "PDS_URL", "PDS_ADMIN_PASSWORD"] 70[functions.say] 71external_node_modules = ["@google-cloud/text-to-speech"] 72included_env_vars = ["GCP_EMAIL", "GCP_TTS_KEY_URL", "CONTEXT", "ART_ENDPOINT", "ART_KEY", "ART_SECRET", "ART_SPACE_NAME", "OPENAI_API_KEY"] 73[functions.mood] 74external_node_modules = ["got", "firebase-admin", "obscenity", "@atproto/api", "sharp", "mongodb", "mongodb-connection-string-url"] 75included_env_vars = ["CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "REDIS_CONNECTION_STRING", "NETLIFY_DEV", "GCM_FIREBASE_CONFIG_URL", "PDS_URL", "PDS_ADMIN_PASSWORD"] 76[functions.handle] 77included_files = ["public/aesthetic.computer/lib/text.mjs", "backend/**/*.mjs"] 78external_node_modules = ["got", "mongodb", "mongodb-connection-string-url", "obscenity", "@atproto/api", "sharp"] 79included_env_vars = ["CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "REDIS_CONNECTION_STRING", "NETLIFY_DEV", "LOGGER_KEY", "PDS_URL", "PDS_ADMIN_PASSWORD"] 80[functions.handle-colors] 81included_files = ["backend/**/*.mjs"] 82external_node_modules = ["mongodb", "mongodb-connection-string-url"] 83included_env_vars = ["CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "NETLIFY_DEV", "LOGGER_KEY"] 84[functions.atproto-user-stats] 85external_node_modules = ["mongodb", "mongodb-connection-string-url"] 86included_files = ["backend/**/*.mjs"] 87included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 88[functions.logo] 89external_node_modules = ["got"] 90included_env_vars = [] 91[functions.email] 92external_node_modules = ["stripe"] 93included_env_vars = ["NETLIFY_DEV", "CONTEXT", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "SOTCE_STRIPE_API_PRIV_KEY", "SOTCE_STRIPE_API_PUB_KEY"] 94[functions.blank] 95external_node_modules = ["stripe", "nodemailer"] 96included_env_vars = ["CONTEXT", "STRIPE_API_TEST_PRIV_KEY", "STRIPE_API_PRIV_KEY", "STRIPE_ENDPOINT_DEV_SECRET", "MONGODB_URI", "SMTP_SERVER", "SMTP_USER", "SMTP_PASS"] 97[functions.print] 98external_node_modules = ["got", "stripe", "nodemailer"] 99included_env_vars = ["CONTEXT", "PRINTFUL_API_TOKEN", "STRIPE_API_TEST_PRIV_KEY", "STRIPE_API_PRIV_KEY", "STRIPE_ENDPOINT_DEV_SECRET", "STRIPE_ENDPOINT_SECRET"] 100[functions.mug] 101external_node_modules = ["got", "stripe", "nodemailer", "@aws-sdk/client-s3"] 102included_env_vars = ["CONTEXT", "PRINTFUL_API_TOKEN", "STRIPE_API_TEST_PRIV_KEY", "STRIPE_API_PRIV_KEY", "STRIPE_ENDPOINT_DEV_SECRET", "STRIPE_ENDPOINT_MUG_SECRET", "DO_SPACES_KEY", "DO_SPACES_SECRET", "ART_KEY", "ART_SECRET", "MONGODB_URI"] 103[functions.mockup-gif] 104external_node_modules = ["got", "sharp", "gifenc"] 105included_env_vars = ["CONTEXT"] 106[functions.mockup-webp] 107external_node_modules = ["got", "sharp"] 108included_env_vars = ["CONTEXT"] 109[functions.pixel] 110external_node_modules = ["got", "sharp", "qrcode"] 111included_files = ["netlify/fonts/*.ttf", "backend/**/*.mjs"] 112included_env_vars = ["CONTEXT"] 113[functions.ticket] 114external_node_modules = ["stripe", "nanoid"] 115included_env_vars = ["CONTEXT", "SOTCE_SMTP_USER", "SOTCE_SMTP_PASS"] 116[functions.user] 117included_files = ["backend/**/*.mjs"] 118external_node_modules = ["got", "mongodb", "mongodb-connection-string-url"] 119included_env_vars = ["CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET"] 120[functions.presigned-url] 121external_node_modules = [ 122 "got", 123 "mongodb", 124 "mongodb-connection-string-url", 125 "nanoid", 126 "@aws-sdk-client-s3", 127 "@aws-sdk/s3-request-presigner", 128] 129included_files = ["backend/**/*.mjs"] 130included_env_vars = ["ART_ENDPOINT", "ART_KEY", "ART_SECRET", "DO_SPACES_KEY", "DO_SPACES_SECRET", "WAND_ENDPOINT", "USER_ENDPOINT", "ART_SPACE_NAME", "USER_SPACE_NAME", "WAND_SPACE_NAME", "CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET"] 131[functions.screenshot] 132external_node_modules = ["puppeteer-core"] 133included_env_vars = ["CONTEXT", "BROWSERLESS_API_KEY"] 134[functions.session] 135external_node_modules = ["got", "redis"] 136included_env_vars = ["NETLIFY_DEV", "JAMSOCKET_ACCESS_TOKEN"] 137[functions.reload] 138external_node_modules = ["got", "redis"] 139included_env_vars = ["NETLIFY_DEV", "REDIS_CONNECTION_STRING"] 140[functions.vary] 141external_node_modules = ["got", "multiparty", "openai"] 142included_env_vars = ["OPENAI_API_KEY"] 143[functions.slash] 144external_node_modules = ["discord-interactions"] 145included_env_vars = [] 146[functions.playlist] 147# No special external dependencies needed for static playlist 148included_env_vars = [] 149[functions.clock] 150# No special config needed for clock 151included_env_vars = [] 152[functions.store-clock] 153node_bundler = "esbuild" 154external_node_modules = ["mongodb", "mongodb-connection-string-url"] 155included_files = ["backend/**/*.mjs"] 156included_env_vars = ["CONTEXT", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 157 158[functions.stretched-paintings] 159# justanothersystem.org - Stretched paintings CRUD API (admin: @jeffrey only) 160node_bundler = "esbuild" 161external_node_modules = ["mongodb", "mongodb-connection-string-url", "@aws-sdk/client-s3", "@aws-sdk/s3-request-presigner"] 162included_files = ["backend/**/*.mjs"] 163included_env_vars = ["CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "ART_KEY", "ART_SECRET", "ART_ENDPOINT", "ART_SPACE_NAME", "DO_SPACES_KEY", "DO_SPACES_SECRET"] 164 165[functions.jas-tags] 166# justanothersystem.org - Tags/labels CRUD API (admin: @jeffrey only) 167node_bundler = "esbuild" 168external_node_modules = ["mongodb", "mongodb-connection-string-url"] 169included_files = ["backend/**/*.mjs"] 170included_env_vars = ["CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 171 172[functions.ff1-pair] 173external_node_modules = ["redis"] 174included_files = ["backend/**/*.mjs"] 175included_env_vars = ["REDIS_CONNECTION_STRING", "NETLIFY_DEV"] 176 177[functions.ff1-devices] 178external_node_modules = ["got", "mongodb", "mongodb-connection-string-url"] 179included_files = ["backend/**/*.mjs"] 180included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME", "CONTEXT"] 181 182[functions.store-kidlisp] 183node_bundler = "esbuild" 184external_node_modules = ["@taquito/taquito", "@taquito/signer", "mongodb", "mongodb-connection-string-url", "adm-zip", "@atproto/api"] 185included_files = ["public/aesthetic.computer/lib/kidlisp.mjs", "backend/**/*.mjs"] 186included_env_vars = ["CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "NETLIFY_DEV", "SOTCE_AUTH0_M2M_CLIENT_ID", "SOTCE_AUTH0_M2M_SECRET", "TEZOS_ENABLED", "PDS_URL", "PDS_ADMIN_PASSWORD"] 187 188[functions.store-piece] 189node_bundler = "esbuild" 190external_node_modules = ["mongodb", "mongodb-connection-string-url", "@aws-sdk/client-s3", "@atproto/api"] 191included_files = ["backend/**/*.mjs"] 192included_env_vars = ["CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "NETLIFY_DEV", "PDS_URL", "PDS_ADMIN_PASSWORD", "ART_KEY", "ART_SECRET", "DO_SPACES_KEY", "DO_SPACES_SECRET"] 193 194[functions.piece-metadata] 195node_bundler = "esbuild" 196external_node_modules = ["mongodb", "mongodb-connection-string-url"] 197included_files = ["backend/**/*.mjs"] 198included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 199 200[functions.tv] 201external_node_modules = ["mongodb", "mongodb-connection-string-url"] 202included_files = ["backend/**/*.mjs"] 203included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME", "NETLIFY_DEV", "CONTEXT", "MEDIA_BASE_URL"] 204 205[functions.tv-tapes] 206external_node_modules = ["mongodb", "mongodb-connection-string-url"] 207included_files = ["backend/**/*.mjs"] 208included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME", "NETLIFY_DEV", "CONTEXT"] 209 210[functions.ask] 211included_env_vars = ["CONTEXT", "ANTHROPIC_API_KEY", "OPENAI_API_KEY"] 212 213[functions.billing] 214# Billing aggregation - pulls costs from SaaS providers 215included_files = ["backend/**/*.mjs"] 216included_env_vars = ["CONTEXT", "DO_API_TOKEN", "DO_TOKEN", "CLOUDFLARE_EMAIL", "CLOUDFLARE_API_KEY", "CLOUDFLARE_ACCOUNT_ID", "PINATA_API_KEY", "PINATA_API_SECRET", "OPENAI_API_KEY"] 217 218[functions.give] 219# Give/support payments via Stripe 220external_node_modules = ["stripe"] 221included_files = ["backend/**/*.mjs"] 222included_env_vars = ["CONTEXT", "STRIPE_API_TEST_PRIV_KEY", "STRIPE_API_PRIV_KEY"] 223 224[functions.paypal] 225# PayPal payments for giving/supporting AC 226external_node_modules = ["mongodb", "mongodb-connection-string-url"] 227included_files = ["backend/**/*.mjs"] 228included_env_vars = ["CONTEXT", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "PAYPAL_CLIENT_ID", "PAYPAL_CLIENT_SECRET"] 229 230[functions.give-portal] 231# Stripe Customer Portal for managing/canceling subscriptions 232external_node_modules = ["stripe"] 233included_files = ["backend/**/*.mjs"] 234included_env_vars = ["CONTEXT", "STRIPE_API_TEST_PRIV_KEY", "STRIPE_API_PRIV_KEY"] 235 236[functions.unsubscribe] 237# Email blast unsubscribe/resubscribe endpoint 238external_node_modules = ["mongodb", "mongodb-connection-string-url"] 239included_files = ["backend/**/*.mjs"] 240included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME", "UNSUBSCRIBE_SECRET"] 241 242[functions.mail-status] 243# Email preferences and blast history API 244external_node_modules = ["mongodb", "mongodb-connection-string-url"] 245included_files = ["backend/**/*.mjs"] 246included_env_vars = ["CONTEXT", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET"] 247 248[functions.bundle-html] 249# Generates KidLisp .lisp.html bundles on-demand via API 250# Migrated from tezos/bundle-keep-html.mjs CLI tool 251external_node_modules = ["terser"] 252included_files = [ 253 "public/aesthetic.computer/**/*.mjs", 254 "public/aesthetic.computer/**/*.js", 255 "public/aesthetic.computer/disks/drawings/font_1/**/*.json", 256 "public/aesthetic.computer/dep/**/*.mjs", 257 "backend/**/*.mjs" 258] 259included_env_vars = ["GIT_COMMIT", "CONTEXT"] 260 261[functions.bundle-telemetry] 262# Collects performance telemetry from inline bundles 263external_node_modules = ["mongodb", "mongodb-connection-string-url"] 264included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 265 266[functions.bundle-telemetry-query] 267# Query collected bundle telemetry 268external_node_modules = ["mongodb", "mongodb-connection-string-url"] 269included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 270 271[functions.keep-mint] 272# Mint KidLisp pieces as NFTs on Tezos (streaming SSE) 273included_files = ["backend/**/*.mjs"] 274external_node_modules = ["mongodb", "mongodb-connection-string-url", "bn.js", "@taquito/taquito", "@taquito/signer", "@taquito/rpc", "@taquito/http-utils", "@taquito/utils", "@taquito/michelson-encoder", "@taquito/local-forging", "@taquito/michel-codec", "@taquito/core"] 275included_env_vars = ["CONTEXT", "TEZOS_NETWORK", "TEZOS_KIDLISP_KEY", "PINATA_API_KEY", "PINATA_API_SECRET", "OVEN_URL", "USE_IPFS_GATEWAY_URLS", "IPFS_GATEWAY", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "ADMIN_SUB"] 276 277[functions.keep-prepare] 278# Job-based keep preparation (validates, creates job, invokes background) 279included_files = ["backend/**/*.mjs"] 280external_node_modules = ["mongodb", "mongodb-connection-string-url"] 281included_env_vars = ["CONTEXT", "TEZOS_NETWORK", "OVEN_URL", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "ADMIN_SUB", "URL", "DEPLOY_URL"] 282 283[functions.keep-prepare-background] 284# Background pipeline for keep preparation (oven, IPFS, metadata — up to 15 min) 285included_files = ["backend/**/*.mjs"] 286external_node_modules = ["mongodb", "mongodb-connection-string-url", "bn.js", "@taquito/taquito", "@taquito/signer", "@taquito/rpc", "@taquito/http-utils", "@taquito/utils", "@taquito/michelson-encoder", "@taquito/local-forging", "@taquito/michel-codec", "@taquito/core"] 287included_env_vars = ["CONTEXT", "TEZOS_NETWORK", "TEZOS_KIDLISP_KEY", "PINATA_API_KEY", "PINATA_API_SECRET", "OVEN_URL", "USE_IPFS_GATEWAY_URLS", "IPFS_GATEWAY", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "ADMIN_SUB"] 288 289[functions.keep-status] 290# Lightweight polling endpoint for keep job progress 291included_files = ["backend/**/*.mjs"] 292external_node_modules = ["mongodb", "mongodb-connection-string-url"] 293included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 294 295[functions.boot-log] 296# Store boot telemetry in MongoDB 297included_files = ["backend/**/*.mjs"] 298external_node_modules = ["mongodb", "mongodb-connection-string-url"] 299included_env_vars = ["CONTEXT", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 300 301[functions.paper-hit] 302# Track paper PDF views/downloads 303included_files = ["backend/**/*.mjs"] 304external_node_modules = ["mongodb", "mongodb-connection-string-url"] 305included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 306 307[functions.keep-confirm] 308# Confirm client-side wallet mints and update MongoDB 309included_files = ["backend/**/*.mjs"] 310external_node_modules = ["mongodb", "mongodb-connection-string-url"] 311included_env_vars = ["CONTEXT", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "ADMIN_SUB"] 312 313[functions.keep-update] 314# Update on-chain metadata for already-minted Keeps 315included_files = ["backend/**/*.mjs"] 316external_node_modules = ["mongodb", "mongodb-connection-string-url", "bn.js", "@taquito/taquito", "@taquito/signer", "@taquito/rpc", "@taquito/http-utils", "@taquito/utils", "@taquito/michelson-encoder", "@taquito/local-forging", "@taquito/michel-codec", "@taquito/core"] 317included_env_vars = ["CONTEXT", "TEZOS_NETWORK", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "ADMIN_SUB"] 318 319[functions.run] 320included_env_vars = ["NETLIFY_DEV", "REDIS_CONNECTION_STRING"] 321 322[functions.handles] 323external_node_modules = ["mongodb", "mongodb-connection-string-url"] 324included_env_vars = ["CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 325[functions.piece-hit] 326external_node_modules = ["mongodb", "mongodb-connection-string-url"] 327included_files = ["backend/**/*.mjs"] 328included_env_vars = ["CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 329[functions.piece-fans] 330external_node_modules = ["mongodb", "mongodb-connection-string-url"] 331included_files = ["backend/**/*.mjs"] 332included_env_vars = ["CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 333[functions.track-media] 334external_node_modules = ["sharp", "mongodb", "mongodb-connection-string-url", "adm-zip", "@atproto/api"] 335included_files = ["backend/**/*.mjs"] 336included_env_vars = ["CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "NETLIFY_DEV", "PDS_URL", "PDS_ADMIN_PASSWORD", "SOTCE_AUTH0_M2M_CLIENT_ID", "SOTCE_AUTH0_M2M_SECRET", "ART_KEY", "ART_SECRET", "DO_SPACES_KEY", "DO_SPACES_SECRET", "ART_ENDPOINT", "ART_SPACE_NAME", "USER_SPACE_NAME", "USER_ENDPOINT", "OVEN_CALLBACK_SECRET", "OVEN_URL", "URL"] 337[functions.track-tape] 338external_node_modules = ["mongodb", "mongodb-connection-string-url"] 339included_env_vars = ["CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "ART_KEY", "ART_SECRET", "ART_ENDPOINT", "ART_SPACE_NAME", "USER_SPACE_NAME", "DO_SPACES_KEY", "DO_SPACES_SECRET", "MP4_SERVICE_URL", "MP4_SERVICE_TOKEN", "URL"] 340[functions.get-tape] 341external_node_modules = ["mongodb", "mongodb-connection-string-url"] 342included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 343[functions.get-tape-status] 344external_node_modules = ["mongodb", "mongodb-connection-string-url"] 345included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 346[functions.oven-complete] 347external_node_modules = ["mongodb", "mongodb-connection-string-url", "adm-zip", "@atproto/api"] 348included_files = ["backend/**/*.mjs"] 349included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME", "PDS_URL", "PDS_ADMIN_PASSWORD", "OVEN_CALLBACK_SECRET", "OVEN_URL"] 350[functions.get-painting] 351external_node_modules = ["mongodb", "mongodb-connection-string-url"] 352included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 353[functions.painting-code] 354external_node_modules = ["mongodb", "mongodb-connection-string-url"] 355included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 356[functions.painting-metadata] 357external_node_modules = ["mongodb", "mongodb-connection-string-url"] 358included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 359[functions.bdf-glyph] 360included_env_vars = ["NETLIFY_DEV", "NODE_ENV", "ART_ENDPOINT", "ART_KEY", "ART_SECRET", "URL"] 361[functions.shop] 362external_node_modules = ["mongodb", "mongodb-connection-string-url"] 363included_files = ["backend/**/*.mjs"] 364included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 365[functions.export-piece] 366external_node_modules = ["terser"] 367included_files = ["public/aesthetic.computer/disks/**/*.mjs", "public/aesthetic.computer/dep/**/*.mjs", "public/aesthetic.computer/systems/**/*.mjs", "public/aesthetic.computer/lib/**/*.mjs", "backend/**/*.mjs", "public/type/webfonts/**/*"] 368included_env_vars = [] 369[functions.subscribe-to-topic] 370included_env_vars = ["GCM_FIREBASE_CONFIG_URL"] 371[functions.auth0-events] 372external_node_modules = ["@atproto/api", "mongodb", "mongodb-connection-string-url"] 373included_env_vars = ["AUTH0_LOG_TOKEN", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "PDS_URL", "PDS_ADMIN_PASSWORD"] 374[functions.docs] 375included_env_vars = ["CONTEXT"] 376[functions.api-docs] 377# API documentation - no environment variables needed 378included_env_vars = [] 379[functions.mcp-remote] 380# Remote MCP server - no environment variables needed (auth via headers) 381included_env_vars = [] 382[functions.media-collection] 383external_node_modules = ["mongodb", "mongodb-connection-string-url"] 384included_env_vars = ["CONTEXT", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 385[functions.authorized] 386included_env_vars = ["CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET"] 387[functions.profile] 388external_node_modules = ["mongodb", "mongodb-connection-string-url"] 389included_env_vars = ["CONTEXT", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 390[functions.chat-messages] 391external_node_modules = ["mongodb", "mongodb-connection-string-url"] 392included_files = ["backend/**/*.mjs"] 393included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 394[functions.metrics] 395external_node_modules = ["mongodb", "mongodb-connection-string-url"] 396included_files = ["backend/**/*.mjs"] 397included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME", "PRINTFUL_API_TOKEN"] 398[functions.update-painting-slug] 399external_node_modules = ["mongodb", "mongodb-connection-string-url"] 400included_files = ["backend/**/*.mjs"] 401included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET"] 402[functions.sotce-net] 403external_node_modules = ["mongodb", "mongodb-connection-string-url"] 404included_files = ["backend/**/*.mjs"] 405included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 406 407# Missing functions that need env var whitelisting to avoid 4KB limit 408[functions.backfill-painting-codes] 409external_node_modules = ["mongodb", "mongodb-connection-string-url", "nanoid"] 410included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 411 412[functions.redirect-proxy] 413included_files = ["public/aesthetic.computer/lib/helpers.mjs"] 414included_env_vars = [] 415 416[functions.kidlisp-keep] 417external_node_modules = ["mongodb", "mongodb-connection-string-url"] 418included_files = ["backend/**/*.mjs"] 419included_env_vars = ["CONTEXT", "TEZOS_NETWORK", "OVEN_URL", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "ADMIN_SUB"] 420 421[functions.keeps-config] 422external_node_modules = ["mongodb", "mongodb-connection-string-url"] 423included_files = ["backend/**/*.mjs"] 424included_env_vars = ["CONTEXT", "TEZOS_NETWORK", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 425 426[functions.test-tv-hits] 427external_node_modules = ["mongodb", "mongodb-connection-string-url"] 428included_files = ["backend/**/*.mjs"] 429included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] 430 431[functions.update-build] 432external_node_modules = ["mongodb", "mongodb-connection-string-url"] 433included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME", "BUILDS_API_KEY"] 434 435[functions.auth-cli-callback] 436included_env_vars = ["AUTH0_DOMAIN", "AUTH0_CLIENT_ID", "AUTH0_CLIENT_SECRET"] 437 438[functions.ff1-proxy] 439included_env_vars = [] 440 441[functions.firebase-config] 442included_env_vars = ["AC_FIREBASE_API_KEY", "AC_FIREBASE_AUTH_DOMAIN", "AC_FIREBASE_PROJECT_ID", "AC_FIREBASE_STORAGE_BUCKET", "AC_FIREBASE_MESSAGING_SENDER_ID", "AC_FIREBASE_APP_ID"] 443 444[functions.give-image] 445included_env_vars = [] 446 447[functions.gives] 448external_node_modules = ["stripe"] 449included_env_vars = ["CONTEXT", "STRIPE_API_PRIV_KEY"] 450 451[functions.keep-update-confirm] 452external_node_modules = ["mongodb", "mongodb-connection-string-url"] 453included_files = ["backend/**/*.mjs"] 454included_env_vars = ["CONTEXT", "TEZOS_NETWORK", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "ADMIN_SUB"] 455 456[functions.kidlisp-count] 457included_env_vars = [] 458 459[functions.kidlisp-list] 460included_env_vars = [] 461 462[functions.m4l-plugins] 463included_env_vars = [] 464 465[functions.migrate-piece-paths] 466included_env_vars = ["ART_KEY", "ART_SECRET", "DO_SPACES_KEY", "DO_SPACES_SECRET"] 467 468[functions.news] 469included_env_vars = ["CONTEXT", "NETLIFY_DEV", "NODE_ENV"] 470 471[functions.news-api] 472included_env_vars = ["ADMIN_SUB"] 473 474[functions.news-guidelines] 475included_env_vars = [] 476 477[functions.news-toll] 478external_node_modules = ["stripe"] 479included_env_vars = ["CONTEXT", "STRIPE_API_TEST_PRIV_KEY", "STRIPE_API_PRIV_KEY", "STRIPE_ENDPOINT_DEV_SECRET", "STRIPE_ENDPOINT_SECRET"] 480 481[functions.og-preview] 482included_env_vars = ["NETLIFY_DEV", "CONTEXT"] 483 484[functions.patch] 485included_env_vars = ["CONTEXT", "GITHUB_COPILOT_TOKEN"] 486 487[functions.permahandle] 488included_env_vars = [] 489 490[functions.piece-dates] 491included_env_vars = [] 492 493[functions.stories] 494included_env_vars = ["BUILDS_PASSWORD"] 495 496[functions.update-tezos-address] 497included_files = ["backend/**/*.mjs"] 498external_node_modules = ["mongodb", "mongodb-connection-string-url"] 499included_env_vars = ["CONTEXT", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET"] 500 501[functions.mugs] 502included_env_vars = [] 503 504[functions.agent-memory-ingest] 505external_node_modules = ["mongodb", "mongodb-connection-string-url"] 506included_env_vars = [ 507 "AGENT_MEMORY_SECRET_ID", 508 "AGENT_MEMORY_MONGODB_CONNECTION_STRING", 509 "AGENT_MEMORY_MONGODB_NAME", 510 "MONGODB_CONNECTION_STRING", 511 "MONGODB_NAME", 512] 513 514[dev] 515NODE_ENV = "development" 516publish = "public/" 517command = "caddy run --config Caddyfile" 518port = 8888 519targetPort = 8111 520#framework = "#static" 521autoLaunch = false 522# No [dev.https] in base config - it's context-specific 523 524[dev.environment] 525OVEN_URL = "https://localhost:3002" 526SILO_URL = "https://localhost:3003" 527 528# Context for local development: uses HTTPS with local SSL certificates 529[context.local.dev] 530[context.local.dev.https] 531certFile = "../ssl-dev/localhost.pem" 532keyFile = "../ssl-dev/localhost-key.pem" 533 534# Context for Codespaces: disable HTTPS since Codespaces handles SSL at proxy level 535[context.codespace.dev] 536# Inherits all [dev] settings but without HTTPS 537# No [dev.https] section = HTTP only 538 539[context.production] 540NODE_ENV = "production" 541[[headers]] 542for = "/*" # Define which paths this specific [[headers]] block will cover. 543[headers.values] 544Access-Control-Allow-Origin = "*" 545Cache-Control = "no-cache, no-store, must-revalidate" 546Pragma = "no-cache" 547# These headers are required in order for SharedArrayBuffer to be enabled. 548# Currently used by ffmpeg.wasm. 22.08.06.11.01 549# Cross-Origin-Embedder-Policy = "require-corp" 550Cross-Origin-Opener-Policy = "same-origin-allow-popups" 551Cross-Origin-Resource-Policy = "cross-origin" 552[[headers]] 553for = "/api/*" 554[headers.values] 555Access-Control-Allow-Origin = "*" 556Access-Control-Allow-Methods = "GET, POST, PUT, DELETE, OPTIONS" 557Access-Control-Allow-Headers = "Content-Type, Authorization" 558[[headers]] 559for = "/*.mjs|/*.js" 560[headers.values] 561Access-Control-Allow-Origin = "*" 562Cache-Control = "no-cache, no-store, must-revalidate" 563Pragma = "no-cache" 564Content-Security-Policy = "script-src 'self' https://www.gstatic.com https://cdn.jsdelivr.net https://aesthetic.computer https://assets.aesthetic.computer blob: 'unsafe-eval';" 565# Cross-Origin-Resource-Policy = "cross-origin" 566Vary = "*" 567[[edge_functions]] 568path = "/media/*" 569function = "media" 570 571[[edge_functions]] 572path = "/api/os-release-upload" 573function = "os-release-upload" 574 575# keep.kidlisp.com/$code — social crawler meta tag injection 576[[edge_functions]] 577path = "/*" 578function = "keeps-social" 579excludedPath = ["/api/device-auth", "/api/device-login", "/api/device-token", "/api/device-pair", "/device-login"] 580 581# Version/commit status API 582[functions.version] 583included_files = ["public/.commit-ref"] 584 585[[redirects]] 586from = "/api/version" 587to = "/.netlify/functions/version" 588status = 200 589 590# M4L plugins API 591[[redirects]] 592from = "/m4l-plugins" 593to = "/.netlify/functions/m4l-plugins" 594status = 200 595 596[[redirects]] 597from = "/m4l-plugins/*" 598to = "/.netlify/functions/m4l-plugins/:splat" 599status = 200 600 601# FF1 API routes 602[[redirects]] 603from = "/api/ff1/*" 604to = "/.netlify/functions/ff1-:splat" 605status = 200 606 607# Serve type/font assets locally (allow dev edits to BDF files) 608# This must come BEFORE the general /assets/* proxy below 609# force = true ensures this takes precedence over the /assets/* rule 610[[redirects]] 611from = "/assets/type/*" 612to = "/assets/type/:splat" 613status = 200 614force = true 615 616# Proxy assets to S3 (DigitalOcean Spaces) - avoids uploading 13GB to Netlify 617[[redirects]] 618from = "/assets/*" 619to = "https://assets.aesthetic.computer/:splat" 620status = 200 621force = true 622 623# Redirect root-level .mjs requests to aesthetic.computer subdirectory 624# This handles cases where dynamic imports resolve incorrectly 625[[redirects]] 626from = "/bios.mjs" 627to = "/aesthetic.computer/bios.mjs" 628status = 200 629 630[[redirects]] 631from = "/lib/*" 632to = "/aesthetic.computer/lib/:splat" 633status = 200 634 635# Desktop app download shortcuts (via silo → DigitalOcean Spaces) 636[[redirects]] 637from = "/desktop/mac" 638to = "https://silo.aesthetic.computer/desktop/download/mac" 639status = 302 640[[redirects]] 641from = "/desktop/win" 642to = "https://silo.aesthetic.computer/desktop/download/win" 643status = 302 644[[redirects]] 645from = "/desktop/linux" 646to = "https://silo.aesthetic.computer/desktop/download/linux" 647status = 302 648 649[[redirects]] 650from = "https://botce.ac" 651to = "https://aesthetic.computer/botce" 652status = 200 653force = true 654[[redirects]] 655from = "https://sotce.net/aesthetic.computer/*" 656to = "/aesthetic.computer/:splat" 657status = 200 658force = true 659[[redirects]] 660from = "/redirect-proxy-sotce" 661to = "/.netlify/functions/redirect-proxy" 662status = 200 663[[redirects]] 664from = "https://sotce.net/user" 665to = "/.netlify/functions/user" 666status = 200 667force = true 668[[redirects]] 669from = "https://sotce.net/handle" 670to = "/.netlify/functions/handle" 671status = 200 672force = true 673[[redirects]] 674from = "https://sotce.net/api/email" 675to = "/.netlify/functions/email" 676status = 200 677[[redirects]] 678from = "https://sotce.net/redirect-proxy-sotce" 679to = "/.netlify/functions/redirect-proxy" 680status = 200 681[[redirects]] 682from = "https://sotce.net/*" 683to = "/.netlify/functions/sotce-net" 684status = 200 685force = true 686[[redirects]] 687from = "/sotce-net/*" 688to = "/.netlify/functions/sotce-net/:splat" 689status = 200 690force = true 691[[redirects]] 692from = "/sotce.net/*" 693to = "/.netlify/functions/sotce-net/:splat" 694status = 200 695force = true 696[[redirects]] 697from = "https://whistlegraph.com/*" 698to = "https://trio.whistlegraph.com/:splat" 699status = 301 700force = true 701# jas.life - Jeffrey's CV/portfolio 702# Local dev: https://localhost:8888/jas.life/ 703[[redirects]] 704from = "/jas.life" 705to = "/jas.life/" 706status = 200 707force = true 708[[redirects]] 709from = "/jas.life/*" 710to = "/jas.life/:splat" 711status = 200 712force = true 713[[redirects]] 714from = "https://jas.life/*" 715to = "/jas.life/:splat" 716status = 200 717force = true 718[[redirects]] 719from = "https://www.jas.life/*" 720to = "https://jas.life/:splat" 721status = 301 722force = true 723# digitpain.com - redirect to jas.life (deprecated) 724[[redirects]] 725from = "https://digitpain.com/*" 726to = "https://jas.life/:splat" 727status = 301 728force = true 729[[redirects]] 730from = "https://www.digitpain.com/*" 731to = "https://jas.life/:splat" 732status = 301 733force = true 734 735# rdp.jas.life - Radical Digital Painting collection (239 paintings, 2016–2021) 736# Local dev: https://localhost:8888/rdp.jas.life/ 737[[redirects]] 738from = "https://rdp.jas.life/*" 739to = "/rdp.jas.life/:splat" 740status = 200 741force = true 742[[redirects]] 743from = "/rdp.jas.life" 744to = "/rdp.jas.life/" 745status = 200 746force = true 747[[redirects]] 748from = "/rdp.jas.life/*" 749to = "/rdp.jas.life/:splat" 750status = 200 751force = true 752 753# justanothersystem.org - Stretched paintings by Jeffrey Alan Scudder 754# API routes first (before catch-all) 755[[redirects]] 756from = "https://justanothersystem.org/api/stretched-paintings" 757to = "/.netlify/functions/stretched-paintings" 758status = 200 759force = true 760[[redirects]] 761from = "https://justanothersystem.org/api/stretched-paintings/*" 762to = "/.netlify/functions/stretched-paintings/:splat" 763status = 200 764force = true 765[[redirects]] 766from = "https://www.justanothersystem.org/api/stretched-paintings" 767to = "/.netlify/functions/stretched-paintings" 768status = 200 769force = true 770[[redirects]] 771from = "https://www.justanothersystem.org/api/stretched-paintings/*" 772to = "/.netlify/functions/stretched-paintings/:splat" 773status = 200 774force = true 775# JAS Tags API 776[[redirects]] 777from = "https://justanothersystem.org/api/tags" 778to = "/.netlify/functions/jas-tags" 779status = 200 780force = true 781[[redirects]] 782from = "https://justanothersystem.org/api/tags/*" 783to = "/.netlify/functions/jas-tags/:splat" 784status = 200 785force = true 786[[redirects]] 787from = "https://justanothersystem.org/api/jas-tags" 788to = "/.netlify/functions/jas-tags" 789status = 200 790force = true 791[[redirects]] 792from = "https://justanothersystem.org/api/jas-tags/*" 793to = "/.netlify/functions/jas-tags/:splat" 794status = 200 795force = true 796[[redirects]] 797from = "https://www.justanothersystem.org/api/tags" 798to = "/.netlify/functions/jas-tags" 799status = 200 800force = true 801[[redirects]] 802from = "https://www.justanothersystem.org/api/tags/*" 803to = "/.netlify/functions/jas-tags/:splat" 804status = 200 805force = true 806[[redirects]] 807from = "https://www.justanothersystem.org/api/jas-tags" 808to = "/.netlify/functions/jas-tags" 809status = 200 810force = true 811[[redirects]] 812from = "https://www.justanothersystem.org/api/jas-tags/*" 813to = "/.netlify/functions/jas-tags/:splat" 814status = 200 815force = true 816# Static content routes 817[[redirects]] 818from = "https://justanothersystem.org" 819to = "/justanothersystem.org/index.html" 820status = 200 821force = true 822[[redirects]] 823from = "https://justanothersystem.org/cv" 824to = "/justanothersystem.org/cv.html" 825status = 200 826force = true 827[[redirects]] 828from = "https://justanothersystem.org/bio" 829to = "/justanothersystem.org/bio.html" 830status = 200 831force = true 832[[redirects]] 833from = "https://justanothersystem.org/*" 834to = "/justanothersystem.org/:splat" 835status = 200 836force = true 837[[redirects]] 838from = "https://www.justanothersystem.org" 839to = "https://justanothersystem.org" 840status = 301 841force = true 842[[redirects]] 843from = "https://www.justanothersystem.org/*" 844to = "https://justanothersystem.org/:splat" 845status = 301 846force = true 847 848[[redirects]] 849from = "https://builds.false.work/api/register-build" 850to = "/.netlify/functions/register-build" 851status = 200 852force = true 853[[redirects]] 854from = "https://builds.false.work/api/get-builds" 855to = "/.netlify/functions/get-builds" 856status = 200 857force = true 858[[redirects]] 859from = "https://builds.false.work/api/verify-password" 860to = "/.netlify/functions/verify-builds-password" 861status = 200 862force = true 863[[redirects]] 864from = "https://builds.false.work/*" 865to = "/builds.false.work/:splat" 866status = 200 867force = true 868 869# false.work naked domain - landing page 870[[redirects]] 871from = "https://www.false.work" 872to = "https://false.work" 873status = 301 874force = true 875[[redirects]] 876from = "https://www.false.work/*" 877to = "https://false.work/:splat" 878status = 301 879force = true 880[[redirects]] 881from = "https://false.work" 882to = "/false.work/index.html" 883status = 200 884force = true 885[[redirects]] 886from = "https://false.work/*" 887to = "/false.work/:splat" 888status = 200 889force = true 890 891# Local dev path-based access for false.work sites 892[[redirects]] 893from = "/false.work" 894to = "/false.work/index.html" 895status = 200 896[[redirects]] 897from = "/builds.false.work" 898to = "/builds.false.work/index.html" 899status = 200 900 901[[redirects]] 902from = "/media-collection/*" 903to = "/.netlify/functions/media-collection" 904status = 200 905force = true 906[[redirects]] 907from = "/.well-known/apple-developer-merchantid-domain-association" 908to = "/.netlify/functions/apple-developer-merchantid-domain-association" 909status = 200 910force = true 911[[redirects]] 912from = "/slash" 913to = "/.netlify/functions/slash" 914status = 200 915force = true 916[[redirects]] 917from = "https://www.4esthetic.com/*" 918to = "https://aesthetic.computer/:splat" 919status = 301 920force = true 921[[redirects]] 922from = "https://4esthetic.com/*" 923to = "https://aesthetic.computer/:splat" 924status = 301 925force = true 926[[redirects]] 927from = "https://wand.ac" 928to = "https://aesthetic.computer/wand" 929status = 301 930force = true 931[[redirects]] 932from = "https://edit.ac" 933to = "https://vscode.dev/github/digitpain/aesthetic.computer-code/blob/main/blank.mjs" 934status = 301 935force = true 936[[redirects]] 937from = "https://m2w2.whistlegraph.com" 938to = "https://aesthetic.computer/wg~m2w2" 939status = 200 940force = false 941[[redirects]] 942from = "https://wipppps.world" 943to = "https://aesthetic.computer/wipppps" 944status = 200 945force = true 946[[redirects]] 947from = "https://www.wipppps.world" 948to = "https://wipppps.world" 949status = 301 950force = true 951 952[[redirects]] 953from = "https://www.sundarakarma.com" 954to = "https://aesthetic.computer/sundarakarma.com" 955status = 200 956force = true 957[[redirects]] 958from = "https://www.sundarakarma.com/oscar" 959to = "https://aesthetic.computer/sundarakarma.com/oscar.html" 960status = 200 961force = true 962[[redirects]] 963from = "https://sundarakarma.com" 964to = "https://aesthetic.computer/sundarakarma.com" 965status = 200 966force = true 967[[redirects]] 968from = "https://sundarakarma.com/oscar" 969to = "https://aesthetic.computer/sundarakarma.com/oscar.html" 970status = 200 971force = true 972[[redirects]] 973from = "https://pals.aesthetic.computer/*" 974to = "https://aesthetic.computer/api/logo/:splat" 975status = 200 976force = true 977[[redirects]] 978from = "https://prompt.ac/ejjk1z" 979to = "https://duckweedtri.prompt.ac" 980status = 301 981force = true 982[[redirects]] 983from = "https://prompt.ac/*" 984to = "https://aesthetic.computer/:splat" 985status = 301 986force = true 987[[redirects]] 988from = "https://l5.prompt.ac" 989to = "https://l5.aesthetic.computer" 990status = 301 991force = true 992[[redirects]] 993from = "https://l5.prompt.ac/*" 994to = "https://l5.aesthetic.computer/:splat" 995status = 301 996force = true 997[[redirects]] 998from = "https://processing.prompt.ac" 999to = "https://processing.aesthetic.computer" 1000status = 301 1001force = true 1002[[redirects]] 1003from = "https://processing.prompt.ac/*" 1004to = "https://processing.aesthetic.computer/:splat" 1005status = 301 1006force = true 1007[[redirects]] 1008from = "https://p5.prompt.ac" 1009to = "https://p5.aesthetic.computer" 1010status = 301 1011force = true 1012[[redirects]] 1013from = "https://p5.prompt.ac/*" 1014to = "https://p5.aesthetic.computer/:splat" 1015status = 301 1016force = true 1017[[redirects]] 1018from = "/processing.prompt.ac" 1019to = "/processing.aesthetic.computer" 1020status = 301 1021force = true 1022[[redirects]] 1023from = "/processing.prompt.ac/*" 1024to = "/processing.aesthetic.computer/:splat" 1025status = 301 1026force = true 1027[[redirects]] 1028from = "/p5.prompt.ac" 1029to = "/p5.aesthetic.computer" 1030status = 301 1031force = true 1032[[redirects]] 1033from = "/p5.prompt.ac/*" 1034to = "/p5.aesthetic.computer/:splat" 1035status = 301 1036force = true 1037# sitemap.prompt.ac → sitemap.aesthetic.computer 1038[[redirects]] 1039from = "https://sitemap.prompt.ac" 1040to = "https://sitemap.aesthetic.computer" 1041status = 301 1042force = true 1043[[redirects]] 1044from = "https://sitemap.prompt.ac/*" 1045to = "https://sitemap.aesthetic.computer/:splat" 1046status = 301 1047force = true 1048# api.prompt.ac → api.aesthetic.computer 1049[[redirects]] 1050from = "https://api.prompt.ac" 1051to = "https://api.aesthetic.computer" 1052status = 301 1053force = true 1054[[redirects]] 1055from = "https://api.prompt.ac/*" 1056to = "https://api.aesthetic.computer/:splat" 1057status = 301 1058force = true 1059[[redirects]] 1060from = "https://l5.aesthetic.computer" 1061to = "/l5.aesthetic.computer/index.html" 1062status = 200 1063force = true 1064[[redirects]] 1065from = "https://l5.aesthetic.computer/docs.json" 1066to = "/docs.json" 1067status = 200 1068force = true 1069[[redirects]] 1070from = "https://l5.aesthetic.computer/docs/*" 1071to = "/docs/:splat" 1072status = 200 1073force = true 1074[[redirects]] 1075from = "https://l5.aesthetic.computer/l5.aesthetic.computer/*" 1076to = "/l5.aesthetic.computer/:splat" 1077status = 200 1078force = true 1079[[redirects]] 1080from = "https://l5.aesthetic.computer/aesthetic.computer/*" 1081to = "/aesthetic.computer/:splat" 1082status = 200 1083force = true 1084[[redirects]] 1085from = "https://l5.aesthetic.computer/*" 1086to = "/l5.aesthetic.computer/index.html" 1087status = 200 1088force = true 1089[[redirects]] 1090from = "https://processing.aesthetic.computer" 1091to = "/processing.aesthetic.computer/index.html" 1092status = 200 1093force = true 1094[[redirects]] 1095from = "https://processing.aesthetic.computer/docs.json" 1096to = "/docs.json" 1097status = 200 1098force = true 1099[[redirects]] 1100from = "https://processing.aesthetic.computer/docs/*" 1101to = "/docs/:splat" 1102status = 200 1103force = true 1104[[redirects]] 1105from = "https://processing.aesthetic.computer/processing.aesthetic.computer/*" 1106to = "/processing.aesthetic.computer/:splat" 1107status = 200 1108force = true 1109[[redirects]] 1110from = "https://processing.aesthetic.computer/aesthetic.computer/*" 1111to = "/aesthetic.computer/:splat" 1112status = 200 1113force = true 1114[[redirects]] 1115from = "https://processing.aesthetic.computer/*" 1116to = "/processing.aesthetic.computer/index.html" 1117status = 200 1118force = true 1119[[redirects]] 1120from = "https://p5.aesthetic.computer" 1121to = "/processing.aesthetic.computer/index.html" 1122status = 200 1123force = true 1124[[redirects]] 1125from = "https://p5.aesthetic.computer/docs.json" 1126to = "/docs.json" 1127status = 200 1128force = true 1129[[redirects]] 1130from = "https://p5.aesthetic.computer/docs/*" 1131to = "/docs/:splat" 1132status = 200 1133force = true 1134[[redirects]] 1135from = "https://p5.aesthetic.computer/processing.aesthetic.computer/*" 1136to = "/processing.aesthetic.computer/:splat" 1137status = 200 1138force = true 1139[[redirects]] 1140from = "https://p5.aesthetic.computer/aesthetic.computer/*" 1141to = "/aesthetic.computer/:splat" 1142status = 200 1143force = true 1144[[redirects]] 1145from = "https://p5.aesthetic.computer/*" 1146to = "/processing.aesthetic.computer/index.html" 1147status = 200 1148force = true 1149[[redirects]] 1150from = "/processing.aesthetic.computer" 1151to = "/processing.aesthetic.computer/index.html" 1152status = 200 1153force = true 1154[[redirects]] 1155from = "/processing.aesthetic.computer/docs.json" 1156to = "/docs.json" 1157status = 200 1158force = true 1159[[redirects]] 1160from = "/processing.aesthetic.computer/docs/*" 1161to = "/docs/:splat" 1162status = 200 1163force = true 1164[[redirects]] 1165from = "/processing.aesthetic.computer/processing.aesthetic.computer/*" 1166to = "/processing.aesthetic.computer/:splat" 1167status = 200 1168force = true 1169[[redirects]] 1170from = "/processing.aesthetic.computer/*" 1171to = "/processing.aesthetic.computer/index.html" 1172status = 200 1173force = false 1174[[redirects]] 1175from = "/p5.aesthetic.computer" 1176to = "/processing.aesthetic.computer/index.html" 1177status = 200 1178force = true 1179[[redirects]] 1180from = "/p5.aesthetic.computer/docs.json" 1181to = "/docs.json" 1182status = 200 1183force = true 1184[[redirects]] 1185from = "/p5.aesthetic.computer/docs/*" 1186to = "/docs/:splat" 1187status = 200 1188force = true 1189[[redirects]] 1190from = "/p5.aesthetic.computer/processing.aesthetic.computer/*" 1191to = "/processing.aesthetic.computer/:splat" 1192status = 200 1193force = true 1194[[redirects]] 1195from = "/p5.aesthetic.computer/*" 1196to = "/processing.aesthetic.computer/index.html" 1197status = 200 1198force = false 1199# Screenshot generation handled by oven.aesthetic.computer 1200[[redirects]] 1201from = "/preview/*" 1202to = "https://oven.aesthetic.computer/preview/:splat" 1203status = 200 1204# sitemap.aesthetic.computer subdomain 1205[[redirects]] 1206from = "https://sitemap.aesthetic.computer" 1207to = "/sitemap.html" 1208status = 200 1209force = true 1210[[redirects]] 1211from = "https://sitemap.aesthetic.computer/*" 1212to = "/sitemap.html" 1213status = 200 1214force = true 1215 1216[[redirects]] 1217from = "/sitemap" 1218to = "/sitemap.html" 1219status = 200 1220[[redirects]] 1221from = "/l5" 1222to = "/l5.aesthetic.computer/index.html" 1223status = 200 1224force = true 1225[[redirects]] 1226from = "/l5/*" 1227to = "/l5.aesthetic.computer/index.html" 1228status = 200 1229force = true 1230[[redirects]] 1231from = "/L5" 1232to = "/l5.aesthetic.computer/index.html" 1233status = 200 1234force = true 1235[[redirects]] 1236from = "/L5/*" 1237to = "/l5.aesthetic.computer/index.html" 1238status = 200 1239force = true 1240[[redirects]] 1241from = "/processing" 1242to = "/processing.aesthetic.computer/index.html" 1243status = 200 1244force = true 1245[[redirects]] 1246from = "/processing/*" 1247to = "/processing.aesthetic.computer/index.html" 1248status = 200 1249force = true 1250[[redirects]] 1251from = "/Processing" 1252to = "/processing.aesthetic.computer/index.html" 1253status = 200 1254force = true 1255[[redirects]] 1256from = "/Processing/*" 1257to = "/processing.aesthetic.computer/index.html" 1258status = 200 1259force = true 1260[[redirects]] 1261from = "/p5" 1262to = "/processing.aesthetic.computer/index.html" 1263status = 200 1264force = true 1265[[redirects]] 1266from = "/p5/*" 1267to = "/processing.aesthetic.computer/index.html" 1268status = 200 1269force = true 1270[[redirects]] 1271from = "/P5" 1272to = "/processing.aesthetic.computer/index.html" 1273status = 200 1274force = true 1275[[redirects]] 1276from = "/P5/*" 1277to = "/processing.aesthetic.computer/index.html" 1278status = 200 1279force = true 1280[[redirects]] 1281from = "/support" 1282to = "/support.html" 1283status = 200 1284[[redirects]] 1285from = "/privacy-policy" 1286to = "/privacy-policy.html" 1287status = 200 1288[[redirects]] 1289from = "/aesthetic-direct" 1290to = "/aesthetic-direct.html" 1291status = 200 1292[[redirects]] 1293from = "https://aesthetic.direct" 1294to = "https://aesthetic.computer/aesthetic-direct" 1295status = 200 1296force = true 1297 1298# give.aesthetic.computer - Support/donation page 1299[[redirects]] 1300from = "https://give.aesthetic.computer/da" 1301to = "/give.aesthetic.computer/index.html?lang=da&currency=dkk" 1302status = 200 1303force = true 1304[[redirects]] 1305from = "https://give.aesthetic.computer/es" 1306to = "/give.aesthetic.computer/index.html?lang=es&currency=usd" 1307status = 200 1308force = true 1309[[redirects]] 1310from = "https://give.aesthetic.computer/de" 1311to = "/give.aesthetic.computer/index.html?lang=de&currency=eur" 1312status = 200 1313force = true 1314[[redirects]] 1315from = "https://give.aesthetic.computer/cn" 1316to = "/give.aesthetic.computer/index.html?lang=zh&currency=usd" 1317status = 200 1318force = true 1319[[redirects]] 1320from = "https://give.aesthetic.computer/api/give-portal" 1321to = "/.netlify/functions/give-portal" 1322status = 200 1323force = true 1324[[redirects]] 1325from = "https://give.aesthetic.computer/api/give" 1326to = "/.netlify/functions/give" 1327status = 200 1328force = true 1329[[redirects]] 1330from = "https://give.aesthetic.computer/api/billing" 1331to = "/.netlify/functions/billing" 1332status = 200 1333force = true 1334[[redirects]] 1335from = "https://give.aesthetic.computer" 1336to = "/give.aesthetic.computer/index.html" 1337status = 200 1338force = true 1339[[redirects]] 1340from = "https://give.aesthetic.computer/*" 1341to = "/give.aesthetic.computer/:splat" 1342status = 200 1343force = true 1344 1345[[redirects]] 1346from = "/api/unsubscribe" 1347to = "/.netlify/functions/unsubscribe" 1348status = 200 1349[[redirects]] 1350from = "/api/mail-status" 1351to = "/.netlify/functions/mail-status" 1352status = 200 1353 1354# 🎹 notepat.com — proxies to aesthetic.computer/notepat (preserves notepat.com in URL bar) 1355[[redirects]] 1356from = "https://notepat.com" 1357to = "https://aesthetic.computer/notepat" 1358status = 200 1359force = true 1360[[redirects]] 1361from = "https://www.notepat.com" 1362to = "https://aesthetic.computer/notepat" 1363status = 200 1364force = true 1365[[redirects]] 1366from = "https://www.notepat.com/*" 1367to = "https://aesthetic.computer/:splat" 1368status = 200 1369force = true 1370[[redirects]] 1371from = "https://notepat.com/*" 1372to = "https://aesthetic.computer/:splat" 1373status = 200 1374force = true 1375 1376[[redirects]] 1377from = "https://kidlisp.com" 1378to = "https://aesthetic.computer/kidlisp.com/" 1379status = 200 1380force = true 1381# API routes - kidlisp.com/api/* 1382[[redirects]] 1383from = "https://kidlisp.com/api/ff1/*" 1384to = "https://aesthetic.computer/api/ff1/:splat" 1385status = 200 1386force = true 1387[[redirects]] 1388from = "https://kidlisp.com/api/*" 1389to = "https://aesthetic.computer/api/:splat" 1390status = 200 1391force = true 1392# Keeps → subdomain redirect 1393[[redirects]] 1394from = "https://kidlisp.com/keeps" 1395to = "https://keep.kidlisp.com/" 1396status = 301 1397force = true 1398# Learn / reference page 1399[[redirects]] 1400from = "https://kidlisp.com/learn" 1401to = "/kidlisp.com/learn.html" 1402status = 200 1403force = true 1404# Proxy aesthetic.computer assets (split.js, etc.) through kidlisp.com 1405[[redirects]] 1406from = "https://kidlisp.com/aesthetic.computer/*" 1407to = "/aesthetic.computer/:splat" 1408status = 200 1409force = true 1410[[redirects]] 1411from = "https://kidlisp.com/*" 1412to = "https://aesthetic.computer/kidlisp.com/:splat" 1413status = 200 1414force = true 1415[[redirects]] 1416from = "https://www.kidlisp.com" 1417to = "https://aesthetic.computer/kidlisp.com/" 1418status = 200 1419force = true 1420# API routes - www.kidlisp.com/api/* 1421[[redirects]] 1422from = "https://www.kidlisp.com/api/ff1/*" 1423to = "https://aesthetic.computer/api/ff1/:splat" 1424status = 200 1425force = true 1426[[redirects]] 1427from = "https://www.kidlisp.com/api/*" 1428to = "https://aesthetic.computer/api/:splat" 1429status = 200 1430force = true 1431# Keeps → subdomain redirect 1432[[redirects]] 1433from = "https://www.kidlisp.com/keeps" 1434to = "https://keep.kidlisp.com/" 1435status = 301 1436force = true 1437# Learn / reference page 1438[[redirects]] 1439from = "https://www.kidlisp.com/learn" 1440to = "/kidlisp.com/learn.html" 1441status = 200 1442force = true 1443# Proxy aesthetic.computer assets through www.kidlisp.com 1444[[redirects]] 1445from = "https://www.kidlisp.com/aesthetic.computer/*" 1446to = "/aesthetic.computer/:splat" 1447status = 200 1448force = true 1449[[redirects]] 1450from = "https://www.kidlisp.com/*" 1451to = "https://aesthetic.computer/kidlisp.com/:splat" 1452status = 200 1453force = true 1454 1455# learn.kidlisp.com subdomain 1456[[redirects]] 1457from = "https://learn.kidlisp.com" 1458to = "/kidlisp.com/learn.html" 1459status = 200 1460force = true 1461[[redirects]] 1462from = "https://learn.kidlisp.com/api/*" 1463to = "/api/:splat" 1464status = 200 1465force = true 1466[[redirects]] 1467from = "https://learn.kidlisp.com/decree" 1468to = "/kidlisp.com/decree.html" 1469status = 200 1470force = true 1471[[redirects]] 1472from = "https://learn.kidlisp.com/decree/26" 1473to = "/kidlisp.com/decree.html" 1474status = 200 1475force = true 1476[[redirects]] 1477from = "https://learn.kidlisp.com/*" 1478to = "/kidlisp.com/learn.html" 1479status = 200 1480force = true 1481 1482# Legacy keeps.kidlisp.com → keep.kidlisp.com redirect 1483[[redirects]] 1484from = "https://keeps.kidlisp.com/*" 1485to = "https://keep.kidlisp.com/:splat" 1486status = 301 1487force = true 1488[[redirects]] 1489from = "https://keeps.kidlisp.com" 1490to = "https://keep.kidlisp.com/" 1491status = 301 1492force = true 1493 1494# keep.kidlisp.com subdomain 1495[[redirects]] 1496from = "https://keep.kidlisp.com" 1497to = "/kidlisp.com/keeps.html" 1498status = 200 1499force = true 1500[[redirects]] 1501from = "https://keep.kidlisp.com/api/*" 1502to = "/api/:splat" 1503status = 200 1504force = true 1505[[redirects]] 1506from = "https://keep.kidlisp.com/technology" 1507to = "/kidlisp.com/keeps-tech.html" 1508status = 200 1509force = true 1510[[redirects]] 1511from = "https://keep.kidlisp.com/wallet" 1512to = "/kidlisp.com/wallet/index.html" 1513status = 200 1514force = true 1515[[redirects]] 1516from = "https://keep.kidlisp.com/*" 1517to = "/kidlisp.com/keeps.html" 1518status = 200 1519force = true 1520 1521# buy.kidlisp.com subdomain — direct purchase page 1522[[redirects]] 1523from = "https://buy.kidlisp.com" 1524to = "/kidlisp.com/buy.html" 1525status = 200 1526force = true 1527[[redirects]] 1528from = "https://buy.kidlisp.com/*" 1529to = "/kidlisp.com/buy.html" 1530status = 200 1531force = true 1532 1533# PJ subdomain for kidlisp.com - pj.kidlisp.com/code (Piece Jockey) 1534[[redirects]] 1535from = "https://pj.kidlisp.com" 1536to = "/kidlisp.com/pj.html" 1537status = 200 1538force = true 1539[[redirects]] 1540from = "https://pj.kidlisp.com/*" 1541to = "/kidlisp.com/pj.html" 1542status = 200 1543force = true 1544 1545# Device subdomain for kidlisp.com - device.kidlisp.com/codeId (FF1 display mode) 1546[[redirects]] 1547from = "https://device.kidlisp.com" 1548to = "/kidlisp.com/device.html" 1549status = 200 1550force = true 1551# FF1 API routes - device.kidlisp.com/api/ff1/* 1552[[redirects]] 1553from = "https://device.kidlisp.com/api/ff1/*" 1554to = "/api/ff1/:splat" 1555status = 200 1556force = true 1557[[redirects]] 1558from = "https://device.kidlisp.com/qr/*" 1559to = "/kidlisp.com/qr.html?token=:splat" 1560status = 200 1561force = true 1562# Serve static JS assets for device subdomain 1563[[redirects]] 1564from = "https://device.kidlisp.com/js/*" 1565to = "/kidlisp.com/js/:splat" 1566status = 200 1567force = true 1568[[redirects]] 1569from = "https://device.kidlisp.com/*" 1570to = "/kidlisp.com/device.html" 1571status = 200 1572force = true 1573 1574# Top subdomain for kidlisp.com - top.kidlisp.com (alias for top100 playlist) 1575# JS assets served statically (must come before function route) 1576[[redirects]] 1577from = "https://top.kidlisp.com/js/*" 1578to = "/kidlisp.com/js/:splat" 1579status = 200 1580force = true 1581[[redirects]] 1582from = "https://top.kidlisp.com" 1583to = "/.netlify/functions/index/top.kidlisp.com" 1584status = 200 1585force = true 1586[[redirects]] 1587from = "https://top.kidlisp.com/*" 1588to = "/.netlify/functions/index/top.kidlisp.com/:splat" 1589status = 200 1590force = true 1591 1592# Calm subdomain for kidlisp.com - calm.kidlisp.com (hand-curated calm playlist) 1593# JS assets served statically (must come before function route) 1594[[redirects]] 1595from = "https://calm.kidlisp.com/js/*" 1596to = "/kidlisp.com/js/:splat" 1597status = 200 1598force = true 1599# Route through index function for dynamic meta tags (social previews / iMessage) 1600[[redirects]] 1601from = "https://calm.kidlisp.com" 1602to = "/.netlify/functions/index/calm.kidlisp.com" 1603status = 200 1604force = true 1605[[redirects]] 1606from = "https://calm.kidlisp.com/*" 1607to = "/.netlify/functions/index/calm.kidlisp.com/:splat" 1608status = 200 1609force = true 1610 1611[[redirects]] 1612from = "https://news.aesthetic.computer" 1613to = "/.netlify/functions/news" 1614status = 200 1615force = true 1616[[redirects]] 1617from = "https://news.aesthetic.computer/" 1618to = "/.netlify/functions/news" 1619status = 200 1620force = true 1621# News API routes for subdomain (must be before /* catch-all) 1622[[redirects]] 1623from = "https://news.aesthetic.computer/api/news" 1624to = "/.netlify/functions/news-api" 1625status = 200 1626[[redirects]] 1627from = "https://news.aesthetic.computer/api/news/*" 1628to = "/.netlify/functions/news-api/:splat" 1629status = 200 1630[[redirects]] 1631from = "https://news.aesthetic.computer/guidelines" 1632to = "/.netlify/functions/news" 1633status = 200 1634force = true 1635[[redirects]] 1636from = "https://news.aesthetic.computer/*" 1637to = "/.netlify/functions/news/:splat" 1638status = 200 1639force = true 1640 1641[[redirects]] 1642from = "/news.aesthetic.computer" 1643to = "/.netlify/functions/news" 1644status = 200 1645force = true 1646[[redirects]] 1647from = "/news.aesthetic.computer/" 1648to = "/.netlify/functions/news" 1649status = 200 1650force = true 1651# api.aesthetic.computer subdomain 1652[[redirects]] 1653from = "https://api.aesthetic.computer" 1654to = "/.netlify/functions/api-docs" 1655status = 200 1656force = true 1657[[redirects]] 1658from = "https://api.aesthetic.computer/*" 1659to = "/api/:splat" 1660status = 200 1661force = true 1662 1663# Path-based API routes (must be before /* catch-all) 1664# API Documentation - LLM-readable API reference 1665[[redirects]] 1666from = "/api" 1667to = "/.netlify/functions/api-docs" 1668status = 200 1669 1670# Remote MCP Server - SSE endpoint for Claude Pro/Team 1671[[redirects]] 1672from = "/mcp" 1673to = "/.netlify/functions/mcp-remote" 1674status = 200 1675 1676[[redirects]] 1677from = "/api/news" 1678to = "/.netlify/functions/news-api" 1679status = 200 1680[[redirects]] 1681from = "/api/news/*" 1682to = "/.netlify/functions/news-api/:splat" 1683status = 200 1684# News toll (troll toll) - handles both checkout AND webhook 1685[[redirects]] 1686from = "https://news.aesthetic.computer/api/news/toll" 1687to = "/.netlify/functions/news-toll" 1688status = 200 1689[[redirects]] 1690from = "/api/news/toll" 1691to = "/.netlify/functions/news-toll" 1692status = 200 1693[[redirects]] 1694from = "/news.aesthetic.computer/guidelines" 1695to = "/.netlify/functions/news" 1696status = 200 1697force = true 1698[[redirects]] 1699from = "/news.aesthetic.computer/*" 1700to = "/.netlify/functions/news/:splat" 1701status = 200 1702# No force=true - static files in public/news.aesthetic.computer/ served first 1703[[redirects]] 1704from = "/icon/*" 1705to = "https://oven.aesthetic.computer/icon/:splat" 1706status = 200 1707[[redirects]] 1708from = "/api/print/*" 1709to = "/.netlify/functions/print" 1710status = 200 1711[[redirects]] 1712from = "/api/blank" 1713to = "/.netlify/functions/blank" 1714status = 200 1715[[redirects]] 1716from = "/api/mug" 1717to = "/.netlify/functions/mug" 1718status = 200 1719[[redirects]] 1720from = "/api/mugs" 1721to = "/.netlify/functions/mugs" 1722status = 200 1723[[redirects]] 1724from = "/api/mockup-gif" 1725to = "/.netlify/functions/mockup-gif" 1726status = 200 1727[[redirects]] 1728from = "/api/mockup-webp" 1729to = "/.netlify/functions/mockup-webp" 1730status = 200 1731[[redirects]] 1732from = "/api/clock" 1733to = "/.netlify/functions/clock" 1734status = 200 1735[[redirects]] 1736from = "/api/chat/messages" 1737to = "/.netlify/functions/chat-messages" 1738status = 200 1739[[redirects]] 1740from = "/api/auth0-events" 1741to = "/.netlify/functions/auth0-events" 1742status = 200 1743[[redirects]] 1744from = "/api/auth/cli-callback" 1745to = "/.netlify/functions/auth-cli-callback" 1746status = 200 1747[[redirects]] 1748from = "/api/device-auth" 1749to = "/.netlify/functions/device-auth" 1750status = 200 1751[[redirects]] 1752from = "/api/device-token" 1753to = "/.netlify/functions/device-token" 1754status = 200 1755[[redirects]] 1756from = "/api/device-pair" 1757to = "/.netlify/functions/device-pair" 1758status = 200 1759[[redirects]] 1760from = "/api/device-login" 1761to = "/.netlify/functions/device-login" 1762status = 200 1763[[redirects]] 1764from = "/device-login" 1765to = "/.netlify/functions/device-login" 1766status = 200 1767[[redirects]] 1768from = "/api/metrics" 1769to = "/.netlify/functions/metrics" 1770status = 200 1771[[redirects]] 1772from = "/api/agent-memory-ingest" 1773to = "/.netlify/functions/agent-memory-ingest" 1774status = 200 1775[[redirects]] 1776from = "/api/billing" 1777to = "/.netlify/functions/billing" 1778status = 200 1779[[redirects]] 1780from = "/api/give" 1781to = "/.netlify/functions/give" 1782status = 200 1783[[redirects]] 1784from = "/api/give-portal" 1785to = "/.netlify/functions/give-portal" 1786status = 200 1787[[redirects]] 1788from = "/api/gives" 1789to = "/.netlify/functions/gives" 1790status = 200 1791[[redirects]] 1792from = "/api/give-image" 1793to = "/.netlify/functions/give-image" 1794status = 200 1795[[redirects]] 1796from = "/api/shop" 1797to = "/.netlify/functions/shop" 1798status = 200 1799[[redirects]] 1800from = "/api/stretched-paintings" 1801to = "/.netlify/functions/stretched-paintings" 1802status = 200 1803[[redirects]] 1804from = "/api/jas-tags" 1805to = "/.netlify/functions/jas-tags" 1806status = 200 1807[[redirects]] 1808from = "/api/piece-hit" 1809to = "/.netlify/functions/piece-hit" 1810status = 200 1811[[redirects]] 1812from = "/api/piece-fans" 1813to = "/.netlify/functions/piece-fans" 1814status = 200 1815[[redirects]] 1816from = "/api/ticket/*" 1817to = "/.netlify/functions/ticket" 1818status = 200 1819[[redirects]] 1820from = "/api/subscribe-to-topic" 1821to = "/.netlify/functions/subscribe-to-topic" 1822status = 200 1823[[redirects]] 1824from = "/api/logo/*" 1825to = "/.netlify/functions/logo/:splat" 1826status = 200 1827[[redirects]] 1828from = "/api/logo.png" 1829to = "/.netlify/functions/logo" 1830status = 200 1831[[redirects]] 1832from = "/api/pixel/*" 1833to = "/.netlify/functions/pixel" 1834status = 200 1835[[redirects]] 1836from = "/session/*" 1837to = "/.netlify/functions/session" 1838status = 200 1839[[redirects]] 1840from = "/reload/*" 1841to = "/.netlify/functions/reload" 1842status = 200 1843[[redirects]] 1844from = "/sotce-blog/*" 1845to = "/.netlify/functions/sotce-blog" 1846status = 200 1847[[redirects]] 1848from = "/auth" 1849to = "/.netlify/functions/auth" 1850status = 200 1851[[redirects]] 1852from = "/docs/*" 1853to = "/.netlify/functions/docs/:splat" 1854status = 200 1855[[redirects]] 1856from = "/docs.json" 1857to = "/.netlify/functions/docs" 1858status = 200 1859[[redirects]] 1860from = "/api/vary" 1861to = "/.netlify/functions/vary" 1862status = 200 1863[[redirects]] 1864from = "/api/mood/*" 1865to = "/.netlify/functions/mood" 1866status = 200 1867[[redirects]] 1868from = "/api/atproto-user-stats" 1869to = "/.netlify/functions/atproto-user-stats" 1870status = 200 1871[[redirects]] 1872from = "/api/store-kidlisp" 1873to = "/.netlify/functions/store-kidlisp" 1874status = 200 1875[[redirects]] 1876from = "/api/store-clock" 1877to = "/.netlify/functions/store-clock" 1878status = 200 1879[[redirects]] 1880from = "/api/store-piece" 1881to = "/.netlify/functions/store-piece" 1882status = 200 1883[[redirects]] 1884from = "/api/piece-metadata" 1885to = "/.netlify/functions/piece-metadata" 1886status = 200 1887[[redirects]] 1888from = "/api/pack-html" 1889to = "https://oven.aesthetic.computer/pack-html" 1890status = 200 1891[[redirects]] 1892from = "/api/bundle-html" 1893to = "https://oven.aesthetic.computer/bundle-html" 1894status = 200 1895[[redirects]] 1896from = "/api/os" 1897to = "https://oven.aesthetic.computer/os" 1898status = 200 1899[[redirects]] 1900from = "/api/pack-telemetry" 1901to = "/.netlify/functions/bundle-telemetry" 1902status = 200 1903[[redirects]] 1904from = "/api/bundle-telemetry" 1905to = "/.netlify/functions/bundle-telemetry" 1906status = 200 1907[[redirects]] 1908from = "/api/pack-telemetry-query" 1909to = "/.netlify/functions/bundle-telemetry-query" 1910status = 200 1911[[redirects]] 1912from = "/api/bundle-telemetry-query" 1913to = "/.netlify/functions/bundle-telemetry-query" 1914status = 200 1915[[redirects]] 1916from = "/api/boot-log" 1917to = "/.netlify/functions/boot-log" 1918status = 200 1919[[redirects]] 1920from = "/api/paper-hit" 1921to = "/.netlify/functions/paper-hit" 1922status = 200 1923[[redirects]] 1924from = "/api/kidlisp-log" 1925to = "/.netlify/functions/kidlisp-log" 1926status = 200 1927[[redirects]] 1928from = "/api/keep-mint" 1929to = "/.netlify/functions/keep-mint" 1930status = 200 1931[[redirects]] 1932from = "/api/keep-prepare" 1933to = "/.netlify/functions/keep-prepare" 1934status = 200 1935[[redirects]] 1936from = "/api/update-tezos-address" 1937to = "/.netlify/functions/update-tezos-address" 1938status = 200 1939[[redirects]] 1940from = "/api/keep-status" 1941to = "/.netlify/functions/keep-status" 1942status = 200 1943[[redirects]] 1944from = "/api/keep-confirm" 1945to = "/.netlify/functions/keep-confirm" 1946status = 200 1947[[redirects]] 1948from = "/api/keep-update" 1949to = "/.netlify/functions/keep-update" 1950status = 200 1951[[redirects]] 1952from = "/api/keeps-config" 1953to = "/.netlify/functions/keeps-config" 1954status = 200 1955[[redirects]] 1956from = "/api/delete-erase-and-forget-me" 1957to = "/.netlify/functions/delete-erase-and-forget-me" 1958status = 200 1959[[redirects]] 1960from = "/api/track-media" 1961to = "/.netlify/functions/track-media" 1962status = 200 1963force = false 1964[[redirects]] 1965from = "/api/track-tape" 1966to = "/.netlify/functions/track-media" 1967status = 200 1968force = false 1969[[redirects]] 1970from = "/api/tape-convert-background" 1971to = "/.netlify/functions/tape-convert-background" 1972status = 200 1973force = false 1974[[redirects]] 1975from = "/api/get-tape" 1976to = "/.netlify/functions/get-tape" 1977status = 200 1978force = false 1979[[redirects]] 1980from = "/api/get-tape-status" 1981to = "/.netlify/functions/get-tape-status" 1982status = 200 1983force = false 1984[[redirects]] 1985from = "/api/oven-complete" 1986to = "/.netlify/functions/oven-complete" 1987status = 200 1988force = false 1989[[redirects]] 1990from = "/api/painting-code" 1991to = "/.netlify/functions/painting-code" 1992status = 200 1993force = false 1994[[redirects]] 1995from = "/api/painting-metadata" 1996to = "/.netlify/functions/painting-metadata" 1997status = 200 1998force = false 1999[[redirects]] 2000from = "/api/profile/*" 2001to = "/.netlify/functions/profile" 2002status = 200 2003[[redirects]] 2004from = "/handle" 2005to = "/.netlify/functions/handle" 2006status = 200 2007[[redirects]] 2008from = "api/authorized" 2009to = "/.netlify/functions/authorized" 2010status = 200 2011[[redirects]] 2012from = "api/handles" 2013to = "/.netlify/functions/handles" 2014status = 200 2015[[redirects]] 2016from = "/api/email" 2017to = "/.netlify/functions/email" 2018status = 200 2019[[redirects]] 2020from = "/user" 2021to = "/.netlify/functions/user" 2022status = 200 2023[[redirects]] 2024from = "/run" 2025to = "/.netlify/functions/run" 2026status = 200 2027[[redirects]] 2028from = "/redirect-proxy" 2029to = "/.netlify/functions/redirect-proxy" 2030status = 200 2031[[redirects]] 2032from = "/local-upload/*" 2033to = "/.netlify/functions/local-upload" 2034status = 200 2035force = true 2036[[redirects]] 2037from = "/presigned-upload-url/*" 2038to = "/.netlify/functions/presigned-url" 2039status = 200 2040force = true 2041[[redirects]] 2042from = "/presigned-download-url/*" 2043to = "/.netlify/functions/presigned-url" 2044status = 200 2045force = true 2046[[redirects]] 2047from = "/api/ask" 2048to = "/.netlify/functions/ask" 2049status = 200 2050# from = "/api/ask" 2051# to = "http://localhost:3000/api/ask" 2052# status = 200 2053# force = false 2054[[redirects]] 2055from = "/api/playlist" 2056to = "/.netlify/functions/playlist" 2057status = 200 2058[[redirects]] 2059from = "/api/kidlisp-count" 2060to = "/.netlify/functions/kidlisp-count" 2061status = 200 2062[[redirects]] 2063from = "/api/tv" 2064to = "/.netlify/functions/tv" 2065status = 200 2066[[redirects]] 2067from = "/api/tv-tapes" 2068to = "/.netlify/functions/tv-tapes" 2069status = 200 2070[[redirects]] 2071from = "/api/say" 2072to = "/.netlify/functions/say" 2073status = 200 2074# [[redirects]] 2075# from = "/api/say" 2076# to = "http://localhost:3000/api/say" 2077# status = 200 2078# force = false 2079[[redirects]] 2080from = "https://sotce.local:8888" 2081to = "/.netlify/functions/sotce-net" 2082status = 200 2083force = true 2084[[redirects]] 2085from = "https://sotce.local:8888/*" 2086to = "/.netlify/functions/sotce-net" 2087status = 200 2088force = true 2089# [[redirects]] 2090# from = "/" 2091# to = "/.netlify/functions/index" 2092# status = 200 2093# force = true 2094# 🛍️ Shop and ⛵ JAS Signature Redirects 2095[[redirects]] 2096from = "/shop/@jeffrey/help" 2097to = "https://shop.aesthetic.computer/products/45-minutes-of-computer-help-from-jeffrey" 2098status = 301 2099[[redirects]] 2100from = "/shop/*" 2101to = "https://shop.aesthetic.computer/:splat" 2102status = 301 2103# 📚 Books 2104[[redirects]] 2105from = "/25.4.8.21.19" 2106to = "https://shop.aesthetic.computer/products/books_the-shape-of-things-by-vilem-flusser_25-4-8-21-19" 2107status = 301 2108[[redirects]] 2109from = "/shop~25.4.8.21.19" 2110to = "https://shop.aesthetic.computer/products/books_the-shape-of-things-by-vilem-flusser_25-4-8-21-19" 2111status = 301 2112[[redirects]] 2113from = "/25.4.8.21.17" 2114to = "https://shop.aesthetic.computer/products/books_art-as-a-social-system-by-niklas-luhmann_25-4-8-21-17" 2115status = 301 2116[[redirects]] 2117from = "/shop~25.4.8.21.17" 2118to = "https://shop.aesthetic.computer/products/books_art-as-a-social-system-by-niklas-luhmann_25-4-8-21-17" 2119status = 301 2120[[redirects]] 2121from = "/25.4.8.21.11" 2122to = "https://shop.aesthetic.computer/products/books_play-by-catherine-garvey_25-4-8-21-11" 2123status = 301 2124[[redirects]] 2125from = "/shop~25.4.8.21.11" 2126to = "https://shop.aesthetic.computer/products/books_play-by-catherine-garvey_25-4-8-21-11" 2127status = 301 2128[[redirects]] 2129from = "/25.4.8.21.08" 2130to = "https://shop.aesthetic.computer/products/books_what-is-landscape-by-john-r-stilgoe_25-4-8-21-08" 2131status = 301 2132[[redirects]] 2133from = "/shop~25.4.8.21.08" 2134to = "https://shop.aesthetic.computer/products/books_what-is-landscape-by-john-r-stilgoe_25-4-8-21-08" 2135status = 301 2136[[redirects]] 2137from = "/25.4.8.21.07" 2138to = "https://shop.aesthetic.computer/products/books_the-complete-poems-of-emily-dickinson_25-4-8-21-07" 2139status = 301 2140[[redirects]] 2141from = "/shop~25.4.8.21.07" 2142to = "https://shop.aesthetic.computer/products/books_the-complete-poems-of-emily-dickinson_25-4-8-21-07" 2143status = 301 2144[[redirects]] 2145from = "/25.11.17.19.03" 2146to = "https://shop.aesthetic.computer/products/books_radical-computer-music-by-goodiepal_25-11-17-19-03" 2147status = 301 2148[[redirects]] 2149from = "/shop~25.11.17.19.03" 2150to = "https://shop.aesthetic.computer/products/books_radical-computer-music-by-goodiepal_25-11-17-19-03" 2151status = 301 2152[[redirects]] 2153from = "/25.4.8.21.0" 2154to = "https://shop.aesthetic.computer/products/books_the-art-of-seeing-by-aldous-huxley_25-4-8-21-0" 2155status = 301 2156[[redirects]] 2157from = "/shop~25.4.8.21.0" 2158to = "https://shop.aesthetic.computer/products/books_the-art-of-seeing-by-aldous-huxley_25-4-8-21-0" 2159status = 301 2160[[redirects]] 2161from = "/25.4.8.20.47" 2162to = "https://shop.aesthetic.computer/products/books_does-writing-have-a-future-by-vilem-flusser_25-4-8-20-47" 2163status = 301 2164[[redirects]] 2165from = "/shop~25.4.8.20.47" 2166to = "https://shop.aesthetic.computer/products/books_does-writing-have-a-future-by-vilem-flusser_25-4-8-20-47" 2167status = 301 2168[[redirects]] 2169from = "/25.4.8.21.13" 2170to = "https://shop.aesthetic.computer/products/books_musical-gestures-sound-movement-and-meaning_25-4-8-21-13" 2171status = 301 2172[[redirects]] 2173from = "/shop~25.4.8.21.13" 2174to = "https://shop.aesthetic.computer/products/books_musical-gestures-sound-movement-and-meaning_25-4-8-21-13" 2175status = 301 2176# Music 2177[[redirects]] 2178from = "/25.11.3.14.17" 2179to = "https://shop.aesthetic.computer/products/music_baktok-7-inch_25-11-3-14-17" 2180status = 301 2181[[redirects]] 2182from = "/shop~25.11.3.14.17" 2183to = "https://shop.aesthetic.computer/products/music_baktok-7-inch_25-11-3-14-17" 2184status = 301 2185# 🖍️ Pictures 2186[[redirects]] 2187from = "/25.4.13.17.47" 2188to = "https://shop.aesthetic.computer/products/pictures_25-4-13-17-47" 2189status = 301 2190[[redirects]] 2191from = "/shop~25.4.13.17.47" 2192to = "https://shop.aesthetic.computer/products/pictures_25-4-13-17-47" 2193status = 301 2194[[redirects]] 2195from = "/25.4.13.19.06" 2196to = "https://shop.aesthetic.computer/products/pictures_25-4-13-19-06" 2197status = 301 2198[[redirects]] 2199from = "/shop~25.4.13.19.06" 2200to = "https://shop.aesthetic.computer/products/pictures_25-4-13-19-06" 2201status = 301 2202[[redirects]] 2203from = "/25.4.13.18.18" 2204to = "https://shop.aesthetic.computer/products/pictures_25-4-13-18-18" 2205status = 301 2206[[redirects]] 2207from = "/shop~25.4.13.18.18" 2208to = "https://shop.aesthetic.computer/products/pictures_25-4-13-18-18" 2209status = 301 2210[[redirects]] 2211from = "/25.4.13.19.24" 2212to = "https://shop.aesthetic.computer/products/pictures_25-4-13-19-24" 2213status = 301 2214[[redirects]] 2215from = "/shop~25.4.13.19.24" 2216to = "https://shop.aesthetic.computer/products/pictures_25-4-13-19-24" 2217status = 301 2218[[redirects]] 2219from = "/25.4.13.18.54" 2220to = "https://shop.aesthetic.computer/products/pictures_25-4-13-18-54" 2221status = 301 2222[[redirects]] 2223from = "/shop~25.4.13.18.54" 2224to = "https://shop.aesthetic.computer/products/pictures_25-4-13-18-54" 2225status = 301 2226# 🚲 Bikes 2227[[redirects]] 2228from = "/25.12.4.10.09" 2229to = "https://shop.aesthetic.computer/products/bikes_adult-bike_25-12-4-10-09" 2230status = 301 2231[[redirects]] 2232from = "/shop~25.12.4.10.09" 2233to = "https://shop.aesthetic.computer/products/bikes_adult-bike_25-12-4-10-09" 2234status = 301 2235[[redirects]] 2236from = "/25.12.4.10.08" 2237to = "https://shop.aesthetic.computer/products/bikes_kids-bike_25-12-4-10-08" 2238status = 301 2239[[redirects]] 2240from = "/shop~25.12.4.10.08" 2241to = "https://shop.aesthetic.computer/products/bikes_kids-bike_25-12-4-10-08" 2242status = 301 2243# 🛠️ Tools 2244[[redirects]] 2245from = "/25.12.4.11.21" 2246to = "https://shop.aesthetic.computer/products/tools_i-welcome-new-experiences-every-single-day_25-12-4-11-21" 2247status = 301 2248[[redirects]] 2249from = "/shop~25.12.4.11.21" 2250to = "https://shop.aesthetic.computer/products/tools_i-welcome-new-experiences-every-single-day_25-12-4-11-21" 2251status = 301 2252[[redirects]] 2253from = "/25.12.4.11.22" 2254to = "https://shop.aesthetic.computer/products/tools_prompt-ac_25-12-4-11-22" 2255status = 301 2256[[redirects]] 2257from = "/shop~25.12.4.11.22" 2258to = "https://shop.aesthetic.computer/products/tools_prompt-ac_25-12-4-11-22" 2259status = 301 2260[[redirects]] 2261from = "/25.12.4.11.23" 2262to = "https://shop.aesthetic.computer/products/tools_my-songs_25-12-4-11-23" 2263status = 301 2264[[redirects]] 2265from = "/shop~25.12.4.11.23" 2266to = "https://shop.aesthetic.computer/products/tools_my-songs_25-12-4-11-23" 2267status = 301 2268[[redirects]] 2269from = "/25.12.4.11.24" 2270to = "https://shop.aesthetic.computer/products/tools_pretty-pictures_25-12-4-11-24" 2271status = 301 2272[[redirects]] 2273from = "/shop~25.12.4.11.24" 2274to = "https://shop.aesthetic.computer/products/tools_pretty-pictures_25-12-4-11-24" 2275status = 301 2276[[redirects]] 2277from = "/25.12.4.11.25" 2278to = "https://shop.aesthetic.computer/products/tools_play_25-12-4-11-25" 2279status = 301 2280[[redirects]] 2281from = "/shop~25.12.4.11.25" 2282to = "https://shop.aesthetic.computer/products/tools_play_25-12-4-11-25" 2283status = 301 2284# 👕 Shirts 2285[[redirects]] 2286from = "/26.1.3.0.02" 2287to = "https://shop.aesthetic.computer/products/shirts_beige-abex-tee-m_26-1-3-0-02" 2288status = 301 2289[[redirects]] 2290from = "/shop~26.1.3.0.02" 2291to = "https://shop.aesthetic.computer/products/shirts_beige-abex-tee-m_26-1-3-0-02" 2292status = 301 2293[[redirects]] 2294from = "/26.1.3.0.00" 2295to = "https://shop.aesthetic.computer/products/shirts_coral-abex-tee-l_26-1-3-0-00" 2296status = 301 2297[[redirects]] 2298from = "/shop~26.1.3.0.00" 2299to = "https://shop.aesthetic.computer/products/shirts_coral-abex-tee-l_26-1-3-0-00" 2300status = 301 2301# END SHOP 2302[[redirects]] 2303from = "/api/bdf-glyph" 2304to = "/.netlify/functions/bdf-glyph" 2305status = 200 2306[[redirects]] 2307from = "/disks/*" 2308to = "/aesthetic.computer/disks/:splat" 2309status = 200 2310[[redirects]] 2311# Allow GIF files to be served statically 2312from = "/*.gif" 2313to = "/aesthetic.computer/:splat.gif" 2314status = 200 2315force = false 2316[[redirects]] 2317# Allow WebP files to be served statically (animated mockups with transparency) 2318from = "/*.webp" 2319to = "/aesthetic.computer/:splat.webp" 2320status = 200 2321force = false 2322[[redirects]] 2323# Serve .mjs files from the aesthetic.computer subdirectory 2324from = "/*.mjs" 2325to = "/aesthetic.computer/:splat.mjs" 2326status = 200 2327force = false 2328[[redirects]] 2329# PJ mode - route /kidlisp.com/pj/* to pj.html (legacy) 2330from = "/kidlisp.com/pj/*" 2331to = "/kidlisp.com/pj.html" 2332status = 200 2333force = false 2334[[redirects]] 2335# PJ mode - route /pj.kidlisp.com/* to pj.html (local dev mirroring production subdomain) 2336from = "/pj.kidlisp.com/*" 2337to = "/kidlisp.com/pj.html" 2338status = 200 2339force = false 2340[[redirects]] 2341# Keeps - local dev mirroring production subdomain 2342# Local dev: https://localhost:8888/keep.kidlisp.com/ 2343from = "/keep.kidlisp.com/*" 2344to = "/kidlisp.com/keeps.html" 2345status = 200 2346force = false 2347[[redirects]] 2348from = "/keep.kidlisp.com" 2349to = "/kidlisp.com/keeps.html" 2350status = 200 2351force = false 2352[[redirects]] 2353# Buy - local dev mirroring production subdomain 2354# Local dev: https://localhost:8888/buy.kidlisp.com/ 2355from = "/buy.kidlisp.com/*" 2356to = "/kidlisp.com/buy.html" 2357status = 200 2358force = false 2359[[redirects]] 2360from = "/buy.kidlisp.com" 2361to = "/kidlisp.com/buy.html" 2362status = 200 2363force = false 2364[[redirects]] 2365# bills.aesthetic.computer - local dev mirroring production subdomain 2366# Local dev: https://localhost:8888/bills.aesthetic.computer/ 2367from = "/bills.aesthetic.computer" 2368to = "/bills.aesthetic.computer/index.html" 2369status = 200 2370force = true 2371[[redirects]] 2372from = "/bills.aesthetic.computer/*" 2373to = "/bills.aesthetic.computer/:splat" 2374status = 200 2375force = false 2376[[redirects]] 2377# give.aesthetic.computer - local dev mirroring production subdomain 2378# Local dev: https://localhost:8888/give.aesthetic.computer/ 2379from = "/give.aesthetic.computer" 2380to = "/give.aesthetic.computer/index.html" 2381status = 200 2382force = true 2383[[redirects]] 2384from = "/give.aesthetic.computer/da" 2385to = "/give.aesthetic.computer/index.html?lang=da&currency=dkk" 2386status = 200 2387force = true 2388[[redirects]] 2389from = "/give.aesthetic.computer/es" 2390to = "/give.aesthetic.computer/index.html?lang=es&currency=usd" 2391status = 200 2392force = true 2393[[redirects]] 2394from = "/give.aesthetic.computer/de" 2395to = "/give.aesthetic.computer/index.html?lang=de&currency=eur" 2396status = 200 2397force = true 2398[[redirects]] 2399from = "/give.aesthetic.computer/cn" 2400to = "/give.aesthetic.computer/index.html?lang=zh&currency=usd" 2401status = 200 2402force = true 2403[[redirects]] 2404from = "/give.aesthetic.computer/api/give-portal" 2405to = "/.netlify/functions/give-portal" 2406status = 200 2407force = true 2408[[redirects]] 2409from = "/give.aesthetic.computer/api/give" 2410to = "/.netlify/functions/give" 2411status = 200 2412force = true 2413[[redirects]] 2414from = "/give.aesthetic.computer/api/billing" 2415to = "/.netlify/functions/billing" 2416status = 200 2417force = true 2418[[redirects]] 2419from = "/give.aesthetic.computer/*" 2420to = "/give.aesthetic.computer/:splat" 2421status = 200 2422force = false 2423[[redirects]] 2424# PJ mode via kidlisp.com domain - kidlisp.com/pj/code (subdomain fallback) 2425from = "https://kidlisp.com/pj/*" 2426to = "/kidlisp.com/pj.html" 2427status = 200 2428force = true 2429[[redirects]] 2430from = "https://www.kidlisp.com/pj/*" 2431to = "/kidlisp.com/pj.html" 2432status = 200 2433force = true 2434[[redirects]] 2435# SPA fallback for kidlisp.com routes - only for paths without file extensions 2436# force = false ensures static files (js, css, etc.) are served directly 2437from = "/kidlisp.com" 2438to = "/kidlisp.com/index.html" 2439status = 200 2440force = true 2441[[redirects]] 2442# Explicit editor entrypoint for local dev 2443from = "/kidlisp.com/editor" 2444to = "/kidlisp.com/index.html" 2445status = 200 2446force = true 2447[[redirects]] 2448from = "/kidlisp.com/editor/*" 2449to = "/kidlisp.com/index.html" 2450status = 200 2451force = true 2452[[redirects]] 2453from = "/kidlisp.com/*" 2454to = "/kidlisp.com/index.html" 2455status = 200 2456force = false 2457# DOLLHOUSE report page 2458[[redirects]] 2459from = "/dollhouse" 2460to = "/dollhouse/index.html" 2461status = 200 2462force = true 2463# bills.aesthetic.computer subdomain 2464[[redirects]] 2465from = "https://bills.aesthetic.computer" 2466to = "/bills.aesthetic.computer/index.html" 2467status = 200 2468force = true 2469[[redirects]] 2470from = "https://bills.aesthetic.computer/*" 2471to = "/bills.aesthetic.computer/:splat" 2472status = 200 2473force = true 2474# papers.aesthetic.computer subdomain 2475[[redirects]] 2476from = "https://papers.aesthetic.computer" 2477to = "/papers.aesthetic.computer/index.html" 2478status = 200 2479force = true 2480[[redirects]] 2481from = "https://papers.aesthetic.computer/en" 2482to = "/papers.aesthetic.computer/index.html?lang=en" 2483status = 200 2484force = true 2485[[redirects]] 2486from = "https://papers.aesthetic.computer/da" 2487to = "/papers.aesthetic.computer/index.html?lang=da" 2488status = 200 2489force = true 2490[[redirects]] 2491from = "https://papers.aesthetic.computer/es" 2492to = "/papers.aesthetic.computer/index.html?lang=es" 2493status = 200 2494force = true 2495[[redirects]] 2496from = "https://papers.aesthetic.computer/cn" 2497to = "/papers.aesthetic.computer/index.html?lang=zh" 2498status = 200 2499force = true 2500[[redirects]] 2501from = "https://papers.aesthetic.computer/platter" 2502to = "/papers.aesthetic.computer/platter.html" 2503status = 200 2504force = true 2505[[redirects]] 2506from = "https://papers.aesthetic.computer/ac-repo-archaeology" 2507to = "/papers.aesthetic.computer/ac-repo-archaeology.html" 2508status = 200 2509force = true 2510[[redirects]] 2511from = "https://papers.aesthetic.computer/*" 2512to = "/papers.aesthetic.computer/:splat" 2513status = 200 2514force = true 2515# papers.prompt.ac → papers.aesthetic.computer 2516[[redirects]] 2517from = "https://papers.prompt.ac" 2518to = "https://papers.aesthetic.computer" 2519status = 301 2520force = true 2521[[redirects]] 2522from = "https://papers.prompt.ac/*" 2523to = "https://papers.aesthetic.computer/:splat" 2524status = 301 2525force = true 2526 2527[[redirects]] 2528from = "/api/machines" 2529to = "/.netlify/functions/machines" 2530status = 200 2531 2532[[redirects]] 2533from = "/api/machine-logs" 2534to = "/.netlify/functions/machine-logs" 2535status = 200 2536 2537[[redirects]] 2538from = "/*" 2539to = "/.netlify/functions/index" 2540status = 200 2541force = false 2542[functions.fix-tezos-network-prod] 2543# One-time function to fix production database - DELETE AFTER USE 2544included_files = ["backend/**/*.mjs"] 2545external_node_modules = ["mongodb", "mongodb-connection-string-url"] 2546included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "ADMIN_SUB"]