Amanu
Records and transcribes online meetings. Automatically.
Amanu is a free, open-source meeting recorder for macOS. It works with Zoom, Google Meet, Telegram, WhatsApp, and other call apps without sending a bot into the meeting. It starts and stops recording on its own, separates speakers, writes a detailed summary, and keeps the complete record in an ordinary folder on your Mac.
Website · Download the latest release · MIT license
What Amanu does
- Records meetings automatically. Amanu notices when a call app is using
- Produces a speaker-attributed transcript. Your microphone and the other
- Puts names to voices. Amanu uses calendar participants and evidence in the
- Writes a detailed summary. The result covers the topic, key points,
- Shows its work. The status window, menu bar, and Dock icon make it clear
- Keeps one folder per meeting. Audio, transcript, speaker names, summary,
Local when you want it, powerful when you need it
Recording always happens on the Mac. Amanu can also transcribe and summarize a meeting without sending its contents anywhere:
- Parakeet provides local transcription on Apple Silicon.
- The optional live transcript uses a separate on-device model.
- Ollama can write summaries locally when its Base URL is localhost/loopback.
There is no Amanu account and no hosted meeting library. No meeting content leaves the Mac unless you choose a cloud transcription or summary backend. Cloud and CLI summary backends receive the transcript plus available meeting context such as its title and calendar participants; Ollama keeps that work on the Mac when it is configured with a localhost/loopback Base URL. The complete data-flow description is in the privacy notice. Work that cannot run without a network is marked as deferred and resumed later instead of being silently dropped. A summary or naming pass that keeps reaching a model without getting an answer stops after five tries, until its settings, keys or backends change.
Anonymous product-usage reporting is enabled by default with a random install UUID. The last control in first-run setup, and the same control in Settings, turns it off. Recordings, transcripts, summaries, calendar contents, names, paths, keys, and error text are never included. The complete event and field list is public in What Amanu sends.
What a meeting leaves behind
A typical retained session looks like this:
~/Recordings/2026.09.02-1400 Weekly sync/
├── audio.m4a # optional: microphone left, call audio right
├── transcript.md # readable transcript with speaker names
├── transcript.json # timed segments and engine provenance
├── speakers.json # names, confidence, and supporting evidence
├── summary.md
├── meta.json # timing, devices, trigger, and processing state
└── transcribe.log
Audio can be discarded automatically after a successful transcript. If transcription fails, Amanu keeps the source recording so it can be tried again. The recordings window shows what is complete, pending, or failed for every session.
Why Amanu is built this way
The less visible parts of Amanu come from failures measured on real calls, not from an idealized recording pipeline.
- No bot, virtual audio device, or kernel extension. A Core Audio process
- The two sides stay separate. Amanu records the microphone and system
- Recording must not change the meeting. Apple's duplex voice-processing
- Capture is crash-recoverable. The live tracks are uncompressed PCM in
- The folder is the database.
meta.jsonand the artifacts beside it are
- **It is a signed application, not a background executable pretending to be
- Updates wait for the recording. Sparkle checks and installs signed
- Failures become tests. The automated suite covers interrupted sessions,
The constraints behind these choices are documented in
Things that will bite. Design notes live in
docs/specs.
Install
Install with Homebrew:
brew install --cask gsamat/tap/amanu
Or download the disk image from the
latest release, drag
Amanu.app to Applications, and open it. The first-run setup requests
microphone, system-audio, and optional calendar access, then asks how meetings
should be transcribed and summarized.
Requirements:
- macOS 14.2 or later.
- Apple Silicon for local transcription and the live transcript.
- The distributed app is universal (
arm64andx86_64). On Intel, recording
The release is signed with a Developer ID certificate and carries a stapled Apple notarization ticket. Amanu checks for signed updates automatically and will not install one during a recording.
Build from source
Amanu is one Swift 6 package. SwiftPM builds the executable; make app
builds the pinned LocalVQE native assets, then assembles and signs the
application bundle without an Xcode project. Building from source requires
CMake as well as Xcode's command-line tools.
git clone https://github.com/gsamat/amanu.git
cd amanu
make app
make run-app
swift test
make run-app launches through LaunchServices, which matters because macOS
attributes privacy permissions to the process responsible for starting the
capture. A checkout with no signing certificate falls back to ad-hoc signing;
that is sufficient for development, although macOS may ask for permissions
again after a rebuild.
Before changing capture, packaging, permissions, or releases, read
CLAUDE.md, Things that will bite, and
Releasing.
CLI
First launch creates ~/.local/bin/amanu, pointing into the installed app so
scripts use the same signed program as the UI.
amanu doctor # check permissions, engines, and configuration
amanu record start # ask the running app to start recording
amanu record stop
amanu sessions # list recordings and outstanding work
amanu process <folder> # finish or retry one meeting
amanu format-transcripts # rebuild AssemblyAI Markdown from saved transcripts
amanu setup # reopen first-run setup
Run amanu --help or amanu for the complete command-line
interface. Most people never need it: recording and post-processing are
automatic, and the app exposes the same controls.
Configuration
Settings writes ~/.config/amanu/config.json. The file is optional and stores
only values that differ from the defaults. A compact example:
{
"recordings_dir": "~/Recordings",
"keep_audio": false,
"analytics": true,
"interface_language": "auto",
"transcription": {
"enabled": true,
"engine": "auto",
"cloud": "assemblyai",
"language": "ru",
"assemblyai": { "api_key_path": "~/.config/amanu/keys/assemblyai" }
},
"auto_record": {
"enabled": true,
"mic_activity": true,
"calendar": false,
"start_delay_seconds": 12,
"stop_delay_seconds": 15,
"min_duration_seconds": 45,
"silence_stop_minutes": 10,
"max_duration_minutes": 300,
"apps": ["us.zoom", "com.google.Chrome"],
"ignore_apps": []
},
"summary": {
"enabled": true,
"backend": "auto",
"language": "ru"
},
"on_stop": "my-hook"
}
recordings_dirselects the session folder;keep_audioretains the compact
on_stop is a shell command
run after processing; analytics controls anonymous product-usage reporting.
on_stopgets the session folder as its only argument and runs once per
transcription.*coversenabled,engine,cloud,local_engine,model, andlanguage.
local_engine is parakeet by default, whisper, or gigaam; Whisper
downloads about 550 MB once. GigaAM v3 downloads about 260 MB and runs
locally through Handy's transcribe.cpp Metal/CPU runtime. It is Russian-only;
Amanu splits long recordings into 20-second pieces to stay inside its trained
utterance window.
Provider overrides are transcription.openai.model,
transcription.openai.api_key_path,
transcription.assemblyai.api_key,
transcription.assemblyai.api_key_path, and
transcription.assemblyai.speech_model, plus
transcription.elevenlabs.api_key and
transcription.elevenlabs.api_key_path. Choose elevenlabs as
transcription.cloud or transcription.engine to use Scribe v2. It sends
the microphone and system channels separately, with speaker diarization on
each; a mono import uses the same diarization. Set ELEVENLABS_API_KEY or
save a key in ~/.config/amanu/keys/elevenlabs. live_transcription.enabled
controls the on-device preview.
auto_record.*coversenabled,mic_activity,calendar,
start_delay_seconds, stop_delay_seconds, min_duration_seconds,
max_duration_minutes, silence_stop_minutes, apps, and ignore_apps.
speaker_names.*coversenabled,backend, andmodel. Naming sends
summary.backend does, and to no model when
summaries are off, unless speaker_names.backend names a backend of its own.
summary.*coversenabled,backend,language,model,
openai_model, openai_base_url, ollama_model, ollama_base_url,
template, api_key_path, openai_api_key_path, and
openai_compatible_api_key_path. The two Base URLs
allow OpenAI-compatible servers and a non-default Ollama host; only a
loopback Ollama URL keeps the transcript on this Mac, and any other host
must be reached over https — plain http is refused off this Mac. The OpenAI
key is only ever sent to OpenAI: summary.openai_api_key_path names it for
summaries while openai_base_url is OpenAI's own, and
transcription.openai.api_key_path names it for transcription (an older
config's summary.openai_api_key_path still counts for transcription while
the summary talks to OpenAI). The key for any other server is
summary.openai_compatible_api_key_path, or one pasted in Setup, which is
kept in ~/.config/amanu/keys/openai-compatible. amanu doctor walks the configured summary backend,
including whether Ollama is answering and has the chosen model. template contains
the complete summary instructions and starts with Amanu's built-in default.
mic_voice_processingenables Apple's capture-time voice processing;
offline_echo_cancellation (on by default) instead cleans a copy of the mic
after recording, using system audio as the playback reference. It never
opens a playback device or changes the archived source audio. Transcription
uses a separate cache for cleaned audio; the first re-transcription of an
older recording therefore needs a new provider request. Reference silence
before playback and after a one-second acoustic-tail holdoff keeps the
original microphone samples exactly. If playback occurs later, the model
still consumes leading silence from the start so its delay-estimation clock
remains aligned with the recording; an entirely silent reference is detected
first and skips the model;
transcript_echo_filter removes proven duplicate far-end speech later;
system_audio is app or all; calendar controls meeting context; and
user_name replaces “me” in named transcripts.
interface_languageisauto,en, orru.dock_icon,menu_bar_icon,
window control where Amanu appears.
Inline and file-based API keys remain supported for compatibility, but the UI never displays an inline secret. Environment variables take precedence.
Project
Amanu began as a fork of digimata/quill and has since been substantially rewritten. The fork grew into a native app with first-run setup, automatic recording, live transcription, speaker naming, a resumable processing pipeline, local and cloud backends, crash recovery, a regression suite, and signed automatic updates. FORK.md records the project's provenance and explains how the architecture diverged.
The name comes from amanuensis: a person whose job is to write down what is said. Amanu is free software under the MIT license; dependency licenses are listed in third-party notices.