brand: the asterisk — white, square terminals. favicon.svg, icons/, manifest, service worker (library plays offline), Media Session, g*ndora wordmark
shots / shots (push) Canceled after 42s

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
This commit is contained in:
teahubxyzandClaude Fable 5.1 committed 2026-10-20 23:40:30 +00:00
1 parent d3ff1799b3
commit bd5eab0c7c
5 files changed
+50 -1

No files matched your search

+8 -1
View File
@@ -1 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="64" height="64" rx="14" fill="#0b0b0e"/><g fill="none" stroke="#e9d8a6" stroke-width="2"><circle cx="32" cy="32" r="24" opacity=".3"/><circle cx="32" cy="32" r="16" opacity=".6"/></g><circle cx="32" cy="32" r="6" fill="#e9d8a6"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
<style>line{stroke:#ededf0}@media (prefers-color-scheme:light){line{stroke:#17171a}}</style>
<g transform="translate(32 32)" stroke-width="9" stroke-linecap="butt">
<line x1="0" y1="-27" x2="0" y2="27"/>
<line x1="-23.4" y1="-13.5" x2="23.4" y2="13.5"/>
<line x1="-23.4" y1="13.5" x2="23.4" y2="-13.5"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 309 B

After

Width:  |  Height:  |  Size: 395 B

+5
View File
@@ -0,0 +1,5 @@
<!doctype html>
<meta charset="utf-8">
<title>icon</title>
<style>html,body{margin:0;height:100%;background:#0b0b0e;overflow:hidden}img{display:block;width:100vmin;height:100vmin}</style>
<img src="icon.svg" alt="">
+8
View File
@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<rect width="512" height="512" fill="#0b0b0e"/>
<g transform="translate(256 256)" stroke="#ededf0" stroke-width="58" stroke-linecap="butt">
<line x1="0" y1="-150" x2="0" y2="150"/>
<line x1="-130" y1="-75" x2="130" y2="75"/>
<line x1="-130" y1="75" x2="130" y2="-75"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 362 B

+16
View File
@@ -0,0 +1,16 @@
{
"name": "gandora",
"short_name": "gandora",
"description": "Type a seed. Get a station. Every song is made for you as it plays.",
"start_url": "/",
"scope": "/",
"display": "standalone",
"orientation": "portrait",
"background_color": "#0b0b0e",
"theme_color": "#0b0b0e",
"icons": [
{ "src": "icons/icon.svg", "sizes": "any", "type": "image/svg+xml", "purpose": "any maskable" },
{ "src": "icons/icon-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any maskable" },
{ "src": "icons/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any maskable" }
]
}
+13
View File
@@ -0,0 +1,13 @@
// gandora's service worker: the shell is cached so the app opens and the library plays with no signal.
// Tracks live in IndexedDB already; the DJ and new renders need the network and the page says so.
const SHELL = "gandora-shell-v1";
const FILES = ["/", "/index.html", "/brain.js", "/favicon.svg", "/manifest.json", "/icons/icon.svg"];
self.addEventListener("install", (e) => { e.waitUntil(caches.open(SHELL).then((c) => c.addAll(FILES)).then(() => self.skipWaiting())); });
self.addEventListener("activate", (e) => { e.waitUntil(caches.keys().then((ks) => Promise.all(ks.filter((k) => k !== SHELL).map((k) => caches.delete(k)))).then(() => self.clients.claim())); });
// same-origin GETs: network first (so a deploy shows up on the next open), cache as the fallback; everything else untouched
self.addEventListener("fetch", (e) => {
const u = new URL(e.request.url);
if (e.request.method !== "GET" || u.origin !== location.origin) return;
e.respondWith(fetch(e.request).then((r) => { if (r.ok) caches.open(SHELL).then((c) => c.put(e.request, r.clone())); return r; })
.catch(() => caches.match(e.request, { ignoreSearch: true }).then((r) => r || caches.match("/"))));
});