Something went wrong. Try again.
Monorepo for Aesthetic.Computer aesthetic.computer
Something went wrong. Try again.
TOML
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579# 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"]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 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.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.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
# 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/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 = 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"]