Diariz
FreeNot checkedSelf-hosted, multi-user transcription platform: record or upload audio. Speaker-labeled, timestamped transcripts, Recognize speakers across recordings, Summariz
About
Self-hosted, multi-user transcription platform: record or upload audio. Speaker-labeled, timestamped transcripts, Recognize speakers across recordings, Summarize, extract action items and chat over your transcripts with your own OpenAI-compatible LLM. Your Audio, your Server, your Model. Tested on Laptop RTX4070, Desktop RTX3090 and RTX5090
README

Smart Meeting Transcription. Personal, multi-user voice/meeting transcription platform: record audio (mic or system audio), transcribe it server-side with speaker diarization and word-level timestamps, identify known speakers across recordings, summarize, and chat across transcripts. See diariz.app for more details, videos and screenshots.
docs/Overall_Synopsis_of_Platform.md has the original brief and the architecture plan for the full design.
Versioned per the rule in CLAUDE.md; the current version and per-release notes live in
apps/web/src/lib/releases.ts (and /version.json) and on
the in-app Release Notes page (/release-notes), reachable from About in the account menu.
Features
At a glance - see docs/features.md for the full detail on each.
| Feature | Description |
|---|---|
| Capture | Record from the browser mic (device picker, DSP tuning, live level meter, pause/resume), system audio, or both mixed on one device; schedule a recording to auto-stop at a set time or after 15/30/60 minutes; system audio works in Chromium browsers ("Share audio") and seamlessly in the desktop app; upload files (WAV/MP3/FLAC/Ogg/Opus/WebM/M4A) or drag-drop several at once. |
| Transcribe & diarize | Server-side WhisperX (large-v3, word-level timestamps) + pyannote speaker diarization; speaker-labelled, editable, playable segments; re-transcribe any time, with an original/revised toggle. |
| Recording hub | Every meeting opens on a hub: a summary card (meeting type, key facts, the summary inline) over tiles for transcript, actions, speakers, notes, files, and formulas - each with its count and a preview, and new-note / add-file / run-formula in place. The transcript embeds a conversation-flow player showing who spoke when, which doubles as the scrubber. |
| People and speaker identification | One shared, platform-wide directory of the people who appear in your meetings. A voiceprint is optional: someone can be in the directory with no biometric held for them, or opt out entirely - which erases theirs and stops them being matched. Enrol a voice once (SpeechBrain ECAPA voiceprints) and Diariz recognises it across later recordings; assign speakers from the Speakers tab or from any transcript row; rename, merge, and erase (GDPR). A People directory opens over whatever you are reading, so you keep your place in a transcript; it lists everyone one to a line, with a search box matching name, email or company, and filters; a person carries a job title, company, email address, phone number and an internal/external marker, and likely duplicates are pointed out for you to merge. The Speakers tab shows an identified speaker's title, company and internal/external marker inline, with the rest of their details on hovering that marker, a contact card - email and phone as live links - above their segments, and a pencil to correct that person's record without leaving the transcript. Browsing the directory and editing other people needs the Manage people permission - opting yourself out, and finding someone to name a speaker, never do. |
| Summaries & minutes | Auto summary plus full professional meeting minutes (WYSIWYG-editable, emailable). A meeting type is presentation and selection - name, icon, colour, and the framing you give the model - and it points at the formula that generates its minutes, plus any others to run at the same time (their documents land in the recording's Formulas tab). So minutes and formulas are the same machinery: any formula you can use can produce your minutes. Templates are built from blocks (H1-H3 headings, literal text, substituted details, model prompts, rules, drag-to-reorder) with JSON import/export. |
| Notes | Jot your own note lines during or before a meeting (live, timestamped, crash-safe); they appear inline in the transcript at the moment you wrote them, steer the minutes, and can be woven into an "enhanced notes" section that links to the exact transcript moments. |
| Meeting screenshots | Capture the screen during a recording from the desktop app - a configurable hotkey, the tray menu, or the app itself; choose a screen or a rectangle on the first capture and reuse it for the rest of the meeting. Captures appear inline in the transcript at the moment they were taken, open in a full-size viewer with zoom and pan to read a capture at native resolution, and list in a collapsed Notes-tab section. |
| Action items | Auto-extracted with owner and deadline into an editable table, tracked across every meeting with completion, a person filter, and links back to the transcript. |
| Tag cloud | Every meeting auto-tagged with weighted topics; a Tags tab shows a weighted cloud and lists the meetings behind each tag, with an expanded modal view. |
| Chat over transcripts | Stream answers over one meeting, a folder (its summary/minutes/actions), several selected, or all meetings (context inferred from what you're viewing) via an OpenAI-compatible LLM; context dial, file attachments, saved conversations, and slash commands. |
| Formulas | Build a document from headings, literal text, substituted meeting details (date, attendees, the action-items table, the full timestamped transcript...) and instructions to the model, choose what it may see (transcript, notes, summary, minutes, actions), and run it over any recording - or a whole folder and its sub-sections (every meeting in it) - to generate a named Markdown document you can edit, download, or email. Runs happen in the background ("Generating..." then fills in), and re-running one replaces its previous document rather than piling up copies (a document you have edited by hand is left alone). Built-in, platform-wide, and personal; share a personal one so others can find and add it (a live link) and run it; run one with /formula <name> in chat or ask Claude via MCP; admins manage the platform-wide and built-in formulas from a Manage Formulas window. |
| Search | A search box above the meetings list, scoped to the folder you are browsing: hits show the matching words in context and open the transcript at that moment. Search everywhere widens it to every room you can see, grouped by folder with Section / Date / Speaker chips. Keyword search across your library, upgraded to semantic (RAG - hybrid vector + trigram) when an embeddings endpoint is configured. |
| Chat tools | The assistant calls built-in tools (who-said-what, search, attendees, talk time, summaries, email-to-self, and more) and links answers to the exact segment. |
| Voice dictation in chat | Dictate chat questions by voice - browser speech recognition, or a server STT endpoint on the desktop app. |
| Connect Claude (MCP) | An in-process MCP server lets Claude connect to your own meetings via OAuth (claude.ai) or a personal token (Claude Desktop/Code), when the platform's Claude/MCP toggle is on, including a run_formula tool to trigger your saved Formulas. |
| User API access | When a Platform Administrator enables it, generate a personal API token, read-only or read-write, with an optional expiry date, to call the REST API as yourself - including the people directory at /api/people - with a built-in API reference that documents every endpoint. |
| Automations (webhooks) | When a Platform Administrator enables it, register outbound webhooks (Preferences → Automations) that fire when a recording is created, finishes or fails transcription, a summary / meeting minutes / action items / tags become ready (each carrying its output), or a formula finishes or fails. Every recording event also carries an attendees list - who spoke, the person they are, their title, company, and internal or external - so a workflow can route without calling back; attendees' email addresses and phone numbers are included only when that automation opts in. Signed deliveries with automatic retries (paced to a per-automation rate cap and honoring a 429 Retry-After), a send-test-event button, auto-pause after repeated failure, and a Pause / Resume button so deliveries can be stopped reversibly - deleting an automation discards its signing secret, pausing one keeps it. Admins can also define named Workflow Signals and wire one platform automation to each, so a formula author picks "When this finishes, trigger: ..." in the formula editor - no URL or per-user setup - and the formula's output is delivered inline to everyone routed through that signal. |
| n8n community node | A published node package (n8n-nodes-diariz, installable from n8n's Community Nodes): a Diariz Trigger that registers its own automation on activation, removes it on deactivation, and verifies every signed delivery, plus a Diariz action node covering the whole REST API - dropdowns listing your real recordings, folders and formulas, files in and out as binary data, Return All on lists, and a Run Formula step that waits for the document to finish. See integrations/n8n-nodes-diariz. |
| Translate | Translate a whole transcript (segments, summary, actions) or a single segment; stored as revisions you can flip back. |
| Attachments | Attach files or URLs (PDF, Office, email, calendar, images) to a recording or directly to a folder, edit Markdown attachments in place, save a chat conversation with /attach, and optionally feed them to chat. |
| Rooms | A private Personal Room per account plus shareable Rooms: invite users and groups with per-member permissions. Each Shared Room has its own folder structure (sections/sub-sections, drag-and-drop, per-room order) and its own List/Calendar/Actions/Tags scoped to it; record or upload files straight into a room (your Personal Room keeps the original), and search + chat over every room you belong to. A member who can read a shared recording sees its notes and screenshots too - only the owner can add, edit, or delete them. Your Google Calendar and its linking stay personal. The switcher shows each room's folder and meeting counts (shared ones labelled), ticks the one you are in, and remembers where you were. Manage rooms from the switcher. |
| Organise & merge | Sections and sub-sections with drag-and-drop; the list drills in one folder at a time with a breadcrumb back out, so it stays readable however many recordings you have; choose where a new recording is filed; browse as a list, calendar, cross-meeting actions, or tag cloud; merge recordings into one. |
| Folder pages | Open a folder as a page with a roll-up LLM summary and consolidated minutes across it and its sub-folders, plus aggregated actions, notes, and attachments tagged with their source meeting. |
| Google sign-in & Calendar | Optional Google OAuth sign-in; opt-in read-only Calendar linking, invite details, and a month overlay. |
| External calendar feeds | Subscribe to public iCalendar (.ics) URLs; their meetings appear on the Calendar tab. |
| Multi-user & groups | User groups grant platform permissions (manage rooms / users / platform), with an access-request to approval lifecycle; per-user data isolation; Light/Dark/Auto themes. |
| Preferences & profile | Per-user AI endpoint/model/key, reasoning, profile fields, native/app language, and a device-synced theme. |
| Model settings | Platform-wide LLM controls: minutes-generation mode and a global AI request timeout (default 120s) covering every AI call. |
| Integration toggles | A Platform Administrator independently enables or disables API access, Claude/MCP, and Automations (webhooks) - each is off by default except Claude/MCP, which is on to protect an existing connector. |
| Storage quotas & retention | Per-user audio quotas plus an optional nightly auto-deletion of old audio (transcripts kept) with per-recording protection. |
| Backup & restore | A Platform Administrator can export the whole platform (database + files) as one archive and restore it, with live progress while the archive is built or applied. |
| Provide Feedback | Any signed-in user can describe something that looks or behaves wrong from the account menu, with a scrubbed technical trail of recent app activity attached automatically. Readable and deletable only by a Platform Administrator (Settings → Feedback), and can raise a feedback.submitted event for a platform automation - the submitter's own words are included only when that subscription opts in via the admin API (no Settings checkbox yet). |
| Desktop apps | Electron thin shell for Windows (tray) and macOS (menu-bar, beta): system audio, tray recording, Google sign-in, auto-update on Windows. |
| Status bar | Live pipeline progress plus storage, transcription, and transcript counts along the bottom. |
| Help & documentation | A browsable help section at /help with a grouped article tree and instant search, plus a ? beside features that opens a short explanation linking to the full article. Includes an Advanced and admin section covering formulas, meeting types, automations, permissions, MCP, n8n, Zapier, and the API. |
See docs/features.md for the full prose description of each feature.
Architecture
| Component | Tech | Path |
|---|---|---|
| API / auth / orchestration | ASP.NET Core (C#) + EF Core + SignalR | src/Diariz.Api |
| Domain model + migrations | EF Core + Postgres/pgvector | src/Diariz.Domain |
| Transcription + diarization + voiceprints | Python: WhisperX (large-v3) + pyannote 3.1 + SpeechBrain ECAPA (GPU) | src/Diariz.Worker |
| Web UI | React + TypeScript + Vite + Tailwind | apps/web |
| Desktop app | Electron thin shell — Windows system-tray + macOS (beta) menu-bar (first-run server config, mic + system audio, tray recording; auto-update on Windows, manual update check on macOS) | apps/desktop |
| Orchestration | docker-compose (postgres/pgvector, redis, minio) | deploy |
| Observability (optional) | Self-hosted GlitchTip: error tracking + transaction timings for the worker, API and SPA, each behind a scrubber that redacts credentials and meeting content. Opt-in compose overlay with its own Postgres and MinIO bucket; entirely inert unless a DSN is set | overlay, deployment runbook |
Summaries and chat use any OpenAI-compatible LLM endpoint you configure (OpenAI, or a local server such
as Ollama / LM Studio / vLLM) — see the Settings modal and deploy/.env.example. The API also hosts an
in-process MCP server at /mcp (Streamable HTTP) so Claude can connect to a user's own transcripts
using the same built-in tools — authenticated with either a personal access token (Desktop/Code) or an
OAuth 2.1 sign-in (the claude.ai web connector; the API is also a spec-compliant OAuth authorization server,
built on OpenIddict).
Flow: client records → uploads to API → audio stored in MinIO, metadata in Postgres → job enqueued on a Redis Stream → Python worker transcribes + diarizes + extracts per-speaker voiceprints → posts segments back → API stores them, auto-identifies enrolled speakers, and notifies the client over SignalR → note view shows speaker-labelled, timestamped segments.
Quick start
Prerequisites: Docker (+ NVIDIA Container Toolkit for the GPU worker), .NET 10 SDK, Node 20+.
For diarization you need a Hugging Face token with the pyannote/speaker-diarization-3.1
terms accepted — see src/Diariz.Worker/README.md. For GPU/VRAM
requirements, tuning for smaller cards, and known-working GPUs, see the worker's
GPU and hardware requirements.
On AMD ROCm (experimental) run docker compose -f docker-compose.rocm.yml up --build instead — the
worker transcribes with openai-whisper since CTranslate2 has no AMD GPU support; see the worker README's
AMD ROCm section.
# 1. Whole stack — web UI, API, Postgres, Redis, MinIO, GPU worker.
# Runs as a single Compose project named "diariz".
cd deploy
cp .env.example .env # fill in JWT_KEY, CALLBACK_SECRET, HF_TOKEN, seed user
docker compose up --build # web UI at http://localhost:8081, API at http://localhost:8080
# 2. (dev alternative to the bundled UI) Vite dev server with hot reload,
# proxying /api and /hubs to the API.
cd ../apps/web
npm install && npm run dev # http://localhost:5173
# 3. (optional) Desktop shell for system-audio capture
cd ../desktop
npm install && npm run dev
Sign in with the seeded user (SEED_EMAIL / SEED_PASSWORD), record a clip, and the
transcript appears automatically when the worker finishes.
Translations
Users pick their interface language at signup or in
Preferences, and ?lang=es forces it to Spanish for example. The initial release includes English, French, German and Spanish translations. Languages catalogues are auto discovered so developers can extend or improve these translations with a data only pull request (No code changes needed). Make sure you translate both the Web UX and Server side strings (See below)
Web User Interface
The web UI is localized with react-i18next. Strings live in JSON catalogues under apps/web/src/locales/, one folder per language (English is the authoritative base; Spanish, French, and German ship by default). As catalogues are auto-discovered, adding or improving a language is a data-only PR - no code changes. See apps/web/src/locales/README.md for the contributor guide (CI checks that every catalogue mirrors English and limits a translation PR to one language).
Server Side
The headings in downloaded and emailed transcripts are localized too, from server-side catalogues under src/Diariz.Api/locales/. Follow the same rules to change or extend them.
Roadmap
- M1 — done: capture → transcribe (timestamps + diarization) → view.
- M2 — done: multi-user auth + RBAC, LLM summaries, transcript export, re-transcribe with model choice.
- M3 — done: chat across transcripts, including semantic (RAG) search over an embedded transcript index (pgvector) fused with keyword search, and an "All meetings" chat mode that answers across your whole library; speaker identification via enrolled voiceprints (pgvector).
- M4 — in progress: Windows desktop app (done), macOS desktop app (beta - unsigned), mobile, packaging, live streaming.
- Integrations — done: a hardened REST API (scoped, expiring personal tokens) and the MCP server for inbound access; outbound webhooks ("Automations") that fire on recording and formula events with signed, rate-limited, auto-retrying delivery; and Workflow Signals that let an author tag a formula and a Platform Administrator route its output to one platform automation for everyone. Diariz now connects to Zapier / n8n / Make and the like in both directions.
For the next major arc - note enhancement, an internal workflow rules engine (conditions and non-webhook actions layered on the automation triggers already shipped), collaborative shared spaces, and optional ambient capture - see the long-term roadmap.
Keep this README current. When a PR changes what the app does (a new feature, a stack change, or a shipped roadmap item), update the Features table (one concise row) and docs/features.md (the full prose), plus the Architecture and Roadmap sections and the in-app About-box
CAPABILITIEStable - all in the same PR, alongside the releases.ts entry required by CLAUDE.md. (The version isn't repeated here on purpose - it lives inversion.json/releases.tsso it can't drift.)
Licensing & commercial use
This software is dual-licensed. Depending on your use case, you may use it under one of two options:
1. Open Source (GNU AGPLv3)
This project is completely free for personal, academic, or non-profit use under the terms of the GNU Affero General Public License v3.0.
- Anyone using, modifying, or hosting this code under this license must also make their entire project's source code publicly available under the same AGPLv3 terms.
2. Commercial License
For-profit companies or commercial projects that wish to use, integrate, or build upon this software without being bound by the AGPLv3 open-source requirements must secure a private commercial agreement.
To discuss commercial licensing, custom terms, or to obtain an exception, please contact me directly at: [email protected]
A few parts of the ML/storage stack carry caveats worth understanding before a commercial license is requested. This is a summary for orientation, not legal advice.
- Transcription & diarization — clear for commercial use. Whisper large-v3 (MIT) and the pyannote
models (
speaker-diarization-3.1,segmentation-3.0) are MIT-licensed. They are gated — you must accept their terms on Hugging Face and supply anHF_TOKEN— but gating is an access step, not a licence restriction. - Speaker identification / voiceprints — the main caveat. Recognising known speakers across recordings
uses SpeechBrain ECAPA embeddings. The model code is Apache-2.0, but the weights are trained on the
VoxCeleb dataset, which is published for research / non-commercial use. Whether a dataset's terms bind
the trained weights is legally unsettled; for a commercial deployment, get your own legal read, or swap
the embedder for one trained on commercially-cleared data (e.g. NVIDIA NeMo TitaNet, WeSpeaker), or
simply disable the feature with
ENABLE_SPEAKER_EMBEDDINGS=falseon the worker — transcription and diarization still work, you just lose cross-recording speaker identification. Voiceprints are biometric data: only enrol people with their consent, and use the Voice Prints tab to erase them on request. - Object storage (MinIO) is AGPL-3.0. Used unmodified as a separate container it does not impose copyleft on Diariz's own code, but if AGPL is a concern, point storage at any S3-compatible store (AWS S3, Cloudflare R2, …) and drop MinIO entirely.
- Summaries & chat send transcript text to whatever OpenAI-compatible LLM endpoint you configure; that provider's terms and privacy policy govern the text you send.
- Uploaded audio formats. Decoding is done by ffmpeg in the worker (Diariz ships no codec). The
royalty-free formats — WAV, FLAC, Ogg Vorbis, Opus, WebM — plus MP3 (its patents expired in 2017)
are always accepted. M4A/AAC is accepted by default but AAC still carries active patents, so it can be
disabled (
UPLOAD_ALLOW_AAC=false) for maximum commercial caution. Operators are responsible for their ffmpeg build's codec licensing.
Installing Diariz
This server has no published package — it is built from source. Open the repository and follow its README.
▸ github.com/kenhayward/DiarizFAQ
Is Diariz MCP free?
Yes, Diariz MCP is free — one-click install via Unyly at no cost.
Does Diariz need an API key?
No, Diariz runs without API keys or environment variables.
Is Diariz hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Diariz in Claude Desktop, Claude Code or Cursor?
Open Diariz on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
Gmail
Read, send and search emails from Claude
by GoogleSlack
Send, search and summarize Slack messages
by SlackRunbear
No-code MCP client for team chat platforms, such as Slack, Microsoft Teams, and Discord.
Discord Server
A community discord server dedicated to MCP by [Frank Fiegel](https://github.com/punkpeye)
Compare Diariz with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All communication MCPs
