Something went wrong. Try again.
Monorepo for Aesthetic.Computer aesthetic.computer
Something went wrong. Try again.
TOML
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608# DEPRECATED: Aesthetic Computer no longer deploys on Netlify. The production# host is the lith Express monolith at lith.aesthetic.computer (see CLAUDE.md).# This file is retained for historical reference only — do not add new routes# here. Backend handlers still live in system/netlify/functions/ (the path is# historical), and lith adapts them via app.all("/api/:fn", …) at runtime.
[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", "mongodb", "mongodb-connection-string-url", "got", "redis"]included_files = ["backend/**/*.mjs"]included_env_vars = ["GCP_EMAIL", "GCP_TTS_KEY_URL", "CONTEXT", "ART_ENDPOINT", "ART_KEY", "ART_SECRET", "ART_SPACE_NAME", "OPENAI_API_KEY", "ELEVENLABS_API_KEY", "PRUTTI_ELEVENLABS_VOICE_ID", "ADMIN_SUB", "AUTH0_M2M_CLIENT_ID", "AUTH0_M2M_SECRET", "MONGODB_CONNECTION_STRING", "MONGODB_NAME", "REDIS_CONNECTION_STRING"][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 playlistincluded_env_vars = [][functions.clock]# No special config needed for clockincluded_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 providersincluded_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 Stripeexternal_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 ACexternal_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 subscriptionsexternal_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 endpointexternal_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 APIexternal_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 toolexternal_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 bundlesexternal_node_modules = ["mongodb", "mongodb-connection-string-url"]included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME"]
[functions.bundle-telemetry-query]# Query collected bundle telemetryexternal_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 progressincluded_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 MongoDBincluded_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/downloadsincluded_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 MongoDBincluded_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 Keepsincluded_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.nom-scores]external_node_modules = ["mongodb", "mongodb-connection-string-url"]included_files = ["backend/**/*.mjs", "public/aesthetic.computer/lib/nom-score.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 neededincluded_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.pruttivox]# Speak a @prutti chat message in his consented voice clone (word-timed)external_node_modules = ["mongodb", "mongodb-connection-string-url"]included_files = ["backend/**/*.mjs"]included_env_vars = ["MONGODB_CONNECTION_STRING", "MONGODB_NAME", "ART_ENDPOINT", "ART_KEY", "ART_SECRET", "ELEVENLABS_API_KEY", "PRUTTI_ELEVENLABS_VOICE_ID"][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 = 8888targetPort = 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
# Mime — discussion on media[[redirects]]from = "/api/mime"to = "/.netlify/functions/mime"status = 200
[[redirects]]from = "/api/mimechan"to = "/.netlify/functions/mimechan"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 = 200force = true
# Proxy assets to S3 (DigitalOcean Spaces) - avoids uploading 13GB to Netlify[[redirects]]from = "/assets/*"to = "https://assets.aesthetic.computer/:splat"status = 200force = 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 = 200force = true[[redirects]]from = "https://sotce.net/aesthetic.computer/*"to = "/aesthetic.computer/:splat"status = 200force = true[[redirects]]from = "/redirect-proxy-sotce"to = "/.netlify/functions/redirect-proxy"status = 200[[redirects]]from = "https://sotce.net/user"to = "/.netlify/functions/user"status = 200force = true[[redirects]]from = "https://sotce.net/handle"to = "/.netlify/functions/handle"status = 200force = 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 = 200force = true[[redirects]]from = "/sotce-net/*"to = "/.netlify/functions/sotce-net/:splat"status = 200force = true[[redirects]]from = "/sotce.net/*"to = "/.netlify/functions/sotce-net/:splat"status = 200force = true[[redirects]]from = "https://whistlegraph.com/*"to = "https://trio.whistlegraph.com/:splat"status = 301force = true# jas.life - Jeffrey's CV/portfolio# Local dev: https://localhost:8888/jas.life/[[redirects]]from = "/jas.life"to = "/jas.life/"status = 200force = true[[redirects]]from = "/jas.life/*"to = "/jas.life/:splat"status = 200force = true[[redirects]]from = "https://jas.life/*"to = "/jas.life/:splat"status = 200force = true[[redirects]]from = "https://www.jas.life/*"to = "https://jas.life/:splat"status = 301force = true# digitpain.com - redirect to jas.life (deprecated)[[redirects]]from = "https://digitpain.com/*"to = "https://jas.life/:splat"status = 301force = true[[redirects]]from = "https://www.digitpain.com/*"to = "https://jas.life/:splat"status = 301force = 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 = 200force = true[[redirects]]from = "/rdp.jas.life"to = "/rdp.jas.life/"status = 200force = true[[redirects]]from = "/rdp.jas.life/*"to = "/rdp.jas.life/:splat"status = 200force = 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 = 200force = true[[redirects]]from = "https://justanothersystem.org/api/stretched-paintings/*"to = "/.netlify/functions/stretched-paintings/:splat"status = 200force = true[[redirects]]from = "https://www.justanothersystem.org/api/stretched-paintings"to = "/.netlify/functions/stretched-paintings"status = 200force = true[[redirects]]from = "https://www.justanothersystem.org/api/stretched-paintings/*"to = "/.netlify/functions/stretched-paintings/:splat"status = 200force = true# JAS Tags API[[redirects]]from = "https://justanothersystem.org/api/tags"to = "/.netlify/functions/jas-tags"status = 200force = true[[redirects]]from = "https://justanothersystem.org/api/tags/*"to = "/.netlify/functions/jas-tags/:splat"status = 200force = true[[redirects]]from = "https://justanothersystem.org/api/jas-tags"to = "/.netlify/functions/jas-tags"status = 200force = true[[redirects]]from = "https://justanothersystem.org/api/jas-tags/*"to = "/.netlify/functions/jas-tags/:splat"status = 200force = true[[redirects]]from = "https://www.justanothersystem.org/api/tags"to = "/.netlify/functions/jas-tags"status = 200force = true[[redirects]]from = "https://www.justanothersystem.org/api/tags/*"to = "/.netlify/functions/jas-tags/:splat"status = 200force = true[[redirects]]from = "https://www.justanothersystem.org/api/jas-tags"to = "/.netlify/functions/jas-tags"status = 200force = true[[redirects]]from = "https://www.justanothersystem.org/api/jas-tags/*"to = "/.netlify/functions/jas-tags/:splat"status = 200force = true# Static content routes[[redirects]]from = "https://justanothersystem.org"to = "/justanothersystem.org/index.html"status = 200force = true[[redirects]]from = "https://justanothersystem.org/cv"to = "/justanothersystem.org/cv.html"status = 200force = true[[redirects]]from = "https://justanothersystem.org/bio"to = "https://justanothersystem.org/cv"status = 301force = true[[redirects]]from = "https://justanothersystem.org/*"to = "/justanothersystem.org/:splat"status = 200force = true[[redirects]]from = "https://www.justanothersystem.org"to = "https://justanothersystem.org"status = 301force = true[[redirects]]from = "https://www.justanothersystem.org/*"to = "https://justanothersystem.org/:splat"status = 301force = true
[[redirects]]from = "https://builds.false.work/api/register-build"to = "/.netlify/functions/register-build"status = 200force = true[[redirects]]from = "https://builds.false.work/api/get-builds"to = "/.netlify/functions/get-builds"status = 200force = true[[redirects]]from = "https://builds.false.work/api/verify-password"to = "/.netlify/functions/verify-builds-password"status = 200force = true[[redirects]]from = "https://builds.false.work/*"to = "/builds.false.work/:splat"status = 200force = true
# false.work naked domain - landing page[[redirects]]from = "https://www.false.work"to = "https://false.work"status = 301force = true[[redirects]]from = "https://www.false.work/*"to = "https://false.work/:splat"status = 301force = true[[redirects]]from = "https://false.work"to = "/false.work/index.html"status = 200force = true[[redirects]]from = "https://false.work/*"to = "/false.work/:splat"status = 200force = 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 = 200force = true[[redirects]]from = "/.well-known/apple-developer-merchantid-domain-association"to = "/.netlify/functions/apple-developer-merchantid-domain-association"status = 200force = true[[redirects]]from = "/slash"to = "/.netlify/functions/slash"status = 200force = true[[redirects]]from = "https://www.4esthetic.com/*"to = "https://aesthetic.computer/:splat"status = 301force = true[[redirects]]from = "https://4esthetic.com/*"to = "https://aesthetic.computer/:splat"status = 301force = true[[redirects]]from = "https://wand.ac"to = "https://aesthetic.computer/wand"status = 301force = true[[redirects]]from = "https://edit.ac"to = "https://vscode.dev/github/digitpain/aesthetic.computer-code/blob/main/blank.mjs"status = 301force = true[[redirects]]from = "https://m2w2.whistlegraph.com"to = "https://aesthetic.computer/wg~m2w2"status = 200force = false[[redirects]]from = "https://wipppps.world"to = "https://aesthetic.computer/wipppps"status = 200force = true[[redirects]]from = "https://www.wipppps.world"to = "https://wipppps.world"status = 301force = true
[[redirects]]from = "https://www.sundarakarma.com"to = "https://aesthetic.computer/sundarakarma.com"status = 200force = true[[redirects]]from = "https://www.sundarakarma.com/oscar"to = "https://aesthetic.computer/sundarakarma.com/oscar.html"status = 200force = true[[redirects]]from = "https://sundarakarma.com"to = "https://aesthetic.computer/sundarakarma.com"status = 200force = true[[redirects]]from = "https://sundarakarma.com/oscar"to = "https://aesthetic.computer/sundarakarma.com/oscar.html"status = 200force = true[[redirects]]from = "https://pals.aesthetic.computer/*"to = "https://aesthetic.computer/api/logo/:splat"status = 200force = true[[redirects]]from = "https://prompt.ac/ejjk1z"to = "https://duckweedtri.prompt.ac"status = 301force = true[[redirects]]from = "https://prompt.ac/*"to = "https://aesthetic.computer/:splat"status = 301force = true[[redirects]]from = "https://l5.prompt.ac"to = "https://l5.aesthetic.computer"status = 301force = true[[redirects]]from = "https://l5.prompt.ac/*"to = "https://l5.aesthetic.computer/:splat"status = 301force = true[[redirects]]from = "https://processing.prompt.ac"to = "https://processing.aesthetic.computer"status = 301force = true[[redirects]]from = "https://processing.prompt.ac/*"to = "https://processing.aesthetic.computer/:splat"status = 301force = true[[redirects]]from = "https://p5.prompt.ac"to = "https://p5.aesthetic.computer"status = 301force = true[[redirects]]from = "https://p5.prompt.ac/*"to = "https://p5.aesthetic.computer/:splat"status = 301force = true[[redirects]]from = "/processing.prompt.ac"to = "/processing.aesthetic.computer"status = 301force = true[[redirects]]from = "/processing.prompt.ac/*"to = "/processing.aesthetic.computer/:splat"status = 301force = true[[redirects]]from = "/p5.prompt.ac"to = "/p5.aesthetic.computer"status = 301force = true[[redirects]]from = "/p5.prompt.ac/*"to = "/p5.aesthetic.computer/:splat"status = 301force = true# sitemap.prompt.ac → sitemap.aesthetic.computer[[redirects]]from = "https://sitemap.prompt.ac"to = "https://sitemap.aesthetic.computer"status = 301force = true[[redirects]]from = "https://sitemap.prompt.ac/*"to = "https://sitemap.aesthetic.computer/:splat"status = 301force = true# api.prompt.ac → api.aesthetic.computer[[redirects]]from = "https://api.prompt.ac"to = "https://api.aesthetic.computer"status = 301force = true[[redirects]]from = "https://api.prompt.ac/*"to = "https://api.aesthetic.computer/:splat"status = 301force = true[[redirects]]from = "https://l5.aesthetic.computer"to = "/l5.aesthetic.computer/index.html"status = 200force = true[[redirects]]from = "https://l5.aesthetic.computer/docs.json"to = "/docs.json"status = 200force = true[[redirects]]from = "https://l5.aesthetic.computer/docs/*"to = "/docs/:splat"status = 200force = true[[redirects]]from = "https://l5.aesthetic.computer/l5.aesthetic.computer/*"to = "/l5.aesthetic.computer/:splat"status = 200force = true[[redirects]]from = "https://l5.aesthetic.computer/aesthetic.computer/*"to = "/aesthetic.computer/:splat"status = 200force = true[[redirects]]from = "https://l5.aesthetic.computer/*"to = "/l5.aesthetic.computer/index.html"status = 200force = true[[redirects]]from = "https://processing.aesthetic.computer"to = "/processing.aesthetic.computer/index.html"status = 200force = true[[redirects]]from = "https://processing.aesthetic.computer/docs.json"to = "/docs.json"status = 200force = true[[redirects]]from = "https://processing.aesthetic.computer/docs/*"to = "/docs/:splat"status = 200force = true[[redirects]]from = "https://processing.aesthetic.computer/processing.aesthetic.computer/*"to = "/processing.aesthetic.computer/:splat"status = 200force = true[[redirects]]from = "https://processing.aesthetic.computer/aesthetic.computer/*"to = "/aesthetic.computer/:splat"status = 200force = true[[redirects]]from = "https://processing.aesthetic.computer/*"to = "/processing.aesthetic.computer/index.html"status = 200force = true[[redirects]]from = "https://p5.aesthetic.computer"to = "/processing.aesthetic.computer/index.html"status = 200force = true[[redirects]]from = "https://p5.aesthetic.computer/docs.json"to = "/docs.json"status = 200force = true[[redirects]]from = "https://p5.aesthetic.computer/docs/*"to = "/docs/:splat"status = 200force = true[[redirects]]from = "https://p5.aesthetic.computer/processing.aesthetic.computer/*"to = "/processing.aesthetic.computer/:splat"status = 200force = true[[redirects]]from = "https://p5.aesthetic.computer/aesthetic.computer/*"to = "/aesthetic.computer/:splat"status = 200force = true[[redirects]]from = "https://p5.aesthetic.computer/*"to = "/processing.aesthetic.computer/index.html"status = 200force = true[[redirects]]from = "/processing.aesthetic.computer"to = "/processing.aesthetic.computer/index.html"status = 200force = true[[redirects]]from = "/processing.aesthetic.computer/docs.json"to = "/docs.json"status = 200force = true[[redirects]]from = "/processing.aesthetic.computer/docs/*"to = "/docs/:splat"status = 200force = true[[redirects]]from = "/processing.aesthetic.computer/processing.aesthetic.computer/*"to = "/processing.aesthetic.computer/:splat"status = 200force = true[[redirects]]from = "/processing.aesthetic.computer/*"to = "/processing.aesthetic.computer/index.html"status = 200force = false[[redirects]]from = "/p5.aesthetic.computer"to = "/processing.aesthetic.computer/index.html"status = 200force = true[[redirects]]from = "/p5.aesthetic.computer/docs.json"to = "/docs.json"status = 200force = true[[redirects]]from = "/p5.aesthetic.computer/docs/*"to = "/docs/:splat"status = 200force = true[[redirects]]from = "/p5.aesthetic.computer/processing.aesthetic.computer/*"to = "/processing.aesthetic.computer/:splat"status = 200force = true[[redirects]]from = "/p5.aesthetic.computer/*"to = "/processing.aesthetic.computer/index.html"status = 200force = 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 = 200force = true[[redirects]]from = "https://sitemap.aesthetic.computer/*"to = "/sitemap.html"status = 200force = true
[[redirects]]from = "/sitemap"to = "/sitemap.html"status = 200[[redirects]]from = "/l5"to = "/l5.aesthetic.computer/index.html"status = 200force = true[[redirects]]from = "/l5/*"to = "/l5.aesthetic.computer/index.html"status = 200force = true[[redirects]]from = "/L5"to = "/l5.aesthetic.computer/index.html"status = 200force = true[[redirects]]from = "/L5/*"to = "/l5.aesthetic.computer/index.html"status = 200force = true[[redirects]]from = "/processing"to = "/processing.aesthetic.computer/index.html"status = 200force = true[[redirects]]from = "/processing/*"to = "/processing.aesthetic.computer/index.html"status = 200force = true[[redirects]]from = "/Processing"to = "/processing.aesthetic.computer/index.html"status = 200force = true[[redirects]]from = "/Processing/*"to = "/processing.aesthetic.computer/index.html"status = 200force = true[[redirects]]from = "/p5"to = "/processing.aesthetic.computer/index.html"status = 200force = true[[redirects]]from = "/p5/*"to = "/processing.aesthetic.computer/index.html"status = 200force = true[[redirects]]from = "/P5"to = "/processing.aesthetic.computer/index.html"status = 200force = true[[redirects]]from = "/P5/*"to = "/processing.aesthetic.computer/index.html"status = 200force = 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 = 200force = 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 = 200force = true[[redirects]]from = "https://give.aesthetic.computer/es"to = "/give.aesthetic.computer/index.html?lang=es¤cy=usd"status = 200force = true[[redirects]]from = "https://give.aesthetic.computer/de"to = "/give.aesthetic.computer/index.html?lang=de¤cy=eur"status = 200force = true[[redirects]]from = "https://give.aesthetic.computer/cn"to = "/give.aesthetic.computer/index.html?lang=zh¤cy=usd"status = 200force = true[[redirects]]from = "https://give.aesthetic.computer/api/give-portal"to = "/.netlify/functions/give-portal"status = 200force = true[[redirects]]from = "https://give.aesthetic.computer/api/give"to = "/.netlify/functions/give"status = 200force = true[[redirects]]from = "https://give.aesthetic.computer/api/billing"to = "/.netlify/functions/billing"status = 200force = true[[redirects]]from = "https://give.aesthetic.computer"to = "/give.aesthetic.computer/index.html"status = 200force = true[[redirects]]from = "https://give.aesthetic.computer/*"to = "/give.aesthetic.computer/:splat"status = 200force = 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 = 200force = true[[redirects]]from = "https://www.notepat.com"to = "https://aesthetic.computer/notepat"status = 200force = true[[redirects]]from = "https://www.notepat.com/*"to = "https://aesthetic.computer/:splat"status = 200force = true[[redirects]]from = "https://notepat.com/*"to = "https://aesthetic.computer/:splat"status = 200force = true
[[redirects]]from = "https://kidlisp.com"to = "https://aesthetic.computer/kidlisp.com/"status = 200force = true# API routes - kidlisp.com/api/*[[redirects]]from = "https://kidlisp.com/api/ff1/*"to = "https://aesthetic.computer/api/ff1/:splat"status = 200force = true[[redirects]]from = "https://kidlisp.com/api/*"to = "https://aesthetic.computer/api/:splat"status = 200force = true# Keeps → subdomain redirect[[redirects]]from = "https://kidlisp.com/keeps"to = "https://keep.kidlisp.com/"status = 301force = true# Learn / reference page[[redirects]]from = "https://kidlisp.com/learn"to = "/kidlisp.com/learn.html"status = 200force = true# Proxy aesthetic.computer assets (split.js, etc.) through kidlisp.com[[redirects]]from = "https://kidlisp.com/aesthetic.computer/*"to = "/aesthetic.computer/:splat"status = 200force = true[[redirects]]from = "https://kidlisp.com/*"to = "https://aesthetic.computer/kidlisp.com/:splat"status = 200force = true[[redirects]]from = "https://www.kidlisp.com"to = "https://aesthetic.computer/kidlisp.com/"status = 200force = true# API routes - www.kidlisp.com/api/*[[redirects]]from = "https://www.kidlisp.com/api/ff1/*"to = "https://aesthetic.computer/api/ff1/:splat"status = 200force = true[[redirects]]from = "https://www.kidlisp.com/api/*"to = "https://aesthetic.computer/api/:splat"status = 200force = true# Keeps → subdomain redirect[[redirects]]from = "https://www.kidlisp.com/keeps"to = "https://keep.kidlisp.com/"status = 301force = true# Learn / reference page[[redirects]]from = "https://www.kidlisp.com/learn"to = "/kidlisp.com/learn.html"status = 200force = true# Proxy aesthetic.computer assets through www.kidlisp.com[[redirects]]from = "https://www.kidlisp.com/aesthetic.computer/*"to = "/aesthetic.computer/:splat"status = 200force = true[[redirects]]from = "https://www.kidlisp.com/*"to = "https://aesthetic.computer/kidlisp.com/:splat"status = 200force = true
# learn.kidlisp.com subdomain[[redirects]]from = "https://learn.kidlisp.com"to = "/kidlisp.com/learn.html"status = 200force = true[[redirects]]from = "https://learn.kidlisp.com/api/*"to = "/api/:splat"status = 200force = true[[redirects]]from = "https://learn.kidlisp.com/decree"to = "/kidlisp.com/decree.html"status = 200force = true[[redirects]]from = "https://learn.kidlisp.com/decree/26"to = "/kidlisp.com/decree.html"status = 200force = true[[redirects]]from = "https://learn.kidlisp.com/*"to = "/kidlisp.com/learn.html"status = 200force = true
# Legacy keeps.kidlisp.com → keep.kidlisp.com redirect[[redirects]]from = "https://keeps.kidlisp.com/*"to = "https://keep.kidlisp.com/:splat"status = 301force = true[[redirects]]from = "https://keeps.kidlisp.com"to = "https://keep.kidlisp.com/"status = 301force = true
# keep.kidlisp.com subdomain[[redirects]]from = "https://keep.kidlisp.com"to = "/kidlisp.com/keeps.html"status = 200force = true[[redirects]]from = "https://keep.kidlisp.com/api/*"to = "/api/:splat"status = 200force = true[[redirects]]from = "https://keep.kidlisp.com/technology"to = "/kidlisp.com/keeps-tech.html"status = 200force = true[[redirects]]from = "https://keep.kidlisp.com/wallet"to = "/kidlisp.com/wallet/index.html"status = 200force = true[[redirects]]from = "https://keep.kidlisp.com/*"to = "/kidlisp.com/keeps.html"status = 200force = true
# buy.kidlisp.com subdomain — direct purchase page[[redirects]]from = "https://buy.kidlisp.com"to = "/kidlisp.com/buy.html"status = 200force = true[[redirects]]from = "https://buy.kidlisp.com/*"to = "/kidlisp.com/buy.html"status = 200force = true
# PJ subdomain for kidlisp.com - pj.kidlisp.com/code (Piece Jockey)[[redirects]]from = "https://pj.kidlisp.com"to = "/kidlisp.com/pj.html"status = 200force = true[[redirects]]from = "https://pj.kidlisp.com/*"to = "/kidlisp.com/pj.html"status = 200force = 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 = 200force = true# FF1 API routes - device.kidlisp.com/api/ff1/*[[redirects]]from = "https://device.kidlisp.com/api/ff1/*"to = "/api/ff1/:splat"status = 200force = true[[redirects]]from = "https://device.kidlisp.com/qr/*"to = "/kidlisp.com/qr.html?token=:splat"status = 200force = true# Serve static JS assets for device subdomain[[redirects]]from = "https://device.kidlisp.com/js/*"to = "/kidlisp.com/js/:splat"status = 200force = true[[redirects]]from = "https://device.kidlisp.com/*"to = "/kidlisp.com/device.html"status = 200force = 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 = 200force = true[[redirects]]from = "https://top.kidlisp.com"to = "/.netlify/functions/index/top.kidlisp.com"status = 200force = true[[redirects]]from = "https://top.kidlisp.com/*"to = "/.netlify/functions/index/top.kidlisp.com/:splat"status = 200force = 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 = 200force = 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 = 200force = true[[redirects]]from = "https://calm.kidlisp.com/*"to = "/.netlify/functions/index/calm.kidlisp.com/:splat"status = 200force = true
[[redirects]]from = "https://news.aesthetic.computer"to = "/.netlify/functions/news"status = 200force = true[[redirects]]from = "https://news.aesthetic.computer/"to = "/.netlify/functions/news"status = 200force = 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 = 200force = true[[redirects]]from = "https://news.aesthetic.computer/*"to = "/.netlify/functions/news/:splat"status = 200force = true
[[redirects]]from = "/news.aesthetic.computer"to = "/.netlify/functions/news"status = 200force = true[[redirects]]from = "/news.aesthetic.computer/"to = "/.netlify/functions/news"status = 200force = true# api.aesthetic.computer subdomain[[redirects]]from = "https://api.aesthetic.computer"to = "/.netlify/functions/api-docs"status = 200force = true[[redirects]]from = "https://api.aesthetic.computer/*"to = "/api/:splat"status = 200force = 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 = 200force = 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/nom-scores"to = "/.netlify/functions/nom-scores"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/pruttivox"to = "/.netlify/functions/pruttivox"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 = 200force = false[[redirects]]from = "/api/track-tape"to = "/.netlify/functions/track-media"status = 200force = false[[redirects]]from = "/api/tape-convert-background"to = "/.netlify/functions/tape-convert-background"status = 200force = false[[redirects]]from = "/api/get-tape"to = "/.netlify/functions/get-tape"status = 200force = false[[redirects]]from = "/api/get-tape-status"to = "/.netlify/functions/get-tape-status"status = 200force = false[[redirects]]from = "/api/oven-complete"to = "/.netlify/functions/oven-complete"status = 200force = false[[redirects]]from = "/api/painting-code"to = "/.netlify/functions/painting-code"status = 200force = false[[redirects]]from = "/api/painting-metadata"to = "/.netlify/functions/painting-metadata"status = 200force = 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/pieces-search"to = "/.netlify/functions/pieces-search"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 = 200force = true[[redirects]]from = "/presigned-upload-url/*"to = "/.netlify/functions/presigned-url"status = 200force = true[[redirects]]from = "/presigned-download-url/*"to = "/.netlify/functions/presigned-url"status = 200force = 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/flux"to = "/.netlify/functions/flux"status = 200[[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 = 200force = true[[redirects]]from = "https://sotce.local:8888/*"to = "/.netlify/functions/sotce-net"status = 200force = 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/1-hour-of-remote-help-from-jeffrey"status = 301[[redirects]]from = "/shop~help"to = "https://shop.aesthetic.computer/products/1-hour-of-remote-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# 💻 Laptops[[redirects]]from = "/26.4.17.12.51"to = "https://shop.aesthetic.computer/products/laptops_ac-native-laptop_26-4-17-12-51"status = 301[[redirects]]from = "/shop~26.4.17.12.51"to = "https://shop.aesthetic.computer/products/laptops_ac-native-laptop_26-4-17-12-51"status = 301# Convenience alias: "shop blank" → AC Native Laptop. (Bare /blank stays the piece route.)[[redirects]]from = "/shop~blank"to = "https://shop.aesthetic.computer/products/laptops_ac-native-laptop_26-4-17-12-51"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 staticallyfrom = "/*.gif"to = "/aesthetic.computer/:splat.gif"status = 200force = false[[redirects]]# Allow WebP files to be served statically (animated mockups with transparency)from = "/*.webp"to = "/aesthetic.computer/:splat.webp"status = 200force = false[[redirects]]# Serve .mjs files from the aesthetic.computer subdirectoryfrom = "/*.mjs"to = "/aesthetic.computer/:splat.mjs"status = 200force = false[[redirects]]# PJ mode - route /kidlisp.com/pj/* to pj.html (legacy)from = "/kidlisp.com/pj/*"to = "/kidlisp.com/pj.html"status = 200force = 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 = 200force = 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 = 200force = false[[redirects]]from = "/keep.kidlisp.com"to = "/kidlisp.com/keeps.html"status = 200force = 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 = 200force = false[[redirects]]from = "/buy.kidlisp.com"to = "/kidlisp.com/buy.html"status = 200force = 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 = 200force = true[[redirects]]from = "/bills.aesthetic.computer/*"to = "/bills.aesthetic.computer/:splat"status = 200force = 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 = 200force = true[[redirects]]from = "/give.aesthetic.computer/da"to = "/give.aesthetic.computer/index.html?lang=da¤cy=dkk"status = 200force = true[[redirects]]from = "/give.aesthetic.computer/es"to = "/give.aesthetic.computer/index.html?lang=es¤cy=usd"status = 200force = true[[redirects]]from = "/give.aesthetic.computer/de"to = "/give.aesthetic.computer/index.html?lang=de¤cy=eur"status = 200force = true[[redirects]]from = "/give.aesthetic.computer/cn"to = "/give.aesthetic.computer/index.html?lang=zh¤cy=usd"status = 200force = true[[redirects]]from = "/give.aesthetic.computer/api/give-portal"to = "/.netlify/functions/give-portal"status = 200force = true[[redirects]]from = "/give.aesthetic.computer/api/give"to = "/.netlify/functions/give"status = 200force = true[[redirects]]from = "/give.aesthetic.computer/api/billing"to = "/.netlify/functions/billing"status = 200force = true[[redirects]]from = "/give.aesthetic.computer/*"to = "/give.aesthetic.computer/:splat"status = 200force = 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 = 200force = true[[redirects]]from = "https://www.kidlisp.com/pj/*"to = "/kidlisp.com/pj.html"status = 200force = true[[redirects]]# SPA fallback for kidlisp.com routes - only for paths without file extensions# force = false ensures static files (js, css, etc.) are served directlyfrom = "/kidlisp.com"to = "/kidlisp.com/index.html"status = 200force = true[[redirects]]# Explicit editor entrypoint for local devfrom = "/kidlisp.com/editor"to = "/kidlisp.com/index.html"status = 200force = true[[redirects]]from = "/kidlisp.com/editor/*"to = "/kidlisp.com/index.html"status = 200force = true[[redirects]]from = "/kidlisp.com/*"to = "/kidlisp.com/index.html"status = 200force = false# DOLLHOUSE report page[[redirects]]from = "/dollhouse"to = "/dollhouse/index.html"status = 200force = true# bills.aesthetic.computer subdomain[[redirects]]from = "https://bills.aesthetic.computer"to = "/bills.aesthetic.computer/index.html"status = 200force = true[[redirects]]from = "https://bills.aesthetic.computer/*"to = "/bills.aesthetic.computer/:splat"status = 200force = true# papers.aesthetic.computer subdomain[[redirects]]from = "https://papers.aesthetic.computer"to = "/papers.aesthetic.computer/index.html"status = 200force = true[[redirects]]from = "https://papers.aesthetic.computer/en"to = "/papers.aesthetic.computer/index.html?lang=en"status = 200force = true[[redirects]]from = "https://papers.aesthetic.computer/da"to = "/papers.aesthetic.computer/index.html?lang=da"status = 200force = true[[redirects]]from = "https://papers.aesthetic.computer/es"to = "/papers.aesthetic.computer/index.html?lang=es"status = 200force = true[[redirects]]from = "https://papers.aesthetic.computer/cn"to = "/papers.aesthetic.computer/index.html?lang=zh"status = 200force = true[[redirects]]from = "https://papers.aesthetic.computer/platter"to = "/papers.aesthetic.computer/platter.html"status = 200force = true[[redirects]]from = "https://papers.aesthetic.computer/ac-repo-archaeology"to = "/papers.aesthetic.computer/ac-repo-archaeology.html"status = 200force = true[[redirects]]from = "https://papers.aesthetic.computer/*"to = "/papers.aesthetic.computer/:splat"status = 200force = true# papers.prompt.ac → papers.aesthetic.computer[[redirects]]from = "https://papers.prompt.ac"to = "https://papers.aesthetic.computer"status = 301force = true[[redirects]]from = "https://papers.prompt.ac/*"to = "https://papers.aesthetic.computer/:splat"status = 301force = 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 = 200force = false[functions.fix-tezos-network-prod]# One-time function to fix production database - DELETE AFTER USEincluded_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"]