Complete setup guide

From download to your first live transcript.

Choose Discord, browser meetings, or both. The desktop app repeats this guide and can save the configuration as you go.

01 · Desktop

Install Kuali on macOS

The current release supports macOS 11 or newer on Apple Silicon. Homebrew verifies the checksum pinned by Kuali’s tap before installing the application.

Terminal · macOS
$ brew install --cask igarrux/kuali/kuali
$ xattr -dr com.apple.quarantine /Applications/Kuali.app

Open Kuali from Applications. On first launch, the app opens its guided setup automatically. You can return to it later from the Guide button.

02 · Transcription

Download a Whisper model

Kuali includes the transcription engine, but model weights are downloaded separately. At least one model must be ready before initial setup can finish. If none is installed, Kuali keeps a model panel visible throughout the app instead of leaving transcription silently unavailable.

Choose the performance level that fits your Mac

Light uses Large v3 Turbo Q5 and is recommended for fast, accurate live transcription. Balanced uses Large v3 Turbo, Precise uses Large v3 Q5 for difficult audio, and Highest accuracy uses Kuali's reproducible Large v3 Q8 quantization. Kuali shows estimated RAM, download size, and the technical model name for every level.

Start the download

Select a model from the persistent model panel or open Settings → Transcription → Storage and choose Download selected model. The progress indicator remains visible while you use other parts of Kuali. Keep the app open until verification finishes.

You can join a call while it downloads

If a meeting starts before the model is ready, Kuali keeps the captured audio queued in memory and transcribes it when the download completes. Nothing already captured is discarded.

Choose where weights live

The default models folder is ~/.kuali. Use Models folder → Choose… to move downloaded or partial weights elsewhere. Kuali preserves the selected language and special terminology when moving them.

Manage downloaded weights

Under Downloaded weights, delete only the models you no longer need. If you remove the last one, the persistent model panel appears again until another model is ready.

The model uses RAM only during meetings

Kuali loads Whisper when the first active meeting needs it, shares that instance across concurrent meetings, and releases it after the final one ends. In testing on Apple Silicon, the Rust app used about 40 MB while waiting and up to about 600 MB while transcribing with the recommended Q5 model. Actual use varies. The downloaded weights remain on disk.

Add product names to the vocabulary

In Settings → Transcription → Custom vocabulary, add names such as internal products, acronyms, or people that Whisper should preserve.

03 · Discord

Connect Kuali to Discord in three simple steps

Create, paste, and authorize. Kuali prepares the technical details and saves each completed step; you only follow the buttons shown below. The dedicated bot token should be treated like a password.

Create the application

Open the Discord Developer Portal, sign in, select New Application, name it Kuali, and select Create.

Paste the token and your username

Open Bot, select Reset Token, and copy the value Discord shows. In Kuali, paste it together with your exact Discord @username, not the display name.

Treat the token like a password. Kuali verifies it locally from the desktop app and never places it in the authorization URL.

To copy your username, open your profile from the bottom-left corner of Discord and select the copy icon beside it.

Authorize the server

Kuali obtains the application ID from the token and opens Discord with the bot and applications.commands scopes already prepared. Choose the server, select Authorize, then return to Kuali and connect.

The authorization requests View Channels, Send Messages, Send Messages in Threads, Embed Links, Attach Files, Connect, Speak, and Use Voice Activity—never Administrator or permission to read message history.

With automatic following enabled, Kuali joins after you. You can pause following from Home or invite it manually with /record or /grabar.

04 · Meet, Teams, and Zoom

Connect Google Meet in three simple steps

Install, pin, and confirm. Chrome Web Store handles the extension and Kuali finds the desktop app locally—no developer mode or unpacked files. Keep Kuali open while recording.

Support status: Google Meet is stable. Microsoft Teams and Zoom are experimental and have partial support; capture, participant identity, or speaker separation may be incomplete in some meeting modes.

Install from Chrome Web Store ↗

Choose your browser

The Chrome Web Store listing works in Chrome, Edge, Brave, and Arc. Select Add when your browser asks for confirmation.

Pin Kuali

Open your browser’s extensions menu and pin the Kuali icon for quick access from meetings.

Confirm the local connection

Join a meeting and open Kuali’s extension. It should report that the desktop app is available and let you start recording. The default local port is 9099.

For development or when the store is unavailable, the desktop guide still provides the manual unpacked-install option.

05 · Integrations

Send completed meetings with Standard Webhooks

Kuali can deliver a completed meeting to applications you explicitly subscribe. These deliveries follow the Standard Webhooks specification, so existing verification libraries can validate them. The payload contains the transcript, participants, summary, and tasks available for the meeting; it never contains the original audio.

Create a subscription

Open Settings → Integrations → Subscribed applications, select Add application, and enter a name plus the endpoint URL that will receive the request. Use HTTPS for endpoints outside your computer.

Choose its scope

Subscribe the application to every completed meeting or limit it to one channel. Kuali sends meeting.completed only after that matching meeting and its optional AI processing finish.

Store the signing secret

Kuali generates a secret beginning with whsec_. Copy it into the receiving application and keep it private. Use Send test to receive a webhook.test event before relying on the integration.

Verify the raw request

Validate the signature before parsing the JSON. Standard Webhooks signs the exact bytes in webhook-id.webhook-timestamp.body using HMAC-SHA256.

Abbreviated webhook request
webhook-id: msg_01HXYZ
webhook-timestamp: 1786339200
webhook-signature: v1,BASE64_SIGNATURE

{"type":"meeting.completed","timestamp":"2026-08-10T16:00:00Z","data":{"id":"meeting-id","participants":[],"transcript":[],"summary":null}}
Verify against the raw request body, reject stale timestamps, compare signatures in constant time, and deduplicate deliveries by webhook-id. Return any 2xx response only after accepting the event.

Each request uses type, timestamp, and data at the top level. Failed deliveries are retried with backoff and jitter; a numeric Retry-After response is honored when present. Receivers must therefore be idempotent.

06 · Verification

Check your first call

Start with two participants if possible. Speak one at a time, then overlap briefly to confirm that activity and attribution react as expected.

  • Kuali shows the meeting under Live meetings.
  • The active participant lights up while speaking.
  • Text appears during the call, not only after it ends.
  • Muting a participant stops that participant’s activity.
  • Leaving the meeting finalizes it and releases the Whisper model.

Discord commands

  • /record · /grabarInvite Kuali to your current voice channel.