Persistent configuration lives in ~/.config/call2notes/config.toml (Linux) or %APPDATA%/call2notes/config.toml (Windows). Override with CALL2NOTES_CONFIG.
| Key | Required | Description |
|---|---|---|
openai_api_key |
Yes | OpenAI API key (or compatible provider) |
openai_model |
Yes | Model name (e.g. gpt-4o-mini) |
openai_base_url |
No | Provider base URL (defaults to OpenAI) |
data_dir |
No | Data root (default: ~/.local/share/call2notes/) |
device |
No | auto (default), cpu, or cuda |
summary_prompt |
No | Path to a custom prompt markdown file. Use default.md, support.md, brainstorm.md, memo.md, or chat.md for bundled prompts (see Bundled prompts) |
summary_copy_dir |
No | Directory to copy summaries into |
summary_template |
No | Output path template (see below) |
no_mic |
No | Skip microphone capture (boolean) |
Inherit all keys from [default]. Add profile-specific overrides:
| Key | Description |
|---|---|
name |
Meeting name used when --name is not passed |
identify_speakers |
Match speakers against embeddings.json (boolean) |
Every key in [default] has a CALL2NOTES_<UPPERCASE_KEY> env var equivalent (e.g. CALL2NOTES_DEVICE=cpu, CALL2NOTES_SUMMARY_PROMPT=~/my-prompt.md).
Additional env vars:
| Variable | Description |
|---|---|
CALL2NOTES_CONFIG |
Config file path (default: ~/.config/call2notes/config.toml) |
CALL2NOTES_PROFILE |
Active profile name |
CALL2NOTES_MIC_SOURCE |
Pin a specific mic source; on Windows use default or a device-name substring |
<data_dir>/ ← ~/.local/share/call2notes/ (Linux) / %LOCALAPPDATA%/call2notes/ (Windows)
├── embeddings.json ← shared speaker embeddings
├── raw_person/ ← enrolled speaker WAV clips (shared)
│ └── David/seg_0.0-4.2.wav
├── work-daily/ ← auto-namespaced by profile name
│ ├── raw/
│ │ └── 20260505_1015-daily.wav
│ └── processed/
│ └── 20260505_1015-daily/
│ ├── transcript.txt
│ ├── summary.md
│ └── SPEAKER_00/
│ └── seg_0.0-4.2.wav
└── personal/ ← another profile
└── raw/...
raw/andprocessed/are per profile under<data_dir>/<profile>/raw_person/andembeddings.jsonare shared at thedata_dirroot
Call2Notes ships with these prompts in src/Call2Notes/prompts/. Reference them by filename in summary_prompt:
| File | Type | Language | Description |
|---|---|---|---|
default.md |
Meeting notes | EN + ES | Structured bilingual meeting notes with key points, decisions, action items, offtopics, and open questions. |
support.md |
Support / Debugging | ES | Technical support session notes: problem, diagnosis, root cause, solution, follow-up. |
brainstorm.md |
Brainstorming / Ideation | ES | Creative session notes: ideas grouped by theme, connections, selected items, actions. |
memo.md |
Voice memo | ES | Personal voice memo to structured notes: key topics, tasks, questions, reflections. |
chat.md |
Casual conversation | ES | Adaptive notes for any informal conversation: catch-up, planning, emotional support, desahogo, debate, shared interests, decisions. Adapts depth and sections to conversation type. |
Usage example:
[default]
summary_prompt = "support.md"Or override per run:
call2notes summarize --prompt brainstorm.mdControls where summaries are saved inside summary_copy_dir.
Available variables:
| Variable | Example |
|---|---|
{name} |
daily |
{slug} |
daily (sanitized) |
{recording_id} |
20260505_1015 |
{date} |
2026-05-05 |
{time} |
1015 |
{datetime} |
2026-05-05_10-15 |
{yyyy} |
2026 |
{mm} |
05 |
{dd} |
05 |
{yyyy-mm-dd} |
2026-05-05 |
Default: {yyyy}/{mm}/{dd}_{time}_{slug}.md
Do not use {HH:MM} — colons have special meaning in Python format strings. Use {time} instead.
Create ~/.config/call2notes/config.toml interactively. Optional --data-dir <path>.
Full pipeline: record → transcribe → summarize.
Options: --profile, --no-mic, --name, --identify-speakers, --keep-sources.
Raw audio capture only. Requires --output or a profile.
Options: --name, --no-mic, --profile.
Diarize and transcribe a raw WAV. Requires --input or a profile.
Options: --output, --segments-dir, --identify-speakers, --profile.
Generate a summary markdown from a transcript file.
Options: --output, --recording-id, --profile.
Diagnose effective configuration, paths, device, and list configured profiles.
Options: --profile.
Remove intermediate artifacts.
Options: --dry-run, --keep-last N, --segments-only, --raw-only, --processed-only, --from YYYY-MM-DD, --profile.
Name speakers from a processed directory.
Arguments: input_dir.
Options: --name (direct mode for a single speaker), --profile.
Build or update speaker embeddings from raw_person/ directories.
Options: --samples-dir, --output, --profile.
auto(default): CUDA if PyTorch detects it, CPU otherwise.cpu: force CPU even if CUDA is available.cuda: require GPU, fail fast if unavailable.
By default Call2Notes follows the active PulseAudio/PipeWire default source on Linux, or the default microphone selected at recording start on Windows. To pin a specific device:
CALL2NOTES_MIC_SOURCE="alsa_input.usb...source" call2notes recordOn Windows, use CALL2NOTES_MIC_SOURCE="Microphone name" with a device-name substring. To find available Linux sources: pactl list sources short | grep input
- Run
call2notes runwithidentify_speakers = false(default). - After transcription, segments are grouped as
SPEAKER_00,SPEAKER_01, etc. - Run
speakers collecton the processed directory — it reads the transcript, shows example phrases, and lets you enter names. - For each named speaker, the best segments are copied to
raw_person/<Name>/. - Run
speakers enrollto compute and save embeddings. - Set
identify_speakers = truein the profile for future runs.
To name a single speaker directly:
call2notes speakers collect <processed_dir>/SPEAKER_00 --name David --profile work-daily