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