Changelog
Every release, documented.
No stable releases yet.
- 1.0.0-beta.29Added
- The menu bar has tabs for Record, Dictate and Thoughts. Each has a start button, shows its shortcut and the source or model it will use, and says what it last did; clicking the last recording opens it.
- Test levels on the Sound and Microphone cards checks a source is picking up audio before you record. Nothing is written or sent anywhere.
- Two new transcription providers, both marked beta: ElevenLabs Scribe v2 (speaker labels, 90+ languages) and Soniox (speaker labels, 60+ languages, roughly $0.10 per hour). Both also stream dictation and Thoughts from Settings > Speech using the same key.
- Google Gemini across the app: transcription (beta), streaming dictation, summaries and Thoughts on one key. Flash models have a free tier on which Google may use your text; the app says so before you save a key.
- OpenRouter has a searchable model catalogue with pricing, Auto Router and Free Models Router, with separate spending limits for summaries and Thoughts.
- Ollama model fields list what you have already pulled, suggest models that fit this Mac, and can download one from inside Settings.
- Dictation History: a window listing every dictation with its text, engine, duration and target app, plus
stenobar://historylinks and Shortcuts actions. Settings > Dictation can turn it off or auto-delete it. - Dictation and Thoughts have their own spoken-language picker, and Gemini transcription has a Language setting.
- Automatic cleanup posts a notification saying how many recordings went to the Trash, and Settings > Recording > Retention shows the last cleanup.
- Imported recordings show when they were imported as well as when they were recorded.
- Settings > Recording warns when notifications are off and auto-stop is on, since the countdown before an automatic stop then only shows in the menu bar.
Changed- Stenobar never stops a recording on its own without warning you first. For silence or the 4 GB WAV limit you get a countdown with a Keep Recording button, in the menu bar and as a notification; at the file limit you can keep going once, for a couple of minutes.
- The menu is reorganised: Start Recording sits at the top and says what it will capture, Sound and Microphone are two cards with their own switches, the app list opens on demand, and Recordings, Thoughts and Dictation History moved into the icon strip at the bottom. Return starts recording, Tab and Space work the cards, and Escape closes the app list.
- The Preset section stays out of the menu until you save a preset.
- In Thoughts, search sits in the sidebar like the Recordings window, and the status, category and destination filters moved to a toolbar Filter menu that shows how many are on.
- Recording settings previews each meeting prompt layout, and summaries and Thoughts name the model OpenRouter's Auto Router actually used.
- The Apple Reminders tile in Settings > Integrations reads "Built-in Reminders list".
Fixed- Choosing Google Gemini for dictation or Thoughts without a key says so before you speak, instead of after a whole take.
- Cancelling a TickTick, Todoist or Notion sign-in shows a "sign-in cancelled" page instead of claiming success, and the page after connecting no longer sometimes fails to load.
- A one-word non-answer from a model is no longer offered as a recording title.
- Recordings recovered after a crash or force quit keep their project and their import status.
- The microphone and application lists update while the menu is open, and a device connected after launch shows up without switching tabs.
- Moving a recording into another project right after opening the Recordings window works again.
- A library, Thoughts store or dictation history that cannot be opened no longer stops Stenobar launching. The app says nothing is being saved this session and leaves the file untouched.
- An edit made just before quitting is retried on quit instead of lost after one failed save.
- Imported recordings are never auto-deleted by the retention sweep. Check the Trash if an older import went missing.
- Failed or cancelled transcriptions no longer leave their working audio copy on disk.
- Onboarding saves an API key only when you press Save, and Skip discards an unsaved key.
- Moving recordings between projects, or deleting a project, no longer loses their audio. A move that cannot be completed is refused with an explanation.
- Non-English dictation works on the cloud engines, and WhisperKit transcribes other languages instead of translating them into English.
- Dictation keeps the first words of a take on a slow connection.
- Per-project overrides list every transcription model and allow speaker labels for Parakeet and Gemini.
- Thoughts remembers a classification model per provider.
- Reasoning models no longer leak their thought process into summaries, titles, tags or Thoughts, and OpenRouter free-model routing rejects unusable results.
- Saved summaries keep their opening heading and drop the provenance header, and failed ones offer Try Again.
- Switching recordings no longer leaks transcript, summary or in-flight edits between them, and a suggestion in flight finishes against the recording it started on.
- A recording whose transcription failed says so with a retry, in the list and as a notification; one whose combined track could not be created explains why.
- 1.0.0-beta.28Added
- Stenobar now offers to record when you join a call, without you opening anything. A small panel names what it noticed, the app and whether you're in the call or still in a waiting room, and offers Yes, No, and Ignore for now. It waits for an answer instead of disappearing on its own, and you can pick which project the recording goes to before answering. It also knows the difference between a call and a browser tab that is simply playing something, so music and videos don't set it off. Choose between offering, the old pre-select-only behaviour, and off entirely in Settings → Recording → Source. Existing installs keep pre-select-only until you change it.
- The meeting prompt can hang off the top of the screen in a notch / Dynamic Island style, or float below the menu bar as a card. It picks the notch style automatically on a Mac that has one, and you can override it either way in Settings → Recording → Source → Prompt style.
- The meeting prompt now animates in and out instead of appearing all at once. The floating card drops in from above the menu bar and settles; the notch style starts as a small pill at the top of the screen and expands outwards, with the text arriving as the shape finishes. Dismissing it plays the same motion in reverse. With Reduce Motion turned on in System Settings it simply fades, and nothing travels.
- The meeting prompt can play a soft sound when it appears, off or on, with a choice of tones you can preview before picking one. Settings → Recording → Source.
Changed- Stenobar has a new app icon. It picks up the depth and lighting macOS applies to icons on this release, and the microphone artwork was redrawn so its edges stay crisp instead of showing a faint seam across the stand. The waveform inside the microphone is spaced more widely so it still reads at Dock and Finder sizes.
Fixed- Sending a thought to Apple Reminders could fail silently, with no reminder created and no error shown. Stenobar was missing the macOS permission entitlement it needs to reach your Reminders, so the system refused access without ever asking you. You may see a Reminders permission prompt once after updating.
- 1.0.0-beta.27Fixed
- The Settings window's sidebar and detail panes no longer wash out to gray in dark mode when a bright window sits behind them.
- Integration tiles now list everything a provider is actually used for. Parakeet, WhisperKit, Apple Speech, AssemblyAI and Deepgram show their dictation and Thoughts-capture role, and Apple Intelligence shows that it writes summaries as well as routing thoughts — so the pane answers "what breaks if I remove this?" correctly.
Added- The recording panel now pre-selects the app you're in a call with: a meeting app (Zoom, Teams, Webex, …) or a browser (Google Meet, telehealth sessions) while it is actually using your microphone — an app that is merely open is left alone. It only fills in the source when you haven't chosen one yourself, it offers once per call, and it's one click to change. Edit both lists — or switch it off — in Settings → Recording → Source. Stenobar only checks which apps are on the mic; it never listens in, and it never accesses the camera.
- Transcripts of recordings that captured both your microphone and system audio now say who spoke, based on the audio itself: your side is labelled "Me" and the other side is labelled separately. It works with every transcription provider, runs entirely on your Mac, and follows the existing Speaker labels setting.
- You can call yourself something other than "Me" in transcripts: set a name in Settings → Transcription → Speakers, or per project in Settings → Projects. It applies to transcripts made from then on; ones you already have keep the labels they were written with.
- Recordings can now stop themselves after a configurable stretch of silence (off by default — Settings → Recording → Auto-stop), with an on-screen countdown you can cancel by making noise.
Fixed- Recording presets got a polish pass: applying a preset now also switches the hotkey's microphone; presets can be renamed; deleting asks for confirmation; saving over an existing name updates it instead of duplicating; preset subtitles show app names instead of bundle-ID fragments; and the preset section no longer vanishes when you have none.
- Local transcription models already on disk are found again after a settings reset or a fresh install, instead of being reported missing and offered as a ~600 MB re-download. Stenobar also notes in diagnostics when a model has been downloaded twice, so the duplicate can be reclaimed deliberately.
- Release notes in the updater render **bold** text,
codespans, and angle brackets properly instead of showing the raw markdown asterisks and dropping anything inside<>. - Dictated thoughts that name a list rather than an action no longer get an invented verb in their title — "Shopping list for tomorrow" is filed as "Shopping list", not "Generate shopping list".
- Very long recordings (over ~6 hours at default quality) now warn and stop cleanly before hitting the WAV format's 4 GB limit, instead of crashing or producing a truncated file.
- Quitting right after a recording stops no longer silently abandons the finishing work. Stenobar asks whether to wait while it stitches, transcribes, and compresses, and offers Quit Anyway when you'd rather not. An interrupted stitch is also redone next time instead of leaving a truncated combined track that playback would prefer.
- 1.0.0-beta.26Fixed
- API keys no longer disappear after an update. Saving a key deleted and re-added its keychain item, which reset the item to trust only the build that wrote it — so after a Sparkle update every provider read as "not configured". If a key was already lost this way, re-enter it once; it will stick from now on.
- Recording could get stuck on "Starting..." forever after a failed start, with the popover, hotkey, and deep links all silently doing nothing until relaunch.
- Selecting a microphone whose sample rate differed from the audio engine's produced a silent recording.
- Stopping a long recording no longer freezes the interface.
- Dictation and Thoughts said "No speech detected" when transcription had actually failed. Both now report the real error.
- Thoughts interrupted by a quit or crash are recovered on next launch. Timed-out and rate-limited sends now retry, and retrying a Todoist task no longer duplicates it.
- Imported recordings whose mic and system tracks had different sample rates came out pitch-shifted and drifting; they are now resampled to a common rate.
- SRT and VTT exports no longer produce overlapping cues that stack or flicker.
- Exporting a transcript from a recording's context menu now matches the transcript pane for multichannel recordings.
- Parakeet and WhisperKit models already on disk are found again after a settings reset, instead of being offered as a fresh multi-hundred-megabyte download.
- The dictation waveform updates at a consistent rate on lower-sample-rate mics.
- Settings sidebar icons fit inside their tiles.
Changed- Opening recordings is faster in large libraries.
- 1.0.0-beta.25Fixed
- Transcripts are no longer reordered when displayed. beta.24 rebuilt conversational turns on every transcript with speaker labels, but that repair is only correct for split-channel recordings, where the two streams arrive interleaved mid-sentence. On an ordinary single-channel transcript there is nothing to reassemble, so it pulled a speaker's later reply back onto their earlier line — printing answers ahead of the questions they answered, and stacking several replies under one speaker heading. Turns are now joined across another speaker only where the two genuinely overlap in time. Affected transcripts were only being displayed wrongly; nothing on disk was altered, and they read correctly again on reload.
- 1.0.0-beta.24Fixed
- The WhisperKit
large-v3-turbomodel now downloads successfully. Stenobar was passing its hyphenated display name to a model repository that names the downloadlarge-v3_turbo, so WhisperKit could not find a match. - Combined-track exports now respect whether the cached track was created in Mixed or Split mode. This prevents a Mixed track from being reused where separate left/right channels were requested, and avoids uploading a large lossless library file for AssemblyAI transcription.
Added- AssemblyAI can now transcribe system audio and microphone as separate channels, making the microphone speaker reliably appear as **Me** instead of relying on probabilistic diarization. Enable **Transcribe channels separately** in Settings → Transcription, globally or per project. It is available on compatible AssemblyAI models, requires speaker labels, and is off by default because AssemblyAI bills each channel separately.
Changed- Split-channel AssemblyAI transcripts are rebuilt into readable conversational turns when speakers overlap, instead of rendering the provider's word-sized, interleaved fragments. Existing transcripts get the same repair when loaded or reprocessed, without another paid transcription.
- The WhisperKit
- 1.0.0-beta.23Changed
- Transcription key terms now actually reach the provider. The old "Prompt / Key terms" box sent everything as one block of prose, so a list of names and jargon typed into it was handed to AssemblyAI as a paragraph — which their own guidance warns against, and which meant key terms were doing almost nothing. Settings → Transcription now has two separate fields: **Context**, for a sentence or two describing the recording, and **Key terms**, for the names, product names, and jargon you want recognised. Each goes to the provider's proper channel. Your existing text is moved into whichever field fits it on first launch — a comma-separated list becomes key terms, a sentence becomes context — and the original is kept, so nothing is lost if the guess is wrong. Per-project overrides get the same two fields.
- Key terms now work on Deepgram's older models. Nova-2, Enhanced, and Base previously got no term biasing at all; they now use Deepgram's keyword boosting, while Nova-3 continues to use key-term prompting.
- Dictation sends key terms to AssemblyAI. Settings → Speech has a Key terms field when AssemblyAI is the dictation provider, kept separate from the Library's list so short dictated commands can be biased differently from long recordings.
- Picking an AssemblyAI speech model is now a dropdown instead of a comma-separated text box, with a primary model and an optional fallback for languages the primary doesn't cover.
- Each provider's limits are now shown as you type, in that provider's own units — terms remaining, words remaining, or an estimated token count — and the Context field is hidden entirely for models that don't accept one.
Fixed- The default AssemblyAI fallback model was not a real model. New installs shipped with
universal-3-pro, which exists only in AssemblyAI's streaming API, so the fallback silently did nothing for languages the primary model doesn't support. It is nowuniversal-2, and existing settings are corrected on launch. - Key-term lists that were too long for a provider could fail the whole transcription rather than being trimmed. Lists are now clamped to each provider's documented limit before the request is sent.
- 1.0.0-beta.22Changed
- Local dictation is much faster after the first use. Parakeet and WhisperKit models now stay loaded for as long as Stenobar is running, so each dictation after the first takes well under a second instead of around one. The models also start loading in the background when Stenobar launches, so the first dictation of a session no longer waits on a twenty-second model load — previously that load ran at the worst possible moment, right after you stopped speaking. Switching models in Settings → Dictation reloads immediately so the new one is ready when you are. If you use Apple Speech or a cloud provider, nothing loads and nothing changes.
- Internal: the local transcription providers now have automated test coverage of their result handling and branch selection, which previously could only be verified by hand against a downloaded model.
Fixed- Dictation no longer gets stuck on "Transcribing…". Ending a take almost immediately — a fumbled hotkey press, or a modifier chord you thought better of — used to hand the near-empty recording to the full local pipeline anyway, which spent tens of seconds loading models before reporting the empty transcript it could never have avoided. Takes shorter than 0.3 s are now discarded up front.
- Added a way out of a transcription that's taking too long: an ✕ on the dictation HUD, or Esc. Cancelling frees the hotkey immediately instead of swallowing every subsequent press, and nothing is pasted or copied.
- A transcription that never returns at all now gives up after 60 seconds and says so, rather than leaving dictation permanently unavailable until you restart the app. Applies to the Thoughts HUD as well.
- 1.0.0-beta.21Added
- Hold a single modifier key to dictate or capture a thought. In Settings → Shortcuts, each "hold" shortcut now takes an optional bare modifier — pick a side (left or right) and a key (⌘ ⌃ ⌥ ⇧), and holding just that key starts recording. Press any other key while it's down and the take is cancelled silently, so your everyday shortcuts still work: ⌘C copies as usual and nothing is transcribed or pasted. Right-side keys are the sweet spot, since most shortcuts are typed with the left hand. Your existing key-combo shortcuts keep working alongside it, and a modifier can drive dictation or Thoughts, but not both. Needs Accessibility permission — without it the modifier shortcut stays inert.
- 1.0.0-beta.20Fixed
- Speaker labels and per-line timestamps now actually work on long local transcriptions. beta.19 introduced a bug that shuffled words at the seams between processing windows; the app noticed the transcript no longer matched and threw the timed lines away, leaving one untimed block labelled with a single speaker. Anything past roughly half a minute was affected.
- Setting "key terms & context" on a recording no longer costs you timestamps and speaker labels. Locally transcribed recordings with key terms were always returned as one unlabelled block, at any length.
- Locally transcribing with key terms no longer silently drops pieces of the transcript — on a 15-minute recording it was losing a few hundred characters scattered through the middle.
- 1.0.0-beta.19Added
- Speaker labels on local transcripts: Parakeet transcription can now work out who is speaking and tag each line, splitting lines where the speaker changes. Turn on "Speaker diarization" in Settings → Transcription and download the one-time ~35 MB model; it runs entirely on-device. Leave the model undownloaded and transcription works exactly as before, without labels.
- Parakeet transcripts now have per-line timestamps: local transcriptions split into timed lines, so playback follows the transcript and clicking a line jumps the audio — just like cloud transcripts. (Runs using key-term boosting keep single-block text for now.)
Changed- Privacy: local Parakeet transcription and dictation are now enforced offline. The app touches the network only for model downloads you start in Settings (and dictation's first-run model download). If a downloaded model is damaged, you'll now see an error asking you to re-download it instead of the app silently re-fetching it.
Fixed- Local (Parakeet) transcription and dictation of anything longer than about 15 seconds could drop words, lose the ending, or come back empty — showing "No speech detected" after real speech. Long audio now runs through the streaming engine, and long transcripts get the same per-line timestamps and speaker labels as short ones (previously they collapsed to a single untimed block attributed to one speaker).
- Dark mode: the strip above the recordings list no longer lags behind the rest of the window while you drag the window or play video behind it. The same artifact is gone from the Thoughts window.
- 1.0.0-beta.18Added
- Summaries: each recording can now carry its own optional "key terms & context" — names and their correct spellings, jargon, or topics to focus on — which is appended to whichever summary prompt you've selected. Set it from the book icon next to the summary controls; it stays with the recording, so re-summarizing keeps using it.
Changed- New installs now default AssemblyAI transcription to the newer
universal-3-5-promodel, falling back touniversal-3-pro. If you've customized the model list in Settings, your selection is unchanged.
- 1.0.0-beta.17Fixed
- If the system audio capture stream dies mid-recording (a rare macOS capture-engine failure), Stenobar now stops cleanly, saves everything captured up to that point, and explains what happened in the menu-bar popover — previously the recording timer kept running while nothing was being captured.
- Auto-delete no longer removes a recording from the library when moving its files to the Trash fails: the recording stays fully intact and the cleanup is retried on the next sweep, instead of leaving orphaned audio files with their title, tags, and markers lost.
- Failures that previously printed only to the developer console (disk-full write errors, library save errors, screen-capture refresh errors) are now written to the diagnostics log, so problem reports are actually diagnosable.
Changed- Performance: smoother interface while recording and dictating, faster live-streaming summaries, and snappier typing and search in large libraries.
- 1.0.0-beta.16Added
- Summary prompts: save a library of named prompts, assign one per project, and pick one ad-hoc when summarizing a recording.
- Per-project summary AI: each project can override the summary provider and model, and tags/title generation can use a separate provider and model (both globally and per project).
- 1.0.0-beta.15Added
- List-aware Thoughts: when a dictated thought is clearly an enumeration, Stenobar formats its description as a list instead of a comma run-on, and each destination renders it natively — Todoist sub-tasks, TickTick and Things checklist items, Notion bulleted lists, Apple Notes bullet lists, and structured items in the Shortcuts payload. Obsidian and Bear get the markdown list for free, and Apple Reminders keeps it as a text list in the note. The Thoughts Inbox shows list descriptions with per-category glyphs (checkboxes for tasks and reminders, bullets for notes).
Changed- Captured thoughts now keep a cleaned-up description separate from your verbatim words. Each thought carries an editable, reformatted description plus the original spoken text shown read-only beneath it, in both the Inbox and the preview sheet. Synced notes send the tidied description by default; a new "Include original words in synced notes" setting appends the verbatim capture below it for apps like Reminders, Notes, and Todoist.
- The Thoughts Inbox now shows a processing spinner on a thought's row while it is still being classified and routed.
- 1.0.0-beta.14Added
- Obsidian as a Thoughts destination: route a captured thought straight into your Obsidian vault as a new note via the obsidian:// URL scheme, configured in Settings → Integrations.
- Bear as a Thoughts destination: file a thought as a Bear note over Bear's x-callback-url API, with confirmation that the note was actually created.
- Notion as a Thoughts destination: connect your workspace with OAuth and send a thought as a new page under a parent page you choose.
- 1.0.0-beta.13Fixed
- The Settings window now gets a Dock icon and the app menu bar (Stenobar / File / Edit …) like the Library and Thoughts windows, instead of leaving the app menu-bar-only — so you can click the Dock icon to return to it. The main menu bar also no longer intermittently fails to appear when a Library or Thoughts window is open and frontmost.
- The Dock icon's right-click menu now lists the open Library (Recordings) and Thoughts windows so you can jump straight to them; previously only Settings appeared there.
- 1.0.0-beta.12Fixed
- Microphone recordings from external USB audio interfaces that deliver 24-bit (or 32-bit) integer PCM — e.g. the Focusrite Scarlett 2i2 — no longer capture as static/buzz. The WAV writer previously decoded every non-float buffer as 16-bit, misaligning every sample; it now decodes 16/24/32-bit signed PCM correctly.
- The selected microphone is now remembered across recordings and app launches instead of snapping back to the system-default input each time. The global hotkey honors the same saved device.
- 1.0.0-beta.11Added
- AssemblyAI as a dictation provider: low-latency streaming transcription via AssemblyAI Universal-Streaming, selectable in Settings → Dictation and surfaced in onboarding. Gated on an AssemblyAI API key.
- Deepgram as a dictation provider: streaming transcription with a model picker (Flux and Nova-3) in Settings → Dictation and onboarding. Gated on a Deepgram API key.
- 1.0.0-beta.10Added
- App Intents for Shortcuts, Siri, and Spotlight: start/stop/toggle recording, drop a marker, toggle dictation, capture a thought, open the library or Thoughts inbox, and get your last recording — with built-in Siri phrases and no setup.
- 1.0.0-beta.9Changed
- Library derivation is memoized and transcript search parallelized for a snappier library at scale.
Fixed- Onboarding playback no longer clips the start: microphone warm-up is trimmed and the player follows audio-format swaps.
- 1.0.0-beta.8Changed
- GUI performance: API-key presence checks no longer hit the Keychain on every render (Settings panes, summary availability in the library detail view); markdown summaries are styled once per text snapshot instead of on every redraw (most visible while a summary streams in); transcript rows skip re-rendering when nothing about them changed; and the streaming summary's follow-the-tail auto-scroll is coalesced instead of firing on every LLM delta.
Fixed- Numbered lists in summaries no longer render every item as "1." — items keep their numbers from the markdown source, including when paragraphs sit between the numbered points (the shape LLM summaries usually produce).
- 1.0.0-beta.7Fixed
- Windowless deep links (
stenobar://dictate,record,thought,marker) no longer pop the Recordings library open as a side effect.open stenobar://…reactivates the app, and SwiftUI auto-presents the first declaredWindowscene on that reopen — so the library surfaced even when the command needed no window. The hidden bridge window is now declared first, so the reopen resolves to it instead.
- Windowless deep links (
- 1.0.0-beta.6Added
stenobar://URL scheme and a JSON library index for external integrations (e.g. a Raycast extension): open the library / a recording / project / Thoughts inbox / settings, and fire record-toggle, dictate, thought-capture, and marker the same way the global hotkeys do. A versionedindex.jsonsnapshot of recordings + thoughts is refreshed on every change so external tools can search without touching SwiftData. "Copy Link" actions producestenobar://recording/<uuid>links. Seedocs/URL-SCHEME.md.
- 1.0.0-beta.5Changed
- Public GitHub links now point to the
stenobar-releasesrepo so they resolve for end users (the source repo is private).
- Public GitHub links now point to the
- 1.0.0-beta.4Added
- Website links (Home, Privacy, License) in the About box.
Changed- Release tooling syncs PRIVACY and LICENSE to the public releases repo.
- 1.0.0-beta.3Fixed
- App failed to launch on some Macs: hardened runtime is disabled for ad-hoc Sparkle builds so Library Validation no longer blocks Sparkle.framework.
- 1.0.0-beta.2Changed
- Release tooling: publish the DMG + Sparkle appcast to the public
stenobar-releasesrepo; the DMG is namedStenobar.dmg.
- Release tooling: publish the DMG + Sparkle appcast to the public