Skip to content

Releases

Parley 0.11.0

Choose a tag to compare

@fmasi fmasi released this 31 Oct 14:46
671fb10

Parley 0.11.0 processes each part of a recording with about a quarter less memory and a quarter less
time. It can now also remove the other side's voice that your microphone picks up from your speakers,
before your words are transcribed.

Faster, lighter processing

For every 30 minutes of recording, Parley now needs about 1.4 GB at its peak instead of 1.9 GB, and
finishes in about 35 seconds instead of 47 (measured on a real call on an M5 Pro). One step read the
whole audio file into memory at full quality before working on it; it now reads it in small pieces.
Your transcript's words and timings are unchanged. (#348)

Optional: speaker detection on the Neural Engine. Adding "diarization_compute_units": "neural_engine"
to ~/Library/Application Support/Parley/config.json brings the peak down to about 0.9 GB, for about
3 seconds more per 30 minutes. It found the same speakers as the default in every test. It is off by
default while it is measured on more Macs.

Optional: remove speaker echo from your microphone

On a call on speakers rather than headphones, your microphone also hears the other side, and that echo
could show up in the transcript as words you never said. With "mic_echo_cancel": "on" in config.json,
Parley removes that echo from a copy of your microphone before transcribing it. (#342, #347)

  • Your recording is untouched. Only the transcription reads the cleaned copy; the audio file and
    the speaker samples are your microphone as it was.
  • It never removes your own words on purpose. Wherever the other side was silent, any of your
    speech that cleaning turned down is put back from the original.
  • It runs on this Mac only, with a small model that ships inside Parley. Nothing is downloaded.
  • Off by default while it is tested on more calls. The echo marking from earlier versions still runs
    on whatever is left.

Also

  • Re-detecting speakers on a transcript whose microphone was cleaned cleans it again, so the speakers
    it finds match the first pass.
  • The command-line transcribe --split --echo-cancel does the same.

Version: a minor release (0.11), not a patch: optional echo cancellation is a new capability.

Parley 0.10.0

Choose a tag to compare

@fmasi fmasi released this 29 Oct 15:48
4af4ffe

Parley 0.10.0 notices when a meeting starts and offers to record it — forgetting to press Record is
the most common way to lose a meeting. It also cuts the false alarms that real calls over AirPods
were producing, and updates the speech and speaker models' engine.

Parley offers to record your meetings

When Zoom, Teams, Webex, Slack, Discord or a meeting in Chrome, Safari, Arc, Edge or Firefox starts
using your microphone, a small panel appears at the top of the screen offering to record. When the
call app has let go of the microphone for 30 seconds, Parley offers to stop. (#118)

  • It never records or stops on its own. Every recording still starts and ends with your click.
  • It keeps the call app in focus, collapses to a small dot after 20 seconds, and asks once per call.
  • Turn it off in Settings → General → Meeting Detection. It checks which app is using the
    microphone, on this Mac only; it never listens.

Fewer false alarms on real calls

  • Silence is no longer mistaken for a lost permission. Call apps send pure digital silence
    whenever the other side is quiet. Once the system audio has delivered real sound, Parley knows
    its permission works, so later silence is just silence: no "uncertain" warning in the summary, and
    no rebuild of the audio capture in the middle of a call (which could cause a brief AirPods
    dropout). (#333)
  • AirPods changing rate at hang-up no longer marks a call as compromised. A rate change that
    Parley fixes within seconds is stated as a brief glitch, and one that comes after the other side's
    last word is recorded but not announced. (#308, #333)
  • The microphone never switches to the built-in mic of a closed MacBook while you have another
    input. (#315)

Also

  • Updated FluidAudio (0.17.7), the engine behind transcription and speaker detection. It fixes how
    speakers are grouped, so speaker counts on some calls may differ from before. (#337)
  • Stop finishes only once the transcript is shown and the recovery file is gone. (#321)
  • A recording's audio is protected from the storage limit from the moment it starts, and an
    overrun notice says whose audio was affected. (#294)
  • Re-detecting speakers labels every flagged line on that side consistently. (#296)
  • The recording's record states which build made it, and what you were shown during it. (#295,
    #314, #317)
  • Sparkle, the updater, is up to date.

Parley records on your Mac, transcribes on your Mac, and sends nothing anywhere unless you configure
a summary endpoint yourself.

Parley 0.9.0

Choose a tag to compare

@fmasi fmasi released this 07 Oct 13:26
546c7b6

Parley 0.9.0 is a correctness release. Most of it is capture reliability — the class of bug where a
recording looks perfectly healthy and its contents are wrong — plus echo detection, a way to fix a
speaker count the diarizer got wrong, and a storage limit that finally means what it says.

This update changes how Parley looks. It is now built against the current macOS SDK, so the
interface picks up Apple's newer design. No feature moved; if something looks unfamiliar, it is in
the same place it was.

Read this before updating if you keep a lot of audio: the storage limit in Settings now covers
your whole recordings folder, not just today's. The first recording you finish after updating
deletes the oldest audio until the folder is under your limit. Transcripts are never deleted; each
one whose audio went says so, and Parley tells you how many recordings were affected. Raise the
limit in Settings → Audio Archive first if you want to keep more. (#224)

Your recordings are harder to get silently wrong

  • A recording never fails silently. Parley now either captures audio or tells you it isn't:
    a silent microphone, a gap in the audio stream, a failed write, a lost System Audio Recording
    permission and a capture helper that stopped answering each raise an alarm during the recording
    instead of surfacing as a gap afterwards. (#255, #217, #235)
  • Bluetooth no longer corrupts a recording mid-call. Connecting AirPods during a recording flips
    the device to its headset profile and halves its sample rate. Parley used to keep writing against
    the old rate — producing audio of exactly the right duration, at the wrong pitch, which then
    transcribed into fluent and completely incorrect text. Parley now refuses to clock a capture off a
    Bluetooth device at all, and treats a measured drift as a reason to rebuild rather than a line in a
    log. (#175)
  • Stop always finishes. Stopping a long, multi-chunk recording waits a bounded time for the last
    chunk and reads it only once it is complete. (#226, #232)
  • Mic-only recordings keep their audio. A call answered on speakerphone, with nothing on the
    system side, produced an empty system track that blocked archiving — and the transcript then
    pointed at the empty file instead of the microphone recording holding every word. (#183)
  • Fewer false alarms, and better ones. The padding detector no longer flags a healthy recording
    that simply started before the call connected; a short final chunk with too little speech is
    noted, not reported as a failure; and a summary that times out says so instead of blaming disk
    space and permissions. (#180, #302, #191)
  • The microphone switcher no longer freezes the app, and other main-thread stalls are gone.
    (#192, #197)

Echo: the other side through your speakers

On speakers, your microphone also picks up the other side of the call. Parley used to transcribe
that as a second local voice — and a re-detect at one speaker could then merge it into your name.

  • Echo is now judged per detected voice: a local voice that mostly repeats what the other side said
    is flagged as echo, not presented as a participant. (#242)
  • Re-detecting a speaker count never merges an echo voice into a person. (#243, #277)
  • The rename dialog says when a local voice looks like the other side through the speakers. (#244,
    #245)
  • Summaries list people only — no echo voice, no "Unknown". (#269)

Flagged lines are marked, never deleted: the transcript remains the full record.

Fixing a wrong speaker count

The rename dialog can re-run speaker detection on one side of a call at a number you state — useful
when the diarizer splits one person into two, or merges two into one.

  • Stating a count binds: asking for one speaker returns one. (#201)
  • Re-detecting clears names only on the side you re-detect, warns you first, and keeps the previous
    names in the transcript so a mistake is recoverable. (#202, #205)
  • It decodes the audio once, shows what it is doing and how long it has taken, and can be cancelled.
    (#203, #204, #207)

Also

  • The summary API key moved from the plain config file to the Keychain. (#214)
  • The storage limit never deletes audio another recording is still using. (#230)
  • The crash-protection row in the menu states the current reason and clears when the recording
    ends. (#236, #237)
  • After a crash, a chunked recording is put back together instead of starting over. (#135, #170)
  • Speaker labels that hold a negligible share of a conversation are folded into the dominant
    speaker rather than presented as their own participant. (#65, #67)
  • The CLI creates a missing --output-dir. (#246)
  • Speaker names and file paths are consistently marked private in the system log.

Parley records on your Mac, transcribes on your Mac, and sends nothing anywhere unless you configure
a summary endpoint yourself.

Parley 0.8.2

Choose a tag to compare

@fmasi fmasi released this 15 Jul 09:07
6d9fb78

Parley 0.8.2

If you have recorded meetings with 3 or more people, the speaker labels in those transcripts are wrong. This release fixes it — re-run those recordings to get correct labels.

Speaker labels on multi-party calls were wrong

Diarization was collapsing every speaker into a single cluster. On a real 5-person call, one participant's label absorbed three other people's speech, and a fourth participant who spoke for minutes got no label at all.

The cause was a single configuration flag that excluded nothing and blended everything: speaker embeddings were computed over windows containing overlapping voices, so every embedding became a mixture and the clusterer could no longer tell anyone apart.

Verified against a standard reference recording (a 4-speaker meeting from the AMI Meeting Corpus): before, 1 speaker was detected; now, 4.

This has been broken for a long time — it is not a regression from a recent release. It went unnoticed because one-to-one calls are unaffected: the local and remote sides are recorded on separate channels, so a two-person call has only one remote speaker to get wrong.

Transcripts of 1:1 calls are unaffected. Transcripts of calls with 3+ people should be re-run.

Remote audio was corrupted when recording with AirPods

If your AirPods were being used as the microphone, the remote participants' audio could be captured at half speed and padded with silence — producing a recording of the correct length whose content was 2x fast and choppy.

Bluetooth cannot run high-quality audio output and a microphone at the same time, so using the AirPods mic forces the output device down to 24 kHz. Parley's system-audio capture was tied to that device and followed it down, even though the original meeting audio was available at full quality the whole time.

Capture is now independent of the headset. Recording on AirPods gives full-quality remote audio.

Parley also now detects this class of fault while recording and flags the recording, rather than producing a corrupt file that looks correct.

Renaming speakers actually works

  • On recordings longer than one chunk, some speakers played no audio at all when you pressed play — their samples were being looked for in the wrong file.
  • After renaming a speaker, playback could switch to the wrong person's voice.
  • Voice samples were chosen as each speaker's longest segment, which is usually the moment they were being talked over. Samples are now chosen from clean, isolated speech.
  • "Rename Speakers…" was permanently greyed out after quitting the app, so a recording could never be renamed again. You can now pick any transcript.
  • Renaming could silently fail to save. It now saves atomically and tells you if it can't.

Reliability

  • A speaker could be silently swapped for another for the rest of a meeting if you stayed quiet through an entire 30-minute stretch.
  • When diarization failed for part of a recording, that section was attributed to an existing speaker instead of being marked "Unknown". Parley no longer invents an identity it doesn't have.

For the curious

Diarization quality is now checked automatically on every change against a reference meeting with a known speaker count, so this class of bug cannot silently return.

Parley 0.8.1

Choose a tag to compare

@fmasi fmasi released this 13 Jul 19:28
4fdc66d

Parley 0.8.1

Dependency maintenance

  • FluidAudio 0.14.4 → 0.15.5. Brings the transcription/diarization SDK current. Previously
    deferred over risk from a decoder-state change in the ASR path that could theoretically affect
    speaker continuity across chunk boundaries in long, multi-chunk recordings. Device-tested against
    a real ~28.5 minute two-party mic+system-audio call crossing two chunk boundaries: speaker labels
    stayed fully consistent throughout, with no ID resets or fallback labels. No model re-download
    required for existing users — the on-disk diarization model cache is unaffected by this bump.
  • Sparkle 2.9.3 → 2.9.4. Routine auto-update framework bump.

Internal

  • Fixed a stale SDK-version string (FluidAudioEngine.sdkLabel) that would have been recorded
    into the model-manifest JSON on fresh installs or model re-downloads after the FluidAudio bump
    above — caught in review before shipping.

No user-facing behavior changes in this release.

Parley 0.8.0

Choose a tag to compare

@fmasi fmasi released this 10 Jul 18:27
45c3bea

Parley 0.8.0 — "Quiet Confidence"

A full interface revamp. Parley now looks and behaves like a first-party Mac app, without changing a single line of how it records, transcribes, or summarizes. No audio ever leaves your Mac.

The menu bar is now a panel

The dropdown was nine text menu items. It's now a real status panel: recording state, a live elapsed timer, a prominent record button, and hover-highlighted actions. Errors and interruption warnings show up as dismissible banners rather than greyed-out, broken-looking menu rows.

Every screen, redesigned

  • Settings — five tabs (General, Audio, Transcription, Summary, Permissions) replace a single 600-point scroll of ten sections. The recording folder gets a real path control and folder picker instead of a raw text field.
  • Rename Speakers — one card per speaker, readable sample text, and playback controls big enough to hit.
  • First run — leads with what Parley does ("Everything stays on this Mac") instead of apologising for the permissions it needs, and now tells you why Continue is disabled.
  • Session naming — a name suggested from your calendar now says so.
  • Microphone switching — mid-recording switches show a spinner instead of an inert, disabled button.
  • Critical alerts — same material and spacing language as the rest of the app.

Details that add up

  • Red is reserved. It used to mean recording, errors, denied permissions, retry buttons, and meter clipping all at once. It now means recording, or something genuinely wrong — so the record button always means one thing. Recoverable problems are orange.
  • True ellipsis characters (…) on every action that opens further UI.
  • Removed the Silence Detection setting. Its config keys had no consumer anywhere in the codebase — the UI was driving a no-op. Better no switch than a switch that lies.

Fixes found on the way

  • The status header no longer shows a red dot beside "Ready to record" after a recording crash.
  • Settings no longer reports "Saved" when a summary is switched on without an endpoint — it says an endpoint is required, and keeps the provider, model, and key you typed instead of discarding them.
  • "Check for Updates…" closes the menu panel before Sparkle's dialog opens.
  • Recording-folder paths outside your home directory display correctly.

Under the hood

  • recordingTimerString and path abbreviation moved into TranscriberCore with full boundary coverage (minute/hour rollovers, clock-adjustment clamping, nested-home paths).
  • VoiceOver no longer reads decorative icon and status-dot elements.
  • 658 tests across 66 suites, all green. The audio capture, transcription, diarization, echo-dedup, and summary pipelines are untouched by this release.

Upgrading: use Check for Updates… from the menu bar, or download below. Your permissions and settings carry over.

Requires: macOS 15+, Apple Silicon.

Parley 0.7.1

Choose a tag to compare

@fmasi fmasi released this 10 Jul 09:24
427e159

Parley 0.7.1

Fixed: speaker misattribution at speaker-change boundaries (#120)

The core diarization/transcription fix in this release. Previously, a single ASR transcript
segment spanning a genuine speaker change — most commonly one speaker's short question
immediately followed by the other's longer answer, with no gap between them — was assigned
whole (text and audio-playback range) to whichever speaker had the greater time-overlap.
The other speaker's words were silently absorbed into the wrong person's block.

Fixed by retaining the word-level timing both transcription engines already compute internally
(previously discarded after initial segmentation) and re-splitting any segment whose words cross
a diarized speaker-change boundary at the true word boundary, before speaker labels are assigned.
Segments within one speaker, or lacking word-level timing, are unaffected — no behavior change
for the common case.

Device-validated against a real recorded interview (confirming the exact previously-misattributed
segment now splits correctly) and again live on a real call.

Fixed: rare double-launch on startup (#109)

Replaced an NSRunningApplication-based single-instance check (which could race during launch)
with a kernel-level file lock — eliminates a rare path where two copies of Parley could start
at once.

Fixed: TCC permissions dropped on update

Update installs now use a stable code-signing identity instead of re-signing ad-hoc on every
build, so Microphone and Screen Recording permission grants survive future auto-updates instead
of silently being revoked.

Fixed: raw speaker IDs leaking into transcripts (#113)

The cross-chunk speaker reconciler now always mints a friendly Speaker N label instead of
occasionally leaking the diarizer's internal spk_N identifier into transcript output.

Fixed: system-only recordings archiving as raw WAV (#105)

Recordings using only the system-audio stream now correctly archive to compressed .m4a like
all other recordings, instead of leaking an uncompressed .wav to disk.

Internal / reliability

  • Core Audio system-audio tap hardening: no leading-frame drop at capture start, no pitch/rate
    artifact on output-device switch mid-recording, and a fixed teardown race around device
    rebuilds.
  • CFBundleVersion now derives from the HEAD commit timestamp, monotonically increasing across
    branches — fixes a case where a maintenance release could ship a lower build number than an
    earlier one and break update detection.
  • Added an offline end-to-end Sparkle update dry-run tool (scripts/sparkle-dryrun.sh) and a
    release-time guard that refuses to ship a build signed with the wrong key or without the
    stable signing identity.

Parley 0.7.0

Choose a tag to compare

@fmasi fmasi released this 02 Jul 08:32
22f883a

Parley 0.7.0

Automatic updates

Parley now ships with Sparkle auto-update support. Use
Check for Updates… from the menu bar, or let it check automatically in the background —
you'll always be prompted before anything installs (never silent, never mid-recording).

New: Core Audio system-audio capture option

A new opt-in system-audio capture path (Settings → Recording → System Audio Capture →
"Core Audio Tap"
) captures a strict superset of the default capture path, including
Continuity/iPhone-relay telephony calls and some VoIP calls that the default path can miss.
Off by default — turn it on if you regularly take calls that route through your Mac.

Improved: dual-stream speaker labeling

  • Fixed fragmented/bare "Unknown" speaker labels on recordings with both mic and system audio.
  • Fixed cross-chunk speaker reconciliation so long recordings (split into multiple chunks) keep
    consistent speaker labels for the same person throughout, instead of only within one chunk.

Internal

  • CFBundleVersion is now derived from total commit count instead of commit-distance-since-tag,
    fixing a bug where the build number could reset and break update detection.

v0.6.5 — Single-instance fix

Choose a tag to compare

@fmasi fmasi released this 02 Jul 20:21

Maintenance patch on the 0.6.x line.

🔧 Fix

  • No more double-launch — launching Parley could bring up two menu-bar instances: the crash-recovery LaunchAgent (KeepAlive) started a second copy alongside your own launch. A single-instance guard now keeps exactly one instance running (the earliest survives; later ones exit). Crash auto-relaunch is unaffected.

Everything else is unchanged from v0.6.4. For the new Core Audio call-capture (Continuity/telephony + VoIP) and Sparkle auto-update, see v0.7.0.

v0.6.4 — 0.6.x Bug-Crush & Capture Trust

Choose a tag to compare

@fmasi fmasi released this 30 Jun 16:20

Closes out the 0.6.x line — the v0.6.3 bug-crush and the v0.6.4 capture-trust work, shipped together.

🎙️ Capture reliability (v0.6.4)

  • Verified auto-heal after audio route changes — a recording is trusted as "resumed" only once real audio actually starts flowing again. Fixes a bug where a route change (e.g. connecting AirPods) could leave the remote side silently recording as silence.
  • A system-audio failure never stops your microphone — if the system stream can't recover, you get a clear "remote audio couldn't be recovered — only your mic is recording" notice, and your recording keeps going.
  • Long recordings no longer lock out after a transient audio glitch.
  • Per-session diagnostics no longer leak route-change/anomaly counts between recordings.

📝 Transcript quality

  • No more Local Local Speaker double labels; multi-chunk transcripts are always in correct time order.
  • More robust echo removal across crash-recovered recordings.

💾 Archival

  • No-mic / system-audio-only recordings now always compress to .m4a — no leftover raw .wav files (the WAV is kept only if compression genuinely fails).
  • Concatenation can no longer hang on a corrupt audio file.

🧠 Summaries

  • Summaries are dated to when you recorded, not when you generated them.
  • Rate-limit retries (OpenAI 429/503) and better LM Studio context handling.
  • Settings now persists all summary options.

🔒 Privacy & integrity

  • Speaker names, file paths, and meeting/session titles are redacted (<private>) in system logs.
  • Missing/corrupt model files are surfaced to you (launch notification + a Settings indicator), and all problems are reported at once.

✨ Polish

  • About section with version + build number; software version stamped into every transcript.
  • Several crash-safety and thread-safety hardenings.

⚠️ Known limitation

  • iPhone cellular calls answered on the Mac (Continuity) still aren't captured on the remote side — ScreenCaptureKit structurally can't see telephony audio. A Core Audio tap is coming in v0.7.0 to fix this. Until then, use headphones to avoid the remote bleeding into your mic.

Full history: v0.6.2…v0.6.4 — v0.6.2...v0.6.4