Skip to content

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 05 Nov 16:58
· 172 commits to main since this release
0579cb5

Cassini is now called Cassini talk. Your Library stays in Music/Cassini.

  • Recording starts reliably when the computer is silent: the other people's
    side waits for the first sound instead of failing the start
  • When a microphone or the computer's sound cannot open, Cassini says why and
    keeps recording what did open; if nothing opened, no empty meeting is left
    behind. Quit no longer waits for a microphone that never delivers audio
  • Silent sources are saved as exact silence, so writing down and speaker
    separation skip them instead of reading noise
  • Every part of Cassini places each track at the same start, so playback,
    transcripts and speakers line up; words stay inside the time a person was
    present, and a turn never spans a gap. Cassini for Mac passes the same check
  • Browser meetings: set up the companion from Cassini, connect in the
    background, keep recording through page reloads, record automatically only
    once a call has really started, and record with no window open. Browser and
    computer audio share one clock, even when the system clock is adjusted
    during a meeting. The companion is now version 0.2.13: a long silent stretch
    no longer slows a browser recording's clock
  • GNOME and Mac pass the same end-to-end tests: a recording followed live
    while it is in progress (shared test 2), and the same three outcome files
    (shared test 8)
  • While recording: a live spectrogram for each side, Recording details that
    show what is being captured, a warning when muted output would silence the
    computer's sound, and a test recording to check your setup
  • Library: move meetings to Trash with five seconds to undo, rename with F2,
    and keep each saved meeting as a portable Cassini file
  • Writing down shows its progress before the first words, reads a track again
    without voice detection when it finds too few words there, and names the app
    version when it downloads models
  • Translated into Italian, French, Spanish and Portuguese (Brazil and Portugal)
  • Many capture fixes: interrupted and re-anchored inputs, frozen browser
    connections, and a live spectrum that no longer stops after the window
    stalls

What's Changed

  • Move saved meetings to Trash with five-second Undo by @silviot in #98
  • Wait for inbound call evidence before automatic recording by @silviot in #97
  • Pin reviewed call evidence and gate shared auto-start vectors by @silviot in #99
  • Keep row menu actions connected until activation finishes by @silviot in #100
  • Prepare saved voices for older meetings and explain missing models by @silviot in #101
  • Remove timestamped notes from the Recording page by @silviot in #102
  • Apply the recording title caret fix to main by @silviot in #106
  • Make custom recording and playback buttons accessible by @silviot in #105
  • Connect to the browser in the background by @silviot in #107
  • Show writing progress before the first transcript words by @silviot in #109
  • Ask before enabling the global recording shortcut by @silviot in #108
  • Balance the empty Library heading by @silviot in #111
  • Keep the Flatpak Library when XDG Music is unavailable by @silviot in #104
  • Restore Keyboard Shortcuts in the Library menu by @silviot in #110
  • Keep a new recording visible when an older capture finishes by @silviot in #112
  • Make the microphone tone gate tolerate clock phase corrections by @silviot in #113
  • Keep exports outside Flatpak’s temporary home and show success by @silviot in #114
  • D35: Rename saved meetings from either menu or F2 by @silviot in #115
  • D35: Cancel on Escape and explicit background recording permission by @silviot in #116
  • D37: align GNOME consent, browser states and saved meeting journeys by @silviot in #117
  • Prevent the delayed GTK warning during Rename saves by @silviot in #119
  • Show Recording details with live capture and writing-down facts by @silviot in #96
  • Fix playback speed and harden companion setup responsiveness by @silviot in #122
  • Add the browser companion from Cassini (D39) by @silviot in #123
  • Restore automatic names and clean displayed quotation marks by @silviot in #118
  • Restart installed updates safely and heal dead browser registrations by @silviot in #127
  • Keep browser service tests out of the user's library by @silviot in #126
  • Library v2 step 2: every track reader accepts WAV and compacted Opus spans (S-12 §5) by @silviot in #128
  • Library v2 step 3a: names, journal, durable publish, mixdown and finalize (S-12) by @silviot in #130
  • Library v2: direct regression tests for #130's commit guards by @silviot in #131
  • Keep the browser control link open and keep stopped calls stopped by @silviot in #125
  • D45: rename Cassini talk and migrate existing installations by @silviot in #129
  • Finish Quit when a microphone never produces audio by @silviot in #132
  • Keep browser recording batches inside the app request timeout by @silviot in #134
  • Background Apps for windowless automatic recording (D41) by @silviot in #124
  • Keep browser recordings through reloads and save how they ended by @silviot in #121
  • Keep browser meeting identities and queued work across reconnects by @silviot in #133
  • Preserve capture identity and stopping in tab-scoped browser status by @silviot in #135
  • Bump GitHub Actions to current majors by @silviot in #136
  • Warn when muted output silences a system recording by @silviot in #138
  • Publish stopped captures as Library Cassini files by @silviot in #137
  • Complete the clean Cassini talk rename (D45.2 / D51) by @silviot in #140
  • ci: align rolling openSUSE container snapshots by @silviot in #141
  • Draft: recording spectrogram (D36.1) by @silviot in #139
  • test: synchronize broker meter delivery and fixture clocks by @silviot in #142
  • Adopt D52 multistream capture accounting and lifecycle by @silviot in #143
  • Draft source diagnostics in portable meeting files by @silviot in #144
  • D50: Localize Cassini talk in six languages by @silviot in #145
  • Bound recognition timestamps to each source audio extent by @silviot in #146
  • Add producer drop counts to the recorded span instead of replacing them by @silviot in #147
  • Never expect an announced page microphone when Me is recorded natively by @silviot in #150
  • Record gap ranges and derive presence without reading PCM (D52.2, G6) by @silviot in #148
  • Raise the pytest suite deadline to 360 s by @silviot in #152
  • Bump actions/setup-node from 6 to 7 by @dependabot[bot] in #154
  • Pin the test-Library isolation protocol (#30) by @silviot in #153
  • Close frozen browser transports on deadlines instead of waiting for EOF (G7, part A) by @silviot in #151
  • Decode a track without VAD when its VAD pass finds too few words (G10) by @silviot in #149
  • Record when a write-down assumed a track's start at 0 (D55) by @silviot in #158
  • Compute ActivityMeter.inside() once per frame count by @silviot in #159
  • Name the app and its version in every model download (D54) by @silviot in #157
  • G12: tie voice names to the diarization input (voiceSource) by @silviot in #160
  • Wait for the picker paste before Open in companion-install by @silviot in #161
  • Heartbeat control liveness, D52.4 transport loss and D52.5 (G7, part B) by @silviot in #156
  • G12 follow-ups: gate stamps without meeting.json, hold Remember during a job by @silviot in #163
  • Re-anchor a wrapped native first input stamp instead of ending the recording by @silviot in #162
  • G14: one-group temp disk for voices, disk budget, lowDisk separation skip by @silviot in #165
  • Sync pinned UX files to coordination 0f0c21d (D56), with G14 (#165) merged in by @silviot in #164
  • Stop anchoring a re-anchored native source; #162 review follow-ups by @silviot in #168
  • G14 follow-ups to main (re-raise of #167, which merged into the stacked branch after #164 landed) by @silviot in #170
  • Record clockSlaving on a re-anchored native track (D57/R77) by @silviot in #171
  • D56: leave silent tracks out of recognition and separation (silentTracks) by @silviot in #166
  • G7 part C: D52.5 ask-once resume (resume-capture-v1 host side) and dead-span watchdog by @silviot in #169
  • G13 prerequisite: open each native side independently at start by @silviot in #172
  • G13: classified refusals (D58), no folder when nothing opens, refused resume by @silviot in #173
  • Give batch tests fake command and batch deadlines by @silviot in #175
  • G13c: stand-in adoption, refused resumes, retries, D17 per-meeting lines (R82) by @silviot in #174
  • Pin protocol 364c87b9 (PR #38): resume requestId follow-ups by @silviot in #176
  • Keep voice windows of a per-person track inside its speech by @silviot in #177
  • Pin protocol 032e98fc (#39, #40, D61): copy the clock facts; departed-generation watchdog by @silviot in #179
  • G13b: the test recording (D60, R83) by @silviot in #178
  • G15: run GNOME's pipelines on corpus v2; mask the published mix by ownership by @silviot in #180
  • D63 #2: a turn never spans a gap range of its own track (R85) by @silviot in #182
  • Turn gaps: a source id ending in ~n keeps its own entry, not a voice group's by @silviot in #183
  • D63 #1 and #3: the G10 gate per person; words only inside presence (R85) by @silviot in #181
  • One lane reservation set for transcription and turn gaps (#183 follow-up) by @silviot in #184
  • Pin protocol c0284a6f (#43): the resume ask waits for the committed fallback by @silviot in #186
  • CI G2: Desktop needs only the deb and Flatpak it installs by @silviot in #188
  • Test: start-all's Starts may arrive in either order by @silviot in #189
  • D64: keep a group undiarized when its voice id is another speaker's by @silviot in #185
  • CI G7: skip Recording, Boards and Offline when Build failed by @silviot in #193
  • Bump actions/cache from 4 to 6 by @dependabot[bot] in #155
  • CI G3: run pytest as four serial shards and keep the meson test logs by @silviot in #190
  • CI G8: key the Flatpak builder cache on its manifest; .deb name in CONTRIBUTING.md by @silviot in #197
  • CI G1 + G12: pin the RPM to fedora:44, nightly fedora:latest canary, wire the test-recording scenarios by @silviot in #187
  • CI G10: Recording timeout 30 min, apt network retries, shared Playwright cache by @silviot in #195
  • Recording harness: a failed UI action is never reported as success (app-control auto timeout) by @silviot in #198
  • CI G4: take the Flatpak SDK off overlayfs, pin the builder, fail fast on infra (stacked on #188) by @silviot in #191
  • CI G5: fix five hidden flaky tests at the root; retry only network installs by @silviot in #196
  • CI G6: cancel a pull request's superseded run automatically by @silviot in #192
  • Record starts a recording while the previous browser capture only saves (Desktop "second recording") by @silviot in #199
  • Pin protocol 854f4ada (#44, #45); cancel an uncommitted fallback when the call returns by @silviot in #201
  • CI G13 + G14: a time budget for every job; CI on pushes to main only by @silviot in #200
  • Native stereo proof: measure tones in 100 ms windows (Recording right880 0.0019) by @silviot in #202
  • Reconnect tests: an inventory waits for its own packet, not an earlier row by @silviot in #203
  • CI G16: run the release metadata check in Lint; Release preparation loses its PR trigger by @silviot in #204
  • CI G16: run the package builds on the pinned ubuntu-26.04 image by @silviot in #205
  • Ship the stable Flatpak main tested, and refuse it without the signed remote (G15, D66) by @silviot in #207
  • Run pytest once per image: Source skips it where a package job runs it (G11, D66) by @silviot in #206
  • Bound every local test run (E1) by @silviot in #208
  • Shared test 8: three outcome files (D67) by @silviot in #210
  • D55: one placement for every consumer, checked by shared test 9 by @silviot in #209
  • CI cut B: root-fix the slowest tests, run conformance once (D68/R91) by @silviot in #211
  • CI cut C+H: cache the harness images, run the Meson tests beside Build (D68/R91) by @silviot in #214
  • Fix the batch-budget fallback test flake: bound the durable save as a hang guard by @silviot in #216
  • CI: let repository variables move heavy jobs to our Hetzner runners by @silviot in #213
  • Shared test 2: the live folder through GNOME's real app (D68) by @silviot in #215
  • Fix the spectrogram-browser flake: an unanswered broker poll is unknown, not idle by @silviot in #217
  • D58.1: the others' side stays armed through silence by @silviot in #212
  • CI cut G: Boards runs on a PR only when a file it reads changes (D68/R91) by @silviot in #219
  • CI cut F: cache the Trash portal build, decode the engine goldens on the stable bundle only (D68/R91) by @silviot in #218
  • A stalled view keeps its live spectrum: the meter never blocks on it (spectrogram-browser flake) by @silviot in #220
  • Pin protocol 54e0006 (#54 merged): capture contexts keep real time; companion 0.2.13 by @silviot in #223
  • Make shared test 2's live-folder job gating (R93); no workflow may hide a failure by @silviot in #224
  • Browser capture stamps on one monotonic session clock, origin mapped once (D61; protocol #55) by @silviot in #225
  • Pin protocol ab2823c (#55 merged): the live-folder driver's monotonic session clock by @silviot in #226
  • Capture taps convert without dither, so a silent source stays all zeros (D56) by @silviot in #222
  • Test waits on durable work are bounded by the fsyncs behind them, and wait on events (follow-up to #216) by @silviot in #221
  • Release 0.4.0: version bump, changelog and release notes by @silviot in #227
  • Release native packages and the GitHub release; no Flatpak release (D45.4) by @silviot in #228

New Contributors

Full Changelog: v0.3.0...v0.4.0