[build] base = "system" publish = "public" ignore = "bash ./ignore-index.sh" command = "rm -f public/index.html && echo $COMMIT_REF > public/.commit-ref" # command = "bash ./github-discord.sh" # command = "echo 'Building...'" # Disable Netlify's post-processing that can cause /:splat redirect issues [build.processing] skip_processing = false [build.processing.html] pretty_urls = false [functions] node_bundler = "esbuild" directory = "netlify/functions" external_node_modules = ["mongodb"] [functions.apple-developer-merchantid-domain-association] included_files = ["public/.well-known/*"] included_env_vars = [] [functions.verify-builds-password] included_files = ["backend/**/*.mjs"] included_env_vars = ["BUILDS_PASSWORD"] [functions.claude-token] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.register-build] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["BUILDS_API_KEY", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.get-builds] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["BUILDS_PASSWORD", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.get-build-report] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_env_vars = ["BUILDS_PASSWORD", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.save-build-report] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_env_vars = ["BUILDS_API_KEY", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.reports] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["BUILDS_PASSWORD", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.index] included_files = [ "public/aesthetic.computer/*.mjs", "public/aesthetic.computer/disks/**/*.mjs", "public/aesthetic.computer/dep/**/*.mjs", "public/aesthetic.computer/systems/**/*.mjs", "public/aesthetic.computer/lib/**/*.mjs", "backend/**/*.mjs", ] external_node_modules = ["he"] included_env_vars = [] [functions.delete-erase-and-forget-me] external_node_modules = ["@aws-sdk/client-s3", "@atproto/api", "mongodb", "mongodb-connection-string-url"] included_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"] [functions.say] external_node_modules = ["@google-cloud/text-to-speech"] included_env_vars = ["GCP_EMAIL", "GCP_TTS_KEY_URL", "CONTEXT", "ART_ENDPOINT", "ART_KEY", "ART_SECRET", "ART_SPACE_NAME", "OPENAI_API_KEY"] [functions.mood] external_node_modules = ["got", "firebase-admin", "obscenity", "@atproto/api", "sharp", "mongodb", "mongodb-connection-string-url"] included_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"] [functions.handle] included_files = ["public/aesthetic.computer/lib/text.mjs", "backend/**/*.mjs"] external_node_modules = ["got", "mongodb", "mongodb-connection-string-url", "obscenity", "@atproto/api", "sharp"] included_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"] [functions.handle-colors] included_files = ["backend/**/*.mjs"] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_env_vars = ["CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "NETLIFY_DEV", "LOGGER_KEY"] [functions.atproto-user-stats] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.logo] external_node_modules = ["got"] included_env_vars = [] [functions.email] external_node_modules = ["stripe"] included_env_vars = ["NETLIFY_DEV", "CONTEXT", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "SOTCE_STRIPE_API_PRIV_KEY", "SOTCE_STRIPE_API_PUB_KEY"] [functions.blank] external_node_modules = ["stripe", "nodemailer"] included_env_vars = ["CONTEXT", "STRIPE_API_TEST_PRIV_KEY", "STRIPE_API_PRIV_KEY", "STRIPE_ENDPOINT_DEV_SECRET", "MONGODB_URI", "SMTP_SERVER", "SMTP_USER", "SMTP_PASS"] [functions.print] external_node_modules = ["got", "stripe", "nodemailer"] included_env_vars = ["CONTEXT", "PRINTFUL_API_TOKEN", "STRIPE_API_TEST_PRIV_KEY", "STRIPE_API_PRIV_KEY", "STRIPE_ENDPOINT_DEV_SECRET", "STRIPE_ENDPOINT_SECRET"] [functions.mug] external_node_modules = ["got", "stripe", "nodemailer", "@aws-sdk/client-s3"] included_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"] [functions.mockup-gif] external_node_modules = ["got", "sharp", "gifenc"] included_env_vars = ["CONTEXT"] [functions.mockup-webp] external_node_modules = ["got", "sharp"] included_env_vars = ["CONTEXT"] [functions.pixel] external_node_modules = ["got", "sharp", "qrcode"] included_files = ["netlify/fonts/*.ttf", "backend/**/*.mjs"] included_env_vars = ["CONTEXT"] [functions.ticket] external_node_modules = ["stripe", "nanoid"] included_env_vars = ["CONTEXT", "SOTCE_SMTP_USER", "SOTCE_SMTP_PASS"] [functions.user] included_files = ["backend/**/*.mjs"] external_node_modules = ["got", "mongodb", "mongodb-connection-string-url"] included_env_vars = ["CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET"] [functions.presigned-url] external_node_modules = [ "got", "mongodb", "mongodb-connection-string-url", "nanoid", "@aws-sdk-client-s3", "@aws-sdk/s3-request-presigner", ] included_files = ["backend/**/*.mjs"] included_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"] [functions.screenshot] external_node_modules = ["puppeteer-core"] included_env_vars = ["CONTEXT", "BROWSERLESS_API_KEY"] [functions.session] external_node_modules = ["got", "redis"] included_env_vars = ["NETLIFY_DEV", "JAMSOCKET_ACCESS_TOKEN"] [functions.reload] external_node_modules = ["got", "redis"] included_env_vars = ["NETLIFY_DEV", "REDIS_CONNECTION_STRING"] [functions.vary] external_node_modules = ["got", "multiparty", "openai"] included_env_vars = ["OPENAI_API_KEY"] [functions.slash] external_node_modules = ["discord-interactions"] included_env_vars = [] [functions.playlist] # No special external dependencies needed for static playlist included_env_vars = [] [functions.clock] # No special config needed for clock included_env_vars = [] [functions.store-clock] node_bundler = "esbuild" external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["CONTEXT", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.stretched-paintings] # justanothersystem.org - Stretched paintings CRUD API (admin: @jeffrey only) node_bundler = "esbuild" external_node_modules = ["mongodb", "mongodb-connection-string-url", "@aws-sdk/client-s3", "@aws-sdk/s3-request-presigner"] included_files = ["backend/**/*.mjs"] included_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"] [functions.jas-tags] # justanothersystem.org - Tags/labels CRUD API (admin: @jeffrey only) node_bundler = "esbuild" external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.ff1-pair] external_node_modules = ["redis"] included_files = ["backend/**/*.mjs"] included_env_vars = ["REDIS_CONNECTION_STRING", "NETLIFY_DEV"] [functions.ff1-devices] external_node_modules = ["got", "mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME", "CONTEXT"] [functions.store-kidlisp] node_bundler = "esbuild" external_node_modules = ["@taquito/taquito", "@taquito/signer", "mongodb", "mongodb-connection-string-url", "adm-zip", "@atproto/api"] included_files = ["public/aesthetic.computer/lib/kidlisp.mjs", "backend/**/*.mjs"] included_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"] [functions.store-piece] node_bundler = "esbuild" external_node_modules = ["mongodb", "mongodb-connection-string-url", "@aws-sdk/client-s3", "@atproto/api"] included_files = ["backend/**/*.mjs"] included_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"] [functions.piece-metadata] node_bundler = "esbuild" external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.tv] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME", "NETLIFY_DEV", "CONTEXT", "MEDIA_BASE_URL"] [functions.tv-tapes] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME", "NETLIFY_DEV", "CONTEXT"] [functions.ask] included_env_vars = ["CONTEXT", "ANTHROPIC_API_KEY", "OPENAI_API_KEY"] [functions.billing] # Billing aggregation - pulls costs from SaaS providers included_files = ["backend/**/*.mjs"] included_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"] [functions.give] # Give/support payments via Stripe external_node_modules = ["stripe"] included_files = ["backend/**/*.mjs"] included_env_vars = ["CONTEXT", "STRIPE_API_TEST_PRIV_KEY", "STRIPE_API_PRIV_KEY"] [functions.paypal] # PayPal payments for giving/supporting AC external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["CONTEXT", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "PAYPAL_CLIENT_ID", "PAYPAL_CLIENT_SECRET"] [functions.give-portal] # Stripe Customer Portal for managing/canceling subscriptions external_node_modules = ["stripe"] included_files = ["backend/**/*.mjs"] included_env_vars = ["CONTEXT", "STRIPE_API_TEST_PRIV_KEY", "STRIPE_API_PRIV_KEY"] [functions.unsubscribe] # Email blast unsubscribe/resubscribe endpoint external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME", "UNSUBSCRIBE_SECRET"] [functions.mail-status] # Email preferences and blast history API external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["CONTEXT", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET"] [functions.bundle-html] # Generates KidLisp .lisp.html bundles on-demand via API # Migrated from tezos/bundle-keep-html.mjs CLI tool external_node_modules = ["terser"] included_files = [ "public/aesthetic.computer/**/*.mjs", "public/aesthetic.computer/**/*.js", "public/aesthetic.computer/disks/drawings/font_1/**/*.json", "public/aesthetic.computer/dep/**/*.mjs", "backend/**/*.mjs" ] included_env_vars = ["GIT_COMMIT", "CONTEXT"] [functions.bundle-telemetry] # Collects performance telemetry from inline bundles external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.bundle-telemetry-query] # Query collected bundle telemetry external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.keep-mint] # Mint KidLisp pieces as NFTs on Tezos (streaming SSE) included_files = ["backend/**/*.mjs"] external_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"] included_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"] [functions.keep-prepare] # Job-based keep preparation (validates, creates job, invokes background) included_files = ["backend/**/*.mjs"] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_env_vars = ["CONTEXT", "TEZOS_NETWORK", "OVEN_URL", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "ADMIN_SUB", "URL", "DEPLOY_URL"] [functions.keep-prepare-background] # Background pipeline for keep preparation (oven, IPFS, metadata — up to 15 min) included_files = ["backend/**/*.mjs"] external_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"] included_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"] [functions.keep-status] # Lightweight polling endpoint for keep job progress included_files = ["backend/**/*.mjs"] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.boot-log] # Store boot telemetry in MongoDB included_files = ["backend/**/*.mjs"] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_env_vars = ["CONTEXT", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.paper-hit] # Track paper PDF views/downloads included_files = ["backend/**/*.mjs"] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.keep-confirm] # Confirm client-side wallet mints and update MongoDB included_files = ["backend/**/*.mjs"] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_env_vars = ["CONTEXT", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "ADMIN_SUB"] [functions.keep-update] # Update on-chain metadata for already-minted Keeps included_files = ["backend/**/*.mjs"] external_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"] included_env_vars = ["CONTEXT", "TEZOS_NETWORK", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "ADMIN_SUB"] [functions.run] included_env_vars = ["NETLIFY_DEV", "REDIS_CONNECTION_STRING"] [functions.handles] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_env_vars = ["CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.piece-hit] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.piece-fans] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.track-media] external_node_modules = ["sharp", "mongodb", "mongodb-connection-string-url", "adm-zip", "@atproto/api"] included_files = ["backend/**/*.mjs"] included_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"] [functions.track-tape] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_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"] [functions.get-tape] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.get-tape-status] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.oven-complete] external_node_modules = ["mongodb", "mongodb-connection-string-url", "adm-zip", "@atproto/api"] included_files = ["backend/**/*.mjs"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME", "PDS_URL", "PDS_ADMIN_PASSWORD", "OVEN_CALLBACK_SECRET", "OVEN_URL"] [functions.get-painting] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.painting-code] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.painting-metadata] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.bdf-glyph] included_env_vars = ["NETLIFY_DEV", "NODE_ENV", "ART_ENDPOINT", "ART_KEY", "ART_SECRET", "URL"] [functions.shop] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.export-piece] external_node_modules = ["terser"] included_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/**/*"] included_env_vars = [] [functions.subscribe-to-topic] included_env_vars = ["GCM_FIREBASE_CONFIG_URL"] [functions.auth0-events] external_node_modules = ["@atproto/api", "mongodb", "mongodb-connection-string-url"] included_env_vars = ["AUTH0_LOG_TOKEN", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "PDS_URL", "PDS_ADMIN_PASSWORD"] [functions.docs] included_env_vars = ["CONTEXT"] [functions.api-docs] # API documentation - no environment variables needed included_env_vars = [] [functions.mcp-remote] # Remote MCP server - no environment variables needed (auth via headers) included_env_vars = [] [functions.media-collection] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_env_vars = ["CONTEXT", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.authorized] included_env_vars = ["CONTEXT", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET"] [functions.profile] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_env_vars = ["CONTEXT", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.chat-messages] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.metrics] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME", "PRINTFUL_API_TOKEN"] [functions.update-painting-slug] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET"] [functions.sotce-net] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] # Missing functions that need env var whitelisting to avoid 4KB limit [functions.backfill-painting-codes] external_node_modules = ["mongodb", "mongodb-connection-string-url", "nanoid"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.redirect-proxy] included_files = ["public/aesthetic.computer/lib/helpers.mjs"] included_env_vars = [] [functions.kidlisp-keep] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["CONTEXT", "TEZOS_NETWORK", "OVEN_URL", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "ADMIN_SUB"] [functions.keeps-config] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["CONTEXT", "TEZOS_NETWORK", "MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.test-tv-hits] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"] [functions.update-build] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME", "BUILDS_API_KEY"] [functions.auth-cli-callback] included_env_vars = ["AUTH0_DOMAIN", "AUTH0_CLIENT_ID", "AUTH0_CLIENT_SECRET"] [functions.ff1-proxy] included_env_vars = [] [functions.firebase-config] included_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"] [functions.give-image] included_env_vars = [] [functions.gives] external_node_modules = ["stripe"] included_env_vars = ["CONTEXT", "STRIPE_API_PRIV_KEY"] [functions.keep-update-confirm] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_files = ["backend/**/*.mjs"] included_env_vars = ["CONTEXT", "TEZOS_NETWORK", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "ADMIN_SUB"] [functions.kidlisp-count] included_env_vars = [] [functions.kidlisp-list] included_env_vars = [] [functions.m4l-plugins] included_env_vars = [] [functions.migrate-piece-paths] included_env_vars = ["ART_KEY", "ART_SECRET", "DO_SPACES_KEY", "DO_SPACES_SECRET"] [functions.news] included_env_vars = ["CONTEXT", "NETLIFY_DEV", "NODE_ENV"] [functions.news-api] included_env_vars = ["ADMIN_SUB"] [functions.news-guidelines] included_env_vars = [] [functions.news-toll] external_node_modules = ["stripe"] included_env_vars = ["CONTEXT", "STRIPE_API_TEST_PRIV_KEY", "STRIPE_API_PRIV_KEY", "STRIPE_ENDPOINT_DEV_SECRET", "STRIPE_ENDPOINT_SECRET"] [functions.og-preview] included_env_vars = ["NETLIFY_DEV", "CONTEXT"] [functions.patch] included_env_vars = ["CONTEXT", "GITHUB_COPILOT_TOKEN"] [functions.permahandle] included_env_vars = [] [functions.piece-dates] included_env_vars = [] [functions.stories] included_env_vars = ["BUILDS_PASSWORD"] [functions.update-tezos-address] included_files = ["backend/**/*.mjs"] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_env_vars = ["CONTEXT", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET"] [functions.mugs] included_env_vars = [] [functions.agent-memory-ingest] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_env_vars = [ "AGENT_MEMORY_SECRET_ID", "AGENT_MEMORY_MONGODB_CONNECTION_STRING", "AGENT_MEMORY_MONGODB_NAME", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", ] [dev] NODE_ENV = "development" publish = "public/" command = "caddy run --config Caddyfile" port = 8888 targetPort = 8111 #framework = "#static" autoLaunch = false # No [dev.https] in base config - it's context-specific [dev.environment] OVEN_URL = "https://localhost:3002" SILO_URL = "https://localhost:3003" # Context for local development: uses HTTPS with local SSL certificates [context.local.dev] [context.local.dev.https] certFile = "../ssl-dev/localhost.pem" keyFile = "../ssl-dev/localhost-key.pem" # Context for Codespaces: disable HTTPS since Codespaces handles SSL at proxy level [context.codespace.dev] # Inherits all [dev] settings but without HTTPS # No [dev.https] section = HTTP only [context.production] NODE_ENV = "production" [[headers]] for = "/*" # Define which paths this specific [[headers]] block will cover. [headers.values] Access-Control-Allow-Origin = "*" Cache-Control = "no-cache, no-store, must-revalidate" Pragma = "no-cache" # These headers are required in order for SharedArrayBuffer to be enabled. # Currently used by ffmpeg.wasm. 22.08.06.11.01 # Cross-Origin-Embedder-Policy = "require-corp" Cross-Origin-Opener-Policy = "same-origin-allow-popups" Cross-Origin-Resource-Policy = "cross-origin" [[headers]] for = "/api/*" [headers.values] Access-Control-Allow-Origin = "*" Access-Control-Allow-Methods = "GET, POST, PUT, DELETE, OPTIONS" Access-Control-Allow-Headers = "Content-Type, Authorization" [[headers]] for = "/*.mjs|/*.js" [headers.values] Access-Control-Allow-Origin = "*" Cache-Control = "no-cache, no-store, must-revalidate" Pragma = "no-cache" Content-Security-Policy = "script-src 'self' https://www.gstatic.com https://cdn.jsdelivr.net https://aesthetic.computer https://assets.aesthetic.computer blob: 'unsafe-eval';" # Cross-Origin-Resource-Policy = "cross-origin" Vary = "*" [[edge_functions]] path = "/media/*" function = "media" [[edge_functions]] path = "/api/os-release-upload" function = "os-release-upload" # keep.kidlisp.com/$code — social crawler meta tag injection [[edge_functions]] path = "/*" function = "keeps-social" excludedPath = ["/api/device-auth", "/api/device-login", "/api/device-token", "/api/device-pair", "/device-login"] # Version/commit status API [functions.version] included_files = ["public/.commit-ref"] [[redirects]] from = "/api/version" to = "/.netlify/functions/version" status = 200 # M4L plugins API [[redirects]] from = "/m4l-plugins" to = "/.netlify/functions/m4l-plugins" status = 200 [[redirects]] from = "/m4l-plugins/*" to = "/.netlify/functions/m4l-plugins/:splat" status = 200 # FF1 API routes [[redirects]] from = "/api/ff1/*" to = "/.netlify/functions/ff1-:splat" status = 200 # Serve type/font assets locally (allow dev edits to BDF files) # This must come BEFORE the general /assets/* proxy below # force = true ensures this takes precedence over the /assets/* rule [[redirects]] from = "/assets/type/*" to = "/assets/type/:splat" status = 200 force = true # Proxy assets to S3 (DigitalOcean Spaces) - avoids uploading 13GB to Netlify [[redirects]] from = "/assets/*" to = "https://assets.aesthetic.computer/:splat" status = 200 force = true # Redirect root-level .mjs requests to aesthetic.computer subdirectory # This handles cases where dynamic imports resolve incorrectly [[redirects]] from = "/bios.mjs" to = "/aesthetic.computer/bios.mjs" status = 200 [[redirects]] from = "/lib/*" to = "/aesthetic.computer/lib/:splat" status = 200 # Desktop app download shortcuts (via silo → DigitalOcean Spaces) [[redirects]] from = "/desktop/mac" to = "https://silo.aesthetic.computer/desktop/download/mac" status = 302 [[redirects]] from = "/desktop/win" to = "https://silo.aesthetic.computer/desktop/download/win" status = 302 [[redirects]] from = "/desktop/linux" to = "https://silo.aesthetic.computer/desktop/download/linux" status = 302 [[redirects]] from = "https://botce.ac" to = "https://aesthetic.computer/botce" status = 200 force = true [[redirects]] from = "https://sotce.net/aesthetic.computer/*" to = "/aesthetic.computer/:splat" status = 200 force = true [[redirects]] from = "/redirect-proxy-sotce" to = "/.netlify/functions/redirect-proxy" status = 200 [[redirects]] from = "https://sotce.net/user" to = "/.netlify/functions/user" status = 200 force = true [[redirects]] from = "https://sotce.net/handle" to = "/.netlify/functions/handle" status = 200 force = true [[redirects]] from = "https://sotce.net/api/email" to = "/.netlify/functions/email" status = 200 [[redirects]] from = "https://sotce.net/redirect-proxy-sotce" to = "/.netlify/functions/redirect-proxy" status = 200 [[redirects]] from = "https://sotce.net/*" to = "/.netlify/functions/sotce-net" status = 200 force = true [[redirects]] from = "/sotce-net/*" to = "/.netlify/functions/sotce-net/:splat" status = 200 force = true [[redirects]] from = "/sotce.net/*" to = "/.netlify/functions/sotce-net/:splat" status = 200 force = true [[redirects]] from = "https://whistlegraph.com/*" to = "https://trio.whistlegraph.com/:splat" status = 301 force = true # jas.life - Jeffrey's CV/portfolio # Local dev: https://localhost:8888/jas.life/ [[redirects]] from = "/jas.life" to = "/jas.life/" status = 200 force = true [[redirects]] from = "/jas.life/*" to = "/jas.life/:splat" status = 200 force = true [[redirects]] from = "https://jas.life/*" to = "/jas.life/:splat" status = 200 force = true [[redirects]] from = "https://www.jas.life/*" to = "https://jas.life/:splat" status = 301 force = true # digitpain.com - redirect to jas.life (deprecated) [[redirects]] from = "https://digitpain.com/*" to = "https://jas.life/:splat" status = 301 force = true [[redirects]] from = "https://www.digitpain.com/*" to = "https://jas.life/:splat" status = 301 force = true # rdp.jas.life - Radical Digital Painting collection (239 paintings, 2016–2021) # Local dev: https://localhost:8888/rdp.jas.life/ [[redirects]] from = "https://rdp.jas.life/*" to = "/rdp.jas.life/:splat" status = 200 force = true [[redirects]] from = "/rdp.jas.life" to = "/rdp.jas.life/" status = 200 force = true [[redirects]] from = "/rdp.jas.life/*" to = "/rdp.jas.life/:splat" status = 200 force = true # justanothersystem.org - Stretched paintings by Jeffrey Alan Scudder # API routes first (before catch-all) [[redirects]] from = "https://justanothersystem.org/api/stretched-paintings" to = "/.netlify/functions/stretched-paintings" status = 200 force = true [[redirects]] from = "https://justanothersystem.org/api/stretched-paintings/*" to = "/.netlify/functions/stretched-paintings/:splat" status = 200 force = true [[redirects]] from = "https://www.justanothersystem.org/api/stretched-paintings" to = "/.netlify/functions/stretched-paintings" status = 200 force = true [[redirects]] from = "https://www.justanothersystem.org/api/stretched-paintings/*" to = "/.netlify/functions/stretched-paintings/:splat" status = 200 force = true # JAS Tags API [[redirects]] from = "https://justanothersystem.org/api/tags" to = "/.netlify/functions/jas-tags" status = 200 force = true [[redirects]] from = "https://justanothersystem.org/api/tags/*" to = "/.netlify/functions/jas-tags/:splat" status = 200 force = true [[redirects]] from = "https://justanothersystem.org/api/jas-tags" to = "/.netlify/functions/jas-tags" status = 200 force = true [[redirects]] from = "https://justanothersystem.org/api/jas-tags/*" to = "/.netlify/functions/jas-tags/:splat" status = 200 force = true [[redirects]] from = "https://www.justanothersystem.org/api/tags" to = "/.netlify/functions/jas-tags" status = 200 force = true [[redirects]] from = "https://www.justanothersystem.org/api/tags/*" to = "/.netlify/functions/jas-tags/:splat" status = 200 force = true [[redirects]] from = "https://www.justanothersystem.org/api/jas-tags" to = "/.netlify/functions/jas-tags" status = 200 force = true [[redirects]] from = "https://www.justanothersystem.org/api/jas-tags/*" to = "/.netlify/functions/jas-tags/:splat" status = 200 force = true # Static content routes [[redirects]] from = "https://justanothersystem.org" to = "/justanothersystem.org/index.html" status = 200 force = true [[redirects]] from = "https://justanothersystem.org/cv" to = "/justanothersystem.org/cv.html" status = 200 force = true [[redirects]] from = "https://justanothersystem.org/bio" to = "/justanothersystem.org/bio.html" status = 200 force = true [[redirects]] from = "https://justanothersystem.org/*" to = "/justanothersystem.org/:splat" status = 200 force = true [[redirects]] from = "https://www.justanothersystem.org" to = "https://justanothersystem.org" status = 301 force = true [[redirects]] from = "https://www.justanothersystem.org/*" to = "https://justanothersystem.org/:splat" status = 301 force = true [[redirects]] from = "https://builds.false.work/api/register-build" to = "/.netlify/functions/register-build" status = 200 force = true [[redirects]] from = "https://builds.false.work/api/get-builds" to = "/.netlify/functions/get-builds" status = 200 force = true [[redirects]] from = "https://builds.false.work/api/verify-password" to = "/.netlify/functions/verify-builds-password" status = 200 force = true [[redirects]] from = "https://builds.false.work/*" to = "/builds.false.work/:splat" status = 200 force = true # false.work naked domain - landing page [[redirects]] from = "https://www.false.work" to = "https://false.work" status = 301 force = true [[redirects]] from = "https://www.false.work/*" to = "https://false.work/:splat" status = 301 force = true [[redirects]] from = "https://false.work" to = "/false.work/index.html" status = 200 force = true [[redirects]] from = "https://false.work/*" to = "/false.work/:splat" status = 200 force = true # Local dev path-based access for false.work sites [[redirects]] from = "/false.work" to = "/false.work/index.html" status = 200 [[redirects]] from = "/builds.false.work" to = "/builds.false.work/index.html" status = 200 [[redirects]] from = "/media-collection/*" to = "/.netlify/functions/media-collection" status = 200 force = true [[redirects]] from = "/.well-known/apple-developer-merchantid-domain-association" to = "/.netlify/functions/apple-developer-merchantid-domain-association" status = 200 force = true [[redirects]] from = "/slash" to = "/.netlify/functions/slash" status = 200 force = true [[redirects]] from = "https://www.4esthetic.com/*" to = "https://aesthetic.computer/:splat" status = 301 force = true [[redirects]] from = "https://4esthetic.com/*" to = "https://aesthetic.computer/:splat" status = 301 force = true [[redirects]] from = "https://wand.ac" to = "https://aesthetic.computer/wand" status = 301 force = true [[redirects]] from = "https://edit.ac" to = "https://vscode.dev/github/digitpain/aesthetic.computer-code/blob/main/blank.mjs" status = 301 force = true [[redirects]] from = "https://m2w2.whistlegraph.com" to = "https://aesthetic.computer/wg~m2w2" status = 200 force = false [[redirects]] from = "https://wipppps.world" to = "https://aesthetic.computer/wipppps" status = 200 force = true [[redirects]] from = "https://www.wipppps.world" to = "https://wipppps.world" status = 301 force = true [[redirects]] from = "https://www.sundarakarma.com" to = "https://aesthetic.computer/sundarakarma.com" status = 200 force = true [[redirects]] from = "https://www.sundarakarma.com/oscar" to = "https://aesthetic.computer/sundarakarma.com/oscar.html" status = 200 force = true [[redirects]] from = "https://sundarakarma.com" to = "https://aesthetic.computer/sundarakarma.com" status = 200 force = true [[redirects]] from = "https://sundarakarma.com/oscar" to = "https://aesthetic.computer/sundarakarma.com/oscar.html" status = 200 force = true [[redirects]] from = "https://pals.aesthetic.computer/*" to = "https://aesthetic.computer/api/logo/:splat" status = 200 force = true [[redirects]] from = "https://prompt.ac/ejjk1z" to = "https://duckweedtri.prompt.ac" status = 301 force = true [[redirects]] from = "https://prompt.ac/*" to = "https://aesthetic.computer/:splat" status = 301 force = true [[redirects]] from = "https://l5.prompt.ac" to = "https://l5.aesthetic.computer" status = 301 force = true [[redirects]] from = "https://l5.prompt.ac/*" to = "https://l5.aesthetic.computer/:splat" status = 301 force = true [[redirects]] from = "https://processing.prompt.ac" to = "https://processing.aesthetic.computer" status = 301 force = true [[redirects]] from = "https://processing.prompt.ac/*" to = "https://processing.aesthetic.computer/:splat" status = 301 force = true [[redirects]] from = "https://p5.prompt.ac" to = "https://p5.aesthetic.computer" status = 301 force = true [[redirects]] from = "https://p5.prompt.ac/*" to = "https://p5.aesthetic.computer/:splat" status = 301 force = true [[redirects]] from = "/processing.prompt.ac" to = "/processing.aesthetic.computer" status = 301 force = true [[redirects]] from = "/processing.prompt.ac/*" to = "/processing.aesthetic.computer/:splat" status = 301 force = true [[redirects]] from = "/p5.prompt.ac" to = "/p5.aesthetic.computer" status = 301 force = true [[redirects]] from = "/p5.prompt.ac/*" to = "/p5.aesthetic.computer/:splat" status = 301 force = true # sitemap.prompt.ac → sitemap.aesthetic.computer [[redirects]] from = "https://sitemap.prompt.ac" to = "https://sitemap.aesthetic.computer" status = 301 force = true [[redirects]] from = "https://sitemap.prompt.ac/*" to = "https://sitemap.aesthetic.computer/:splat" status = 301 force = true # api.prompt.ac → api.aesthetic.computer [[redirects]] from = "https://api.prompt.ac" to = "https://api.aesthetic.computer" status = 301 force = true [[redirects]] from = "https://api.prompt.ac/*" to = "https://api.aesthetic.computer/:splat" status = 301 force = true [[redirects]] from = "https://l5.aesthetic.computer" to = "/l5.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "https://l5.aesthetic.computer/docs.json" to = "/docs.json" status = 200 force = true [[redirects]] from = "https://l5.aesthetic.computer/docs/*" to = "/docs/:splat" status = 200 force = true [[redirects]] from = "https://l5.aesthetic.computer/l5.aesthetic.computer/*" to = "/l5.aesthetic.computer/:splat" status = 200 force = true [[redirects]] from = "https://l5.aesthetic.computer/aesthetic.computer/*" to = "/aesthetic.computer/:splat" status = 200 force = true [[redirects]] from = "https://l5.aesthetic.computer/*" to = "/l5.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "https://processing.aesthetic.computer" to = "/processing.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "https://processing.aesthetic.computer/docs.json" to = "/docs.json" status = 200 force = true [[redirects]] from = "https://processing.aesthetic.computer/docs/*" to = "/docs/:splat" status = 200 force = true [[redirects]] from = "https://processing.aesthetic.computer/processing.aesthetic.computer/*" to = "/processing.aesthetic.computer/:splat" status = 200 force = true [[redirects]] from = "https://processing.aesthetic.computer/aesthetic.computer/*" to = "/aesthetic.computer/:splat" status = 200 force = true [[redirects]] from = "https://processing.aesthetic.computer/*" to = "/processing.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "https://p5.aesthetic.computer" to = "/processing.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "https://p5.aesthetic.computer/docs.json" to = "/docs.json" status = 200 force = true [[redirects]] from = "https://p5.aesthetic.computer/docs/*" to = "/docs/:splat" status = 200 force = true [[redirects]] from = "https://p5.aesthetic.computer/processing.aesthetic.computer/*" to = "/processing.aesthetic.computer/:splat" status = 200 force = true [[redirects]] from = "https://p5.aesthetic.computer/aesthetic.computer/*" to = "/aesthetic.computer/:splat" status = 200 force = true [[redirects]] from = "https://p5.aesthetic.computer/*" to = "/processing.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "/processing.aesthetic.computer" to = "/processing.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "/processing.aesthetic.computer/docs.json" to = "/docs.json" status = 200 force = true [[redirects]] from = "/processing.aesthetic.computer/docs/*" to = "/docs/:splat" status = 200 force = true [[redirects]] from = "/processing.aesthetic.computer/processing.aesthetic.computer/*" to = "/processing.aesthetic.computer/:splat" status = 200 force = true [[redirects]] from = "/processing.aesthetic.computer/*" to = "/processing.aesthetic.computer/index.html" status = 200 force = false [[redirects]] from = "/p5.aesthetic.computer" to = "/processing.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "/p5.aesthetic.computer/docs.json" to = "/docs.json" status = 200 force = true [[redirects]] from = "/p5.aesthetic.computer/docs/*" to = "/docs/:splat" status = 200 force = true [[redirects]] from = "/p5.aesthetic.computer/processing.aesthetic.computer/*" to = "/processing.aesthetic.computer/:splat" status = 200 force = true [[redirects]] from = "/p5.aesthetic.computer/*" to = "/processing.aesthetic.computer/index.html" status = 200 force = false # Screenshot generation handled by oven.aesthetic.computer [[redirects]] from = "/preview/*" to = "https://oven.aesthetic.computer/preview/:splat" status = 200 # sitemap.aesthetic.computer subdomain [[redirects]] from = "https://sitemap.aesthetic.computer" to = "/sitemap.html" status = 200 force = true [[redirects]] from = "https://sitemap.aesthetic.computer/*" to = "/sitemap.html" status = 200 force = true [[redirects]] from = "/sitemap" to = "/sitemap.html" status = 200 [[redirects]] from = "/l5" to = "/l5.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "/l5/*" to = "/l5.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "/L5" to = "/l5.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "/L5/*" to = "/l5.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "/processing" to = "/processing.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "/processing/*" to = "/processing.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "/Processing" to = "/processing.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "/Processing/*" to = "/processing.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "/p5" to = "/processing.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "/p5/*" to = "/processing.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "/P5" to = "/processing.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "/P5/*" to = "/processing.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "/support" to = "/support.html" status = 200 [[redirects]] from = "/privacy-policy" to = "/privacy-policy.html" status = 200 [[redirects]] from = "/aesthetic-direct" to = "/aesthetic-direct.html" status = 200 [[redirects]] from = "https://aesthetic.direct" to = "https://aesthetic.computer/aesthetic-direct" status = 200 force = true # give.aesthetic.computer - Support/donation page [[redirects]] from = "https://give.aesthetic.computer/da" to = "/give.aesthetic.computer/index.html?lang=da¤cy=dkk" status = 200 force = true [[redirects]] from = "https://give.aesthetic.computer/es" to = "/give.aesthetic.computer/index.html?lang=es¤cy=usd" status = 200 force = true [[redirects]] from = "https://give.aesthetic.computer/de" to = "/give.aesthetic.computer/index.html?lang=de¤cy=eur" status = 200 force = true [[redirects]] from = "https://give.aesthetic.computer/cn" to = "/give.aesthetic.computer/index.html?lang=zh¤cy=usd" status = 200 force = true [[redirects]] from = "https://give.aesthetic.computer/api/give-portal" to = "/.netlify/functions/give-portal" status = 200 force = true [[redirects]] from = "https://give.aesthetic.computer/api/give" to = "/.netlify/functions/give" status = 200 force = true [[redirects]] from = "https://give.aesthetic.computer/api/billing" to = "/.netlify/functions/billing" status = 200 force = true [[redirects]] from = "https://give.aesthetic.computer" to = "/give.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "https://give.aesthetic.computer/*" to = "/give.aesthetic.computer/:splat" status = 200 force = true [[redirects]] from = "/api/unsubscribe" to = "/.netlify/functions/unsubscribe" status = 200 [[redirects]] from = "/api/mail-status" to = "/.netlify/functions/mail-status" status = 200 # 🎹 notepat.com — proxies to aesthetic.computer/notepat (preserves notepat.com in URL bar) [[redirects]] from = "https://notepat.com" to = "https://aesthetic.computer/notepat" status = 200 force = true [[redirects]] from = "https://www.notepat.com" to = "https://aesthetic.computer/notepat" status = 200 force = true [[redirects]] from = "https://www.notepat.com/*" to = "https://aesthetic.computer/:splat" status = 200 force = true [[redirects]] from = "https://notepat.com/*" to = "https://aesthetic.computer/:splat" status = 200 force = true [[redirects]] from = "https://kidlisp.com" to = "https://aesthetic.computer/kidlisp.com/" status = 200 force = true # API routes - kidlisp.com/api/* [[redirects]] from = "https://kidlisp.com/api/ff1/*" to = "https://aesthetic.computer/api/ff1/:splat" status = 200 force = true [[redirects]] from = "https://kidlisp.com/api/*" to = "https://aesthetic.computer/api/:splat" status = 200 force = true # Keeps → subdomain redirect [[redirects]] from = "https://kidlisp.com/keeps" to = "https://keep.kidlisp.com/" status = 301 force = true # Learn / reference page [[redirects]] from = "https://kidlisp.com/learn" to = "/kidlisp.com/learn.html" status = 200 force = true # Proxy aesthetic.computer assets (split.js, etc.) through kidlisp.com [[redirects]] from = "https://kidlisp.com/aesthetic.computer/*" to = "/aesthetic.computer/:splat" status = 200 force = true [[redirects]] from = "https://kidlisp.com/*" to = "https://aesthetic.computer/kidlisp.com/:splat" status = 200 force = true [[redirects]] from = "https://www.kidlisp.com" to = "https://aesthetic.computer/kidlisp.com/" status = 200 force = true # API routes - www.kidlisp.com/api/* [[redirects]] from = "https://www.kidlisp.com/api/ff1/*" to = "https://aesthetic.computer/api/ff1/:splat" status = 200 force = true [[redirects]] from = "https://www.kidlisp.com/api/*" to = "https://aesthetic.computer/api/:splat" status = 200 force = true # Keeps → subdomain redirect [[redirects]] from = "https://www.kidlisp.com/keeps" to = "https://keep.kidlisp.com/" status = 301 force = true # Learn / reference page [[redirects]] from = "https://www.kidlisp.com/learn" to = "/kidlisp.com/learn.html" status = 200 force = true # Proxy aesthetic.computer assets through www.kidlisp.com [[redirects]] from = "https://www.kidlisp.com/aesthetic.computer/*" to = "/aesthetic.computer/:splat" status = 200 force = true [[redirects]] from = "https://www.kidlisp.com/*" to = "https://aesthetic.computer/kidlisp.com/:splat" status = 200 force = true # learn.kidlisp.com subdomain [[redirects]] from = "https://learn.kidlisp.com" to = "/kidlisp.com/learn.html" status = 200 force = true [[redirects]] from = "https://learn.kidlisp.com/api/*" to = "/api/:splat" status = 200 force = true [[redirects]] from = "https://learn.kidlisp.com/decree" to = "/kidlisp.com/decree.html" status = 200 force = true [[redirects]] from = "https://learn.kidlisp.com/decree/26" to = "/kidlisp.com/decree.html" status = 200 force = true [[redirects]] from = "https://learn.kidlisp.com/*" to = "/kidlisp.com/learn.html" status = 200 force = true # Legacy keeps.kidlisp.com → keep.kidlisp.com redirect [[redirects]] from = "https://keeps.kidlisp.com/*" to = "https://keep.kidlisp.com/:splat" status = 301 force = true [[redirects]] from = "https://keeps.kidlisp.com" to = "https://keep.kidlisp.com/" status = 301 force = true # keep.kidlisp.com subdomain [[redirects]] from = "https://keep.kidlisp.com" to = "/kidlisp.com/keeps.html" status = 200 force = true [[redirects]] from = "https://keep.kidlisp.com/api/*" to = "/api/:splat" status = 200 force = true [[redirects]] from = "https://keep.kidlisp.com/technology" to = "/kidlisp.com/keeps-tech.html" status = 200 force = true [[redirects]] from = "https://keep.kidlisp.com/wallet" to = "/kidlisp.com/wallet/index.html" status = 200 force = true [[redirects]] from = "https://keep.kidlisp.com/*" to = "/kidlisp.com/keeps.html" status = 200 force = true # buy.kidlisp.com subdomain — direct purchase page [[redirects]] from = "https://buy.kidlisp.com" to = "/kidlisp.com/buy.html" status = 200 force = true [[redirects]] from = "https://buy.kidlisp.com/*" to = "/kidlisp.com/buy.html" status = 200 force = true # PJ subdomain for kidlisp.com - pj.kidlisp.com/code (Piece Jockey) [[redirects]] from = "https://pj.kidlisp.com" to = "/kidlisp.com/pj.html" status = 200 force = true [[redirects]] from = "https://pj.kidlisp.com/*" to = "/kidlisp.com/pj.html" status = 200 force = true # Device subdomain for kidlisp.com - device.kidlisp.com/codeId (FF1 display mode) [[redirects]] from = "https://device.kidlisp.com" to = "/kidlisp.com/device.html" status = 200 force = true # FF1 API routes - device.kidlisp.com/api/ff1/* [[redirects]] from = "https://device.kidlisp.com/api/ff1/*" to = "/api/ff1/:splat" status = 200 force = true [[redirects]] from = "https://device.kidlisp.com/qr/*" to = "/kidlisp.com/qr.html?token=:splat" status = 200 force = true # Serve static JS assets for device subdomain [[redirects]] from = "https://device.kidlisp.com/js/*" to = "/kidlisp.com/js/:splat" status = 200 force = true [[redirects]] from = "https://device.kidlisp.com/*" to = "/kidlisp.com/device.html" status = 200 force = true # Top subdomain for kidlisp.com - top.kidlisp.com (alias for top100 playlist) # JS assets served statically (must come before function route) [[redirects]] from = "https://top.kidlisp.com/js/*" to = "/kidlisp.com/js/:splat" status = 200 force = true [[redirects]] from = "https://top.kidlisp.com" to = "/.netlify/functions/index/top.kidlisp.com" status = 200 force = true [[redirects]] from = "https://top.kidlisp.com/*" to = "/.netlify/functions/index/top.kidlisp.com/:splat" status = 200 force = true # Calm subdomain for kidlisp.com - calm.kidlisp.com (hand-curated calm playlist) # JS assets served statically (must come before function route) [[redirects]] from = "https://calm.kidlisp.com/js/*" to = "/kidlisp.com/js/:splat" status = 200 force = true # Route through index function for dynamic meta tags (social previews / iMessage) [[redirects]] from = "https://calm.kidlisp.com" to = "/.netlify/functions/index/calm.kidlisp.com" status = 200 force = true [[redirects]] from = "https://calm.kidlisp.com/*" to = "/.netlify/functions/index/calm.kidlisp.com/:splat" status = 200 force = true [[redirects]] from = "https://news.aesthetic.computer" to = "/.netlify/functions/news" status = 200 force = true [[redirects]] from = "https://news.aesthetic.computer/" to = "/.netlify/functions/news" status = 200 force = true # News API routes for subdomain (must be before /* catch-all) [[redirects]] from = "https://news.aesthetic.computer/api/news" to = "/.netlify/functions/news-api" status = 200 [[redirects]] from = "https://news.aesthetic.computer/api/news/*" to = "/.netlify/functions/news-api/:splat" status = 200 [[redirects]] from = "https://news.aesthetic.computer/guidelines" to = "/.netlify/functions/news" status = 200 force = true [[redirects]] from = "https://news.aesthetic.computer/*" to = "/.netlify/functions/news/:splat" status = 200 force = true [[redirects]] from = "/news.aesthetic.computer" to = "/.netlify/functions/news" status = 200 force = true [[redirects]] from = "/news.aesthetic.computer/" to = "/.netlify/functions/news" status = 200 force = true # api.aesthetic.computer subdomain [[redirects]] from = "https://api.aesthetic.computer" to = "/.netlify/functions/api-docs" status = 200 force = true [[redirects]] from = "https://api.aesthetic.computer/*" to = "/api/:splat" status = 200 force = true # Path-based API routes (must be before /* catch-all) # API Documentation - LLM-readable API reference [[redirects]] from = "/api" to = "/.netlify/functions/api-docs" status = 200 # Remote MCP Server - SSE endpoint for Claude Pro/Team [[redirects]] from = "/mcp" to = "/.netlify/functions/mcp-remote" status = 200 [[redirects]] from = "/api/news" to = "/.netlify/functions/news-api" status = 200 [[redirects]] from = "/api/news/*" to = "/.netlify/functions/news-api/:splat" status = 200 # News toll (troll toll) - handles both checkout AND webhook [[redirects]] from = "https://news.aesthetic.computer/api/news/toll" to = "/.netlify/functions/news-toll" status = 200 [[redirects]] from = "/api/news/toll" to = "/.netlify/functions/news-toll" status = 200 [[redirects]] from = "/news.aesthetic.computer/guidelines" to = "/.netlify/functions/news" status = 200 force = true [[redirects]] from = "/news.aesthetic.computer/*" to = "/.netlify/functions/news/:splat" status = 200 # No force=true - static files in public/news.aesthetic.computer/ served first [[redirects]] from = "/icon/*" to = "https://oven.aesthetic.computer/icon/:splat" status = 200 [[redirects]] from = "/api/print/*" to = "/.netlify/functions/print" status = 200 [[redirects]] from = "/api/blank" to = "/.netlify/functions/blank" status = 200 [[redirects]] from = "/api/mug" to = "/.netlify/functions/mug" status = 200 [[redirects]] from = "/api/mugs" to = "/.netlify/functions/mugs" status = 200 [[redirects]] from = "/api/mockup-gif" to = "/.netlify/functions/mockup-gif" status = 200 [[redirects]] from = "/api/mockup-webp" to = "/.netlify/functions/mockup-webp" status = 200 [[redirects]] from = "/api/clock" to = "/.netlify/functions/clock" status = 200 [[redirects]] from = "/api/chat/messages" to = "/.netlify/functions/chat-messages" status = 200 [[redirects]] from = "/api/auth0-events" to = "/.netlify/functions/auth0-events" status = 200 [[redirects]] from = "/api/auth/cli-callback" to = "/.netlify/functions/auth-cli-callback" status = 200 [[redirects]] from = "/api/device-auth" to = "/.netlify/functions/device-auth" status = 200 [[redirects]] from = "/api/device-token" to = "/.netlify/functions/device-token" status = 200 [[redirects]] from = "/api/device-pair" to = "/.netlify/functions/device-pair" status = 200 [[redirects]] from = "/api/device-login" to = "/.netlify/functions/device-login" status = 200 [[redirects]] from = "/device-login" to = "/.netlify/functions/device-login" status = 200 [[redirects]] from = "/api/metrics" to = "/.netlify/functions/metrics" status = 200 [[redirects]] from = "/api/agent-memory-ingest" to = "/.netlify/functions/agent-memory-ingest" status = 200 [[redirects]] from = "/api/billing" to = "/.netlify/functions/billing" status = 200 [[redirects]] from = "/api/give" to = "/.netlify/functions/give" status = 200 [[redirects]] from = "/api/give-portal" to = "/.netlify/functions/give-portal" status = 200 [[redirects]] from = "/api/gives" to = "/.netlify/functions/gives" status = 200 [[redirects]] from = "/api/give-image" to = "/.netlify/functions/give-image" status = 200 [[redirects]] from = "/api/shop" to = "/.netlify/functions/shop" status = 200 [[redirects]] from = "/api/stretched-paintings" to = "/.netlify/functions/stretched-paintings" status = 200 [[redirects]] from = "/api/jas-tags" to = "/.netlify/functions/jas-tags" status = 200 [[redirects]] from = "/api/piece-hit" to = "/.netlify/functions/piece-hit" status = 200 [[redirects]] from = "/api/piece-fans" to = "/.netlify/functions/piece-fans" status = 200 [[redirects]] from = "/api/ticket/*" to = "/.netlify/functions/ticket" status = 200 [[redirects]] from = "/api/subscribe-to-topic" to = "/.netlify/functions/subscribe-to-topic" status = 200 [[redirects]] from = "/api/logo/*" to = "/.netlify/functions/logo/:splat" status = 200 [[redirects]] from = "/api/logo.png" to = "/.netlify/functions/logo" status = 200 [[redirects]] from = "/api/pixel/*" to = "/.netlify/functions/pixel" status = 200 [[redirects]] from = "/session/*" to = "/.netlify/functions/session" status = 200 [[redirects]] from = "/reload/*" to = "/.netlify/functions/reload" status = 200 [[redirects]] from = "/sotce-blog/*" to = "/.netlify/functions/sotce-blog" status = 200 [[redirects]] from = "/auth" to = "/.netlify/functions/auth" status = 200 [[redirects]] from = "/docs/*" to = "/.netlify/functions/docs/:splat" status = 200 [[redirects]] from = "/docs.json" to = "/.netlify/functions/docs" status = 200 [[redirects]] from = "/api/vary" to = "/.netlify/functions/vary" status = 200 [[redirects]] from = "/api/mood/*" to = "/.netlify/functions/mood" status = 200 [[redirects]] from = "/api/atproto-user-stats" to = "/.netlify/functions/atproto-user-stats" status = 200 [[redirects]] from = "/api/store-kidlisp" to = "/.netlify/functions/store-kidlisp" status = 200 [[redirects]] from = "/api/store-clock" to = "/.netlify/functions/store-clock" status = 200 [[redirects]] from = "/api/store-piece" to = "/.netlify/functions/store-piece" status = 200 [[redirects]] from = "/api/piece-metadata" to = "/.netlify/functions/piece-metadata" status = 200 [[redirects]] from = "/api/pack-html" to = "https://oven.aesthetic.computer/pack-html" status = 200 [[redirects]] from = "/api/bundle-html" to = "https://oven.aesthetic.computer/bundle-html" status = 200 [[redirects]] from = "/api/os" to = "https://oven.aesthetic.computer/os" status = 200 [[redirects]] from = "/api/pack-telemetry" to = "/.netlify/functions/bundle-telemetry" status = 200 [[redirects]] from = "/api/bundle-telemetry" to = "/.netlify/functions/bundle-telemetry" status = 200 [[redirects]] from = "/api/pack-telemetry-query" to = "/.netlify/functions/bundle-telemetry-query" status = 200 [[redirects]] from = "/api/bundle-telemetry-query" to = "/.netlify/functions/bundle-telemetry-query" status = 200 [[redirects]] from = "/api/boot-log" to = "/.netlify/functions/boot-log" status = 200 [[redirects]] from = "/api/paper-hit" to = "/.netlify/functions/paper-hit" status = 200 [[redirects]] from = "/api/kidlisp-log" to = "/.netlify/functions/kidlisp-log" status = 200 [[redirects]] from = "/api/keep-mint" to = "/.netlify/functions/keep-mint" status = 200 [[redirects]] from = "/api/keep-prepare" to = "/.netlify/functions/keep-prepare" status = 200 [[redirects]] from = "/api/update-tezos-address" to = "/.netlify/functions/update-tezos-address" status = 200 [[redirects]] from = "/api/keep-status" to = "/.netlify/functions/keep-status" status = 200 [[redirects]] from = "/api/keep-confirm" to = "/.netlify/functions/keep-confirm" status = 200 [[redirects]] from = "/api/keep-update" to = "/.netlify/functions/keep-update" status = 200 [[redirects]] from = "/api/keeps-config" to = "/.netlify/functions/keeps-config" status = 200 [[redirects]] from = "/api/delete-erase-and-forget-me" to = "/.netlify/functions/delete-erase-and-forget-me" status = 200 [[redirects]] from = "/api/track-media" to = "/.netlify/functions/track-media" status = 200 force = false [[redirects]] from = "/api/track-tape" to = "/.netlify/functions/track-media" status = 200 force = false [[redirects]] from = "/api/tape-convert-background" to = "/.netlify/functions/tape-convert-background" status = 200 force = false [[redirects]] from = "/api/get-tape" to = "/.netlify/functions/get-tape" status = 200 force = false [[redirects]] from = "/api/get-tape-status" to = "/.netlify/functions/get-tape-status" status = 200 force = false [[redirects]] from = "/api/oven-complete" to = "/.netlify/functions/oven-complete" status = 200 force = false [[redirects]] from = "/api/painting-code" to = "/.netlify/functions/painting-code" status = 200 force = false [[redirects]] from = "/api/painting-metadata" to = "/.netlify/functions/painting-metadata" status = 200 force = false [[redirects]] from = "/api/profile/*" to = "/.netlify/functions/profile" status = 200 [[redirects]] from = "/handle" to = "/.netlify/functions/handle" status = 200 [[redirects]] from = "api/authorized" to = "/.netlify/functions/authorized" status = 200 [[redirects]] from = "api/handles" to = "/.netlify/functions/handles" status = 200 [[redirects]] from = "/api/email" to = "/.netlify/functions/email" status = 200 [[redirects]] from = "/user" to = "/.netlify/functions/user" status = 200 [[redirects]] from = "/run" to = "/.netlify/functions/run" status = 200 [[redirects]] from = "/redirect-proxy" to = "/.netlify/functions/redirect-proxy" status = 200 [[redirects]] from = "/local-upload/*" to = "/.netlify/functions/local-upload" status = 200 force = true [[redirects]] from = "/presigned-upload-url/*" to = "/.netlify/functions/presigned-url" status = 200 force = true [[redirects]] from = "/presigned-download-url/*" to = "/.netlify/functions/presigned-url" status = 200 force = true [[redirects]] from = "/api/ask" to = "/.netlify/functions/ask" status = 200 # from = "/api/ask" # to = "http://localhost:3000/api/ask" # status = 200 # force = false [[redirects]] from = "/api/playlist" to = "/.netlify/functions/playlist" status = 200 [[redirects]] from = "/api/kidlisp-count" to = "/.netlify/functions/kidlisp-count" status = 200 [[redirects]] from = "/api/tv" to = "/.netlify/functions/tv" status = 200 [[redirects]] from = "/api/tv-tapes" to = "/.netlify/functions/tv-tapes" status = 200 [[redirects]] from = "/api/say" to = "/.netlify/functions/say" status = 200 # [[redirects]] # from = "/api/say" # to = "http://localhost:3000/api/say" # status = 200 # force = false [[redirects]] from = "https://sotce.local:8888" to = "/.netlify/functions/sotce-net" status = 200 force = true [[redirects]] from = "https://sotce.local:8888/*" to = "/.netlify/functions/sotce-net" status = 200 force = true # [[redirects]] # from = "/" # to = "/.netlify/functions/index" # status = 200 # force = true # 🛍️ Shop and ⛵ JAS Signature Redirects [[redirects]] from = "/shop/@jeffrey/help" to = "https://shop.aesthetic.computer/products/45-minutes-of-computer-help-from-jeffrey" status = 301 [[redirects]] from = "/shop/*" to = "https://shop.aesthetic.computer/:splat" status = 301 # 📚 Books [[redirects]] from = "/25.4.8.21.19" to = "https://shop.aesthetic.computer/products/books_the-shape-of-things-by-vilem-flusser_25-4-8-21-19" status = 301 [[redirects]] from = "/shop~25.4.8.21.19" to = "https://shop.aesthetic.computer/products/books_the-shape-of-things-by-vilem-flusser_25-4-8-21-19" status = 301 [[redirects]] from = "/25.4.8.21.17" to = "https://shop.aesthetic.computer/products/books_art-as-a-social-system-by-niklas-luhmann_25-4-8-21-17" status = 301 [[redirects]] from = "/shop~25.4.8.21.17" to = "https://shop.aesthetic.computer/products/books_art-as-a-social-system-by-niklas-luhmann_25-4-8-21-17" status = 301 [[redirects]] from = "/25.4.8.21.11" to = "https://shop.aesthetic.computer/products/books_play-by-catherine-garvey_25-4-8-21-11" status = 301 [[redirects]] from = "/shop~25.4.8.21.11" to = "https://shop.aesthetic.computer/products/books_play-by-catherine-garvey_25-4-8-21-11" status = 301 [[redirects]] from = "/25.4.8.21.08" to = "https://shop.aesthetic.computer/products/books_what-is-landscape-by-john-r-stilgoe_25-4-8-21-08" status = 301 [[redirects]] from = "/shop~25.4.8.21.08" to = "https://shop.aesthetic.computer/products/books_what-is-landscape-by-john-r-stilgoe_25-4-8-21-08" status = 301 [[redirects]] from = "/25.4.8.21.07" to = "https://shop.aesthetic.computer/products/books_the-complete-poems-of-emily-dickinson_25-4-8-21-07" status = 301 [[redirects]] from = "/shop~25.4.8.21.07" to = "https://shop.aesthetic.computer/products/books_the-complete-poems-of-emily-dickinson_25-4-8-21-07" status = 301 [[redirects]] from = "/25.11.17.19.03" to = "https://shop.aesthetic.computer/products/books_radical-computer-music-by-goodiepal_25-11-17-19-03" status = 301 [[redirects]] from = "/shop~25.11.17.19.03" to = "https://shop.aesthetic.computer/products/books_radical-computer-music-by-goodiepal_25-11-17-19-03" status = 301 [[redirects]] from = "/25.4.8.21.0" to = "https://shop.aesthetic.computer/products/books_the-art-of-seeing-by-aldous-huxley_25-4-8-21-0" status = 301 [[redirects]] from = "/shop~25.4.8.21.0" to = "https://shop.aesthetic.computer/products/books_the-art-of-seeing-by-aldous-huxley_25-4-8-21-0" status = 301 [[redirects]] from = "/25.4.8.20.47" to = "https://shop.aesthetic.computer/products/books_does-writing-have-a-future-by-vilem-flusser_25-4-8-20-47" status = 301 [[redirects]] from = "/shop~25.4.8.20.47" to = "https://shop.aesthetic.computer/products/books_does-writing-have-a-future-by-vilem-flusser_25-4-8-20-47" status = 301 [[redirects]] from = "/25.4.8.21.13" to = "https://shop.aesthetic.computer/products/books_musical-gestures-sound-movement-and-meaning_25-4-8-21-13" status = 301 [[redirects]] from = "/shop~25.4.8.21.13" to = "https://shop.aesthetic.computer/products/books_musical-gestures-sound-movement-and-meaning_25-4-8-21-13" status = 301 # Music [[redirects]] from = "/25.11.3.14.17" to = "https://shop.aesthetic.computer/products/music_baktok-7-inch_25-11-3-14-17" status = 301 [[redirects]] from = "/shop~25.11.3.14.17" to = "https://shop.aesthetic.computer/products/music_baktok-7-inch_25-11-3-14-17" status = 301 # 🖍️ Pictures [[redirects]] from = "/25.4.13.17.47" to = "https://shop.aesthetic.computer/products/pictures_25-4-13-17-47" status = 301 [[redirects]] from = "/shop~25.4.13.17.47" to = "https://shop.aesthetic.computer/products/pictures_25-4-13-17-47" status = 301 [[redirects]] from = "/25.4.13.19.06" to = "https://shop.aesthetic.computer/products/pictures_25-4-13-19-06" status = 301 [[redirects]] from = "/shop~25.4.13.19.06" to = "https://shop.aesthetic.computer/products/pictures_25-4-13-19-06" status = 301 [[redirects]] from = "/25.4.13.18.18" to = "https://shop.aesthetic.computer/products/pictures_25-4-13-18-18" status = 301 [[redirects]] from = "/shop~25.4.13.18.18" to = "https://shop.aesthetic.computer/products/pictures_25-4-13-18-18" status = 301 [[redirects]] from = "/25.4.13.19.24" to = "https://shop.aesthetic.computer/products/pictures_25-4-13-19-24" status = 301 [[redirects]] from = "/shop~25.4.13.19.24" to = "https://shop.aesthetic.computer/products/pictures_25-4-13-19-24" status = 301 [[redirects]] from = "/25.4.13.18.54" to = "https://shop.aesthetic.computer/products/pictures_25-4-13-18-54" status = 301 [[redirects]] from = "/shop~25.4.13.18.54" to = "https://shop.aesthetic.computer/products/pictures_25-4-13-18-54" status = 301 # 🚲 Bikes [[redirects]] from = "/25.12.4.10.09" to = "https://shop.aesthetic.computer/products/bikes_adult-bike_25-12-4-10-09" status = 301 [[redirects]] from = "/shop~25.12.4.10.09" to = "https://shop.aesthetic.computer/products/bikes_adult-bike_25-12-4-10-09" status = 301 [[redirects]] from = "/25.12.4.10.08" to = "https://shop.aesthetic.computer/products/bikes_kids-bike_25-12-4-10-08" status = 301 [[redirects]] from = "/shop~25.12.4.10.08" to = "https://shop.aesthetic.computer/products/bikes_kids-bike_25-12-4-10-08" status = 301 # 🛠️ Tools [[redirects]] from = "/25.12.4.11.21" to = "https://shop.aesthetic.computer/products/tools_i-welcome-new-experiences-every-single-day_25-12-4-11-21" status = 301 [[redirects]] from = "/shop~25.12.4.11.21" to = "https://shop.aesthetic.computer/products/tools_i-welcome-new-experiences-every-single-day_25-12-4-11-21" status = 301 [[redirects]] from = "/25.12.4.11.22" to = "https://shop.aesthetic.computer/products/tools_prompt-ac_25-12-4-11-22" status = 301 [[redirects]] from = "/shop~25.12.4.11.22" to = "https://shop.aesthetic.computer/products/tools_prompt-ac_25-12-4-11-22" status = 301 [[redirects]] from = "/25.12.4.11.23" to = "https://shop.aesthetic.computer/products/tools_my-songs_25-12-4-11-23" status = 301 [[redirects]] from = "/shop~25.12.4.11.23" to = "https://shop.aesthetic.computer/products/tools_my-songs_25-12-4-11-23" status = 301 [[redirects]] from = "/25.12.4.11.24" to = "https://shop.aesthetic.computer/products/tools_pretty-pictures_25-12-4-11-24" status = 301 [[redirects]] from = "/shop~25.12.4.11.24" to = "https://shop.aesthetic.computer/products/tools_pretty-pictures_25-12-4-11-24" status = 301 [[redirects]] from = "/25.12.4.11.25" to = "https://shop.aesthetic.computer/products/tools_play_25-12-4-11-25" status = 301 [[redirects]] from = "/shop~25.12.4.11.25" to = "https://shop.aesthetic.computer/products/tools_play_25-12-4-11-25" status = 301 # 👕 Shirts [[redirects]] from = "/26.1.3.0.02" to = "https://shop.aesthetic.computer/products/shirts_beige-abex-tee-m_26-1-3-0-02" status = 301 [[redirects]] from = "/shop~26.1.3.0.02" to = "https://shop.aesthetic.computer/products/shirts_beige-abex-tee-m_26-1-3-0-02" status = 301 [[redirects]] from = "/26.1.3.0.00" to = "https://shop.aesthetic.computer/products/shirts_coral-abex-tee-l_26-1-3-0-00" status = 301 [[redirects]] from = "/shop~26.1.3.0.00" to = "https://shop.aesthetic.computer/products/shirts_coral-abex-tee-l_26-1-3-0-00" status = 301 # END SHOP [[redirects]] from = "/api/bdf-glyph" to = "/.netlify/functions/bdf-glyph" status = 200 [[redirects]] from = "/disks/*" to = "/aesthetic.computer/disks/:splat" status = 200 [[redirects]] # Allow GIF files to be served statically from = "/*.gif" to = "/aesthetic.computer/:splat.gif" status = 200 force = false [[redirects]] # Allow WebP files to be served statically (animated mockups with transparency) from = "/*.webp" to = "/aesthetic.computer/:splat.webp" status = 200 force = false [[redirects]] # Serve .mjs files from the aesthetic.computer subdirectory from = "/*.mjs" to = "/aesthetic.computer/:splat.mjs" status = 200 force = false [[redirects]] # PJ mode - route /kidlisp.com/pj/* to pj.html (legacy) from = "/kidlisp.com/pj/*" to = "/kidlisp.com/pj.html" status = 200 force = false [[redirects]] # PJ mode - route /pj.kidlisp.com/* to pj.html (local dev mirroring production subdomain) from = "/pj.kidlisp.com/*" to = "/kidlisp.com/pj.html" status = 200 force = false [[redirects]] # Keeps - local dev mirroring production subdomain # Local dev: https://localhost:8888/keep.kidlisp.com/ from = "/keep.kidlisp.com/*" to = "/kidlisp.com/keeps.html" status = 200 force = false [[redirects]] from = "/keep.kidlisp.com" to = "/kidlisp.com/keeps.html" status = 200 force = false [[redirects]] # Buy - local dev mirroring production subdomain # Local dev: https://localhost:8888/buy.kidlisp.com/ from = "/buy.kidlisp.com/*" to = "/kidlisp.com/buy.html" status = 200 force = false [[redirects]] from = "/buy.kidlisp.com" to = "/kidlisp.com/buy.html" status = 200 force = false [[redirects]] # bills.aesthetic.computer - local dev mirroring production subdomain # Local dev: https://localhost:8888/bills.aesthetic.computer/ from = "/bills.aesthetic.computer" to = "/bills.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "/bills.aesthetic.computer/*" to = "/bills.aesthetic.computer/:splat" status = 200 force = false [[redirects]] # give.aesthetic.computer - local dev mirroring production subdomain # Local dev: https://localhost:8888/give.aesthetic.computer/ from = "/give.aesthetic.computer" to = "/give.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "/give.aesthetic.computer/da" to = "/give.aesthetic.computer/index.html?lang=da¤cy=dkk" status = 200 force = true [[redirects]] from = "/give.aesthetic.computer/es" to = "/give.aesthetic.computer/index.html?lang=es¤cy=usd" status = 200 force = true [[redirects]] from = "/give.aesthetic.computer/de" to = "/give.aesthetic.computer/index.html?lang=de¤cy=eur" status = 200 force = true [[redirects]] from = "/give.aesthetic.computer/cn" to = "/give.aesthetic.computer/index.html?lang=zh¤cy=usd" status = 200 force = true [[redirects]] from = "/give.aesthetic.computer/api/give-portal" to = "/.netlify/functions/give-portal" status = 200 force = true [[redirects]] from = "/give.aesthetic.computer/api/give" to = "/.netlify/functions/give" status = 200 force = true [[redirects]] from = "/give.aesthetic.computer/api/billing" to = "/.netlify/functions/billing" status = 200 force = true [[redirects]] from = "/give.aesthetic.computer/*" to = "/give.aesthetic.computer/:splat" status = 200 force = false [[redirects]] # PJ mode via kidlisp.com domain - kidlisp.com/pj/code (subdomain fallback) from = "https://kidlisp.com/pj/*" to = "/kidlisp.com/pj.html" status = 200 force = true [[redirects]] from = "https://www.kidlisp.com/pj/*" to = "/kidlisp.com/pj.html" status = 200 force = true [[redirects]] # SPA fallback for kidlisp.com routes - only for paths without file extensions # force = false ensures static files (js, css, etc.) are served directly from = "/kidlisp.com" to = "/kidlisp.com/index.html" status = 200 force = true [[redirects]] # Explicit editor entrypoint for local dev from = "/kidlisp.com/editor" to = "/kidlisp.com/index.html" status = 200 force = true [[redirects]] from = "/kidlisp.com/editor/*" to = "/kidlisp.com/index.html" status = 200 force = true [[redirects]] from = "/kidlisp.com/*" to = "/kidlisp.com/index.html" status = 200 force = false # DOLLHOUSE report page [[redirects]] from = "/dollhouse" to = "/dollhouse/index.html" status = 200 force = true # bills.aesthetic.computer subdomain [[redirects]] from = "https://bills.aesthetic.computer" to = "/bills.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "https://bills.aesthetic.computer/*" to = "/bills.aesthetic.computer/:splat" status = 200 force = true # papers.aesthetic.computer subdomain [[redirects]] from = "https://papers.aesthetic.computer" to = "/papers.aesthetic.computer/index.html" status = 200 force = true [[redirects]] from = "https://papers.aesthetic.computer/en" to = "/papers.aesthetic.computer/index.html?lang=en" status = 200 force = true [[redirects]] from = "https://papers.aesthetic.computer/da" to = "/papers.aesthetic.computer/index.html?lang=da" status = 200 force = true [[redirects]] from = "https://papers.aesthetic.computer/es" to = "/papers.aesthetic.computer/index.html?lang=es" status = 200 force = true [[redirects]] from = "https://papers.aesthetic.computer/cn" to = "/papers.aesthetic.computer/index.html?lang=zh" status = 200 force = true [[redirects]] from = "https://papers.aesthetic.computer/platter" to = "/papers.aesthetic.computer/platter.html" status = 200 force = true [[redirects]] from = "https://papers.aesthetic.computer/ac-repo-archaeology" to = "/papers.aesthetic.computer/ac-repo-archaeology.html" status = 200 force = true [[redirects]] from = "https://papers.aesthetic.computer/*" to = "/papers.aesthetic.computer/:splat" status = 200 force = true # papers.prompt.ac → papers.aesthetic.computer [[redirects]] from = "https://papers.prompt.ac" to = "https://papers.aesthetic.computer" status = 301 force = true [[redirects]] from = "https://papers.prompt.ac/*" to = "https://papers.aesthetic.computer/:splat" status = 301 force = true [[redirects]] from = "/api/machines" to = "/.netlify/functions/machines" status = 200 [[redirects]] from = "/api/machine-logs" to = "/.netlify/functions/machine-logs" status = 200 [[redirects]] from = "/*" to = "/.netlify/functions/index" status = 200 force = false [functions.fix-tezos-network-prod] # One-time function to fix production database - DELETE AFTER USE included_files = ["backend/**/*.mjs"] external_node_modules = ["mongodb", "mongodb-connection-string-url"] included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "ADMIN_SUB"]