Commit Graph
100 Commits
Author SHA1 Message Date
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude 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
teahubxyzandClaude Fable 5.1 45766b31d1 shots workflow: stamp sw.js with the commit and commit it along with the shots
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 03:41:06 +00:00
teahubxyzandClaude Fable 5.1 98541c5cf0 sw.js carries a build stamp; the shots workflow writes the commit into it so installed apps notice every update
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 03:40:54 +00:00
teahubxyzandClaude Fable 5.1 b4809dbbe1 updates: the app checks for a new version on every return to the foreground and shows a NEW VERSION · RELOAD pill; RELOAD is also on the seed screen for the installed app
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:40:36 +00:00
teahubxyzandClaude Fable 5.1 e699de83aa repeat survives the crackle hold
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:38:41 +00:00
teahubxyzandClaude Fable 5.1 2edb835cc7 if the next track isn't cooked when one ends, the player itself loops the crackle inside the ended event, so a locked phone keeps a live playback session until the track lands
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:38:29 +00:00
teahubxyzandClaude Fable 5.1 7d10ff41d7 locked-screen continuity: when a track ends and the next is already cooked, the swap to it happens synchronously inside the ended event (iOS only lets playback continue that way in the background); the bookkeeping follows
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:36:43 +00:00
teahubxyzandClaude Fable 5.1 5725ed3ebc station sheet: an × in the top right instead of a CLOSE button
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 03:15:46 +00:00
teahubxyzandClaude Fable 5.1 38c5a9ec76 crackle starts the moment there's nothing ready to play (DJ writing + render), and is loud enough to hear
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:13:14 +00:00
teahubxyzandClaude Fable 5.1 b891f698e5 emoji tray: seven most-used + the picker
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 03:08:19 +00:00
teahubxyzandClaude Fable 5.1 0bf78b5d8a meta chips say intermission / sponsored / remix
shots / shots (push) Canceled after 33s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 03:07:26 +00:00
teahubxyzandClaude Fable 5.1 94edeaca94 scrub the progress bar (tap or drag, with a time readout while dragging); remixes say so on the meta line
shots / shots (push) Canceled after 33s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 03:07:11 +00:00
teahubxyzandClaude Fable 5.1 fcdaaff678 station sheet gets STATION FROM THIS TRACK and SHARE STATION; the * STATION pill goes; one fewer emoji in the tray so + stays on the row on phones
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 03:04:23 +00:00
teahubxyzandClaude Fable 5.1 97d8bc938f the first tap unlocks the crackle too
shots / shots (push) Successful in 2m43s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 02:49:50 +00:00
teahubxyzandClaude Fable 5.1 8607d325ef share links carry the render seed, length, meter, look and palette, so the other end hears the same song; vinyl crackle while a track cooks and between tracks (a second quiet <audio>, no Web Audio, so iOS is fine)
shots / shots (push) Canceled after 36s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 02:49:37 +00:00
teahubxyzandClaude Fable 5.1 006597719f the unlock clip is 50 ms of real silence (an empty wav is rejected by some players)
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 02:35:01 +00:00
teahubxyzandClaude Fable 5.1 027d069787 prime only while no track is loaded
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 02:34:06 +00:00
teahubxyzandClaude Fable 5.1 0ffeefe94d mobile: the first tap anywhere unlocks the player (silent clip inside the gesture) so the first track autoplays when it lands; on iOS the cover pulses to the beat instead of the spectrum, so music keeps playing with the screen off and ignores the mute switch
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 02:33:56 +00:00
teahubxyzandClaude Fable 5.1 d372da5950 breaks look like breaks: the cover goes monochrome under an ON AIR ring with the asterisk as the mark
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 02:22:33 +00:00
teahubxyzandClaude Fable 5.1 9da4b4db14 speak() works with a personal Venice key too
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 02:15:03 +00:00
teahubxyzandClaude Fable 5.1 5f8afacda9 spoken breaks are read by a TTS voice the DJ keeps (welcome, recap, shout-out, tease); sung breaks stay on the song model; errors name the renderer, not Venice
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 02:14:53 +00:00
teahubxyzandClaude Fable 5.1 2c53627bac shots workflow: no pip step, the icon script needs nothing
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 02:10:37 +00:00
teahubxyzandClaude Fable 5.1 f718d1869e icons: standard-library PNG writer (the runner has no pip)
shots / shots (push) Failing after 2m16s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 02:10:31 +00:00
teahubxyzandClaude Fable 5.1 4bc0dacd97 welcome break comes after the third track, when the brain turns on
shots / shots (push) Failing after 2m15s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 02:04:59 +00:00
teahubxyzandClaude Fable 5.1 71e4feee03 welcome break: after the first track the DJ pops on once — a name they pick and keep, the station's name, what the station listens for, react or drop a line, thanks for listening to gandora, enjoy
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 02:04:32 +00:00
teahubxyzandClaude Fable 5.1 0874f1566a intermissions wait until the station has three real tracks (when the brain wakes up)
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 02:02:37 +00:00
teahubxyzandClaude Fable 5.1 37bf31d6ba brain: intermissions of any kind stay out of taste
shots / shots (push) Canceled after 2m21s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 01:59:52 +00:00
teahubxyzandClaude Fable 5.1 4f96b9ec82 DJ intermissions: every fifth slot is a 30 s break — ident, recap of the last tracks, tease of what's next, a shout-out to the listener, or the pro word — in the station's own sound, marked, kept out of taste
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 01:59:45 +00:00
teahubxyzandClaude Fable 5.1 a178e5c9b2 shots workflow: Pillow for the icons; rerun when the icon script changes
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 01:58:09 +00:00
teahubxyzandClaude Fable 5.1 c488529e14 icons: drawn by tools/icons.py (Pillow, supersampled), not screenshotted — the runner's Chrome cropped them
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 01:58:01 +00:00
teahubxyzandClaude Fable 5.1 fb1f816ebe brain: sponsored idents never train taste or appear in THE FIVE
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 01:53:41 +00:00
teahubxyzandClaude Fable 5.1 fc2170ab70 sponsored: every sixth track is a 30 s station ident in the station's own style — thanks for listening to g*ndora, a nod to pro — marked SPONSORED, kept out of taste
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 01:53:34 +00:00
teahubxyzandClaude Fable 5.1 390323baf9 remix: the reference sets the length, so when the DJ changed the length by 30 s or more the remix goes without it
shots / shots (push) Successful in 3m53s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 01:45:30 +00:00
teahubxyzandClaude Fable 5.1 6a8e8bed8c trail: bigger thumbs on the cover
shots / shots (push) Successful in 2m36s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 01:31:16 +00:00
teahubxyzandClaude Fable 5.1 c82a340d15 brain: track length is an input to the taste net
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 01:29:58 +00:00
teahubxyzandClaude Fable 5.1 d9dbedd956 icons: PNGs for the installed app (separate any / maskable entries), SVG keeps explicit size; desktop PWA icon was clipped
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 01:29:44 +00:00
teahubxyzandClaude Fable 5.1 e89bb9c538 length and meter are the DJ's to choose (30–300 s, 4/4 3/4 6/8 …), steered by what the listener says; remixes and track-born stations hand the source audio to the renderer as a reference
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 01:29:18 +00:00
teahubxyzandClaude Fable 5.1 31805089f0 start a station from a track (pandora-style): * STATION pill on the player and a * button on library tiles — the track opens the new station, its tags seed the taste, the DJ carries on from there
shots / shots (push) Successful in 2m24s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 00:30:28 +00:00
teahubxyzandClaude Fable 5.1 f8527d6d76 taste: the five picks say what they are
shots / shots (push) Canceled after 2m8s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6897PWcUEwHiqZMcVnNF6
2026-10-21 00:27:34 +00:00
teahubxyzandClaude Fable 5.1 150a1cc14a taste: the five picks sit at the top, under the tabs
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 00:27:27 +00:00
teahubxyzandClaude Fable 5.1 83bf464b49 taste canvases read the theme's colours instead of hard-coded dark ones
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-20 23:53:40 +00:00