Private, local-first meeting transcription with real speaker attribution.
English · Español
Features ·
Quick start ·
Privacy ·
Development
Kuali listens to live calls, transcribes them on your computer, and keeps every speaker attached to their words. Meetings become a searchable library with live transcripts, summaries, decisions, questions, and participant-owned tasks.
Raw audio is processed in memory by Whisper and Silero. It is never retained as an audio recording and never sent to a Kuali-operated service.
- Live, speaker-attributed transcription for Discord and browser meetings.
- Separate concurrent meetings without shared participants, clocks, or state.
- Local Whisper inference with Metal acceleration and Silero voice detection.
- Searchable meeting library with transcript excerpts, channel folders, and Markdown or JSON export.
- Optional summaries, key points, decisions, questions, and tasks by participant.
- Task filters by person, meeting, status, and date range.
- Signed webhooks containing the completed meeting and full transcript.
- English and Spanish interface, guided setup, menu-bar controls, and launch at login.
Install the current macOS release with Homebrew:
brew install --cask igarrux/kuali/kuali
xattr -dr com.apple.quarantine /Applications/Kuali.appTo build from source, install Rust 1.89+, CMake, and a C/C++ toolchain. Node.js 22+ is needed only for extension development and tests.
git clone https://github.com/igarrux/kuali.git
cd kuali
cargo run -p kuali-appKuali opens its guided setup on first launch. The guide walks through creating the Discord bot, installing the browser extension, and downloading a Whisper model without requiring manual configuration-file edits.
Create a bot in the Discord Developer Portal, copy its token into Kuali, and install it in the servers where it should record. The in-app guide shows each screen and the exact permissions required.
Kuali can follow one configured Discord account automatically. Automatic
following can be paused at any time without forgetting the account. A person in
a voice channel can also invite the bot with /grabar or /record.
When Kuali joins, it plays and posts the consent notice. It repeats the notice for participants who arrive later and keeps an append-only consent audit log. Kuali never captures its own announcement.
The extension source lives in browser-extension/.
Until a store release is available, open the extensions page in Chrome, Edge,
Brave, or Arc, enable developer mode, and load that directory as an unpacked
extension. The desktop guide provides the same process step by step.
The extension connects only to Kuali's loopback listener. It preserves separate speaker tracks and participant identity when the meeting service exposes them, and labels mixed audio honestly instead of inventing an attribution.
Model weights are downloaded separately and are not embedded in the app. The
default directory is ~/.kuali; it can be changed from Settings, including to
external storage. Kuali verifies model integrity when weights are downloaded or
moved, and each installed weight can be removed individually.
| Model | Download | Best for |
|---|---|---|
| Tiny | 78 MB | Fast setup checks |
| Base | 148 MB | Lightweight transcription |
| Small | 488 MB | Balanced resource use |
| Medium | 1.5 GB | Higher accuracy |
| Large v3 Turbo | 1.6 GB | Maximum multilingual quality |
| Large v3 Turbo Q5 | 574 MB | Recommended balance |
| Large v3 Turbo LatAm | 1.6 GB | Latin American Spanish |
| Large v3 Turbo LatAm Q5 | 574 MB | Lighter LatAm option |
Summaries are optional. Turn off Settings → Summaries and tasks and Kuali will not send any transcript to an LLM. The switch blocks both automatic and manual summary generation.
When enabled, Kuali can use an authenticated Claude Code, Codex, or Gemini CLI;
a direct Anthropic, OpenAI, or Gemini API key; or an OpenAI-compatible endpoint
such as Ollama or LM Studio. Provider credentials are stored with 0600
permissions in Kuali's configuration file.
| Data | Handling |
|---|---|
| Raw audio | Processed in memory; not saved as an audio file |
| Transcripts and meeting metadata | Stored locally in Kuali's application-data directory |
| Whisper model weights | Stored in the directory selected by the user |
| LLM requests | Disabled by the Summaries and tasks switch; otherwise sent only to the configured provider |
| Webhooks | Disabled until the user creates and enables a subscription |
Recording and consent requirements vary by location. Kuali provides audible, written, and logged disclosure mechanisms, but the person operating it remains responsible for using them appropriately. See the full privacy policy.
~/.kuali/ Whisper and Silero weights
~/Library/Application Support/com.onwev.Kuali/
└── meetings/<id>/
├── meta.json
└── meeting.json
~/Library/Preferences/com.onwev.Kuali/config.toml
Settings → Data → Reset Kuali removes Kuali-owned configuration, meetings, logs, and Whisper weights after typed confirmation. It preserves the bundled runtime, Silero, the browser extension, and unrelated files in external model directories.
Kuali can deliver a meeting.completed webhook for every meeting or for one
specific Discord channel. The payload contains participants, the timestamped
transcript, summary status, and—when enabled—the generated insights and tasks.
Requests are signed with HMAC-SHA256 and retried only for transient failures.
Each request includes X-Kuali-Event, X-Kuali-Delivery,
X-Kuali-Timestamp, X-Kuali-Attempt, and X-Kuali-Signature. Verify the
lowercase hexadecimal HMAC-SHA256 over timestamp + "." + body.
cargo fmt --all --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace
(cd browser-extension && npm test)
node --test src/i18n.test.mjsThe interactive Google Meet end-to-end test opens a real meeting and verifies the capture wire, speaker attribution, live Whisper output, clean shutdown, and model unload:
cd browser-extension
npm run test:e2e:meet| Path | Responsibility |
|---|---|
crates/kuali-core |
Shared types and configuration |
crates/kuali-discord |
Discord lifecycle, consent, and per-speaker audio |
crates/kuali-meet |
Local browser-meeting ingest and wire protocol |
crates/kuali-stt |
Segmentation, Silero VAD, Whisper, and model storage |
crates/kuali-llm |
LLM providers and structured meeting insights |
crates/kuali-store |
Persistence, search, and export |
crates/kuali-engine |
Concurrent meeting orchestration |
src-tauri / src |
Desktop backend and bilingual interface |
browser-extension |
Browser capture extension |
Contributions are welcome. Read CONTRIBUTING.md before opening a pull request, and report security issues through GitHub private vulnerability reporting.
The desktop workspace is available under the MIT License. The
browser extension is distributed separately under the
Apache License 2.0; third-party notices are in
browser-extension/NOTICE.
