tangled
alpha
login
or
join now
aesthetic.computer
/
core
1
fork
atom
Monorepo for Aesthetic.Computer
aesthetic.computer
1
fork
atom
overview
issues
pulls
pipelines
Fix lith try-page routing and mobile layout
Jeffrey Alan Scudder
1 week ago
2a992488
180b259c
+73
-150
9 changed files
expand all
collapse all
unified
split
at
scripts
cloudflare-dns.mjs
lith
Caddyfile
DNS.md
system
netlify.toml
public
aesthetic.computer
lib
try
shared-page.css
shared-page.mjs
l5.aesthetic.computer
app.mjs
index.html
processing.aesthetic.computer
index.html
+7
-7
at/scripts/cloudflare-dns.mjs
reviewed
···
254
254
}
255
255
256
256
/**
257
257
-
* Create or update a CNAME record (for Netlify subdomains)
258
258
-
*
259
259
-
* @param {string} subdomain - Subdomain name (e.g., "bills" for bills.aesthetic.computer)
260
260
-
* @param {string} target - CNAME target (default: Netlify's load balancer)
257
257
+
* Create or update a CNAME record.
258
258
+
*
259
259
+
* @param {string} subdomain - Subdomain name (e.g., "bills" for bills.aesthetic.computer)
260
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
266
-
export async function createOrUpdateCNAME(subdomain, target = 'aesthetic-computer.netlify.app', rootDomain = 'aesthetic.computer', proxied = true, dryRun = false) {
266
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
378
-
const target = args[1] || 'aesthetic-computer.netlify.app';
378
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
404
-
console.log(' add-subdomain <name> [target] Add a CNAME for a Netlify subdomain');
404
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
reviewed
···
308
308
redir https://api.aesthetic.computer{uri} 301
309
309
}
310
310
311
311
+
# --- legacy duckweedtri hosts ---
312
312
+
@duckweedaesthetic host duckweedtri.aesthetic.computer
313
313
+
handle @duckweedaesthetic {
314
314
+
redir https://aesthetic.computer{uri} 301
315
315
+
}
316
316
+
317
317
+
@duckweedprompt host duckweedtri.prompt.ac
318
318
+
handle @duckweedprompt {
319
319
+
redir https://aesthetic.computer{uri} 301
320
320
+
}
321
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
326
+
}
327
327
+
328
328
+
@tryshared {
329
329
+
host l5.aesthetic.computer processing.aesthetic.computer
330
330
+
path /aesthetic.computer/*
331
331
+
}
332
332
+
handle @tryshared {
333
333
+
root * /opt/ac/system/public
334
334
+
file_server
315
335
}
316
336
317
337
# --- l5.aesthetic.computer ---
+21
-127
lith/DNS.md
reviewed
···
1
1
-
# Cloudflare DNS Records — Migration Reference
2
2
-
# Exported 2026-03-28
3
3
-
4
4
-
## Records Pointing to Netlify (aesthetic-computer.netlify.app or 75.2.60.5)
5
5
-
6
6
-
These are what need to change when migrating to the new DO droplet.
7
7
-
8
8
-
### aesthetic.computer (zone: da794a6ae8f17b80424907f81ed0db7c)
9
9
-
| Type | Name | Target | Proxy |
10
10
-
|-------|-----------------------------------|-------------------------------------|-------|
11
11
-
| A | aesthetic.computer | 75.2.60.5 | proxied |
12
12
-
| CNAME | api.aesthetic.computer | aesthetic-computer.netlify.app | proxied |
13
13
-
| CNAME | bills.aesthetic.computer | aesthetic-computer.netlify.app | proxied |
14
14
-
| CNAME | give.aesthetic.computer | aesthetic-computer.netlify.app | proxied |
15
15
-
| CNAME | keeps.aesthetic.computer | aesthetic-computer.netlify.app | proxied |
16
16
-
| CNAME | l5.aesthetic.computer | aesthetic-computer.netlify.app | proxied |
17
17
-
| CNAME | news.aesthetic.computer | aesthetic-computer.netlify.app | proxied |
18
18
-
| CNAME | p5.aesthetic.computer | aesthetic-computer.netlify.app | proxied |
19
19
-
| CNAME | pals.aesthetic.computer | aesthetic-computer.netlify.app | proxied |
20
20
-
| CNAME | papers.aesthetic.computer | aesthetic-computer.netlify.app | proxied |
21
21
-
| CNAME | processing.aesthetic.computer | aesthetic-computer.netlify.app | proxied |
22
22
-
| CNAME | sitemap.aesthetic.computer | aesthetic-computer.netlify.app | proxied |
23
23
-
| CNAME | www.aesthetic.computer | aesthetic-computer.netlify.app | proxied |
24
24
-
25
25
-
### false.work (zone: 0fa28e0097b24e187f41fea0ec036c0d)
26
26
-
| Type | Name | Target | Proxy |
27
27
-
|-------|-----------------------------------|-------------------------------------|-------|
28
28
-
| CNAME | builds.false.work | aesthetic-computer.netlify.app | proxied |
29
29
-
30
30
-
### justanothersystem.org (zone: a3366b124c7ca95fe902a54f868dcc51)
31
31
-
| Type | Name | Target | Proxy |
32
32
-
|-------|-----------------------------------|-------------------------------------|-------|
33
33
-
| A | justanothersystem.org | 75.2.60.5 | DNS-only |
34
34
-
| CNAME | www.justanothersystem.org | aesthetic-computer.netlify.app | DNS-only |
35
35
-
36
36
-
### kidlisp.com (zone: bac7b811ac7b4df664b696fafa9e6207)
37
37
-
| Type | Name | Target | Proxy |
38
38
-
|-------|-----------------------------------|-------------------------------------|-------|
39
39
-
| A | kidlisp.com | 75.2.60.5 | proxied |
40
40
-
| A | www.kidlisp.com | 75.2.60.5 | proxied |
41
41
-
| CNAME | buy.kidlisp.com | aesthetic-computer.netlify.app | proxied |
42
42
-
| CNAME | calm.kidlisp.com | aesthetic-computer.netlify.app | proxied |
43
43
-
| CNAME | device.kidlisp.com | aesthetic-computer.netlify.app | proxied |
44
44
-
| CNAME | keep.kidlisp.com | aesthetic-computer.netlify.app | proxied |
45
45
-
| CNAME | keeps.kidlisp.com | aesthetic-computer.netlify.app | proxied |
46
46
-
| CNAME | learn.kidlisp.com | aesthetic-computer.netlify.app | proxied |
47
47
-
| CNAME | pj.kidlisp.com | aesthetic-computer.netlify.app | proxied |
48
48
-
| CNAME | top.kidlisp.com | aesthetic-computer.netlify.app | proxied |
49
49
-
50
50
-
### notepat.com (zone: 8d289a1e56563dbcc9bc88747428c8ee)
51
51
-
| Type | Name | Target | Proxy |
52
52
-
|-------|-----------------------------------|-------------------------------------|-------|
53
53
-
| A | notepat.com | 75.2.60.5 | proxied |
54
54
-
| CNAME | www.notepat.com | aesthetic-computer.netlify.app | proxied |
55
55
-
56
56
-
### prompt.ac (zone: 1f93ca86e2d9de0def0acb0b8c4e722b)
57
57
-
| Type | Name | Target | Proxy |
58
58
-
|-------|-----------------------------------|-------------------------------------|-------|
59
59
-
| A | prompt.ac | 75.2.60.5 | proxied |
60
60
-
| CNAME | api.prompt.ac | aesthetic-computer.netlify.app | proxied |
61
61
-
| CNAME | l5.prompt.ac | aesthetic-computer.netlify.app | proxied |
62
62
-
| CNAME | p5.prompt.ac | aesthetic-computer.netlify.app | proxied |
63
63
-
| CNAME | papers.prompt.ac | aesthetic-computer.netlify.app | proxied |
64
64
-
| CNAME | processing.prompt.ac | aesthetic-computer.netlify.app | proxied |
65
65
-
| CNAME | sitemap.prompt.ac | aesthetic-computer.netlify.app | proxied |
66
66
-
67
67
-
### sotce.net (zone: 1f56f8b5fd7b3db92d31bad0714a518f)
68
68
-
| Type | Name | Target | Proxy |
69
69
-
|-------|-----------------------------------|-------------------------------------|-------|
70
70
-
| A | sotce.net | 75.2.60.5 | proxied |
71
71
-
| A | www.sotce.net | 75.2.60.5 | proxied |
72
72
-
73
73
-
---
74
74
-
75
75
-
## Records NOT Pointing to Netlify (keep as-is)
1
1
+
# Cloudflare DNS Status
76
2
77
77
-
### aesthetic.computer — DigitalOcean droplets
78
78
-
- A at.aesthetic.computer → 165.227.120.137 (PDS)
79
79
-
- A *.at.aesthetic.computer → 165.227.120.137 (PDS wildcard)
80
80
-
- A chat-clock.aesthetic.computer → 157.245.134.225 (session server)
81
81
-
- A chat-system.aesthetic.computer → 157.245.134.225 (session server)
82
82
-
- A feed.aesthetic.computer → 64.23.151.169 (silo)
83
83
-
- A help.aesthetic.computer → 146.190.150.173 (help)
84
84
-
- A judge.aesthetic.computer → 64.227.102.108 (judge)
85
85
-
- A oven-origin.aesthetic.computer → 137.184.237.166 (oven)
86
86
-
- A oven.aesthetic.computer → 137.184.237.166 (oven)
87
87
-
- A session-server.aesthetic.computer → 157.245.134.225 (session)
88
88
-
- A silo.aesthetic.computer → 64.23.151.169 (silo)
89
89
-
- A udp.aesthetic.computer → 157.245.134.225 (session)
3
3
+
Last audited: 2026-03-30
90
4
91
91
-
### aesthetic.computer — DO Spaces CDN
92
92
-
- CNAME art.aesthetic.computer → art-aesthetic-computer.sfo3.cdn.digitaloceanspaces.com
93
93
-
- CNAME assets.aesthetic.computer → assets-aesthetic-computer.sfo3.cdn.digitaloceanspaces.com
94
94
-
- CNAME at-blobs.aesthetic.computer → at-blobs-aesthetic-computer.sfo3.cdn.digitaloceanspaces.com
95
95
-
- CNAME logo.aesthetic.computer → logo.aesthetic.computer.nyc3.cdn.digitaloceanspaces.com
96
96
-
- CNAME music.aesthetic.computer → music.aesthetic.computer.fra1.cdn.digitaloceanspaces.com
97
97
-
- CNAME private.aesthetic.computer → private-aesthetic-computer.sfo3.digitaloceanspaces.com
98
98
-
- CNAME releases.aesthetic.computer → releases-aesthetic-computer.sfo3.cdn.digitaloceanspaces.com
99
99
-
- CNAME sotce-media.aesthetic.computer → sotce-aesthetic-computer.sfo3.cdn.digitaloceanspaces.com
100
100
-
- CNAME user.aesthetic.computer → user-aesthetic-computer.sfo3.digitaloceanspaces.com
101
101
-
- CNAME wand.aesthetic.computer → wand-aesthetic-computer.sfo3.cdn.digitaloceanspaces.com
5
5
+
This file reflects the live Cloudflare state after the lith cutover.
6
6
+
The primary frontend origin is `209.38.133.33`.
102
7
103
103
-
### aesthetic.computer — Third-party services
104
104
-
- CNAME ai.aesthetic.computer → cname.vercel-dns.com (Vercel)
105
105
-
- CNAME gucci.aesthetic.computer → glitch.edgeapp.net (Glitch)
106
106
-
- CNAME hi.aesthetic.computer → Auth0 tenant
107
107
-
- CNAME ipfs.aesthetic.computer → Pinata IPFS
108
108
-
- CNAME pay.aesthetic.computer → Stripe hosted checkout
109
109
-
- CNAME shop.aesthetic.computer → Shopify
110
110
-
- CNAME duckweedtri.aesthetic.computer → ida-surface.netlify.app (separate Netlify site)
8
8
+
## Frontend Records On lith
111
9
112
112
-
### aesthetic.computer — Cloudflare Workers
113
113
-
- AAAA grab.aesthetic.computer → 100:: (Cloudflare Worker)
114
114
-
- AAAA os.aesthetic.computer → 100:: (Cloudflare Worker)
10
10
+
- `aesthetic.computer` zone: `aesthetic.computer`, `api`, `bills`, `give`, `keeps`, `l5`, `news`, `p5`, `pals`, `papers`, `processing`, `sitemap`, `www`
11
11
+
- `false.work` zone: `builds.false.work`
12
12
+
- `jas.life` zone: `jas.life`
13
13
+
- `justanothersystem.org` zone: `justanothersystem.org`, `www`
14
14
+
- `kidlisp.com` zone: `kidlisp.com`, `www`, `buy`, `calm`, `device`, `keep`, `keeps`, `learn`, `pj`, `top`
15
15
+
- `notepat.com` zone: `notepat.com`, `www`
16
16
+
- `prompt.ac` zone: `prompt.ac`, `api`, `l5`, `p5`, `papers`, `processing`, `sitemap`
17
17
+
- `sotce.net` zone: `sotce.net`, `www`
115
18
116
116
-
### aesthetic.computer — Ngrok tunnels (local dev)
117
117
-
- CNAME local.aesthetic.computer → ngrok
118
118
-
- CNAME chat-sotce.local.aesthetic.computer → ngrok
119
119
-
- CNAME chat-system.local.aesthetic.computer → ngrok
120
120
-
- CNAME session.local.aesthetic.computer → ngrok
19
19
+
## Other Live Exceptions
121
20
122
122
-
### Stripe DKIM + bounce records (keep as-is)
123
123
-
- 6x CNAME _domainkey records
124
124
-
- CNAME bounce.aesthetic.computer → custom-email-domain.stripe.com
21
21
+
- `aesthetic.computer` keeps its non-lith service records for PDS, session, silo, oven, spaces/CDN, Auth0, Shopify, Stripe, and Cloudflare Worker endpoints.
22
22
+
- `prompt.ac` keeps `*.prompt.ac -> 100::` for the Worker wildcard.
23
23
+
- `sotce.net` keeps `chat.sotce.net -> 157.245.134.225` plus its mail/Auth0 records.
125
24
126
126
-
### jas.life — separate site (Vercel + old droplet)
127
127
-
- A jas.life → 75.2.60.5 (**NETLIFY — NEEDS UPDATING to new droplet**)
128
128
-
- A www.jas.life → 76.76.21.21 (Vercel)
129
129
-
- A *.jas.life → 76.76.21.21 (Vercel wildcard)
130
130
-
- Various A records → 162.243.163.221 (old DO droplet for archived sites)
25
25
+
## Netlify Status
131
26
132
132
-
### sotce.net — non-Netlify
133
133
-
- A chat.sotce.net → 157.245.134.225 (session server)
134
134
-
- CNAME bounce.sotce.net → Stripe
135
135
-
- CNAME hi.sotce.net → Auth0 tenant
27
27
+
- No production records in the audited zones point to `aesthetic-computer.netlify.app`.
28
28
+
- No production records in the audited zones point to `75.2.60.5`.
29
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
reviewed
···
923
923
to = "https://aesthetic.computer/:splat"
924
924
status = 301
925
925
force = true
926
926
-
[[redirects]]
927
927
-
from = "https://wand.ac"
928
928
-
to = "https://aesthetic-computer.netlify.app/wand"
929
929
-
status = 301
930
930
-
force = true
926
926
+
[[redirects]]
927
927
+
from = "https://wand.ac"
928
928
+
to = "https://aesthetic.computer/wand"
929
929
+
status = 301
930
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
reviewed
···
305
305
306
306
@media (max-width: 820px) {
307
307
.try-playground {
308
308
-
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
309
309
-
min-height: min(74vh, 560px);
308
308
+
grid-template-columns: minmax(0, 1fr);
309
309
+
min-height: 0;
310
310
}
311
311
312
312
.try-editor-shell {
313
313
-
border-right: 1px solid var(--try-line);
314
314
-
border-bottom: none;
313
313
+
border-right: none;
314
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
343
-
min-height: min(62vh, 460px);
343
343
+
min-height: clamp(220px, 34vh, 340px);
344
344
+
}
345
345
+
346
346
+
.try-preview-host,
347
347
+
.try-preview-host iframe {
348
348
+
min-height: clamp(220px, 38vh, 380px);
349
349
+
}
350
350
+
351
351
+
#try-editor,
352
352
+
.try-editor-fallback {
353
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
reviewed
···
626
626
updateSource(picked);
627
627
setEditorValue(picked.code);
628
628
queueDraftSave(picked.code);
629
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
635
-
setRuntimeStatus(`Reset to ${picked.title}.`, "");
636
636
+
queueOrRun(picked.code);
636
637
});
637
638
638
639
copyBtn.addEventListener("click", async () => {
+2
-2
system/public/l5.aesthetic.computer/app.mjs
reviewed
···
137
137
},
138
138
brand: {
139
139
heading: "Try L5 on AC",
140
140
-
logoUrl: "https://aesthetic.computer/l5.aesthetic.computer/l5-logo-blob.png",
140
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
233
-
img.src = "https://aesthetic.computer/l5.aesthetic.computer/l5-logo-blob.png";
233
233
+
img.src = "./l5-logo-blob.png";
234
234
},
235
235
});
+1
-2
system/public/l5.aesthetic.computer/index.html
reviewed
···
3
3
<head>
4
4
<meta charset="utf-8" />
5
5
<meta name="viewport" content="width=device-width, initial-scale=1" />
6
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
9
-
<link rel="icon" type="image/png" href="https://aesthetic.computer/l5.aesthetic.computer/l5-logo-blob.png" />
8
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
reviewed
···
3
3
<head>
4
4
<meta charset="utf-8" />
5
5
<meta name="viewport" content="width=device-width, initial-scale=1" />
6
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" />