Documentation

Everything Soufflé does, and what it needs to do it.

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/souffle

Or 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

MacApple Silicon. There is no Intel build.
macOS 13+Dictation, and meetings recorded from your microphone.
macOS 14.4+Meetings that also capture the other participants. System-audio capture uses the Core Audio process tap, which does not exist before 14.4. On macOS 13 a meeting still records, and the transcript is labelled Mic only.
Disk670 MB to 5.6 GB for the speech model, downloaded on first use.
SummariesApple Intelligence, which needs macOS 26 or newer, or a local Ollama on any supported version. Transcription needs neither.

Permissions

Soufflé asks for each of these as you use the feature that needs it, never up front. Settings → System → Permissions shows the current state of each and links straight to the matching System Settings pane.

MicrophoneRecords your voice so it can be transcribed. Needed for everything.
System AudioCaptures what the other participants say, without a virtual audio device. Meetings on macOS 14.4+.
AccessibilityInserts the text into the app you were using, and reads back your corrections when “learn from edits” is on.
CalendarReads today's events to list them and offer to start recording. Optional, and off until you turn it on.

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.

First run

A setup wizard covers four things: the permissions Soufflé needs, which microphone to use, the speech model to download, and the dictation shortcut. The default shortcut is ⌘⇧Space.

The last step also offers auto-paste, on by default: when you stop dictating, the text goes straight into the app you were in. Turn it off and the text is put on the clipboard instead. 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 if you turned auto-paste off.

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 optional passes run on the way out. Dictation polish 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.

Optional start and stop sounds confirm the shortcut landed.

Shortcuts

Both dictation shortcuts are set in Settings → Interface. Each must include a modifier key, and the two cannot share a combination.

Toggle dictationPress once to start, once to stop. ⌘⇧Space by default.
Push-to-talkHold to record, release to stop. Not set by default; bind it if you prefer holding.

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. The window is excluded from screen capture, so it does not turn up in the meeting you are in.

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.

The lifecycle is meant to be hands-off: the app offers to start when a calendar meeting begins, 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 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.

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:7b

Then, in Settings → Meetings → Summarization, 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.

Kyutai STT 1BDefault. French and English, ~2.4 GB, Metal GPU via Candle. Streams text while you speak.
Kyutai STT 2.6BEnglish only, higher quality, ~5.6 GB. Streams text while you speak.
Whisper Large V3 TurboMultilingual, ~1.6 GB, Metal via whisper.cpp. Transcribes once you stop.
Parakeet TDT 0.6B v325 languages with punctuation and capitalization, ~670 MB int8, fast CPU inference via ONNX Runtime. Transcribes once you stop.

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 → Audio.

Settings reference

Five tabs. The settings worth knowing about:

Insertion method
Interface
Clipboard and ⌘V, simulated typing, or a direct Accessibility write. Change it when an app refuses the paste.
Auto-paste
Interface
On: the text goes into the app you were using. Off: it is copied to the clipboard.
Feedback sounds
Interface
Start and stop cues, with a volume.
Dictation polish
Transcription
The local LLM pass and its prompt templates, which you can edit. Needs Apple Intelligence or Ollama.
Custom dictionary
Transcription
Proper nouns and technical terms to spell correctly, filled in by hand or learned from your corrections.
Microphone priority
Audio
An 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.
Meeting auto-stop
Audio
Stop after 5, 10, 15 or 30 minutes without speech, with a hard failsafe behind it.
Model unload
Audio
Free the model's RAM after 5, 15 or 60 idle minutes, or never.
Calendar
Meetings
Off until you turn it on. Lists today's events and offers to start recording when one begins.
Summarization
Meetings
Provider, Ollama server and model, and the summary templates.
Meeting audio
System
Off, keep 7 days, keep 30 days, or keep until you delete it.
Update check
System
Asks GitHub once a day whether a newer release exists. Turn it off in About.

What touches the network

The privacy claim is worth checking rather than believing, so here is every outbound connection the app makes.

huggingface.coDownloads a speech model the first time you select it. Nothing is sent, and once the model is on disk transcription works offline forever.
api.github.comOnce a day, and whenever you press Check for updates, asks whether a newer release exists. It sends nothing but the request: no identifier, no account, no usage data. It shows a dialog and never downloads or installs anything. Turn it off in Settings → About.
localhost:11434Your Ollama instance, only if you enable summaries with Ollama. It is your machine unless you point it elsewhere.

Your audio, transcripts, notes and summaries are never sent anywhere. They live in a local SQLite database, and Settings → System → Data exports or deletes the lot.

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, 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.

The other participants are missing from the transcriptSystem-audio capture needs macOS 14.4 or later and the System Audio permission. When it is unavailable the transcript is labelled Mic only and records your microphone alone.
The dictated text is not insertedAuto-paste may be off, in which case the text is waiting on the clipboard. Otherwise it is the Accessibility permission. If Soufflé is already listed and ticked there, the entry can be a stale one left by an update: remove it with the minus button and add it back, or use Settings → System → Permissions → Repair permission.
One app refuses the pasteTerminals and secure fields often reject a synthetic ⌘V. Switch the insertion method to simulated typing in Settings → Interface.
The wrong microphone is pickedPin an input, and a separate one for clamshell mode, in Settings → Audio. Bluetooth headsets are left out of automatic selection by default: using one as a microphone switches it to HFP and costs you stereo sound.
Polish or summaries do nothingBoth need a provider. Without Apple Intelligence (macOS 26+), install Ollama and pick a model in Settings → Meetings. The reason a pass was skipped is shown in the status message and written to the log.
A model download stopped part waySelect the model again; the download resumes. Deleting its folder under models/ forces a clean re-download.
Anything elseSettings → System → Data reveals the data folder. logs/ holds the recent logs, which are what an issue needs.

Uninstall

Installed with Homebrew:

brew uninstall --cask souffle

Otherwise, drag Soufflé out of Applications.

Either way your data stays. To remove it too, delete ~/Library/Application Support/com.souffle.desktop/ — or, before uninstalling, use Settings → System → Data, which clears meetings, dictations and recorded audio in one action.

To reclaim disk without uninstalling, delete the speech models you no longer use from Settings → Transcription.

Build from source

Requires an Apple Silicon Mac, Rust, Node.js 18+, and cmake (brew install cmake).

git clone https://github.com/damione1/souffle.git
cd souffle
npm install
npm run tauri dev

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.