Skip to content

Releases: wine-fall/murmur

murmur 0.3.5

Choose a tag to compare

@wine-fall wine-fall released this 29 Oct 05:21
adc12fe

Eleven commits since v0.3.4 — every minute on the air now belongs to a
named program; the brain runs on one model with its usage logged; Bilibili
answers from its own web API; picks search a scene or a mood instead of a
name they already knew; AI-made songs get a slot of their own, drawn from
deeper and cleaner Bilibili tag lines, falling back to a real artist when
none fits; and music-policy.md becomes your notes on top of the built-in
rules instead of a replacement for them.

What's Changed

  • chore(notices): announce 0.3.4 in the launch bubble by @wine-fall in #311
  • fix(director): the opener holds the air until live audio is ready [spec 04] by @wine-fall in #312
  • feat(tui): Tab opens the whole notice when the bubble cuts it [spec 10] by @wine-fall in #313
  • fix(music): Bilibili search returns songs the pick can judge [spec 14] by @wine-fall in #314
  • feat(brain): one model for every call, usage logged by category [spec 03-01] by @wine-fall in #315
  • feat(programs): every minute on the air belongs to a program [spec 15] by @wine-fall in #316
  • fix(music): Bilibili answers from its own web API, yt-dlp second [spec 14] by @wine-fall in #317
  • feat(music): the channel pool reads tag lines, so AI-made music has a place to be found [spec 14] by @wine-fall in #318
  • feat(music): the AI slot plays one of the channels pool's AI-made songs [spec 14] by @wine-fall in #320
  • feat(music): the default policy searches the frame, never a name [spec 03-01] by @wine-fall in #319
  • feat(music): the listener's music-policy.md is added to the default, never in place of it [spec 03-01] by @wine-fall in #321
  • feat(music): the AI slot reads three pages of tag rows, originals only, and falls back to a real song when none fits [spec 14] by @wine-fall in #322
  • chore(release): 0.3.5 by @wine-fall in #323

Full Changelog: v0.3.4...v0.3.5

murmur 0.3.4

Choose a tag to compare

@wine-fall wine-fall released this 14 Oct 09:18
b280844

Twelve commits since v0.3.3. The host stops fishing for a reply: it talks
on its own and lets a line stand, instead of asking you something and then
telling you that you don't have to answer. murmur now runs on Node 22.16+
as well as 24, and if your Node comes from nvm, fnm, asdf or mise, setup
offers a small shim so the murmur command survives a project switching
Node. Something you tell the host now reaches what it knows about you in
the same session; a blank upload no longer airs as a song; a song's outro
no longer gets a coda after it has already ended; the first beat no longer
waits on a pick still resolving; and the pet can say one notice at launch.

What's Changed

  • feat(tui): let the pet say one launch notice [spec 10] by @wine-fall in #298
  • fix(music): a blank upload stops airing as a song [spec 03-01] by @wine-fall in #299
  • fix(memory): fold a stated fact into the profile the same session [spec 05-01] by @wine-fall in #301
  • fix(tui): a card cuts the ripple off instead of lifting it [spec 10] by @wine-fall in #300
  • fix(director): no coda rides an outro that already ended [spec 04] by @wine-fall in #302
  • test(ci): stabilize invitation timing and restore the README demo by @wine-fall in #303
  • docs(readme): play the product film inline by @wine-fall in #304
  • docs(readme): lead with the experience, three-line first run by @wine-fall in #305
  • fix(director): a dead start never waits on a pick still resolving [spec 04] by @wine-fall in #306
  • feat(setup): pin the command past a Node switch; publish on Node 22.16+ [spec 03-03] by @wine-fall in #307
  • fix(persona): the host broadcasts and never fishes for a reply [spec 06] by @wine-fall in #308
  • chore(deps): claude-agent-sdk ^0.3.220 -> ^0.3.296 by @wine-fall in #309
  • chore(release): 0.3.4 by @wine-fall in #310

Full Changelog: v0.3.3...v0.3.4

murmur 0.3.3

Choose a tag to compare

@wine-fall wine-fall released this 23 Sep 03:26
07f3bcf

Five commits since v0.3.2, all of them about what you actually hear. The radio
no longer opens on half a minute of silence — it says something about two
seconds after launch, and signs off on the way out instead of cutting the
sound. The pick stopped replaying the same shortlist: it knows what you already
know across every platform you have mounted, and keeps somewhere to go besides
memory. And the default female voice is no longer a copy of a copy of a copy —
it is cloned from a real recording.

One note on that last one: it changes the clip a voice is cloned from, not
any voice already pinned in your ~/.murmur/voice.json. A new listener picking
the female timbre during setup gets it automatically. If you are already
running murmur and want it, reopen the setup conversation (murmur --setup, or
/setup in the TUI) and say you want to change the voice — it will clone the
new clip under your own key.

What's Changed

  • feat(music): stop handing the brain a playlist to replay [spec 14] by @wine-fall in #288
  • feat(music): give the pick somewhere to go besides memory [spec 14] by @wine-fall in #289
  • feat(music): let the pick know what the listener already knows [spec 14] by @wine-fall in #291
  • feat(talk): open and sign off from stock lines [spec 04] by @wine-fall in #292
  • feat(voice): clone the default female voice from a real recording [spec 03-03] by @wine-fall in #296
  • chore(release): 0.3.3 by @wine-fall in #297

Full Changelog: v0.3.2...v0.3.3

murmur 0.3.2

Choose a tag to compare

@wine-fall wine-fall released this 21 Sep 06:13
7fc143b

Six PRs since v0.3.1. What the listener keeps now accumulates instead of being
overwritten, and each list carries its own clock; the pick's half of the digest
is chosen for the moment it happens in rather than replaying the same forty
songs all day; and a song found on NetEase plays from YouTube when it can.
Three fixes came with them: the digest stops spending its budget on what was
only watched, the TUI clock stops counting past the end of the song, and the
first line after a gap no longer picks up mid-sentence.

What's Changed

  • fix(taste): the digest stops spending its budget on what they watched [spec 14] by @wine-fall in #278
  • feat(taste): what the listener keeps accumulates, and each list has its own clock [spec 14] by @wine-fall in #280
  • feat(taste): the pick's half of the digest is chosen for the moment it happens in [spec 14] by @wine-fall in #283
  • feat(music): a song found on NetEase plays from YouTube when it can [spec 14] by @wine-fall in #282
  • fix(tui): the clock stops counting past the end of the song [spec 10] by @wine-fall in #281
  • fix(talk): the first line after a gap stops picking up mid-sentence [spec 05] by @wine-fall in #285
  • chore(test): the director polls wait ~5s, so a real mark isn't a flake by @wine-fall in #286
  • chore(release): 0.3.2 by @wine-fall in #287

Full Changelog: v0.3.1...v0.3.2

murmur 0.3.1

Choose a tag to compare

@wine-fall wine-fall released this 20 Sep 02:51
175f16a

Four fixes since v0.3.0, all of them things the radio had been getting wrong
about you. A request made for one afternoon no longer becomes who you are, and
a song you heard this afternoon stops coming back tonight — the avoid-list is
read by age now, seven days, because repetition is felt in time and not in
track counts. The pick stopped paying for reasoning it never read: 82 s down to
11.6 s against a faked network, 29-30 s end to end. The setup guide can finally
answer what the reading speed is set to instead of only changing it. And every
Claude call was re-tiered by what a mistake costs — the voice you hear and the
profile you keep run on opus, the background picks on sonnet, nothing below.

What's Changed

  • fix(setup): the guide reads the knobs it can write, and the switch says when it cuts [spec 03-03] by @wine-fall in #270
  • perf(music): the pick stops paying for thinking it never reads [spec 04] by @wine-fall in #271
  • fix(memory): a request made for this afternoon stops becoming who you are [spec 05-01] by @wine-fall in #276
  • fix(music): a song you heard this afternoon stops coming back tonight [spec 03-01] by @wine-fall in #277
  • chore(release): 0.3.1 by @wine-fall in #279

Full Changelog: v0.3.0...v0.3.1

murmur 0.3.0

Choose a tag to compare

@wine-fall wine-fall released this 17 Sep 07:52
6febd44

Sixty-two commits since v0.2.1 — the taste sources the radio can finally
read (NetEase, Spotify, Bilibili and QQ Music, each signed into by scanning
a code or by lending Chrome's own profile), /sources as a list to tick with
every result landing in the card, real-world topics the host can bring up
unprompted, a memory that recalls and forgets on a stated contract, a coda
that knows the song happened and a prefetch that runs two picks deep, a
first run that is one step table you can walk back through, and MIT on the
licence line.

One thing to know on the way in: the first launch folds an older profile
back to faded, so a returning listener's taste starts over.

What's Changed

  • fix(engine): music decodes at the device's real sample rate, not a fixed 48 kHz [spec 03-02] by @wine-fall in #194
  • chore(test): a real ~/.murmur on the developer's machine never decides a test by @wine-fall in #195
  • feat(music): the way into a track, not a label on it [spec 03-02] by @wine-fall in #199
  • feat(director): a coda — the beat that knows the song happened [spec 04] by @wine-fall in #200
  • feat(memory): recall & forgetting — memory v1.5 [spec 05-01] by @wine-fall in #196
  • fix(prompts): the clock is bearings, not a line [spec 04] by @wine-fall in #201
  • docs(roadmap): the login the catalogue asks for, and an order to read the lines by by @wine-fall in #204
  • feat(talk): real-world topics — an off-loop pool the host can mention [spec 13] by @wine-fall in #203
  • docs(roadmap): line 2 is delivered, so it leaves the roadmap by @wine-fall in #205
  • docs(license): MIT — the model's terms were never murmur's to carry by @wine-fall in #206
  • feat(rwt): real-world topics ride memory — profile taste, ledger footprint, no policy file [spec 13] by @wine-fall in #209
  • test(director): the boot stretch hands the keyboard over by @wine-fall in #208
  • chore(src): one folder per part, and the prompts one module per Brain task by @wine-fall in #211
  • chore(skills): let Codex choose the review model by @wine-fall in #215
  • chore(skills): pin Astra for Codex review by @wine-fall in #216
  • feat(taste): listening-taste — five sources, the digest, named search, typed auth, invitations [spec 14] by @wine-fall in #214
  • chore(skills): prefer the latest Codex reviewer by @wine-fall in #217
  • docs(readme): the demo plays at the top, with sound by @wine-fall in #207
  • fix(memory): fold at startup, keep bootstrapped identity, forget the topic keys [spec 05-01] by @wine-fall in #218
  • feat(sources): NetEase over the plaintext API, Spotify without a developer app [spec 14] by @wine-fall in #220
  • chore(status): three debts the card was keeping to itself by @wine-fall in #168
  • feat(memory): the fold's output contract — cited facts, code-owned dates, refused folds [spec 05-01] by @wine-fall in #219
  • docs(spec14): the taste sources as they shipped — plaintext NetEase, a bundled Spotify id by @wine-fall in #222
  • feat(sources): one browser, opened and read — Chrome, and failures that say which [spec 14] by @wine-fall in #223
  • docs(blog): no dead air, the latency budget of an always-on voice agent by @wine-fall in #226
  • docs(gtm): the storefront says what ships — no local-first, an OG card, npm keywords by @wine-fall in #227
  • fix(first-run): /back on the seed questions, and the slice-B consent before the persona wait [spec 06] by @wine-fall in #229
  • fix(sources): the menu card carries its own status and names — nothing left under the overlay [spec 14] by @wine-fall in #232
  • fix(setup): the guide sets the language it speaks, and the look-ahead follows [spec 03-03] by @wine-fall in #233
  • feat(first-run): the taste sources are offered as one consent card, and a yes runs /sources there [spec 14] by @wine-fall in #234
  • fix(first-run): /quit reaches the latch as it arrives, and the persona call can be cut or time out [spec 06] by @wine-fall in #235
  • fix(first-run): the first run is one step table, and /back walks all of it [spec 06] by @wine-fall in #236
  • refactor(music): the pick task drops the borrowed play data [spec 03-01] by @wine-fall in #230
  • fix(sources): a profile Chrome has never opened is told apart from an absent Chrome [spec 14] by @wine-fall in #237
  • feat(sources): the /sources menu is a list to tick, and every result lands in the card [spec 14] by @wine-fall in #238
  • fix(cards): the way back is named on the card, and every /sources result says what happened [spec 06] by @wine-fall in #239
  • fix(sources): a Chrome profile that does not exist yet is a sign-in, not an obstacle [spec 14] by @wine-fall in #240
  • fix(sources): murmur names the Chrome profile it reads, and pins it to the mount [spec 14] by @wine-fall in #241
  • feat(sources): NetEase and Bilibili sign in by scanning a code [spec 14] by @wine-fall in #242
  • fix(cards): the way back catches the eye, and a consent's two keys read as peers [spec 10] by @wine-fall in #243
  • fix(sources): a typed /quit leaves while a code is still on screen [spec 14] by @wine-fall in #244
  • fix(first-run): only a host that left skips the consent cards [spec 06] by @wine-fall in #245
  • feat(tui): the mouse wheel reads back through the program log [spec 10] by @wine-fall in #246
  • fix(cards): a sign-in code is a card to read, not a line in the log [spec 10] by @wine-fall in #247
  • feat(sources): a sign-in card picks the road and the Chrome profile [spec 14] by @wine-fall in #248
  • fix(cards): the engine numbers the question, not the client [spec 10] by @wine-fall in #249
  • fix(music): YouTube plays anonymously, Bilibili searches anonymously [spec 14] by @wine-fall in #250
  • fix(music): a resolved stream carries the headers its CDN demands [spec 03-01] by @wine-fall in #251
  • feat(music): a curated list of channels is one more place to look for a song [spec 14] by @wine-fall in #254
  • fix(taste): the digest reads what they watched, not what they collected [spec 14] by @wine-fall in #252
  • feat(sources): QQ Music joins the taste sources, read-only [spec 14] by @wine-fall in #253
  • feat(sources): QQ Music signs in by WeChat scan [spec 14] by @wine-fall in #257
  • feat(sources): QQ Music searches and plays [spec 14] by @wine-fall in #258
  • chore(channels): add JLRS-LeoFM to the curated Bilibili channels [spec 14 §2.9] by @wine-fall in #259
  • feat(channels): a chapter is a song [spec 14] by @wine-fall in #260
  • fix(sources): end the /sources hang — a yt-dlp ceiling and an Esc that lands [spec 14] by @wine-fall in #262
  • fix(sources): the sign-in card carries the results so far [spec 14] by @wine-fall in #261
  • fix(sources): the list card tells state from action [spec 10] by @wine-fall in #263
  • fix(director): prime the next pick at air time, and name a due switch [spec 04] by @wine-fall in #265
  • fix(tui): the spotlight card is fitted to the screen before it is drawn [spec 10] by @wine-fall in #267
  • feat(director): the music prefetch runs two picks deep [spec 04] by @wine-fall in #266
  • chore(deps): the repo is pinned to pnpm 12.4.2 by @wine-fall in #274
  • chore(release): 0.3.0 by @wine-fall in #275

Full Changelog: v0.2.1...v0.3.0

murmur 0.2.1

Choose a tag to compare

@wine-fall wine-fall released this 02 Sep 08:39
04ec4a7

Twelve commits since v0.2.0 — the radio now tells you when a newer one
is out, voice setup finishes from one pasted key with two murmur voices
ready to clone into your own account, the guide gets a real composer and
sets the speaking rate when you ask, the clock names the day and the beat
speaks from the program actually on air, plus the setup conversation
reading like one and the TUI's missing-piece fix.

What's Changed

  • chore(release): the version number is the listener's call, not the radio's by @wine-fall in #182
  • feat(commands): the radio checks npm for a newer murmur [spec 10] by @wine-fall in #183
  • chore(dev): make pack — rehearse the install a listener actually gets by @wine-fall in #184
  • fix(tui): the setup conversation reads like a conversation [spec 10] by @wine-fall in #185
  • feat(guide): one pasted key finishes the whole voice, timbre included [spec 03-03] by @wine-fall in #186
  • feat(tui): the guide gets a real composer, and your line is in the log at once [spec 10] by @wine-fall in #187
  • feat(guide): two murmur voices to clone into your own account [spec 03-03] by @wine-fall in #188
  • docs(readme): the logo follows the reader's theme by @wine-fall in #189
  • fix(tui): a missing piece is ember, not one more quiet hint [spec 10] by @wine-fall in #190
  • fix(director): the beat speaks from the real program, not an imagined one [spec 04] by @wine-fall in #165
  • feat(director): the clock names the day, not just the hour [spec 04] by @wine-fall in #191
  • feat(voice): speaking rate, set by talking to the guide [spec 02] by @wine-fall in #192
  • chore(release): 0.2.1 by @wine-fall in #193

Full Changelog: v0.2.0...v0.2.1

murmur 0.2.0

Choose a tag to compare

@wine-fall wine-fall released this 01 Sep 05:13
9fbdfe4

Fifteen commits since v0.1.2, and they add up to one thing: the radio can now
report on itself. A listener hands it a bug or a wish — from the front end or
from a headless line — and the report finds its own way to GitHub with the log
attached. There is a log to attach now: an installed radio keeps a daily diary
of its own, not just the one make dev used to ask for. A run that dies without
saying goodbye writes itself up on the next boot. And murmur --version finally
answers which radio it is, which is the number every one of those reports now
carries.

What's Changed

  • feat(cli): the listener can hand the radio a bug or a wish [spec 10] by @wine-fall in #158
  • feat(tui): the resting input takes turns naming the ways out [spec 10] by @wine-fall in #161
  • chore(log): the radio keeps its own diary, one day per file by @wine-fall in #159
  • feat(diagnostics): the radio writes down what went wrong, log and all [spec 10] by @wine-fall in #167
  • feat(cli): the radio can say which radio it is [spec 01] by @wine-fall in #166
  • feat(sentinel): the radio remembers the night it went off without a goodbye [spec 10] by @wine-fall in #169
  • feat(deliver): two ways to hand a bug report over [spec 10] by @wine-fall in #170
  • feat(deliver): the headless road files it, and says whose name is on it [spec 10] by @wine-fall in #173
  • feat(cli): the radio takes a report without going off the air [spec 10] by @wine-fall in #172
  • feat(cli): the report finds its own way to GitHub [spec 10] by @wine-fall in #174
  • feat(sentinel): the lost run writes itself up [spec 10] by @wine-fall in #175
  • docs(roadmap): five lines the radio follows next, and where to read them by @wine-fall in #177
  • fix(diagnostics): a report quotes the log this run actually wrote [spec 10] by @wine-fall in #178
  • docs(readme): the front page describes the radio it actually is by @wine-fall in #179
  • chore(release): a skill that cuts the version, not just the tag by @wine-fall in #180
  • chore(release): 0.2.0 by @wine-fall in #181

Full Changelog: v0.1.2...v0.2.0