A privacy-focused, self-hosted meeting-notes app: self-hosted audio transcription and self-hosted LLM summarization, with your data staying on infrastructure you control.
Muesli is an open, self-hostable alternative to cloud meeting-notes apps. You record a meeting, and Muesli transcribes it and rewrites your sparse notes into a clean summary β but the transcription and summarization run as plugins you host (by default a self-hosted Whisper transcriber and a self-hosted Ollama LLM), so audio and notes never have to leave infrastructure you control.
β οΈ Placeholder β real screenshot pending. To replace: runnpm run dev, open a note with a summarized body, take a screenshot (1280Γ800), save it asdocs/images/notes-ui.png, then update thenotes-ui.svgreference in this README tonotes-ui.png.
Before running docker compose up, make sure your host meets these prerequisites:
- Docker β₯ 24 and Compose v2 β the stack uses
docker compose(plugin); the legacydocker-composev1 standalone is not supported. - RAM β β₯ 8 GB system RAM is recommended for comfortable CPU inference with the default
llama3.2:3bmodel. - Disk space β ~2 GB for the default LLM model; allow more if you plan to pull larger models. Whisper also fetches its model on the first transcription.
- CPU vs GPU β CPU inference works out of the box but is slow (the default dev setup); GPU acceleration is available β see the per-plugin Dockerfiles.
- Private by default β the reference plugins run on your self-hosted server; nothing is shipped to a third-party transcription or LLM SaaS.
- Self-hostable β one
docker compose upon a NAS or a cloud box. Scale the pieces independently when you need to. - Pluggable β transcription and summarization are language-agnostic HTTP plugins. Swap in any engine that speaks the contract; bring your own cloud LLM if you choose to.
- Current v3 feature set β calendar integration with CalDAV / ICS / Google / Microsoft sync, note-linked events and Coming up; Chat / RAG over notes with citations; semantic search; speaker diarization with review and speaker aliases; export to Markdown, plain text, DOCX, PDF, and subtitle formats (SRT / ASS / WebVTT); tags, smart lists, folders, nesting, sibling reorder, and recycle bin / soft delete for notes and folders.
- Open source β AGPL-3.0; no lock-in, inspect everything.
Bring up the entire stack (Postgres, Ollama, Whisper transcriber, LLM agent, and the Muesli server) with one command:
docker compose upThen open http://localhost:8080/admin, create your account, and you're done β the default transcriber and agent plugins are auto-registered on startup, so there are no manual admin steps.
First boot is slow: the ollama-pull service downloads the default LLM
(llama3.2:3b, ~2 GB) and Whisper fetches its model on the first
transcription. Expect a few minutes before the stack is fully ready. CPU
inference is slow β this is a local-first dev setup, not a tuned production
deployment. (For GPU acceleration, use the override described in the GPU acceleration section below.)
For a step-by-step first run, see docs/GETTING_STARTED.md.
Deploying to production? See docs/DEPLOYMENT.md.
Use this for a production/hosted deployment. It downloads the GitHub Release
asset bundle (a version-pinned docker-compose.prod.yml, .env.example,
install.sh, and a SHA256SUMS file), verifies checksums before installing
anything, generates real secrets in .env, and uses the GHCR-hosted images
already pinned into that release's compose file.
curl -fsSL https://github.com/abedegno/muesli/releases/latest/download/install.sh | shThis is separate from the dev docker compose up quickstart above. The
installer writes the production files into ./muesli by default; set
MUESLI_RELEASE_TAG to pin a specific release instead of the latest one, and
use --up if you want the script to start the stack after installation.
An optional Compose override adds NVIDIA GPU support for Ollama and Whisper. Requires the NVIDIA Container Toolkit on the host.
docker compose -f docker-compose.yml -f docker-compose.gpu.yml upThe override sets runtime: nvidia + device reservations on the ollama service
and switches Whisper to WHISPER_DEVICE=cuda / WHISPER_COMPUTE_TYPE=float16.
All other services are unchanged.
No .env is required: every secret and URL has a built-in dev default. To
override anything, cp .env.example .env and edit.
Troubleshooting: See docs/TROUBLESHOOTING.md for help with slow first boot, port conflicts, and other common issues.
The Electron desktop client lives at the repo root:
npm install
npm run devPoint it at your running server: http://localhost:8080.
A read-only, native SwiftUI iOS app lives at native/ios (issue
#767): browse your existing notes and read their authored body and generated
summaries, over the same hosted server or from a paired local Electron
instance ("Allow iOS access" in Settings). Note creation, audio capture, and
Android are explicitly out of scope for this first slice. See
native/ios/README.md for project setup, the mobile
API contract it consumes, and this repo's local-pairing security model.
Desktop client ββuploadβββΆ Muesli server βββΆ Transcriber plugin βββΆ Agent plugin βββΆ note
(capture) (queue + pipeline) (Whisper) (Ollama)
The server stores your notes and audio, runs a worker pool that drives each
recording through transcribe β summarize, and serves an embedded admin UI at
/admin. Plugins are independent HTTP services. For the full picture β package
map, the plugin contract, and the processing pipeline β see
docs/ARCHITECTURE.md.
| Doc | What's in it |
|---|---|
docs/index.md |
Master documentation index β all docs by use case. |
docs/ARCHITECTURE.md |
Contributor-oriented architecture: components, pipeline, package map, plugin contract, and the design rationale behind the privacy-first, self-hosted plugin approach. |
docs/CONFIGURATION.md |
Complete reference for all MUESLI_* and plugin environment variables. |
docs/DEPLOYMENT.md |
Production runbook: install, TLS, sizing, backups, upgrades, and smoke checks. |
docs/API.md |
HTTP API reference: JSON models, endpoints, auth rules, and response shapes. |
docs/PLUGINS.md |
Plugin authoring guide: the transcriber/agent contract, required endpoints, auth, and validation flow. |
docs/BACKUP.md |
Backup and restore guide for the Postgres database and audio blob store. |
docs/UPGRADING.md |
Upgrade procedure for pulling or rebuilding images, restarting, and handling migrations. |
docs/TROUBLESHOOTING.md |
Common issues: slow first boot, port conflicts, reading logs, and telling "still loading" from broken. |
CONTRIBUTING.md |
Dev setup, conventions, and how to land a change. |
SECURITY.md |
How to report a vulnerability (privately) + operator responsibilities. |
CODE_OF_CONDUCT.md |
Community standards. |
CHANGELOG.md |
What's changed. |
ROADMAP.md |
High-level milestones (v2 β v5) closing the gap to Granola and into enterprise. |
The compose file ships DEV-ONLY default secrets (master key, storage signing
key, plugin tokens, Postgres password) so docker compose up just works. Do
not run these defaults in production. Before any real deployment, copy
.env.example to .env and set real values β in particular generate a fresh
MUESLI_MASTER_KEY and MUESLI_STORAGE_SIGNING_KEY with openssl rand -base64 32,
and terminate TLS at a reverse proxy. See SECURITY.md.
Muesli is pre-1.0 and under active development. The current v3 feature set covers calendar integration, Chat/RAG over notes, speaker diarization with review and speaker aliases, semantic search, multi-format export, and tags, smart lists, folders, and recycle bin support. The product is still evolving, and there is more polish and broader multi-user work ahead on the roadmap.
Contributions are welcome β see CONTRIBUTING.md to get
started, and please open an issue before tackling anything non-trivial.
GNU Affero General Public License v3.0. If you run a modified Muesli as a network service, the AGPL requires you to make your changes available to its users.