teahubxyz and Claude Opus 5.5
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
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_014mBuCaQSgWwqhtzsmTBQuM
2026-10-22 19:45:05 +00:00
teahubxyz and Claude Opus 5.5
c42a6f5c87
mcp radio: bigger card + report height to host; reactions go to model context (no new prompt), Next stays a message
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_014mBuCaQSgWwqhtzsmTBQuM
2026-10-22 19:40:39 +00:00
teahubxyz and Claude Opus 5.5
ff6e9146cf
mcp: gate the endpoint behind a secret path (/mcp/<TOKEN>) now that it can spend render quota
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_014mBuCaQSgWwqhtzsmTBQuM
2026-10-22 19:26:11 +00:00
teahubxyz and Claude Opus 5.5
c9f3823cc2
mcp: radio spike — Claude DJs gandora in chat (dj_play + ui://gandora/radio; render/speech via service binding to time-inference)
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_014mBuCaQSgWwqhtzsmTBQuM
2026-10-22 19:25:56 +00:00
teahubxyz
6da217f4c4
mcp: spike — gandora MCP App audio probe (ui://gandora/probe + get_track)
2026-10-22 19:13:41 +00:00
teahubxyz and Claude Opus 5.5
f173b9dffd
dev: bump the SW REV so phones drop the pre-split cache
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-22 06:21:38 +00:00
teahubxyz
62f6f3951c
Merge pull request 'split → dev: index.html as ES modules (no build step), for a phone pass' ( #4 ) from split into dev
2026-10-22 06:20:49 +00:00
teahubxyz and Claude Opus 5.5
7cf03eb1f5
dev: webamp.html as on main (tapes, museum skins), so the split merges cleanly
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-22 06:20:25 +00:00
teahubxyz and Claude Fable 5.1
4aa94d8315
handoff: the seams after the module split, what the split left alone, the harness modes
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01Dhu3iHseRewQ2WpBSVLokG
2026-10-21 22:35:15 +00:00
teahubxyz and Claude Fable 5.1
2b2936a831
architecture: tidy the render.js row
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01Dhu3iHseRewQ2WpBSVLokG
2026-10-21 22:34:55 +00:00
teahubxyz and Claude Fable 5.1
db33db4673
architecture: the file map (ES modules, no build step) and the harness modes as they are now
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01Dhu3iHseRewQ2WpBSVLokG
2026-10-21 22:34:48 +00:00
teahubxyz and Claude Fable 5.1
4bbe457421
app.js: the comment on the seq accessor
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01Dhu3iHseRewQ2WpBSVLokG
2026-10-21 22:34:19 +00:00
teahubxyz and Claude Fable 5.1
189023b66f
docs: the file map after the split, the globals brain.js and the harness use, and the harness modes as they are now
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01Dhu3iHseRewQ2WpBSVLokG
2026-10-21 22:34:13 +00:00
teahubxyz and Claude Fable 5.1
5525104679
split.js: setFetcher (added by split-post) belongs to render.js, so the globals block imports it
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01Dhu3iHseRewQ2WpBSVLokG
2026-10-21 22:28:20 +00:00
teahubxyz and Claude Fable 5.1
cd6e02be11
harness-cdp: when the harness did not run, print the page's uncaught exceptions (a module that failed to load, say)
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01Dhu3iHseRewQ2WpBSVLokG
2026-10-21 22:27:29 +00:00
teahubxyz and Claude Fable 5.1
5268620470
split-post: the regex-literal false positive (crackle) also points at index.html in the intermediate steps
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01Dhu3iHseRewQ2WpBSVLokG
2026-10-21 22:23:48 +00:00
teahubxyz and Claude Fable 5.1
f33029c261
harness-safari: copy the modules beside the page, not just brain.js
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01Dhu3iHseRewQ2WpBSVLokG
2026-10-21 22:17:59 +00:00
teahubxyz and Claude Fable 5.1
f855ee15b7
split tooling: line-map splitter, post edits, node checks, harness fragments as modules over window.g, a workflow that performs a step
...
The harness fragments now run as inline modules (after app.js) and stub the renderer through render.setFetcher; harness.sh's loop mode goes over http + DevTools like resume (file:// cannot load modules; --dump-dom also hangs on current Chrome). No page change yet.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01Dhu3iHseRewQ2WpBSVLokG
2026-10-21 22:17:50 +00:00
teahubxyz
9376bd8c70
asmr: optional per-voice label
2026-10-21 19:10:18 +00:00
teahubxyz
d8784c0318
asmr: Luna and eve rendered slower natively (pitch kept), to A/B against the 0.9× toggle
asmr / render (push) Successful in 1m10s
2026-10-21 19:10:16 +00:00
teahubxyz
f02bc04c98
asmr: show cost per clip and per minute of audio on every voice
2026-10-21 19:01:51 +00:00
teahubxyz
8d200c5988
asmr: Venice TTS prices (USD per 1M input characters, from /models)
asmr / render (push) Successful in 1m0s
2026-10-21 19:01:40 +00:00
teahubxyz
4683129167
asmr: Inworld is wav-only; re-render Gemini and Grok with their whisper lead (first pass went out without it)
asmr / render (push) Successful in 1m20s
2026-10-21 18:41:11 +00:00
teahubxyz
599051c33f
asmr: pull before rendering so back-to-back runs don't collide
asmr / render (push) Successful in 1m23s
2026-10-21 18:41:09 +00:00
teahubxyz
87de965fc9
asmr: hide the next-round list when it's empty; absolute favicon for the subdomain
2026-10-21 18:36:44 +00:00
teahubxyz
6803dfb029
asmr: per-voice lead/tail around the script (whisper tags, spoken direction)
asmr / render (push) Failing after 1m32s
2026-10-21 18:36:07 +00:00
teahubxyz
97e246507c
asmr: round two — Inworld, Gemini, MiniMax, Grok
asmr / render (push) Successful in 1m40s
2026-10-21 18:35:31 +00:00
teahubxyz
dc1843c56d
asmr: render workflow
asmr / render (push) Successful in 4m30s
2026-10-21 18:25:19 +00:00
teahubxyz
f41c7abaac
asmr: sampler page
2026-10-21 18:24:48 +00:00
teahubxyz
e1e299788a
asmr: renderer for the voice bake-off
2026-10-21 18:23:57 +00:00
teahubxyz
5e5b3b9e66
asmr: voice bake-off config
2026-10-21 18:23:46 +00:00
teahubxyz and Claude Fable 5.1
7176eb1f86
tools/harness-safari.py: the loop harness in WebKit, driven by safaridriver with a real click
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 09:37:11 +00:00
teahubxyz and Claude Fable 5.1
234dd00379
harness: safari mode (WebKit over safaridriver, real activation)
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 09:36:51 +00:00
teahubxyz and Claude Fable 5.1
b1c8e231d7
handoff: the player rules learned the hard way, and the dev-first lane for player changes
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 09:36:43 +00:00
teahubxyz and Claude Fable 5.1
be3bce8aac
handoff: the playing flag follows play()'s promise; a refused play shows TAP TO PLAY instead of a playing UI with no sound
...
shots / shots (push) Successful in 2m15s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 09:30:08 +00:00
teahubxyz and Claude Fable 5.1
36a8d64684
voice preview: one at a time; a later tap stops the earlier one, even mid-fetch
...
shots / shots (push) Successful in 2m21s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 08:41:54 +00:00
teahubxyz and Claude Fable 5.1
6071116a26
station sheet: the × stays put while the sheet scrolls
...
shots / shots (push) Canceled after 42s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 08:41:08 +00:00
teahubxyz and Claude Fable 5.1
12f92bc28f
station sheet scrolls (capped at 88vh); the DJ section is a collapsed disclosure
...
shots / shots (push) Canceled after 34s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 08:40:53 +00:00
teahubxyz and Claude Fable 5.1
d97628d1ad
hold: the level is baked into the sample (iOS ignores element volume); OFF holds on pure silence
...
shots / shots (push) Successful in 2m21s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 08:38:29 +00:00
teahubxyz and Claude Fable 5.1
dbe369d2c3
station name: bigger, in ink
...
shots / shots (push) Successful in 2m19s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 08:32:08 +00:00
teahubxyz and Claude Fable 5.1
1dc150f977
room tone OFF switch next to the slider; off means no bed and a silent hold
...
shots / shots (push) Canceled after 2m15s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 08:30:07 +00:00
teahubxyz and Claude Fable 5.1
d22117ba55
sw: stats.html offline too
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 08:26:51 +00:00
teahubxyz and Claude Fable 5.1
1261d14945
stats.html: your numbers, from the ledger and the library, on the device only
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 08:26:41 +00:00
teahubxyz and Claude Fable 5.1
cebaead521
a usage ledger in localStorage (cooks, costs, latency, fallbacks, reactions, plays) for stats.html; the station sheet links to it
...
shots / shots (push) Failing after 2m20s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 08:24:31 +00:00
teahubxyz and Claude Fable 5.1
f0bbb5c95c
voices across Venice's TTS models (Qwen3 with a style prompt for whisper/ASMR, Orpheus, ElevenLabs); the persona rides along as the style
...
shots / shots (push) Canceled after 2m15s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 08:20:42 +00:00
teahubxyz and Claude Fable 5.1
cd1e040688
tones mode: binaural beats (delta..gamma), solfeggio frequencies, isochronic pulses, made on the device in stereo
...
shots / shots (push) Canceled after 2m15s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 08:18:22 +00:00
teahubxyz and Claude Fable 5.1
5b1f63bd15
noise: made in slices so the page keeps breathing, 16 kHz, brown and crackle a little quieter
...
shots / shots (push) Canceled after 28s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 08:17:29 +00:00
teahubxyz and Claude Fable 5.1
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
...
shots / shots (push) Canceled after 1m55s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 08:16:15 +00:00
teahubxyz and Claude Fable 5.1
c1606fdf9b
welcome: a DJ with a chosen name keeps it instead of picking one
...
shots / shots (push) Successful in 2m15s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 07:42:43 +00:00
teahubxyz and Claude Fable 5.1
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
...
shots / shots (push) Canceled after 29s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 07:42:33 +00:00
teahubxyz and Claude Fable 5.1
045b14b6a6
repeat toggle: the on state is a filled ink pill, not a 12% gold tint nobody can see
...
shots / shots (push) Successful in 2m23s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 07:37:53 +00:00
teahubxyz and Claude Fable 5.1
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)
...
shots / shots (push) Canceled after 2m17s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 07:35:44 +00:00
teahubxyz and Claude Fable 5.1
74351fefef
reaction pills alternate above and below the bar when neighbours are close; tapping a pill seeks to its moment
...
shots / shots (push) Canceled after 1m48s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 07:34:38 +00:00
teahubxyz and Claude Fable 5.1
f62ebdc79b
room tone default 18% (was 35%); a saved higher level is brought down once
...
shots / shots (push) Successful in 2m21s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 07:31:27 +00:00
teahubxyz and Claude Fable 5.1
6e3965bf1c
reaction ticks: hits close together become one pill reading them in order, recomputed from the hit list each time
...
shots / shots (push) Successful in 2m25s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 07:28:14 +00:00
teahubxyz and Claude Fable 5.1
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
...
shots / shots (push) Canceled after 2m20s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 07:26:03 +00:00
teahubxyz and Claude Fable 5.1
4df29cc14f
bed: when Web Audio takes over, the element is silenced
...
shots / shots (push) Successful in 2m20s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 07:22:57 +00:00
teahubxyz and Claude Fable 5.1
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
...
shots / shots (push) Canceled after 56s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 07:22:25 +00:00
teahubxyz and Claude Fable 5.1
cf522e8926
the player's hold uses a short 4 s crackle (handover waits at most one pass); the room tone keeps the long one
...
shots / shots (push) Successful in 2m18s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 07:16:08 +00:00
teahubxyz and Claude Fable 5.1
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
...
shots / shots (push) Canceled after 34s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 07:15:50 +00:00
teahubxyz and Claude Fable 5.1
9213647549
emoji drawer above the scrim (it was underneath it, so every tap closed it)
...
shots / shots (push) Successful in 2m15s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 07:08:39 +00:00
teahubxyz and Claude Fable 5.1
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
...
shots / shots (push) Successful in 2m17s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 07:04:21 +00:00
teahubxyz and Claude Fable 5.1
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
...
shots / shots (push) Successful in 2m18s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 06:56:22 +00:00
teahubxyz and Claude Fable 5.1
70c630711b
webamp: mixtapes in the Open menu / LOAD LIST, SAVE LIST makes a tape from the playlist, ~40 Winamp Skin Museum skins in Options › Skins plus any museum link
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 06:47:39 +00:00
teahubxyz and Claude Fable 5.1
6e0259daff
library opens again: the playing tile's class list no longer gets an empty token (which threw and aborted the render)
...
shots / shots (push) Successful in 2m26s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 06:29:08 +00:00
teahubxyz and Claude Fable 5.1
c5991ebc36
a little 🦙 in the library's cost line opens Winamp
...
shots / shots (push) Successful in 2m16s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 06:25:46 +00:00
teahubxyz and Claude Fable 5.1
105609b4b1
webamp.html on main: the library in Winamp with Milkdrop (gandora.lol/webamp.html)
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 06:21:50 +00:00
teahubxyz and Claude Fable 5.1
582e5bebf2
typed "no X" / "less X" goes on the avoid list and marks X as a disliked tag; "more X" the reverse; the DJ is told the avoid list is a hard rule that outranks the taste model
...
shots / shots (push) Failing after 2m21s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 06:20:49 +00:00
teahubxyz and Claude Fable 5.1
a4dab59f21
brain: typed negatives count against the track, warm words never include what the station was told to avoid, a young station gets only a faint region prior from the other stations (no words), and the listener's avoid list wins
...
shots / shots (push) Canceled after 42s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 06:20:23 +00:00
teahubxyz and Claude Fable 5.1
fb265d0c9f
dev: /webamp.html — the library in Winamp, with Milkdrop (Butterchurn) as the visualizer
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 06:18:00 +00:00
teahubxyz and Claude Fable 5.1
fc0bfe05a6
Merge pull request 'playback: one explicit state machine (idle → cooking → holding → playing → ended)' ( #1 ) from playback-state-machine into main
...
shots / shots (push) Successful in 2m24s
playback as one state machine; brain.js via hooks; db.get; harness resume mode; docs (#1 )
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 06:14:04 +00:00
teahubxyz and Claude Fable 5.1
1aeebac6f2
harness: a resume mode (autoplay blocked); docs for the state machine and hooks
...
tools/harness.sh resume seeds IndexedDB with a station and one rendered
track, resumes it with no user gesture and expects the TAP TO PLAY wait.
IndexedDB needs http, so the page is served from a temp folder; headless
Chrome's virtual time doesn't wait for IndexedDB, so this mode is driven in
real time over the DevTools protocol (tools/harness-cdp.py, stdlib only).
The loop harness now prints state.phase too.
ARCHITECTURE.md describes the machine as implemented; HANDOFF.md lists what
was found and left alone; STORAGE.md gains db.get and the tapes store (the
code already had both); README points at the new files.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 06:01:48 +00:00
teahubxyz and Claude Fable 5.1
dddf8f0add
brain: plug into the page's hooks instead of overriding its functions
...
hooks.djPrompt, hooks.stationOpened, hooks.jobMade and hooks.reacted carry what
the djPrompt / openStation / makeJob / react reassignments did; same behaviour.
countPlay reads its one row with db.get instead of db.all().
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 05:58:46 +00:00
teahubxyz and Claude Fable 5.1
eb110e827b
playback: one explicit state machine, hooks for brain.js, db.get for single rows
...
state.phase (idle → cooking → holding → playing → ended) with named transitions
(toCooking, toHolding, toPlaying, startNow, handOver, toEnded, toIdle) replaces
the three overlapping mechanisms (playJob/advance, swapNow, the crackle hold with
state.holding/pendingJob). state.holding is now a read-only view of the phase.
Behaviour unchanged; the harness prints the same state lines before and after.
A `hooks` object (djPrompt, jobMade, stationOpened, reacted) is what brain.js
plugs into instead of overriding page functions by assignment.
db.all() used to find one row becomes db.get(id); tapes go through tapeById
(KEPT is virtual). setSource drops old object URLs but never the crackle's.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 05:57:59 +00:00
teahubxyz and Claude Fable 5.1
7453484460
a blocked resume no longer double-handles the first tap: the unlock starts playback and the play button's own click is ignored for that tap (it used to pause it straight back)
...
shots / shots (push) Successful in 2m20s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 05:28:20 +00:00
teahubxyz and Claude Fable 5.1
a54bfdff7e
harness needs no audio file: it renders a generated wav; README wording
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 05:24:42 +00:00
teahubxyz and Claude Fable 5.1
4a33a30820
docs: README (what it is, how it runs), ARCHITECTURE (every moving part, the playback state machine, the data), HANDOFF (seams, known rough edges, what a refactor should keep); tools/harness.html as the playback regression test
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 05:24:03 +00:00
teahubxyz and Claude Fable 5.1
8fc613ed20
the room tone tries to start on load (plays where the browser allows, otherwise on the first tap) — the seed page is never silent for want of a gesture
...
shots / shots (push) Successful in 2m22s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 05:17:12 +00:00
teahubxyz and Claude Fable 5.1
131f3b255b
when a resume on load is blocked by autoplay rules, the cover says TAP TO PLAY and the first tap anywhere starts it; any play that succeeds counts as the unlock
...
shots / shots (push) Canceled after 1m48s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 05:16:09 +00:00
teahubxyz and Claude Fable 5.1
c14e3452ea
crackle eases in over 600 ms and the bed decision waits 300 ms, so a source swap never fires a burst; default level 35%
...
shots / shots (push) Successful in 2m21s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 05:04:08 +00:00
teahubxyz and Claude Fable 5.1
a6cb989fd8
crackle: mix in float, clamp once into 16-bit (overlapping pops could wrap in the int buffer and click)
...
shots / shots (push) Successful in 2m16s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 05:00:11 +00:00
teahubxyz and Claude Fable 5.1
fb6497161e
playback: the next track starts cooking before the play call, not after it resolves; the crackle fades the moment play resolves (not only on the playing event); the crackle itself is 12 dB louder (it sat at -27 dBFS, which is why nobody heard it)
...
shots / shots (push) Canceled after 34s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 04:59:49 +00:00
teahubxyz and Claude Fable 5.1
de1537050e
reactions land in time: each tap keeps where in the track it hit (and which lyric section), shows as a tick on the bar, and the DJ hears " 🔥 at 0:42 (chorus)"
...
shots / shots (push) Successful in 2m23s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 04:52:13 +00:00
teahubxyz and Claude Fable 5.1
778ffcf925
mashups: ⚡ MASHUP on any tape takes up to three of its tracks — the DJ writes one sheet from their sheets, the renderer hears them stitched together with crossfades — and the result goes next on the station
...
shots / shots (push) Successful in 2m17s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 04:46:31 +00:00
teahubxyz and Claude Fable 5.1
03251b5948
the tab says g*ndora, and the track while one plays
...
shots / shots (push) Successful in 2m23s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 04:38:27 +00:00
teahubxyz and Claude Fable 5.1
d08be95048
mixtape covers: each tape gets its own generated cover, drawn from its tracks (their keys, tempo, energy and tags blended; the mark counts the tracks) — in the strip and at the top of the tape page
...
shots / shots (push) Successful in 2m23s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 04:33:54 +00:00
teahubxyz and Claude Fable 5.1
d4d5171f43
crackle level: quieter samples, bed default 80%, so the hold (played by the main player at full volume) matches the room tone
...
shots / shots (push) Canceled after 1m55s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 04:32:50 +00:00
teahubxyz and Claude Fable 5.1
3ee513ad34
volume and room-tone sliders in the station sheet, remembered
...
shots / shots (push) Canceled after 0s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 04:32:36 +00:00
teahubxyz and Claude Fable 5.1
cf00f15447
the crackle is the room tone: it runs whenever music isn't playing (seed screen, cooking, paused) from the first tap on, and fades out the moment a track starts
...
shots / shots (push) Canceled after 34s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 04:32:12 +00:00
teahubxyz and Claude Fable 5.1
73b603970e
the unlock clip is built in code (the pasted base64 was corrupt, so the unlock never happened: no crackle, no first autoplay)
...
shots / shots (push) Successful in 2m23s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 04:01:55 +00:00
teahubxyz and Claude Fable 5.1
bbf3ceb918
play first, then the bookkeeping: the track starts before it is written to the library, not after (a big library made that write take seconds, and a stalled one meant no sound at all)
...
shots / shots (push) Canceled after 1m58s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 04:00:29 +00:00
teahubxyz and Claude Fable 5.1
00fa658b70
the unlock clip ending is not a track ending
...
shots / shots (push) Successful in 2m19s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 03:55:16 +00:00
teahubxyz and Claude Fable 5.1
077acd2dbc
library: the now-playing bar is current when the library opens
...
shots / shots (push) Canceled after 1m56s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 03:53:33 +00:00
teahubxyz and Claude Fable 5.1
574a91d838
library: tap a tile and it plays while you stay; the playing tile is ringed and badged; a now-playing bar at the bottom with pause and a way back to the player
...
shots / shots (push) Canceled after 0s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 03:53:18 +00:00
teahubxyz and Claude Fable 5.1
db701b1b94
adding a track to the KEPT tape keeps it
...
shots / shots (push) Canceled after 2m17s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 03:50:58 +00:00
teahubxyz and Claude Fable 5.1
66388aa1d6
KEPT is a tape: every kept track, newest last, always first in the tapes strip; play all / repeat / share like any tape; removing from it un-keeps; can't be renamed or deleted
...
shots / shots (push) Canceled after 0s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 03:50:49 +00:00
teahubxyz and Claude Fable 5.1
ad1b7abf69
top nav and wordmark clear the status bar / notch (safe-area inset plus a little more)
...
shots / shots (push) Canceled after 1m41s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 03:49:24 +00:00
teahubxyz and Claude Fable 5.1
8ad3efa2f8
db.get: one row by id instead of loading every track (with its audio) to find one — KEEP, the trail jump, remember and the welcome lookups were reading the whole library on each tap, which on a phone takes seconds
...
shots / shots (push) Canceled after 2m14s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 03:47:41 +00:00
teahubxyz and Claude Fable 5.1
d062e2a067
a skip during the hold drops the waiting track instead of playing it
...
shots / shots (push) Successful in 2m15s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 03:43:39 +00:00
teahubxyz and Claude Fable 5.1
bc4f1c8499
the crackle is a queue slot: it loops until the next track has landed, then hands over at the end of its loop, inside its own ended event — no cut mid-crackle, and the locked-screen handoff is synchronous
...
shots / shots (push) Canceled after 27s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 03:43:29 +00:00