Monorepo for Aesthetic.Computer aesthetic.computer
4
fork

Configure Feed

Select the types of activity you want to include in your feed.

Make Tangled the canonical repo link

+48 -77
+1 -1
README.md
··· 27 27 ## Home 28 28 29 29 - **Tangled** (canonical): https://tangled.org/aesthetic.computer/core 30 - - **GitHub** (mirror): https://github.com/whistlegraph/aesthetic-computer 30 + - **GitHub** (deprecated read-only mirror): https://github.com/whistlegraph/aesthetic-computer 31 31 32 32 Self-hosted on `knot.aesthetic.computer`. 33 33
+3 -3
USER-GUIDE.md
··· 89 89 90 90 [1] Recent HN discussion on `notepat` here: https://news.ycombinator.com/item?id=41526754 91 91 92 - [2] The AC Story: https://github.com/whistlegraph/aesthetic-computer/blob/main/STORY.md 93 - 94 - [3] Write a Piece: https://github.com/whistlegraph/aesthetic-computer/blob/main/WRITE-A-PIECE.md 92 + [2] The AC Story: STORY.md 93 + 94 + [3] Write a Piece: WRITE-A-PIECE.md
+3 -3
system/netlify/functions/api-docs.mjs
··· 15 15 description: "Model Context Protocol server for AI assistants (Claude, GPT-4, etc.) to interact with aesthetic.computer APIs", 16 16 package: "@aesthetic.computer/mcp", 17 17 install: "npx @aesthetic.computer/mcp", 18 - repository: "https://github.com/whistlegraph/aesthetic-computer/tree/main/mcp-server", 18 + repository: "https://tangled.org/aesthetic.computer/core/tree/main/mcp-server", 19 19 20 20 tools: [ 21 21 { ··· 942 942 <div class="quick-links"> 943 943 <a href="?format=json" class="btn btn-secondary">[ view json ]</a> 944 944 <a href="https://aesthetic.computer" class="btn">[ home ]</a> 945 - <a href="https://github.com/whistlegraph/aesthetic-computer" class="btn">[ github ]</a> 945 + <a href="https://tangled.org/aesthetic.computer/core" class="btn">[ tangled ]</a> 946 946 </div> 947 947 </div> 948 948 ··· 952 952 <p>${docs.mcp.description}</p> 953 953 <p><strong>package:</strong> <code>${docs.mcp.package}</code></p> 954 954 <p><strong>install:</strong> <code>${docs.mcp.install}</code></p> 955 - <p><a href="${docs.mcp.repository}">view on github &rarr;</a></p> 955 + <p><a href="${docs.mcp.repository}">view on tangled &rarr;</a></p> 956 956 957 957 <h3>tools</h3> 958 958 ${docs.mcp.tools.map(tool => `
+2 -2
system/netlify/functions/docs.js
··· 3785 3785 // 🔗 External Links 3786 3786 github: { 3787 3787 sig: "github", 3788 - desc: "Open the AC GitHub repo.", 3788 + desc: "Open the AC Tangled repo (legacy alias).", 3789 3789 done: true, 3790 3790 }, 3791 3791 gh: { 3792 3792 sig: "gh", 3793 - desc: "Open the AC GitHub repo.", 3793 + desc: "Open the AC Tangled repo (legacy alias).", 3794 3794 done: true, 3795 3795 }, 3796 3796 gmail: {
+3 -3
system/netlify/functions/index.mjs
··· 1266 1266 "url": "https://aesthetic.computer/" + slug, 1267 1267 "applicationCategory": "Creative Coding", 1268 1268 "operatingSystem": "Web Browser", 1269 - "codeRepository": "https://github.com/whistlegraph/aesthetic-computer", 1270 - "sourceOrganization": { "@type": "Organization", "name": "Whistlegraph", "url": "https://github.com/whistlegraph" } 1269 + "codeRepository": "https://tangled.org/aesthetic.computer/core", 1270 + "sourceOrganization": { "@type": "Organization", "name": "Aesthetic Computer", "url": "https://tangled.org/aesthetic.computer/core" } 1271 1271 })} 1272 1272 </script> 1273 1273 </head> ··· 1276 1276 <h1>${encode(title)}</h1> 1277 1277 <p>${encode(desc)}</p> 1278 1278 <p>Aesthetic Computer is an open creative computing platform for making art, games, and tools in the browser using JavaScript and KidLisp. Navigate by typing a piece name (e.g. &quot;painting&quot;, &quot;line&quot;, &quot;wand&quot;, &quot;prompt&quot;) into the command prompt and pressing Enter. See llms.txt for full documentation: https://aesthetic.computer/llms.txt</p> 1279 - <p>Source code: https://github.com/whistlegraph/aesthetic-computer | Pieces (programs): https://github.com/whistlegraph/aesthetic-computer/tree/main/system/public/aesthetic.computer/disks | Runtime: https://github.com/whistlegraph/aesthetic-computer/tree/main/system/public/aesthetic.computer/lib</p> 1279 + <p>Source code: https://tangled.org/aesthetic.computer/core | Pieces (programs): https://tangled.org/aesthetic.computer/core/tree/main/system/public/aesthetic.computer/disks | Runtime: https://tangled.org/aesthetic.computer/core/tree/main/system/public/aesthetic.computer/lib</p> 1280 1280 </article> 1281 1281 <!-- Boot Canvas - VHS style with floating code pages --> 1282 1282 <canvas id="boot-canvas" style="position:fixed;top:0;left:0;width:100vw;height:100vh;height:100dvh;z-index:99999;pointer-events:none;margin:0;padding:0;image-rendering:pixelated;image-rendering:crisp-edges;"></canvas>
+23 -31
system/netlify/functions/version.mjs
··· 9 9 const execFileAsync = promisify(execFile); 10 10 const GIT_REMOTE_OVERRIDE = process.env.VERSION_GIT_REMOTE || ""; 11 11 const GIT_BRANCH = process.env.VERSION_GIT_BRANCH || "main"; 12 + const TANGLED_REPO_URL = 13 + process.env.VERSION_TANGLED_REPO_URL || 14 + "https://knot.aesthetic.computer/aesthetic.computer/core"; 12 15 const RECENT_COMMIT_COUNT = 10; 13 16 const HISTORY_SCAN_LIMIT = 50; 14 17 ··· 112 115 }; 113 116 } 114 117 115 - async function getLatestFromGitHub(deployedCommit) { 116 - const res = await fetch( 117 - "https://api.github.com/repos/whistlegraph/aesthetic-computer/commits?per_page=50", 118 - { 119 - headers: { 120 - "User-Agent": "aesthetic-computer", 121 - Accept: "application/vnd.github.v3+json", 122 - }, 123 - } 118 + async function getLatestFromTangledMirror(deployedCommit) { 119 + const output = await git( 120 + ["ls-remote", TANGLED_REPO_URL, `refs/heads/${GIT_BRANCH}`], 121 + process.cwd(), 124 122 ); 125 - 126 - if (!res.ok) { 127 - throw new Error(`GitHub API returned ${res.status}`); 128 - } 129 - 130 - const commits = await res.json(); 131 - const latestCommit = commits[0]?.sha; 132 - 133 - let behindBy = 0; 134 - if (deployedCommit !== "unknown" && latestCommit) { 135 - const idx = commits.findIndex((c) => 136 - c.sha.startsWith(deployedCommit.slice(0, 7)) 137 - ); 138 - behindBy = idx === -1 ? HISTORY_SCAN_LIMIT : idx; 139 - } 123 + const latestCommit = output.split(/\s+/)[0] || ""; 124 + const behindBy = 125 + deployedCommit !== "unknown" && 126 + latestCommit && 127 + latestCommit.startsWith(deployedCommit.slice(0, 7)) 128 + ? 0 129 + : HISTORY_SCAN_LIMIT; 140 130 141 131 return { 142 132 latestCommit, 143 133 behindBy, 144 - recentCommits: commits.slice(0, RECENT_COMMIT_COUNT).map((c) => ({ 145 - hash: c.sha.slice(0, 7), 146 - message: c.commit?.message?.split("\n")[0]?.slice(0, 60) || "no message", 147 - author: c.commit?.author?.name || c.author?.login || "unknown", 148 - date: c.commit?.author?.date, 149 - })), 134 + recentCommits: latestCommit 135 + ? [{ 136 + hash: latestCommit.slice(0, 7), 137 + message: "latest on Tangled", 138 + author: "tangled.org/aesthetic.computer/core", 139 + date: null, 140 + }] 141 + : [], 150 142 }; 151 143 } 152 144 ··· 180 172 recentCommits, 181 173 } = repoRoot 182 174 ? await getLatestFromTangled(repoRoot, deployedCommit) 183 - : await getLatestFromGitHub(deployedCommit); 175 + : await getLatestFromTangledMirror(deployedCommit); 184 176 185 177 const status = behindBy === 0 ? "current" : "behind"; 186 178
+10 -31
system/public/aesthetic.computer/disks/prompt.mjs
··· 747 747 // Fetch git commit/version status with long-poll for deploy detection 748 748 const fetchVersion = async () => { 749 749 try { 750 - // On localhost, fetch GitHub directly to show latest remote commit 751 - if (location.hostname === "localhost" || location.hostname === "127.0.0.1") { 752 - const ghRes = await fetch( 753 - "https://api.github.com/repos/whistlegraph/aesthetic-computer/commits?per_page=10", 754 - { headers: { Accept: "application/vnd.github.v3+json" } } 755 - ); 756 - if (ghRes.ok) { 757 - const commits = await ghRes.json(); 758 - const currentHash = commits[0]?.sha?.slice(0, 7); 759 - versionInfo = { 760 - deployed: currentHash || "dev", 761 - latest: currentHash, 762 - status: "local", 763 - }; 764 - // Extract commits for uniticker (local dev mode) 765 - recentCommits = commits.map(c => ({ 766 - hash: c.sha.slice(0, 7), 767 - message: c.commit?.message?.split("\n")[0]?.slice(0, 60) || "no message", 768 - author: c.commit?.author?.name || c.author?.login || "unknown", 769 - date: c.commit?.author?.date, 770 - })); 771 - } else { 772 - versionInfo = { deployed: "dev", status: "local" }; 773 - recentCommits = []; 774 - } 775 - needsPaint(); 776 - return; 777 - } 778 750 const res = await fetch("/api/version"); 779 751 if (!res.ok) throw new Error(`HTTP ${res.status}`); 780 752 versionInfo = await res.json(); 753 + if (location.hostname === "localhost" || location.hostname === "127.0.0.1") { 754 + versionInfo = { 755 + ...versionInfo, 756 + deployed: versionInfo.deployed === "unknown" ? "dev" : versionInfo.deployed, 757 + status: "local", 758 + }; 759 + } 781 760 // Store recent commits from the version API 782 761 recentCommits = versionInfo.recentCommits || []; 783 762 needsPaint(); ··· 3863 3842 makeFlash($); 3864 3843 return true; 3865 3844 } else if (text.toLowerCase() === "github" || text === "gh") { 3866 - const githubUrl = "https://github.com/digitpain/aesthetic.computer"; 3867 - if (!openExternalFromIframe(githubUrl)) jump(githubUrl); 3845 + const repoUrl = "https://tangled.org/aesthetic.computer/core"; 3846 + if (!openExternalFromIframe(repoUrl)) jump(repoUrl); 3868 3847 makeFlash($); 3869 3848 return true; 3870 3849 } else if (text.toLowerCase() === "score") { 3871 - const scoreUrl = "https://github.com/whistlegraph/aesthetic-computer/blob/main/SCORE.md"; 3850 + const scoreUrl = "https://tangled.org/aesthetic.computer/core/tree/main/SCORE.md"; 3872 3851 if (!openExternalFromIframe(scoreUrl)) jump(scoreUrl); 3873 3852 makeFlash($); 3874 3853 return true;
+3 -3
system/public/aesthetic.computer/lib/headers.mjs
··· 354 354 ); 355 355 356 356 console.log( 357 - `%cContribute on %cGitHub%c at %chttps://github.com/whistlegraph/aesthetic-computer`, 357 + `%cContribute on %cTangled%c at %chttps://tangled.org/aesthetic.computer/core`, 358 358 "color: #6c757d; font-size: 10px;", 359 - "color: #343a40; font-weight: bold; font-size: 10px;", 359 + "color: #28a745; font-weight: bold; font-size: 10px;", 360 360 "color: #6c757d; font-size: 10px;", 361 - "color: #6c757d; font-size: 10px; text-decoration: underline;" 361 + "color: #28a745; font-size: 10px; text-decoration: underline;" 362 362 ); 363 363 } 364 364 }