Everything Soufflé does, and what it needs.
What Soufflé does, what it needs, and where it keeps things. Nothing here requires an account, an API key, or a network connection beyond the first model download.
Install
With Homebrew:
brew install --cask damione1/tap/souffleOr download the .dmg from the latest release and drag Soufflé into Applications. Every build is signed and notarized, so it opens normally: no right-click detour, no Gatekeeper warning.
On first launch the setup wizard downloads a speech model, between 670 MB and 5.6 GB depending on which one you pick. That download is the only moment Soufflé needs the network in order to transcribe.
Requirements
Permissions
The setup wizard has an optional Permissions step; skip it and Soufflé asks for each of these as you use the feature that needs it. Notifications are the exception, requested when the app launches. Settings → System → Permissions shows the current state of each and links straight to the matching System Settings pane.
Refusing one disables only the feature that needs it. Without System Audio a meeting still records your microphone and the transcript is labelled Mic only. Without Accessibility the dictated text is copied to the clipboard instead of being inserted for you, and a single-key shortcut cannot install its event tap; classic modifier shortcuts still work.
First run
A setup wizard covers the permissions Soufflé needs, which microphone to use, the speech model to download, and the dictation shortcut. The default shortcut is ⌘⇧Space.
The shortcut step also offers auto-paste, off until you tick it: when it is on and you stop dictating, the text goes straight into the app you were in. Left off, the text is put on the clipboard instead. A fresh install finishes with Launch at login on; change that later in Settings → System. Everything here can be changed later in Settings.
Dictation
Press the shortcut anywhere, talk, press it again. The text is inserted into whatever app had focus, or copied to the clipboard while auto-paste is off. Press Esc during a toggle dictation to throw it away. If a paste fails, the text waits on Home under Dictation to recover until you copy or delete it.
Apps that reject a synthetic paste (terminals, secure fields) can receive simulated keystrokes instead. Settings → Interface offers three insertion methods: the clipboard and ⌘V, simulated typing, or a direct write to the focused field through Accessibility.
Two passes run on the way out, and each can be turned off. Dictation polish, on by default when a provider is available, sends the raw transcript through a local LLM with an editable prompt template (clean up, professional email, bullet points, remove fillers) and needs Apple Intelligence or Ollama. Learn from edits, on by default, watches the field just after insertion: correct a misheard name by hand once and Soufflé keeps that spelling for next time, in the custom dictionary under Settings → Transcription.
Voice snippets live under Settings → Transcription: say a trigger phrase at the start of a dictation and Soufflé pastes the expansion instead, case- and accent-insensitive, with no AI polish on that take. The menu bar also offers Copy Last Transcription when you need the previous take back, and Pause Shortcut (1h) when you need the key for something else.
Optional start and stop sounds confirm the shortcut landed.
Shortcuts
Both dictation shortcuts are set in Settings → Interface. Each takes a classic combo with a modifier, or a single key (a lone left or right modifier, or F5–F12), which needs the Accessibility permission so the native tap can install. The two bindings cannot share a combination.
The overlay
Dictation does not open a window. A small overlay, the pill, appears above whatever you are working in: a recording dot, the label, a live waveform and a stop button. It stays compact until there is text to show, then widens and grows line by line as you talk.
When you stop, the pill switches to Reformulating… while the local polish pass runs, then disappears as the text lands in the field you were already using. By default the window is excluded from screen capture, so it does not turn up in the meeting you are in; Hide recording overlay in screen captures in Settings → Interface turns that off.
You can hide the overlay in Settings → Interface; drag it when visible to move it. Position is remembered across display changes.
Meetings
A meeting records your microphone and, on macOS 14.4+, the system audio, so the live transcript separates Me from Them as it goes. That separation needs a Kyutai model; Whisper and Parakeet transcribe the meeting as one mixed stream.
The lifecycle is meant to be hands-off: the app notifies you when a calendar meeting begins, and today's events have a start button on Home. It detects when the meeting seems over and stops on its own after warning you, and recovers or salvages the session if the engine stalls or the microphone disappears. When the Mac goes to sleep the recording is closed cleanly, and Soufflé offers to resume it on wake. A stopped meeting can also be picked up by hand with Resume recording, which adds another session to the same meeting. If a microphone stops responding, a banner says so and offers Restart Soufflé.
A meeting stops on its own after 10 minutes without speech, with a 4-hour failsafe behind it. Both are adjustable in Settings → Audio, along with the microphone Soufflé should prefer.
Audio recording is off by default. Turn it on in Settings → System → Data and the meeting sound is kept as compact Opus files, for 7 days, 30 days or until you delete them, replayable with click-to-seek from any line of the transcript. With system audio the file is stereo, you on the left and the others on the right, at about 1.5x the disk of mono.
From a meeting's page you can copy the summary or the transcript, export the meeting, or delete it. The summary templates are yours to edit in Settings → AI.
Summaries
Summaries are generated on-device: by Apple Intelligence on macOS 26 or newer, with nothing to install, and otherwise by a local Ollama. Alongside the prose summary, Soufflé extracts decisions, action items with owners, and open questions.
Setting up Ollama takes two commands:
brew install ollama
ollama pull qwen2.5:7bThen, in Settings → AI, leave the server at http://localhost:11434 and pick the model. Any general-purpose chat model works; qwen2.5:7b is the one Soufflé recommends. The same provider is what dictation polish uses.
Nothing about a summary is sent anywhere. With Ollama the only request is to your own instance.
Speech models
All models run locally and are downloaded on first use from HuggingFace. Switch at any time in Settings → Transcription.
The two Kyutai models are the streaming ones: text appears while you are still talking. Whisper and Parakeet transcribe the whole recording once you stop, which is fine for a meeting you read afterwards but changes how dictation feels.
A loaded model is unloaded after an hour of inactivity to give the RAM back, and reloaded on the next recording. Change or disable that in Settings → Transcription.
Settings reference
Six tabs. The settings worth knowing about:
InterfaceClipboard and ⌘V, simulated typing, or a direct Accessibility write. Change it when an app refuses the paste.
InterfaceOn: the text goes into the app you were using. Off, the default: it is copied to the clipboard.
InterfaceHow long to wait before pasting. Raise it if the text lands in the wrong app.
InterfaceThe interface in French or English, and a light, dark or system appearance.
InterfaceStart and stop cues, with a volume.
InterfaceHide the floating HUD while dictating or in a meeting. Drag it when visible to move it; the position is remembered. A second switch, on by default, keeps it out of screen captures.
AIThe local LLM pass and its prompt templates, which you can edit. On by default when Apple Intelligence or Ollama is available.
TranscriptionProper nouns and technical terms to spell correctly, filled in by hand or learned from your corrections.
TranscriptionTrigger phrases that expand to a prepared block of text at the start of a dictation. Matching skips the polish pass.
AudioAn ordered list of preferred inputs, a separate choice for clamshell mode, and a switch that keeps Bluetooth headsets from being used as microphones so they stay in stereo.
AudioStop after 5, 10, 15 or 30 minutes without speech, with a hard failsafe behind it.
AudioA hint for language detection in meetings, never forced on the engine.
TranscriptionFree the model's RAM after 5, 15 or 60 idle minutes, or never.
MeetingsOff until you turn it on. Lists today's events from the calendars you keep ticked, reminds you a few minutes before one (2 by default), and notifies you when one begins while a call is using the microphone.
AIProvider, Ollama server and model, and the summary templates.
SystemOpen Soufflé automatically when you start your Mac. On by default after a fresh setup wizard.
SystemOff, keep 7 days, keep 30 days, or keep until you delete it.
SystemDeletes the selected speech model from disk, once it is downloaded and not loaded.
SystemAsks GitHub once a day whether a newer release exists. Turn it off in About. An update is downloaded only when you press Download update, and installed with Install and restart, which asks you to stop a running meeting first.
What touches the network
The privacy claim is worth checking rather than believing, so here is every outbound connection the app makes.
Your audio, transcripts, notes and summaries are never sent anywhere. They live in a local SQLite database: Settings → System → Data exports the lot, and deleting the data folder removes it.
Where your data lives
Everything sits in one folder, ~/Library/Application Support/com.souffle.desktop/. Settings → System → Data has a button that reveals it in Finder.
souffle.dbSQLite: meetings, transcripts, notes, summaries, dictation history, the custom dictionary and your settings.models/Downloaded speech models, filed by engine and backend. Deleting one frees the disk; it is downloaded again if you select that model later.recordings/Meeting audio as Ogg/Opus, one folder per meeting. Empty unless you turned recording on.logs/Rotating application logs. This is what to attach when you report a problem.Backing that folder up backs up everything. Deleting it returns the app to a first launch.
Export
Any meeting exports as Markdown, JSON, or SRT/VTT subtitles, with its recorded audio alongside if you kept any. The whole archive exports as a plain folder of Markdown and JSON. No proprietary container, nothing to migrate out of later.
MCP server
The bundled souffle-mcp sidecar lets Claude Desktop, Claude Code or any MCP client search and read your transcripts. It is read-only, fully local, and works even when the app is closed.
For Claude Code:
claude mcp add souffle "/Applications/Soufflé.app/Contents/MacOS/souffle-mcp"For Claude Desktop, in claude_desktop_config.json:
{
"mcpServers": {
"souffle": {
"command": "/Applications/Soufflé.app/Contents/MacOS/souffle-mcp"
}
}
}Five tools are exposed: list_meetings, get_meeting, search_meetings, get_latest_meeting and list_dictations. Settings → System → Data carries the same snippets with the path already filled in, plus a button that tests the connection.
Headless CLI
The souffle binary transcribes a file without launching the app. It ships inside the app bundle and is not added to your PATH, so invoke it by full path or symlink it once.
# Run directly
"/Applications/Soufflé.app/Contents/MacOS/souffle" --list-engines
# Or expose it as a `souffle` command
ln -s "/Applications/Soufflé.app/Contents/MacOS/souffle" /usr/local/bin/souffle
# Transcribe a file, JSON on stdout
souffle --transcribe-file audio.wav --json
--transcribe-file <WAV>Transcribe a WAV file and exit.--jsonEmit one machine-readable JSON object instead of text.--repeat NRun the same file N times. The model loads once, so this doubles as a benchmark harness for comparing models on your machine.--list-enginesList the available engines.--list-modelsList every engine, model and backend combination with its install status.--engine, --model, --backendOverride what is saved in Settings for this run.It reads the same database and the same downloaded models as the app, so anything already installed is reused.
Troubleshooting
Symptom first, then the usual cause.
models/ forces a clean re-download.logs/ holds the recent logs, which are what an issue needs.Uninstall
Installed with Homebrew:
brew uninstall --cask souffleOtherwise, drag Soufflé out of Applications.
Either way your data stays. To remove it too, quit Soufflé and delete ~/Library/Application Support/com.souffle.desktop/: meetings, dictations, recorded audio and models all live there.
To reclaim disk without uninstalling, select a speech model you no longer use and delete it under Settings → System → Model storage. It has to be downloaded and not loaded.
Build from source
The app is Rust with a native Slint interface, plus a little Swift for the overlay. Building it requires an Apple Silicon Mac, Rust, the Xcode command-line tools, and cmake (brew install cmake).
git clone https://github.com/damione1/souffle.git
cd souffle
make nightlymake nightly builds and opens Soufflé Nightly, a debug build with its own identity that sits next to an installed Soufflé. ./scripts/bundle-macos.sh builds a signed release bundle.
Reporting a problem
If something does not work the way this documentation describes, open an issue. Include your macOS version, your Mac model, the audio devices involved, and a log from the logs/ folder.
License
Copyright © 2026 Damien Goehrig. Released under the GNU General Public License v3.0 or later. You are free to use, study, modify and redistribute it, provided derivative works are published under the same license.