187bc16163
mcp station: DJ box (listener requests steer the next sheet, re-cooks up-next) + emoji reactions; URI station2 to bust the host cache
teahubxyzandClaude Opus 5.52026-10-22 20:00:36 +00:00
7fad367d16
mcp: accept /mcp/<token>/<anything> so a fresh connector URL can bust claude.ai's cached tools and UI
teahubxyzandClaude Opus 5.52026-10-22 19:53:48 +00:00
2b1993ba9f
mcp radio: add dj_station (new tool, new ui://gandora/station URI) to escape claude.ai's cached v1 card
teahubxyzandClaude Opus 5.52026-10-22 19:51:51 +00:00
1599709315
mcp radio: new resource URI so the host stops serving the cached v2 card (which still messaged for each track)
teahubxyzandClaude Opus 5.52026-10-22 19:49:11 +00:00
9cff04e694
mcp radio: the card keeps the station going itself (dj_next via inference chat, pre-cooked), no prompt-box messages; compact layout + explicit size reports
teahubxyzandClaude Opus 5.52026-10-22 19:45:05 +00:00
c42a6f5c87
mcp radio: bigger card + report height to host; reactions go to model context (no new prompt), Next stays a message
teahubxyzandClaude Opus 5.52026-10-22 19:40:39 +00:00
ff6e9146cf
mcp: gate the endpoint behind a secret path (/mcp/<TOKEN>) now that it can spend render quota
teahubxyzandClaude Opus 5.52026-10-22 19:26:11 +00:00
c9f3823cc2
mcp: radio spike — Claude DJs gandora in chat (dj_play + ui://gandora/radio; render/speech via service binding to time-inference)
teahubxyzandClaude Opus 5.52026-10-22 19:25:56 +00:00
62f6f3951c
Merge pull request 'split → dev: index.html as ES modules (no build step), for a phone pass' (#4) from split into dev
teahubxyz2026-10-22 06:20:49 +00:00
7cf03eb1f5
dev: webamp.html as on main (tapes, museum skins), so the split merges cleanly
teahubxyzandClaude Opus 5.52026-10-22 06:20:25 +00:00
1239fceb85
docs/v2: the module split already exists on the split branch; point there instead of the brief
teahubxyzandClaude Opus 5.52026-10-22 06:17:11 +00:00
71da0c9a81
docs/v2: brief for splitting index.html into ES modules (no build step)
teahubxyzandClaude Opus 5.52026-10-22 06:14:24 +00:00
7520b8e037
docs/v2: notes from the POC thread for V2 (direction, auth, ACE-Step/Runware repaint+extend, embeddings, pricing, rights, moderation)
teahubxyzandClaude Opus 5.52026-10-22 06:13:58 +00:00
db33db4673
architecture: the file map (ES modules, no build step) and the harness modes as they are now
teahubxyzandClaude Fable 5.12026-10-21 22:34:48 +00:00
189023b66f
docs: the file map after the split, the globals brain.js and the harness use, and the harness modes as they are now
teahubxyzandClaude Fable 5.12026-10-21 22:34:13 +00:00
479e110f5e
split 4/4: player.js (the state machine and the one <audio>, moved as-is), ui/player.js, ui/library.js, ui/sheet.js, ui/taste.js, mashup.js and app.js (boot, window.g, brain.js globals); index.html is markup + CSS + two script tags
Claude Fable 5.12026-10-21 22:31:34 +00:00
cc6c971423
split 3/4, fixed: the inline module imports setFetcher from render.js (the harness stub reaches it through window.g)
Claude Fable 5.12026-10-21 22:29:14 +00:00
5525104679
split.js: setFetcher (added by split-post) belongs to render.js, so the globals block imports it
teahubxyzandClaude Fable 5.12026-10-21 22:28:20 +00:00
cd6e02be11
harness-cdp: when the harness did not run, print the page's uncaught exceptions (a module that failed to load, say)
teahubxyzandClaude Fable 5.12026-10-21 22:27:29 +00:00
baf43525f6
split 3/4: dj.js (the DJ prompt, askDJ/askBreak/askMash, modes, voices, personas, speak) and render.js (venice behind an injectable fetcher, renderTrack, noise and tone generators, wavBlob) out of index.html
Claude Fable 5.12026-10-21 22:24:29 +00:00
5268620470
split-post: the regex-literal false positive (crackle) also points at index.html in the intermediate steps
teahubxyzandClaude Fable 5.12026-10-21 22:23:48 +00:00
7274c21b63
split 2/4: store.js (db, saveStation, remember, the ledger, tapes incl. the KEPT virtual tape, tapeSpec) out of index.html
Claude Fable 5.12026-10-21 22:20:29 +00:00
455f139842
split 1/4: covers.js (hash32, prng, keyHue, palettes, drawCover and the looks) and core.js (state, hooks, $, utils) out of index.html; the rest stays as an inline module
Claude Fable 5.12026-10-21 22:18:36 +00:00
f855ee15b7
split tooling: line-map splitter, post edits, node checks, harness fragments as modules over window.g, a workflow that performs a step
teahubxyzandClaude Fable 5.12026-10-21 22:17:50 +00:00
4683129167
asmr: Inworld is wav-only; re-render Gemini and Grok with their whisper lead (first pass went out without it)
teahubxyz2026-10-21 18:41:11 +00:00
599051c33f
asmr: pull before rendering so back-to-back runs don't collide
teahubxyz2026-10-21 18:41:09 +00:00
7176eb1f86
tools/harness-safari.py: the loop harness in WebKit, driven by safaridriver with a real click
teahubxyzandClaude Fable 5.12026-10-21 09:37:11 +00:00
b1c8e231d7
handoff: the player rules learned the hard way, and the dev-first lane for player changes
teahubxyzandClaude Fable 5.12026-10-21 09:36:43 +00:00
be3bce8aac
handoff: the playing flag follows play()'s promise; a refused play shows TAP TO PLAY instead of a playing UI with no sound
teahubxyzandClaude Fable 5.12026-10-21 09:30:08 +00:00
d97628d1ad
hold: the level is baked into the sample (iOS ignores element volume); OFF holds on pure silence
teahubxyzandClaude Fable 5.12026-10-21 08:38:29 +00:00
1261d14945
stats.html: your numbers, from the ledger and the library, on the device only
teahubxyzandClaude Fable 5.12026-10-21 08:26:41 +00:00
cebaead521
a usage ledger in localStorage (cooks, costs, latency, fallbacks, reactions, plays) for stats.html; the station sheet links to it
teahubxyzandClaude Fable 5.12026-10-21 08:24:31 +00:00
f0bbb5c95c
voices across Venice's TTS models (Qwen3 with a style prompt for whisper/ASMR, Orpheus, ElevenLabs); the persona rides along as the style
teahubxyzandClaude Fable 5.12026-10-21 08:20:42 +00:00
cd1e040688
tones mode: binaural beats (delta..gamma), solfeggio frequencies, isochronic pulses, made on the device in stereo
teahubxyzandClaude Fable 5.12026-10-21 08:18:22 +00:00
5b1f63bd15
noise: made in slices so the page keeps breathing, 16 kHz, brown and crackle a little quieter
teahubxyzandClaude Fable 5.12026-10-21 08:17:29 +00:00
e281e104dd
hold crackle at room-tone level, not music level, and the bed stops the moment the hold starts; station modes: music / freestyle / asmr / noise
teahubxyzandClaude Fable 5.12026-10-21 08:16:15 +00:00
d65505882c
DJ personas: per-station name, voice (with preview), speaking speed and a persona brief; presets incl. ASMR; brief feeds the track prompt and the break scripts
teahubxyzandClaude Fable 5.12026-10-21 07:42:33 +00:00
045b14b6a6
repeat toggle: the on state is a filled ink pill, not a 12% gold tint nobody can see
teahubxyzandClaude Fable 5.12026-10-21 07:37:53 +00:00
ec8c563595
handoff: a track started inside ended counts as playing at once, and the bed never starts while the phase is playing (on iOS a Web Audio start right after the swap could interrupt the element)
teahubxyzandClaude Fable 5.12026-10-21 07:35:44 +00:00
74351fefef
reaction pills alternate above and below the bar when neighbours are close; tapping a pill seeks to its moment
teahubxyzandClaude Fable 5.12026-10-21 07:34:38 +00:00
6e3965bf1c
reaction ticks: hits close together become one pill reading them in order, recomputed from the hit list each time
teahubxyzandClaude Fable 5.12026-10-21 07:28:14 +00:00
9186dc1be6
emoji tray: the last emoji you used always has a slot (one tap puts it in the bar), the other six are the most used
teahubxyzandClaude Fable 5.12026-10-21 07:26:03 +00:00
7c1992278e
the room tone plays through Web Audio (a looping buffer is seamless; the element loop had a gap every pass); the element stays as the fallback and as the player's hold
teahubxyzandClaude Fable 5.12026-10-21 07:22:25 +00:00
cf522e8926
the player's hold uses a short 4 s crackle (handover waits at most one pass); the room tone keeps the long one
teahubxyzandClaude Fable 5.12026-10-21 07:16:08 +00:00
84c7ba1665
room tone decided from the phase, not from the player's paused flag (the unlock clip flipped it and caused an on-off-on fade); the crackle sample is 12 s long
teahubxyzandClaude Fable 5.12026-10-21 07:15:50 +00:00
b11b3b47a2
emoji drawer: opens without grabbing the keyboard; the type-any-emoji box moves to the bottom; taps register on pointerup so a moving drawer can't swallow them
teahubxyzandClaude Fable 5.12026-10-21 07:04:21 +00:00
b11ff4b7b6
reactions: the tray re-ranks after every tap; ticks that land within a second of each other stack upward instead of hiding one another
teahubxyzandClaude Fable 5.12026-10-21 06:56:22 +00:00