Metadata-Version: 2.4
Name: mindroom
Version: 2026.7.258
Summary: A universal interface for AI agents with persistent memory, where every conversation has a home
Project-URL: documentation, https://github.com/mindroom-ai/mindroom
Project-URL: homepage, https://github.com/mindroom-ai/mindroom
Project-URL: repository, https://github.com/mindroom-ai/mindroom
Author: mindroom team
License-Expression: Apache-2.0
License-File: LICENSE
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Requires-Python: >=3.12
Requires-Dist: agno[anthropic,google,ollama,openai]==2.6.12
Requires-Dist: aiohttp>=3.13.3
Requires-Dist: aiosqlite>=0.20
Requires-Dist: anthropic>=0.77
Requires-Dist: anyio>=4.10
Requires-Dist: authlib>=1.6
Requires-Dist: cerebras-cloud-sdk>=1.46
Requires-Dist: chromadb>=1.0.15
Requires-Dist: cron-descriptor>=1.4.5
Requires-Dist: croniter>=6
Requires-Dist: cryptography>=47
Requires-Dist: fastapi[standard]>=0.116.1
Requires-Dist: filetype>=1.2
Requires-Dist: google-auth>=2.40.3
Requires-Dist: google-genai<2.9,>=2
Requires-Dist: groq>=0.31
Requires-Dist: httpx>=0.27
Requires-Dist: humanize>=4.12.3
Requires-Dist: jinja2>=3.1
Requires-Dist: json5>=0.13
Requires-Dist: markdown-it-py>=4
Requires-Dist: mcp[cli]>=1.12.4
Requires-Dist: mdit-py-plugins>=0.5
Requires-Dist: mem0ai>=0.1.115
Requires-Dist: mindroom-nio[e2e]==0.30
Requires-Dist: openai
Requires-Dist: packaging>=24
Requires-Dist: pydantic-settings>=2.10.1
Requires-Dist: pydantic>=2
Requires-Dist: pygments>=2.20
Requires-Dist: pyjwt>=2.8
Requires-Dist: python-dotenv>=1
Requires-Dist: pyyaml>=6
Requires-Dist: rich
Requires-Dist: structlog>=24.1
Requires-Dist: tenacity>=9.1.2
Requires-Dist: tiktoken>=0.12
Requires-Dist: typer>=0.24
Requires-Dist: uvicorn>=0.35
Requires-Dist: watchfiles>=1
Provides-Extra: agent-vault-access
Requires-Dist: httpx>=0.27; extra == 'agent-vault-access'
Provides-Extra: agentql
Requires-Dist: agentql; extra == 'agentql'
Requires-Dist: playwright; extra == 'agentql'
Provides-Extra: airflow
Provides-Extra: apify
Requires-Dist: apify-client>=1.12.2; (platform_machine != 'aarch64') and extra == 'apify'
Provides-Extra: approved-egress
Provides-Extra: arxiv
Requires-Dist: arxiv; extra == 'arxiv'
Requires-Dist: pypdf; extra == 'arxiv'
Provides-Extra: attachments
Provides-Extra: aws-bedrock
Requires-Dist: boto3>=1.40.8; extra == 'aws-bedrock'
Provides-Extra: aws-lambda
Requires-Dist: boto3>=1.40.8; extra == 'aws-lambda'
Provides-Extra: aws-ses
Requires-Dist: boto3>=1.40.8; extra == 'aws-ses'
Provides-Extra: baidusearch
Requires-Dist: baidusearch; extra == 'baidusearch'
Requires-Dist: pycountry; extra == 'baidusearch'
Provides-Extra: bitbucket
Requires-Dist: requests; extra == 'bitbucket'
Provides-Extra: brandfetch
Requires-Dist: httpx>=0.27; extra == 'brandfetch'
Provides-Extra: brightdata
Requires-Dist: requests; extra == 'brightdata'
Provides-Extra: browser
Requires-Dist: playwright; extra == 'browser'
Provides-Extra: browserbase
Requires-Dist: browserbase; extra == 'browserbase'
Requires-Dist: playwright; extra == 'browserbase'
Provides-Extra: cal-com
Requires-Dist: pytz; extra == 'cal-com'
Requires-Dist: requests; extra == 'cal-com'
Provides-Extra: calculator
Provides-Extra: callback-manager
Provides-Extra: cartesia
Requires-Dist: cartesia; extra == 'cartesia'
Provides-Extra: claude-agent
Requires-Dist: claude-agent-sdk>=0.1.35; extra == 'claude-agent'
Provides-Extra: clickup
Requires-Dist: requests; extra == 'clickup'
Provides-Extra: coding
Provides-Extra: compact-context
Provides-Extra: composio
Requires-Dist: composio-agno; extra == 'composio'
Provides-Extra: config-manager
Requires-Dist: pydantic>=2; extra == 'config-manager'
Requires-Dist: pyyaml>=6; extra == 'config-manager'
Provides-Extra: confluence
Requires-Dist: atlassian-python-api; extra == 'confluence'
Provides-Extra: crawl4ai
Requires-Dist: crawl4ai>=0.7.3; extra == 'crawl4ai'
Provides-Extra: csv
Requires-Dist: duckdb; extra == 'csv'
Provides-Extra: custom-api
Requires-Dist: requests; extra == 'custom-api'
Provides-Extra: dalle
Requires-Dist: openai; extra == 'dalle'
Provides-Extra: daytona
Requires-Dist: daytona; extra == 'daytona'
Provides-Extra: delegate
Provides-Extra: desi-vocal
Requires-Dist: requests; extra == 'desi-vocal'
Provides-Extra: desktop
Requires-Dist: pillow>=10.2; extra == 'desktop'
Requires-Dist: pyautogui>=0.9.54; extra == 'desktop'
Requires-Dist: pyobjc-framework-applicationservices>=12.2.1; (sys_platform == 'darwin') and extra == 'desktop'
Requires-Dist: pyobjc-framework-cocoa>=12.2.1; (sys_platform == 'darwin') and extra == 'desktop'
Provides-Extra: discord
Requires-Dist: requests; extra == 'discord'
Provides-Extra: docker
Requires-Dist: docker; extra == 'docker'
Provides-Extra: duckdb
Requires-Dist: duckdb; extra == 'duckdb'
Provides-Extra: duckduckgo
Requires-Dist: ddgs; extra == 'duckduckgo'
Provides-Extra: dynamic-tools
Provides-Extra: dynamic-workflow
Provides-Extra: e2b
Requires-Dist: e2b-code-interpreter; extra == 'e2b'
Provides-Extra: eleven-labs
Requires-Dist: elevenlabs; extra == 'eleven-labs'
Provides-Extra: email
Provides-Extra: exa
Requires-Dist: exa-py; extra == 'exa'
Provides-Extra: external-trigger-manager
Provides-Extra: fal
Requires-Dist: fal-client; extra == 'fal'
Provides-Extra: file
Provides-Extra: file-generation
Requires-Dist: python-docx>=1.2; extra == 'file-generation'
Requires-Dist: reportlab; extra == 'file-generation'
Provides-Extra: financial-datasets-api
Requires-Dist: requests; extra == 'financial-datasets-api'
Provides-Extra: firecrawl
Requires-Dist: firecrawl-py>=3; extra == 'firecrawl'
Provides-Extra: gemini
Requires-Dist: google-genai; extra == 'gemini'
Provides-Extra: giphy
Requires-Dist: httpx>=0.27; extra == 'giphy'
Provides-Extra: github
Requires-Dist: pygithub>=2.5; extra == 'github'
Provides-Extra: gmail
Requires-Dist: google-api-python-client>=2.178; extra == 'gmail'
Requires-Dist: google-auth-httplib2>=0.2; extra == 'gmail'
Requires-Dist: google-auth-oauthlib>=1.2.2; extra == 'gmail'
Requires-Dist: google-auth>=2.40.3; extra == 'gmail'
Provides-Extra: google-bigquery
Requires-Dist: google-cloud-bigquery; extra == 'google-bigquery'
Provides-Extra: google-calendar
Requires-Dist: google-api-python-client>=2.178; extra == 'google-calendar'
Requires-Dist: google-auth-httplib2>=0.2; extra == 'google-calendar'
Requires-Dist: google-auth-oauthlib>=1.2.2; extra == 'google-calendar'
Requires-Dist: google-auth>=2.40.3; extra == 'google-calendar'
Provides-Extra: google-docs
Requires-Dist: google-api-python-client>=2.178; extra == 'google-docs'
Requires-Dist: google-auth-httplib2>=0.2; extra == 'google-docs'
Requires-Dist: google-auth-oauthlib>=1.2.2; extra == 'google-docs'
Requires-Dist: google-auth>=2.40.3; extra == 'google-docs'
Provides-Extra: google-drive
Requires-Dist: google-api-python-client>=2.178; extra == 'google-drive'
Requires-Dist: google-auth-httplib2>=0.2; extra == 'google-drive'
Requires-Dist: google-auth-oauthlib>=1.2.2; extra == 'google-drive'
Requires-Dist: google-auth>=2.40.3; extra == 'google-drive'
Provides-Extra: google-maps
Requires-Dist: google-maps-places; extra == 'google-maps'
Requires-Dist: googlemaps; extra == 'google-maps'
Provides-Extra: google-scholar
Requires-Dist: scholarly; extra == 'google-scholar'
Provides-Extra: google-sheets
Requires-Dist: google-api-python-client>=2.178; extra == 'google-sheets'
Requires-Dist: google-auth-httplib2>=0.2; extra == 'google-sheets'
Requires-Dist: google-auth-oauthlib>=1.2.2; extra == 'google-sheets'
Provides-Extra: googlesearch
Requires-Dist: ddgs; extra == 'googlesearch'
Provides-Extra: groq
Requires-Dist: groq>=0.31; extra == 'groq'
Provides-Extra: hackernews
Requires-Dist: httpx>=0.27; extra == 'hackernews'
Provides-Extra: homeassistant
Requires-Dist: httpx>=0.27; extra == 'homeassistant'
Provides-Extra: jina
Requires-Dist: httpx>=0.27; extra == 'jina'
Requires-Dist: pydantic>=2; extra == 'jina'
Provides-Extra: jira
Requires-Dist: jira>=3.10.5; extra == 'jira'
Provides-Extra: linear
Requires-Dist: requests; extra == 'linear'
Provides-Extra: linkup
Requires-Dist: linkup-sdk>=0.2.8; extra == 'linkup'
Provides-Extra: lumalabs
Requires-Dist: lumaai; extra == 'lumalabs'
Provides-Extra: matrix-api
Provides-Extra: matrix-calls
Requires-Dist: livekit-agents[openai]>=1.6.4; extra == 'matrix-calls'
Provides-Extra: matrix-e2ee
Provides-Extra: matrix-message
Provides-Extra: matrix-room
Provides-Extra: matrix-voice-message
Provides-Extra: mem0
Requires-Dist: mem0ai>=0.1.115; extra == 'mem0'
Provides-Extra: memory
Provides-Extra: modelslabs
Requires-Dist: requests; extra == 'modelslabs'
Provides-Extra: moviepy-video-tools
Requires-Dist: moviepy; extra == 'moviepy-video-tools'
Provides-Extra: neo4j
Requires-Dist: neo4j; extra == 'neo4j'
Provides-Extra: newspaper
Requires-Dist: lxml-html-clean; extra == 'newspaper'
Requires-Dist: newspaper4k; extra == 'newspaper'
Provides-Extra: notion
Requires-Dist: notion-client; extra == 'notion'
Provides-Extra: openai
Requires-Dist: openai; extra == 'openai'
Provides-Extra: openbb
Requires-Dist: openbb; extra == 'openbb'
Provides-Extra: openclaw-compat
Provides-Extra: openweather
Requires-Dist: requests; extra == 'openweather'
Provides-Extra: oxylabs
Requires-Dist: oxylabs; extra == 'oxylabs'
Provides-Extra: pandas
Requires-Dist: pandas>=2.2; extra == 'pandas'
Provides-Extra: postgres
Requires-Dist: psycopg[binary]; extra == 'postgres'
Provides-Extra: pubmed
Requires-Dist: httpx>=0.27; extra == 'pubmed'
Provides-Extra: python
Provides-Extra: reasoning
Provides-Extra: reddit
Requires-Dist: praw; extra == 'reddit'
Provides-Extra: redshift
Requires-Dist: redshift-connector; extra == 'redshift'
Provides-Extra: replicate
Requires-Dist: replicate>=1.0.7; extra == 'replicate'
Provides-Extra: report-publishing
Provides-Extra: resend
Requires-Dist: resend; extra == 'resend'
Provides-Extra: scheduler
Provides-Extra: scrapegraph
Requires-Dist: scrapegraph-py>=2.1; extra == 'scrapegraph'
Provides-Extra: searxng
Provides-Extra: self-config
Requires-Dist: pydantic>=2; extra == 'self-config'
Requires-Dist: pyyaml>=6; extra == 'self-config'
Provides-Extra: sentence-transformers
Requires-Dist: sentence-transformers; extra == 'sentence-transformers'
Provides-Extra: serpapi
Requires-Dist: google-search-results>=2.4.2; extra == 'serpapi'
Provides-Extra: serper
Requires-Dist: requests; extra == 'serper'
Provides-Extra: shell
Provides-Extra: shopify
Requires-Dist: httpx>=0.27; extra == 'shopify'
Provides-Extra: slack
Requires-Dist: slack-sdk; extra == 'slack'
Provides-Extra: sleep
Provides-Extra: spider
Requires-Dist: spider-client; extra == 'spider'
Provides-Extra: spotify
Requires-Dist: httpx>=0.27; extra == 'spotify'
Requires-Dist: spotipy>=2.25.1; extra == 'spotify'
Provides-Extra: sql
Requires-Dist: sqlalchemy; extra == 'sql'
Provides-Extra: subagents
Provides-Extra: supabase
Requires-Dist: supabase>=2.18.1; extra == 'supabase'
Provides-Extra: tavily
Requires-Dist: tavily-python; extra == 'tavily'
Provides-Extra: telegram
Requires-Dist: httpx>=0.27; extra == 'telegram'
Provides-Extra: thread-model
Provides-Extra: thread-resolution
Provides-Extra: thread-summary
Provides-Extra: thread-tags
Provides-Extra: todo
Provides-Extra: todoist
Requires-Dist: todoist-api-python; extra == 'todoist'
Provides-Extra: trafilatura
Requires-Dist: trafilatura; extra == 'trafilatura'
Provides-Extra: trello
Requires-Dist: py-trello; extra == 'trello'
Provides-Extra: twilio
Requires-Dist: twilio; extra == 'twilio'
Provides-Extra: unsplash
Provides-Extra: update-awareness
Provides-Extra: visualization
Requires-Dist: matplotlib; extra == 'visualization'
Provides-Extra: web-browser-tools
Provides-Extra: webex
Requires-Dist: webexpythonsdk; extra == 'webex'
Provides-Extra: website
Requires-Dist: beautifulsoup4; extra == 'website'
Requires-Dist: httpx>=0.27; extra == 'website'
Provides-Extra: whatsapp
Requires-Dist: httpx>=0.27; extra == 'whatsapp'
Provides-Extra: wikipedia
Requires-Dist: wikipedia; extra == 'wikipedia'
Provides-Extra: x
Requires-Dist: tweepy; extra == 'x'
Provides-Extra: yfinance
Requires-Dist: yfinance; extra == 'yfinance'
Provides-Extra: youtube
Requires-Dist: youtube-transcript-api; extra == 'youtube'
Provides-Extra: zendesk
Requires-Dist: requests; extra == 'zendesk'
Provides-Extra: zep
Requires-Dist: zep-cloud>=3.3; extra == 'zep'
Provides-Extra: zoom
Requires-Dist: requests; extra == 'zoom'
Description-Content-Type: text/markdown

# mindroom

[![PyPI](https://img.shields.io/pypi/v/mindroom)](https://pypi.org/project/mindroom/)
[![Python](https://img.shields.io/pypi/pyversions/mindroom)](https://pypi.org/project/mindroom/)
[![Tests](https://img.shields.io/github/actions/workflow/status/mindroom-ai/mindroom/pytest.yml?label=tests)](https://github.com/mindroom-ai/mindroom/actions/workflows/pytest.yml)
[![Build](https://img.shields.io/github/actions/workflow/status/mindroom-ai/mindroom/build-mindroom.yml?label=build)](https://github.com/mindroom-ai/mindroom/actions/workflows/build-mindroom.yml)
[![Docs](https://img.shields.io/badge/docs-mindroom.chat-blue)](https://docs.mindroom.chat)
[![License](https://img.shields.io/github/license/mindroom-ai/mindroom)](https://github.com/mindroom-ai/mindroom/blob/main/LICENSE)
[![Downloads](https://img.shields.io/pypi/dm/mindroom)](https://pypi.org/project/mindroom/)
[![GitHub](https://img.shields.io/badge/github-mindroom--ai%2Fmindroom-blue?logo=github)](https://github.com/mindroom-ai/mindroom)

<img src="frontend/public/logo.png" alt="MindRoom Logo" align="right" width="150" />

**AI agents that live in your chat rooms.**

MindRoom is an open-source multi-agent runtime built on [Matrix](https://matrix.org/) that works with nearly any [cloud or local AI model](docs/configuration/models.md).
You define agents in a YAML file or in the web dashboard; MindRoom gives each one a Matrix account, and you talk to them in threads in [MindRoom Chat](https://github.com/mindroom-ai/mindroom-chat) — or any other Matrix client you already use.
Because Matrix bridges to other platforms, the same agents also work in Slack, Telegram, Discord, WhatsApp, IRC, and email — with the same persistent memory everywhere.
Self-host the whole stack, or run only the MindRoom backend locally and pair it with hosted Matrix at [mindroom.chat](https://mindroom.chat).

https://github.com/user-attachments/assets/1f121c89-5418-4f42-bdfe-fb9de0fecd03

## Features

- **Multi-agent orchestration** — define specialist agents and teams in `config.yaml`; a built-in router picks the responder when you don't @-mention one, and mentioning several agents makes them collaborate in a thread.
- **Persistent memory** — agents remember people, preferences, and context across conversations and platforms (Mem0 + ChromaDB, stored on your disk).
- **100+ tool integrations** — Gmail, GitHub, Google Docs, Google Drive, Home Assistant, shell, Python, web search, and more, plus native Matrix tools and a per-thread `todo` planner, with sandboxed execution and per-tool approval rules.
- **Knowledge bases (RAG)** — point an agent at a folder of files; MindRoom indexes it and can watch it for changes.
- **Scheduling & automation** — cron or natural-language scheduled tasks (`!schedule`), background work with human escalation.
- **Model routing** — a different model per agent, room, or thread (`!model`); route sensitive rooms to local Ollama and everything else to a cloud model.
- **Voice** — transcription of Matrix voice messages, and text-to-speech tools via OpenAI, Groq, ElevenLabs, and Cartesia.
- **Streaming responses** — agents type into the room with progressive edits, visible tool traces, and cancellation.
- **Plugins & hooks** — drop-in [plugins](docs/plugins.md) add custom tools, skills, and OAuth providers, and a typed [event-hook system](docs/hooks.md) (per-hook timeouts, fault isolation) lets them observe and transform messages; reload plugins at runtime with `!reload-plugins`.
- **Hot reload & restart-safe** — `config.yaml` and plugin changes apply live without bringing down the stack, and conversations resume seamlessly after a restart: session history and turn state are durable on disk, so agents pick up where they left off without double-replying.
- **Web dashboard** — create and configure agents, teams, models, tools, credentials, and knowledge bases by clicking instead of editing YAML; chat stays in your Matrix client.
- **Enterprise deployment** — the same runtime scales from a laptop to multi-tenant Kubernetes with Helm charts, isolated execution workers, and egress approval for locked-down environments.

What it looks like:

```text
You: @research @analyst @writer Create a competitive analysis report
Research: I'll gather data on our top 5 competitors...
Analyst: I'll identify strategic patterns and opportunities...
Writer: I'll compile everything into an executive summary...
```

<details>
<summary><b>Why we built this</b></summary>

Every AI app is a silo:

- ChatGPT knows your coding style... but can't join your team's Slack
- Claude understands your writing... but can't access your email
- GitHub Copilot helps with code... but can't see your project specs
- You teach each AI from scratch, over and over

Your human team collaborates across Slack, Discord, Telegram, and email every day — your AI should too.
MindRoom agents live in one place (Matrix) and follow you everywhere via bridges, with their memory intact.

Federation even lets agents cross organization boundaries:

```text
Your client asks in their Discord:
Client: Can our architect AI review this with your team?
You: Sure! @assistant please collaborate with them

Your Assistant: [Joins from your Matrix server]
Client's Architect AI: [Joins from their server]
Together: [They review architecture, sharing context from both organizations]
```

Two AI agents from different companies collaborating — impossible with app-bound assistants.

</details>

## How It Compares to OpenClaw and Hermes

[OpenClaw](https://github.com/openclaw/openclaw) and [Hermes Agent](https://github.com/nousresearch/hermes-agent) are self-hosted assistants that pipe an agent into chat apps you already use.
MindRoom plays in the same space but makes different architectural bets:

- **Multi-agent and multi-user by default.** Both are personal-first: one owner talking to their assistant. In MindRoom every agent is a real Matrix user, so you run a fleet of specialists and teams, share them with family, a project, or a whole company, and scope access per user and per room.
- **An AI-native interface on an open protocol.** With WhatsApp, Signal, or Telegram as the front end, you rent UX from platforms that were never designed for agents and can cut bots off at any time. MindRoom's home is Matrix, with [MindRoom Chat](https://github.com/mindroom-ai/mindroom-chat) tuned for AI: collapsible tool-call traces, model metadata on every response, streaming with in-place edits, response cancellation, and first-class threads. Bridges to those apps are additive, not the foundation.
- **Sandboxing with real secrets isolation.** Execution tools (shell, Python, coding) can run in isolated container workers with no access to the primary process's secrets — your agent uses credentialed tools (Gmail, GitHub, ...) while the code it executes can never read those credentials. Per-tool [approval rules](docs/configuration/index.md) and [egress approval](docs/deployment/approved-egress.md) add human-in-the-loop control.
- **Batteries included.** 100+ built-in tool integrations with typed configuration, OAuth flows, and automatic dependency installation — plus OpenClaw-compatible skills on top.

Coming from OpenClaw? MindRoom [imports OpenClaw workspaces](docs/openclaw.md) (`SOUL.md`, `MEMORY.md`, skills) and ships an `openclaw_compat` tool preset.

## Quick Start

### Hosted Matrix + local MindRoom (fastest)

MindRoom runs on your machine; Matrix is hosted at `mindroom.chat` and the chat UI at [chat.mindroom.chat](https://chat.mindroom.chat).
The only prerequisite is [uv](https://github.com/astral-sh/uv), which installs Python automatically if needed.
Watch the 2-minute setup video:

<a href="https://youtu.be/jR3xLUxyWhg"><img src="https://img.youtube.com/vi/jR3xLUxyWhg/maxresdefault.jpg" alt="MindRoom: installing and talking to my first AI agent in 2 minutes" width="480"></a>

```bash
# Create ~/.mindroom/config.yaml and ~/.mindroom/.env with hosted defaults
uvx mindroom config init

# Add model auth, or run `uvx mindroom config init --provider codex` and `codex login`
$EDITOR ~/.mindroom/.env

# Generate pair code in https://chat.mindroom.chat:
# Settings -> Local MindRoom -> Generate Pair Code
uvx mindroom connect --pair-code ABCD-EFGH

# Start MindRoom
uvx mindroom run
```

See the [hosted Matrix deployment guide](docs/deployment/hosted-matrix.md) for full details.

### Self-hosted, from source

Requires Python 3.12+ and [uv](https://github.com/astral-sh/uv); the repo dev shell provides Node.js 24 with [bun](https://bun.sh/) for optionally building the web dashboard.

```bash
git clone https://github.com/mindroom-ai/mindroom
cd mindroom
uv sync

# Point at your Matrix homeserver, or bootstrap a local Synapse + MindRoom Chat stack:
#   mindroom local-stack-setup --synapse-dir /path/to/mindroom-stack/local/matrix
export MATRIX_HOMESERVER=https://your-matrix.server
export ANTHROPIC_API_KEY=your-key-here

# Start MindRoom (agents + API + web dashboard)
uv run mindroom run
```

The web dashboard is available at http://localhost:8765.
Matrix E2EE support is installed by default.

### macOS menu bar app

The menu bar app runs the local MindRoom service without keeping a terminal open.
It bundles `uv`, uses `~/.mindroom` for config and state, and manages the `mindroom service` launchd service.
The signed universal app supports both Apple silicon and Intel Macs.

```bash
brew install --cask mindroom-ai/tap/mindroom
```

Open **MindRoom** from `/Applications` and use the menu bar item to install the runtime, pair with the hosted chat UI, and open the dashboard.
See the [macOS app guide](docs/installation/macos-app.md) for setup, updates, and uninstall instructions.

### First steps

In the MindRoom chat client (hosted at [chat.mindroom.chat](https://chat.mindroom.chat), or bundled with the local stack):

```text
You: @assistant What can you do?
Assistant: I can coordinate our team of specialized agents...

You: @research @analyst What are the latest AI breakthroughs?
[Agents collaborate to research and analyze]
```

## How Agents Respond

Agents and teams respond using Matrix thread relations to keep conversations organized.
If your client or bridge only sends plain replies, MindRoom keeps them in an existing thread when the reply chain eventually reaches a threaded ancestor or proven thread root.
Plain replies that never reach threaded context still stay plain replies.

1. **Mentioned agents and teams respond** - Tag them to get their attention
2. **Single responder continues** - One agent or team in a thread keeps responding
3. **Multiple agents collaborate** - Mention multiple agents when you want an ad-hoc collaboration
4. **Smart routing** - System picks the best agent or team for new threads
5. **DMs need no mentions** - Agents respond naturally in 1:1 rooms, and you can add more agents to a DM for private collaboration

### Chat Commands

<!-- CODE:START -->
<!-- import sys -->
<!-- sys.path.insert(0, 'src') -->
<!-- from mindroom.commands.parsing import _get_command_entries -->
<!-- for entry in _get_command_entries(format_code=True): -->
<!--     print(entry) -->
<!-- CODE:END -->
<!-- OUTPUT:START -->
<!-- ⚠️ This content is auto-generated by `markdown-code-runner`. -->
- `!help [topic]` - Get help
- `!reload-plugins` - Reload configured plugins (admin only)
- `!schedule <task>` - Schedule a task
- `!list_schedules` - List scheduled tasks
- `!cancel_schedule <id>` - Cancel a scheduled task
- `!edit_schedule <id> <task>` - Edit an existing scheduled task
- `!config <operation>` - Manage configuration
- `!desktop [setup|status|confirm|rotate|disconnect]` - Manage your Desktop target
- `!model [name|list|reset]` - Show or switch the model used in the current thread
- `!thread_mode [room|thread|reset|show]` - Show or switch the thread mode used in the current room (room admin only)
- `!encrypt [confirm]` - Enable end-to-end encryption for this room (irreversible, room admin only)
- `!e2ee` - Show encryption diagnostics for this room
- `!hi` - Show welcome message

<!-- OUTPUT:END -->

## Configuration

Everything lives in `config.yaml`: agents, teams, models, rooms, knowledge bases, voice, memory, and authorization.
The web dashboard edits the same file, so you can point-and-click instead of writing YAML.
Either way, changes are hot-reloaded and take effect without a restart.

```yaml
agents:
  assistant:
    display_name: Assistant
    role: A helpful AI assistant
    model: default
    rooms: [lobby]
    tools: [matrix_message]
    accept_invites: true  # Optional: accept authorized ad-hoc room invites
    knowledge_bases: [engineering_docs]

models:
  default:
    provider: anthropic
    id: claude-sonnet-5

knowledge_bases:
  engineering_docs:
    path: ./knowledge_docs
    watch: true

voice:
  enabled: true
  stt:
    provider: openai
    model: gpt-4o-transcribe

mindroom_user:
  username: mindroom_user  # Immutable once the account is created on first run
  display_name: MindRoomUser

authorization:
  global_users: ["@alice:example.com"]
  default_room_access: false
```

Environment variables go in `.env` (or `~/.mindroom/.env` for the hosted path):

```bash
MATRIX_HOMESERVER=https://your-matrix.server
ANTHROPIC_API_KEY=your-key-here
# Optional: protect dashboard API endpoints (recommended for non-localhost)
# MINDROOM_API_KEY=your-secret-key
# Optional: use a non-default config location
# MINDROOM_CONFIG_PATH=/path/to/config.yaml
```

Teams, cultures, per-room models, context compaction, history controls, and memory backends are covered in the [configuration docs](docs/configuration/index.md) and at [docs.mindroom.chat](https://docs.mindroom.chat).

## Deployment

- **Own homeserver** — set `MATRIX_HOMESERVER` and run against any Synapse, Conduit, or Dendrite instance.
- **Local stack** — `mindroom local-stack-setup` bootstraps a local Synapse + MindRoom Chat via Docker.
- **Hosted Matrix** — run only the backend locally against hosted Matrix at [mindroom.chat](https://mindroom.chat), pairing via [chat.mindroom.chat](https://chat.mindroom.chat) ([guide](docs/deployment/hosted-matrix.md)).
- **Docker** — single-container runtime ([guide](docs/deployment/docker.md)).
- **Kubernetes** — Helm charts for enterprise-scale, multi-tenant deployments ([guide](docs/deployment/kubernetes.md)).
- **NixOS LXC (Incus)** — the author's favorite for personal use: [mindroom-ai/lxc-nixos](https://github.com/mindroom-ai/lxc-nixos) provisions a persistent, agent-controlled NixOS container with the full stack, which the agent can rebuild and manage itself while the host controls what it sees.
- **Bridges** — connect Slack, Telegram, WhatsApp, and more via [docs/deployment/bridges](docs/deployment/bridges).

## Why Matrix?

Matrix is an open, federated messaging protocol with a decade of production use, including large government and healthcare deployments.
By building on it, MindRoom inherits instead of reimplements:

- End-to-end encryption (Olm/Megolm)
- Federation — your agent can join rooms on other homeservers, including other organizations'
- Mature clients on every platform (Element, Cinny, FluffyChat)
- 50+ maintained bridges to Slack, Telegram, Discord, WhatsApp, IRC, email, and more

<details>
<summary><b>Matrix adoption at a glance</b></summary>

- **10+ years** of development by the Matrix.org Foundation, with **€10M+** invested and **100+ core contributors**
- **35+ million users** globally
- **German healthcare**: 150,000+ organizations on TI-Messenger
- **French government**: 5.5 million civil servants on Tchap
- **Defense**: NATO, U.S. Space Force, and other defense organizations
- Built for European privacy standards (GDPR)

</details>

## Architecture

- **Matrix**: any homeserver (Synapse, Conduit, Dendrite, ...)
- **Agents**: Python, built on [Agno](https://agno.dev/) and [mindroom-nio](https://github.com/mindroom-ai/mindroom-nio)
- **AI models**: Anthropic, OpenAI, Google, Ollama, Bedrock, or any OpenAI-compatible endpoint
- **Memory**: Mem0 + ChromaDB vector storage, persistent on disk
- **UI**: web dashboard for administration; [MindRoom Chat](https://github.com/mindroom-ai/mindroom-chat) (or any Matrix client) for chat

See [docs/architecture](docs/architecture) for internals.

## Note for Self-Hosters

This repository contains everything you need to self-host MindRoom.
The `saas-platform/` directory contains infrastructure specific to running MindRoom as a hosted service and can be safely ignored by self-hosters.

## Contributing

We welcome contributions!
See [CLAUDE.md](CLAUDE.md) for the current development workflow and quality checks.

## License

- **Repository (except `saas-platform/`)**: [Apache License 2.0](LICENSE)
- **SaaS Platform** (`saas-platform/`): [Business Source License 1.1](saas-platform/LICENSE) (converts to Apache 2.0 on 2030-02-06)

## Acknowledgments

Built with:
- [Matrix](https://matrix.org/) - The federated communication protocol
- [Agno](https://agno.dev/) - AI agent framework
- [mindroom-nio](https://github.com/mindroom-ai/mindroom-nio) - Python Matrix client
