Monorepo for Aesthetic.Computer aesthetic.computer

Fix lith try-page routing and mobile layout

+73 -150
+7 -7
at/scripts/cloudflare-dns.mjs
··· 254 254 } 255 255 256 256 /** 257 - * Create or update a CNAME record (for Netlify subdomains) 258 - * 259 - * @param {string} subdomain - Subdomain name (e.g., "bills" for bills.aesthetic.computer) 260 - * @param {string} target - CNAME target (default: Netlify's load balancer) 257 + * Create or update a CNAME record. 258 + * 259 + * @param {string} subdomain - Subdomain name (e.g., "bills" for bills.aesthetic.computer) 260 + * @param {string} target - CNAME target (default: lith frontend host) 261 261 * @param {string} rootDomain - Root domain (default: "aesthetic.computer") 262 262 * @param {boolean} proxied - Whether to proxy through Cloudflare (default: true) 263 263 * @param {boolean} dryRun - If true, only check what would be done 264 264 * @returns {Promise<Object>} Result object with status and details 265 265 */ 266 - export async function createOrUpdateCNAME(subdomain, target = 'aesthetic-computer.netlify.app', rootDomain = 'aesthetic.computer', proxied = true, dryRun = false) { 266 + export async function createOrUpdateCNAME(subdomain, target = 'lith.aesthetic.computer', rootDomain = 'aesthetic.computer', proxied = true, dryRun = false) { 267 267 const recordName = `${subdomain}.${rootDomain}`; 268 268 269 269 try { ··· 375 375 case 'add-subdomain': 376 376 case 'add-cname': { 377 377 const subdomain = args[0]; 378 - const target = args[1] || 'aesthetic-computer.netlify.app'; 378 + const target = args[1] || 'lith.aesthetic.computer'; 379 379 if (!subdomain) { 380 380 console.error('Usage: node cloudflare-dns.mjs add-subdomain <subdomain> [target]'); 381 381 console.error('Example: node cloudflare-dns.mjs add-subdomain bills'); ··· 401 401 console.log('Cloudflare DNS Management'); 402 402 console.log(''); 403 403 console.log('Commands:'); 404 - console.log(' add-subdomain <name> [target] Add a CNAME for a Netlify subdomain'); 404 + console.log(' add-subdomain <name> [target] Add a proxied CNAME (defaults to lith.aesthetic.computer)'); 405 405 console.log(' list [type] List all DNS records (optionally filter by type)'); 406 406 console.log(''); 407 407 console.log('Examples:');
+20
lith/Caddyfile
··· 308 308 redir https://api.aesthetic.computer{uri} 301 309 309 } 310 310 311 + # --- legacy duckweedtri hosts --- 312 + @duckweedaesthetic host duckweedtri.aesthetic.computer 313 + handle @duckweedaesthetic { 314 + redir https://aesthetic.computer{uri} 301 315 + } 316 + 317 + @duckweedprompt host duckweedtri.prompt.ac 318 + handle @duckweedprompt { 319 + redir https://aesthetic.computer{uri} 301 320 + } 321 + 311 322 # --- prompt.ac → aesthetic.computer (301 redirect) --- 312 323 @promptac host prompt.ac 313 324 handle @promptac { 314 325 redir https://aesthetic.computer{uri} 301 326 + } 327 + 328 + @tryshared { 329 + host l5.aesthetic.computer processing.aesthetic.computer 330 + path /aesthetic.computer/* 331 + } 332 + handle @tryshared { 333 + root * /opt/ac/system/public 334 + file_server 315 335 } 316 336 317 337 # --- l5.aesthetic.computer ---
+21 -127
lith/DNS.md
··· 1 - # Cloudflare DNS Records — Migration Reference 2 - # Exported 2026-03-28 3 - 4 - ## Records Pointing to Netlify (aesthetic-computer.netlify.app or 75.2.60.5) 5 - 6 - These are what need to change when migrating to the new DO droplet. 7 - 8 - ### aesthetic.computer (zone: da794a6ae8f17b80424907f81ed0db7c) 9 - | Type | Name | Target | Proxy | 10 - |-------|-----------------------------------|-------------------------------------|-------| 11 - | A | aesthetic.computer | 75.2.60.5 | proxied | 12 - | CNAME | api.aesthetic.computer | aesthetic-computer.netlify.app | proxied | 13 - | CNAME | bills.aesthetic.computer | aesthetic-computer.netlify.app | proxied | 14 - | CNAME | give.aesthetic.computer | aesthetic-computer.netlify.app | proxied | 15 - | CNAME | keeps.aesthetic.computer | aesthetic-computer.netlify.app | proxied | 16 - | CNAME | l5.aesthetic.computer | aesthetic-computer.netlify.app | proxied | 17 - | CNAME | news.aesthetic.computer | aesthetic-computer.netlify.app | proxied | 18 - | CNAME | p5.aesthetic.computer | aesthetic-computer.netlify.app | proxied | 19 - | CNAME | pals.aesthetic.computer | aesthetic-computer.netlify.app | proxied | 20 - | CNAME | papers.aesthetic.computer | aesthetic-computer.netlify.app | proxied | 21 - | CNAME | processing.aesthetic.computer | aesthetic-computer.netlify.app | proxied | 22 - | CNAME | sitemap.aesthetic.computer | aesthetic-computer.netlify.app | proxied | 23 - | CNAME | www.aesthetic.computer | aesthetic-computer.netlify.app | proxied | 24 - 25 - ### false.work (zone: 0fa28e0097b24e187f41fea0ec036c0d) 26 - | Type | Name | Target | Proxy | 27 - |-------|-----------------------------------|-------------------------------------|-------| 28 - | CNAME | builds.false.work | aesthetic-computer.netlify.app | proxied | 29 - 30 - ### justanothersystem.org (zone: a3366b124c7ca95fe902a54f868dcc51) 31 - | Type | Name | Target | Proxy | 32 - |-------|-----------------------------------|-------------------------------------|-------| 33 - | A | justanothersystem.org | 75.2.60.5 | DNS-only | 34 - | CNAME | www.justanothersystem.org | aesthetic-computer.netlify.app | DNS-only | 35 - 36 - ### kidlisp.com (zone: bac7b811ac7b4df664b696fafa9e6207) 37 - | Type | Name | Target | Proxy | 38 - |-------|-----------------------------------|-------------------------------------|-------| 39 - | A | kidlisp.com | 75.2.60.5 | proxied | 40 - | A | www.kidlisp.com | 75.2.60.5 | proxied | 41 - | CNAME | buy.kidlisp.com | aesthetic-computer.netlify.app | proxied | 42 - | CNAME | calm.kidlisp.com | aesthetic-computer.netlify.app | proxied | 43 - | CNAME | device.kidlisp.com | aesthetic-computer.netlify.app | proxied | 44 - | CNAME | keep.kidlisp.com | aesthetic-computer.netlify.app | proxied | 45 - | CNAME | keeps.kidlisp.com | aesthetic-computer.netlify.app | proxied | 46 - | CNAME | learn.kidlisp.com | aesthetic-computer.netlify.app | proxied | 47 - | CNAME | pj.kidlisp.com | aesthetic-computer.netlify.app | proxied | 48 - | CNAME | top.kidlisp.com | aesthetic-computer.netlify.app | proxied | 49 - 50 - ### notepat.com (zone: 8d289a1e56563dbcc9bc88747428c8ee) 51 - | Type | Name | Target | Proxy | 52 - |-------|-----------------------------------|-------------------------------------|-------| 53 - | A | notepat.com | 75.2.60.5 | proxied | 54 - | CNAME | www.notepat.com | aesthetic-computer.netlify.app | proxied | 55 - 56 - ### prompt.ac (zone: 1f93ca86e2d9de0def0acb0b8c4e722b) 57 - | Type | Name | Target | Proxy | 58 - |-------|-----------------------------------|-------------------------------------|-------| 59 - | A | prompt.ac | 75.2.60.5 | proxied | 60 - | CNAME | api.prompt.ac | aesthetic-computer.netlify.app | proxied | 61 - | CNAME | l5.prompt.ac | aesthetic-computer.netlify.app | proxied | 62 - | CNAME | p5.prompt.ac | aesthetic-computer.netlify.app | proxied | 63 - | CNAME | papers.prompt.ac | aesthetic-computer.netlify.app | proxied | 64 - | CNAME | processing.prompt.ac | aesthetic-computer.netlify.app | proxied | 65 - | CNAME | sitemap.prompt.ac | aesthetic-computer.netlify.app | proxied | 66 - 67 - ### sotce.net (zone: 1f56f8b5fd7b3db92d31bad0714a518f) 68 - | Type | Name | Target | Proxy | 69 - |-------|-----------------------------------|-------------------------------------|-------| 70 - | A | sotce.net | 75.2.60.5 | proxied | 71 - | A | www.sotce.net | 75.2.60.5 | proxied | 72 - 73 - --- 74 - 75 - ## Records NOT Pointing to Netlify (keep as-is) 1 + # Cloudflare DNS Status 76 2 77 - ### aesthetic.computer — DigitalOcean droplets 78 - - A at.aesthetic.computer → 165.227.120.137 (PDS) 79 - - A *.at.aesthetic.computer → 165.227.120.137 (PDS wildcard) 80 - - A chat-clock.aesthetic.computer → 157.245.134.225 (session server) 81 - - A chat-system.aesthetic.computer → 157.245.134.225 (session server) 82 - - A feed.aesthetic.computer → 64.23.151.169 (silo) 83 - - A help.aesthetic.computer → 146.190.150.173 (help) 84 - - A judge.aesthetic.computer → 64.227.102.108 (judge) 85 - - A oven-origin.aesthetic.computer → 137.184.237.166 (oven) 86 - - A oven.aesthetic.computer → 137.184.237.166 (oven) 87 - - A session-server.aesthetic.computer → 157.245.134.225 (session) 88 - - A silo.aesthetic.computer → 64.23.151.169 (silo) 89 - - A udp.aesthetic.computer → 157.245.134.225 (session) 3 + Last audited: 2026-03-30 90 4 91 - ### aesthetic.computer — DO Spaces CDN 92 - - CNAME art.aesthetic.computer → art-aesthetic-computer.sfo3.cdn.digitaloceanspaces.com 93 - - CNAME assets.aesthetic.computer → assets-aesthetic-computer.sfo3.cdn.digitaloceanspaces.com 94 - - CNAME at-blobs.aesthetic.computer → at-blobs-aesthetic-computer.sfo3.cdn.digitaloceanspaces.com 95 - - CNAME logo.aesthetic.computer → logo.aesthetic.computer.nyc3.cdn.digitaloceanspaces.com 96 - - CNAME music.aesthetic.computer → music.aesthetic.computer.fra1.cdn.digitaloceanspaces.com 97 - - CNAME private.aesthetic.computer → private-aesthetic-computer.sfo3.digitaloceanspaces.com 98 - - CNAME releases.aesthetic.computer → releases-aesthetic-computer.sfo3.cdn.digitaloceanspaces.com 99 - - CNAME sotce-media.aesthetic.computer → sotce-aesthetic-computer.sfo3.cdn.digitaloceanspaces.com 100 - - CNAME user.aesthetic.computer → user-aesthetic-computer.sfo3.digitaloceanspaces.com 101 - - CNAME wand.aesthetic.computer → wand-aesthetic-computer.sfo3.cdn.digitaloceanspaces.com 5 + This file reflects the live Cloudflare state after the lith cutover. 6 + The primary frontend origin is `209.38.133.33`. 102 7 103 - ### aesthetic.computer — Third-party services 104 - - CNAME ai.aesthetic.computer → cname.vercel-dns.com (Vercel) 105 - - CNAME gucci.aesthetic.computer → glitch.edgeapp.net (Glitch) 106 - - CNAME hi.aesthetic.computer → Auth0 tenant 107 - - CNAME ipfs.aesthetic.computer → Pinata IPFS 108 - - CNAME pay.aesthetic.computer → Stripe hosted checkout 109 - - CNAME shop.aesthetic.computer → Shopify 110 - - CNAME duckweedtri.aesthetic.computer → ida-surface.netlify.app (separate Netlify site) 8 + ## Frontend Records On lith 111 9 112 - ### aesthetic.computer — Cloudflare Workers 113 - - AAAA grab.aesthetic.computer → 100:: (Cloudflare Worker) 114 - - AAAA os.aesthetic.computer → 100:: (Cloudflare Worker) 10 + - `aesthetic.computer` zone: `aesthetic.computer`, `api`, `bills`, `give`, `keeps`, `l5`, `news`, `p5`, `pals`, `papers`, `processing`, `sitemap`, `www` 11 + - `false.work` zone: `builds.false.work` 12 + - `jas.life` zone: `jas.life` 13 + - `justanothersystem.org` zone: `justanothersystem.org`, `www` 14 + - `kidlisp.com` zone: `kidlisp.com`, `www`, `buy`, `calm`, `device`, `keep`, `keeps`, `learn`, `pj`, `top` 15 + - `notepat.com` zone: `notepat.com`, `www` 16 + - `prompt.ac` zone: `prompt.ac`, `api`, `l5`, `p5`, `papers`, `processing`, `sitemap` 17 + - `sotce.net` zone: `sotce.net`, `www` 115 18 116 - ### aesthetic.computer — Ngrok tunnels (local dev) 117 - - CNAME local.aesthetic.computer → ngrok 118 - - CNAME chat-sotce.local.aesthetic.computer → ngrok 119 - - CNAME chat-system.local.aesthetic.computer → ngrok 120 - - CNAME session.local.aesthetic.computer → ngrok 19 + ## Other Live Exceptions 121 20 122 - ### Stripe DKIM + bounce records (keep as-is) 123 - - 6x CNAME _domainkey records 124 - - CNAME bounce.aesthetic.computer → custom-email-domain.stripe.com 21 + - `aesthetic.computer` keeps its non-lith service records for PDS, session, silo, oven, spaces/CDN, Auth0, Shopify, Stripe, and Cloudflare Worker endpoints. 22 + - `prompt.ac` keeps `*.prompt.ac -> 100::` for the Worker wildcard. 23 + - `sotce.net` keeps `chat.sotce.net -> 157.245.134.225` plus its mail/Auth0 records. 125 24 126 - ### jas.life — separate site (Vercel + old droplet) 127 - - A jas.life → 75.2.60.5 (**NETLIFY — NEEDS UPDATING to new droplet**) 128 - - A www.jas.life → 76.76.21.21 (Vercel) 129 - - A *.jas.life → 76.76.21.21 (Vercel wildcard) 130 - - Various A records → 162.243.163.221 (old DO droplet for archived sites) 25 + ## Netlify Status 131 26 132 - ### sotce.net — non-Netlify 133 - - A chat.sotce.net → 157.245.134.225 (session server) 134 - - CNAME bounce.sotce.net → Stripe 135 - - CNAME hi.sotce.net → Auth0 tenant 27 + - No production records in the audited zones point to `aesthetic-computer.netlify.app`. 28 + - No production records in the audited zones point to `75.2.60.5`. 29 + - Legacy `duckweedtri.aesthetic.computer` and `duckweedtri.prompt.ac` were stale Netlify 404s during the audit and should resolve through lith-managed redirects instead.
+5 -5
system/netlify.toml
··· 923 923 to = "https://aesthetic.computer/:splat" 924 924 status = 301 925 925 force = true 926 - [[redirects]] 927 - from = "https://wand.ac" 928 - to = "https://aesthetic-computer.netlify.app/wand" 929 - status = 301 930 - force = true 926 + [[redirects]] 927 + from = "https://wand.ac" 928 + to = "https://aesthetic.computer/wand" 929 + status = 301 930 + force = true 931 931 [[redirects]] 932 932 from = "https://edit.ac" 933 933 to = "https://vscode.dev/github/digitpain/aesthetic.computer-code/blob/main/blank.mjs"
+15 -5
system/public/aesthetic.computer/lib/try/shared-page.css
··· 305 305 306 306 @media (max-width: 820px) { 307 307 .try-playground { 308 - grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); 309 - min-height: min(74vh, 560px); 308 + grid-template-columns: minmax(0, 1fr); 309 + min-height: 0; 310 310 } 311 311 312 312 .try-editor-shell { 313 - border-right: 1px solid var(--try-line); 314 - border-bottom: none; 313 + border-right: none; 314 + border-bottom: 1px solid var(--try-line); 315 315 min-height: 0; 316 316 } 317 317 ··· 340 340 .try-editor-fallback, 341 341 .try-preview-host, 342 342 .try-preview-host iframe { 343 - min-height: min(62vh, 460px); 343 + min-height: clamp(220px, 34vh, 340px); 344 + } 345 + 346 + .try-preview-host, 347 + .try-preview-host iframe { 348 + min-height: clamp(220px, 38vh, 380px); 349 + } 350 + 351 + #try-editor, 352 + .try-editor-fallback { 353 + min-height: clamp(240px, 42vh, 420px); 344 354 } 345 355 346 356 .try-doc-panel {
+2 -1
system/public/aesthetic.computer/lib/try/shared-page.mjs
··· 626 626 updateSource(picked); 627 627 setEditorValue(picked.code); 628 628 queueDraftSave(picked.code); 629 + queueOrRun(picked.code); 629 630 }); 630 631 631 632 resetBtn.addEventListener("click", () => { 632 633 const picked = getExampleById(state.selectedExampleId); 633 634 setEditorValue(picked.code); 634 635 queueDraftSave(picked.code); 635 - setRuntimeStatus(`Reset to ${picked.title}.`, ""); 636 + queueOrRun(picked.code); 636 637 }); 637 638 638 639 copyBtn.addEventListener("click", async () => {
+2 -2
system/public/l5.aesthetic.computer/app.mjs
··· 137 137 }, 138 138 brand: { 139 139 heading: "Try L5 on AC", 140 - logoUrl: "https://aesthetic.computer/l5.aesthetic.computer/l5-logo-blob.png", 140 + logoUrl: "./l5-logo-blob.png", 141 141 logoAlt: "L5 logo", 142 142 heroLink: { 143 143 href: "https://l5lua.org/", ··· 230 230 examples: EXAMPLES, 231 231 docs: L5_DOCS, 232 232 onLogoError: (img) => { 233 - img.src = "https://aesthetic.computer/l5.aesthetic.computer/l5-logo-blob.png"; 233 + img.src = "./l5-logo-blob.png"; 234 234 }, 235 235 });
+1 -2
system/public/l5.aesthetic.computer/index.html
··· 3 3 <head> 4 4 <meta charset="utf-8" /> 5 5 <meta name="viewport" content="width=device-width, initial-scale=1" /> 6 - <base href="/l5.aesthetic.computer/" /> 7 6 <title>Try L5 on AC</title> 8 7 <meta name="description" content="L5 (Processing-style Lua) live playground and API explorer for Aesthetic Computer." /> 9 - <link rel="icon" type="image/png" href="https://aesthetic.computer/l5.aesthetic.computer/l5-logo-blob.png" /> 8 + <link rel="icon" type="image/png" href="./l5-logo-blob.png" /> 10 9 <link rel="stylesheet" href="https://aesthetic.computer/type/webfonts/berkeley-mono-variable.css" /> 11 10 </head> 12 11 <body>
-1
system/public/processing.aesthetic.computer/index.html
··· 3 3 <head> 4 4 <meta charset="utf-8" /> 5 5 <meta name="viewport" content="width=device-width, initial-scale=1" /> 6 - <base href="/processing.aesthetic.computer/" /> 7 6 <title>Try Processing on AC</title> 8 7 <meta name="description" content="Processing-style Java playground for Aesthetic Computer, transpiled to the L5 Lua runtime." /> 9 8 <link rel="icon" type="image/svg+xml" href="./processing-logo.svg" />