diff --git a/at/scripts/cloudflare-dns.mjs b/at/scripts/cloudflare-dns.mjs index 18efc7b29..545c7c5fe 100644 --- a/at/scripts/cloudflare-dns.mjs +++ b/at/scripts/cloudflare-dns.mjs @@ -254,16 +254,16 @@ export async function verifyTXTRecord(recordName, expectedContent, rootDomain) { } /** - * Create or update a CNAME record (for Netlify subdomains) - * - * @param {string} subdomain - Subdomain name (e.g., "bills" for bills.aesthetic.computer) - * @param {string} target - CNAME target (default: Netlify's load balancer) + * Create or update a CNAME record. + * + * @param {string} subdomain - Subdomain name (e.g., "bills" for bills.aesthetic.computer) + * @param {string} target - CNAME target (default: lith frontend host) * @param {string} rootDomain - Root domain (default: "aesthetic.computer") * @param {boolean} proxied - Whether to proxy through Cloudflare (default: true) * @param {boolean} dryRun - If true, only check what would be done * @returns {Promise} Result object with status and details */ -export async function createOrUpdateCNAME(subdomain, target = 'aesthetic-computer.netlify.app', rootDomain = 'aesthetic.computer', proxied = true, dryRun = false) { +export async function createOrUpdateCNAME(subdomain, target = 'lith.aesthetic.computer', rootDomain = 'aesthetic.computer', proxied = true, dryRun = false) { const recordName = `${subdomain}.${rootDomain}`; try { @@ -375,7 +375,7 @@ if (import.meta.url === `file://${process.argv[1]}`) { case 'add-subdomain': case 'add-cname': { const subdomain = args[0]; - const target = args[1] || 'aesthetic-computer.netlify.app'; + const target = args[1] || 'lith.aesthetic.computer'; if (!subdomain) { console.error('Usage: node cloudflare-dns.mjs add-subdomain [target]'); console.error('Example: node cloudflare-dns.mjs add-subdomain bills'); @@ -401,7 +401,7 @@ if (import.meta.url === `file://${process.argv[1]}`) { console.log('Cloudflare DNS Management'); console.log(''); console.log('Commands:'); - console.log(' add-subdomain [target] Add a CNAME for a Netlify subdomain'); + console.log(' add-subdomain [target] Add a proxied CNAME (defaults to lith.aesthetic.computer)'); console.log(' list [type] List all DNS records (optionally filter by type)'); console.log(''); console.log('Examples:'); diff --git a/lith/Caddyfile b/lith/Caddyfile index 6f0e8c1f8..6f8138847 100644 --- a/lith/Caddyfile +++ b/lith/Caddyfile @@ -308,12 +308,32 @@ redir https://api.aesthetic.computer{uri} 301 } + # --- legacy duckweedtri hosts --- + @duckweedaesthetic host duckweedtri.aesthetic.computer + handle @duckweedaesthetic { + redir https://aesthetic.computer{uri} 301 + } + + @duckweedprompt host duckweedtri.prompt.ac + handle @duckweedprompt { + redir https://aesthetic.computer{uri} 301 + } + # --- prompt.ac → aesthetic.computer (301 redirect) --- @promptac host prompt.ac handle @promptac { redir https://aesthetic.computer{uri} 301 } + @tryshared { + host l5.aesthetic.computer processing.aesthetic.computer + path /aesthetic.computer/* + } + handle @tryshared { + root * /opt/ac/system/public + file_server + } + # --- l5.aesthetic.computer --- @l5 host l5.aesthetic.computer handle @l5 { diff --git a/lith/DNS.md b/lith/DNS.md index 87f91cfd3..df5eaa3a6 100644 --- a/lith/DNS.md +++ b/lith/DNS.md @@ -1,135 +1,29 @@ -# Cloudflare DNS Records — Migration Reference -# Exported 2026-03-28 +# Cloudflare DNS Status -## Records Pointing to Netlify (aesthetic-computer.netlify.app or 75.2.60.5) +Last audited: 2026-03-30 -These are what need to change when migrating to the new DO droplet. +This file reflects the live Cloudflare state after the lith cutover. +The primary frontend origin is `209.38.133.33`. -### aesthetic.computer (zone: da794a6ae8f17b80424907f81ed0db7c) -| Type | Name | Target | Proxy | -|-------|-----------------------------------|-------------------------------------|-------| -| A | aesthetic.computer | 75.2.60.5 | proxied | -| CNAME | api.aesthetic.computer | aesthetic-computer.netlify.app | proxied | -| CNAME | bills.aesthetic.computer | aesthetic-computer.netlify.app | proxied | -| CNAME | give.aesthetic.computer | aesthetic-computer.netlify.app | proxied | -| CNAME | keeps.aesthetic.computer | aesthetic-computer.netlify.app | proxied | -| CNAME | l5.aesthetic.computer | aesthetic-computer.netlify.app | proxied | -| CNAME | news.aesthetic.computer | aesthetic-computer.netlify.app | proxied | -| CNAME | p5.aesthetic.computer | aesthetic-computer.netlify.app | proxied | -| CNAME | pals.aesthetic.computer | aesthetic-computer.netlify.app | proxied | -| CNAME | papers.aesthetic.computer | aesthetic-computer.netlify.app | proxied | -| CNAME | processing.aesthetic.computer | aesthetic-computer.netlify.app | proxied | -| CNAME | sitemap.aesthetic.computer | aesthetic-computer.netlify.app | proxied | -| CNAME | www.aesthetic.computer | aesthetic-computer.netlify.app | proxied | +## Frontend Records On lith -### false.work (zone: 0fa28e0097b24e187f41fea0ec036c0d) -| Type | Name | Target | Proxy | -|-------|-----------------------------------|-------------------------------------|-------| -| CNAME | builds.false.work | aesthetic-computer.netlify.app | proxied | +- `aesthetic.computer` zone: `aesthetic.computer`, `api`, `bills`, `give`, `keeps`, `l5`, `news`, `p5`, `pals`, `papers`, `processing`, `sitemap`, `www` +- `false.work` zone: `builds.false.work` +- `jas.life` zone: `jas.life` +- `justanothersystem.org` zone: `justanothersystem.org`, `www` +- `kidlisp.com` zone: `kidlisp.com`, `www`, `buy`, `calm`, `device`, `keep`, `keeps`, `learn`, `pj`, `top` +- `notepat.com` zone: `notepat.com`, `www` +- `prompt.ac` zone: `prompt.ac`, `api`, `l5`, `p5`, `papers`, `processing`, `sitemap` +- `sotce.net` zone: `sotce.net`, `www` -### justanothersystem.org (zone: a3366b124c7ca95fe902a54f868dcc51) -| Type | Name | Target | Proxy | -|-------|-----------------------------------|-------------------------------------|-------| -| A | justanothersystem.org | 75.2.60.5 | DNS-only | -| CNAME | www.justanothersystem.org | aesthetic-computer.netlify.app | DNS-only | +## Other Live Exceptions -### kidlisp.com (zone: bac7b811ac7b4df664b696fafa9e6207) -| Type | Name | Target | Proxy | -|-------|-----------------------------------|-------------------------------------|-------| -| A | kidlisp.com | 75.2.60.5 | proxied | -| A | www.kidlisp.com | 75.2.60.5 | proxied | -| CNAME | buy.kidlisp.com | aesthetic-computer.netlify.app | proxied | -| CNAME | calm.kidlisp.com | aesthetic-computer.netlify.app | proxied | -| CNAME | device.kidlisp.com | aesthetic-computer.netlify.app | proxied | -| CNAME | keep.kidlisp.com | aesthetic-computer.netlify.app | proxied | -| CNAME | keeps.kidlisp.com | aesthetic-computer.netlify.app | proxied | -| CNAME | learn.kidlisp.com | aesthetic-computer.netlify.app | proxied | -| CNAME | pj.kidlisp.com | aesthetic-computer.netlify.app | proxied | -| CNAME | top.kidlisp.com | aesthetic-computer.netlify.app | proxied | +- `aesthetic.computer` keeps its non-lith service records for PDS, session, silo, oven, spaces/CDN, Auth0, Shopify, Stripe, and Cloudflare Worker endpoints. +- `prompt.ac` keeps `*.prompt.ac -> 100::` for the Worker wildcard. +- `sotce.net` keeps `chat.sotce.net -> 157.245.134.225` plus its mail/Auth0 records. -### notepat.com (zone: 8d289a1e56563dbcc9bc88747428c8ee) -| Type | Name | Target | Proxy | -|-------|-----------------------------------|-------------------------------------|-------| -| A | notepat.com | 75.2.60.5 | proxied | -| CNAME | www.notepat.com | aesthetic-computer.netlify.app | proxied | +## Netlify Status -### prompt.ac (zone: 1f93ca86e2d9de0def0acb0b8c4e722b) -| Type | Name | Target | Proxy | -|-------|-----------------------------------|-------------------------------------|-------| -| A | prompt.ac | 75.2.60.5 | proxied | -| CNAME | api.prompt.ac | aesthetic-computer.netlify.app | proxied | -| CNAME | l5.prompt.ac | aesthetic-computer.netlify.app | proxied | -| CNAME | p5.prompt.ac | aesthetic-computer.netlify.app | proxied | -| CNAME | papers.prompt.ac | aesthetic-computer.netlify.app | proxied | -| CNAME | processing.prompt.ac | aesthetic-computer.netlify.app | proxied | -| CNAME | sitemap.prompt.ac | aesthetic-computer.netlify.app | proxied | - -### sotce.net (zone: 1f56f8b5fd7b3db92d31bad0714a518f) -| Type | Name | Target | Proxy | -|-------|-----------------------------------|-------------------------------------|-------| -| A | sotce.net | 75.2.60.5 | proxied | -| A | www.sotce.net | 75.2.60.5 | proxied | - ---- - -## Records NOT Pointing to Netlify (keep as-is) - -### aesthetic.computer — DigitalOcean droplets -- A at.aesthetic.computer → 165.227.120.137 (PDS) -- A *.at.aesthetic.computer → 165.227.120.137 (PDS wildcard) -- A chat-clock.aesthetic.computer → 157.245.134.225 (session server) -- A chat-system.aesthetic.computer → 157.245.134.225 (session server) -- A feed.aesthetic.computer → 64.23.151.169 (silo) -- A help.aesthetic.computer → 146.190.150.173 (help) -- A judge.aesthetic.computer → 64.227.102.108 (judge) -- A oven-origin.aesthetic.computer → 137.184.237.166 (oven) -- A oven.aesthetic.computer → 137.184.237.166 (oven) -- A session-server.aesthetic.computer → 157.245.134.225 (session) -- A silo.aesthetic.computer → 64.23.151.169 (silo) -- A udp.aesthetic.computer → 157.245.134.225 (session) - -### aesthetic.computer — DO Spaces CDN -- CNAME art.aesthetic.computer → art-aesthetic-computer.sfo3.cdn.digitaloceanspaces.com -- CNAME assets.aesthetic.computer → assets-aesthetic-computer.sfo3.cdn.digitaloceanspaces.com -- CNAME at-blobs.aesthetic.computer → at-blobs-aesthetic-computer.sfo3.cdn.digitaloceanspaces.com -- CNAME logo.aesthetic.computer → logo.aesthetic.computer.nyc3.cdn.digitaloceanspaces.com -- CNAME music.aesthetic.computer → music.aesthetic.computer.fra1.cdn.digitaloceanspaces.com -- CNAME private.aesthetic.computer → private-aesthetic-computer.sfo3.digitaloceanspaces.com -- CNAME releases.aesthetic.computer → releases-aesthetic-computer.sfo3.cdn.digitaloceanspaces.com -- CNAME sotce-media.aesthetic.computer → sotce-aesthetic-computer.sfo3.cdn.digitaloceanspaces.com -- CNAME user.aesthetic.computer → user-aesthetic-computer.sfo3.digitaloceanspaces.com -- CNAME wand.aesthetic.computer → wand-aesthetic-computer.sfo3.cdn.digitaloceanspaces.com - -### aesthetic.computer — Third-party services -- CNAME ai.aesthetic.computer → cname.vercel-dns.com (Vercel) -- CNAME gucci.aesthetic.computer → glitch.edgeapp.net (Glitch) -- CNAME hi.aesthetic.computer → Auth0 tenant -- CNAME ipfs.aesthetic.computer → Pinata IPFS -- CNAME pay.aesthetic.computer → Stripe hosted checkout -- CNAME shop.aesthetic.computer → Shopify -- CNAME duckweedtri.aesthetic.computer → ida-surface.netlify.app (separate Netlify site) - -### aesthetic.computer — Cloudflare Workers -- AAAA grab.aesthetic.computer → 100:: (Cloudflare Worker) -- AAAA os.aesthetic.computer → 100:: (Cloudflare Worker) - -### aesthetic.computer — Ngrok tunnels (local dev) -- CNAME local.aesthetic.computer → ngrok -- CNAME chat-sotce.local.aesthetic.computer → ngrok -- CNAME chat-system.local.aesthetic.computer → ngrok -- CNAME session.local.aesthetic.computer → ngrok - -### Stripe DKIM + bounce records (keep as-is) -- 6x CNAME _domainkey records -- CNAME bounce.aesthetic.computer → custom-email-domain.stripe.com - -### jas.life — separate site (Vercel + old droplet) -- A jas.life → 75.2.60.5 (**NETLIFY — NEEDS UPDATING to new droplet**) -- A www.jas.life → 76.76.21.21 (Vercel) -- A *.jas.life → 76.76.21.21 (Vercel wildcard) -- Various A records → 162.243.163.221 (old DO droplet for archived sites) - -### sotce.net — non-Netlify -- A chat.sotce.net → 157.245.134.225 (session server) -- CNAME bounce.sotce.net → Stripe -- CNAME hi.sotce.net → Auth0 tenant +- No production records in the audited zones point to `aesthetic-computer.netlify.app`. +- No production records in the audited zones point to `75.2.60.5`. +- Legacy `duckweedtri.aesthetic.computer` and `duckweedtri.prompt.ac` were stale Netlify 404s during the audit and should resolve through lith-managed redirects instead. diff --git a/system/netlify.toml b/system/netlify.toml index eb10adc16..ddb1ba03d 100644 --- a/system/netlify.toml +++ b/system/netlify.toml @@ -923,11 +923,11 @@ from = "https://4esthetic.com/*" to = "https://aesthetic.computer/:splat" status = 301 force = true -[[redirects]] -from = "https://wand.ac" -to = "https://aesthetic-computer.netlify.app/wand" -status = 301 -force = true +[[redirects]] +from = "https://wand.ac" +to = "https://aesthetic.computer/wand" +status = 301 +force = true [[redirects]] from = "https://edit.ac" to = "https://vscode.dev/github/digitpain/aesthetic.computer-code/blob/main/blank.mjs" diff --git a/system/public/aesthetic.computer/lib/try/shared-page.css b/system/public/aesthetic.computer/lib/try/shared-page.css index 12f84b83e..94145a922 100644 --- a/system/public/aesthetic.computer/lib/try/shared-page.css +++ b/system/public/aesthetic.computer/lib/try/shared-page.css @@ -305,13 +305,13 @@ body { @media (max-width: 820px) { .try-playground { - grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); - min-height: min(74vh, 560px); + grid-template-columns: minmax(0, 1fr); + min-height: 0; } .try-editor-shell { - border-right: 1px solid var(--try-line); - border-bottom: none; + border-right: none; + border-bottom: 1px solid var(--try-line); min-height: 0; } @@ -340,7 +340,17 @@ body { .try-editor-fallback, .try-preview-host, .try-preview-host iframe { - min-height: min(62vh, 460px); + min-height: clamp(220px, 34vh, 340px); + } + + .try-preview-host, + .try-preview-host iframe { + min-height: clamp(220px, 38vh, 380px); + } + + #try-editor, + .try-editor-fallback { + min-height: clamp(240px, 42vh, 420px); } .try-doc-panel { diff --git a/system/public/aesthetic.computer/lib/try/shared-page.mjs b/system/public/aesthetic.computer/lib/try/shared-page.mjs index d1bb77a1e..c59ab4373 100644 --- a/system/public/aesthetic.computer/lib/try/shared-page.mjs +++ b/system/public/aesthetic.computer/lib/try/shared-page.mjs @@ -626,13 +626,14 @@ export async function createTryPage(config) { updateSource(picked); setEditorValue(picked.code); queueDraftSave(picked.code); + queueOrRun(picked.code); }); resetBtn.addEventListener("click", () => { const picked = getExampleById(state.selectedExampleId); setEditorValue(picked.code); queueDraftSave(picked.code); - setRuntimeStatus(`Reset to ${picked.title}.`, ""); + queueOrRun(picked.code); }); copyBtn.addEventListener("click", async () => { diff --git a/system/public/l5.aesthetic.computer/app.mjs b/system/public/l5.aesthetic.computer/app.mjs index 2c4829356..ace0ab39f 100644 --- a/system/public/l5.aesthetic.computer/app.mjs +++ b/system/public/l5.aesthetic.computer/app.mjs @@ -137,7 +137,7 @@ await createTryPage({ }, brand: { heading: "Try L5 on AC", - logoUrl: "https://aesthetic.computer/l5.aesthetic.computer/l5-logo-blob.png", + logoUrl: "./l5-logo-blob.png", logoAlt: "L5 logo", heroLink: { href: "https://l5lua.org/", @@ -230,6 +230,6 @@ await createTryPage({ examples: EXAMPLES, docs: L5_DOCS, onLogoError: (img) => { - img.src = "https://aesthetic.computer/l5.aesthetic.computer/l5-logo-blob.png"; + img.src = "./l5-logo-blob.png"; }, }); diff --git a/system/public/l5.aesthetic.computer/index.html b/system/public/l5.aesthetic.computer/index.html index c1d298941..181dbd4f8 100644 --- a/system/public/l5.aesthetic.computer/index.html +++ b/system/public/l5.aesthetic.computer/index.html @@ -3,10 +3,9 @@ - Try L5 on AC - + diff --git a/system/public/processing.aesthetic.computer/index.html b/system/public/processing.aesthetic.computer/index.html index d84ae34c8..fad99cca0 100644 --- a/system/public/processing.aesthetic.computer/index.html +++ b/system/public/processing.aesthetic.computer/index.html @@ -3,7 +3,6 @@ - Try Processing on AC