Mudabbir is an open-source AI agent that runs locally and connects to Telegram, Discord, Slack, WhatsApp, and a web dashboard. Python 3.11+, async everywhere, protocol-oriented.
We welcome contributions of all kinds: bug fixes, new tools, channel adapters, docs, tests.
👤 Developer profile: Who Am I? | من أنا؟
All pull requests must target the
devbranch.PRs opened against
mainwill be closed. Themainbranch is updated only via merge fromdevwhen a release is ready.
- Search existing issues to see if your bug or feature has already been reported.
- Check open pull requests to make sure someone isn't already working on the same thing.
- If an issue exists, comment on it to let others know you're picking it up.
- If no issue exists, open one first to discuss the approach before writing code.
- Issues labeled
good first issueare a good starting point if you're new to the codebase.
- Fork the repository and clone your fork.
- Create a feature branch off
dev:git checkout dev git pull origin dev git checkout -b feat/your-feature
- Install dependencies (requires uv):
uv sync --dev
- Run the app to verify your setup:
The web dashboard should open at
uv run mudabbir
http://localhost:8888.
# Run the app (web dashboard)
uv run mudabbir
# Run with auto-reload (watches *.py, *.html, *.js, *.css)
uv run mudabbir --dev
# Run tests (skip e2e, they need Playwright browsers)
uv run pytest --ignore=tests/e2e
# Run a specific test file
uv run pytest tests/test_bus.py -v
# Lint
uv run ruff check .
# Format
uv run ruff format .
# Type check
uv run mypy .src/Mudabbir/
agents/ # Agent backends (Claude SDK, Native, Open Interpreter) + router
bus/ # Message bus + event types
adapters/ # Channel adapters (Telegram, Discord, Slack, WhatsApp, etc.)
tools/
builtin/ # 60+ built-in tools (Gmail, Spotify, web search, filesystem, etc.)
protocol.py # ToolProtocol interface (implement this for new tools)
registry.py # Central tool registry with policy filtering
policy.py # Tool access control (profiles, allow/deny lists)
memory/ # Memory stores (file-based, mem0)
security/ # Guardian AI, injection scanner, audit log
mcp/ # MCP server configuration and management
deep_work/ # Multi-step task decomposition and execution
mission_control/ # Multi-agent orchestration
daemon/ # Background tasks, triggers, proactive behaviors
config.py # Pydantic Settings with MUDABBIR_ env prefix
credentials.py # Fernet-encrypted credential store
dashboard.py # FastAPI server, WebSocket handler, REST APIs
scheduler.py # APScheduler-based reminders and cron jobs
frontend/ # Vanilla JS/CSS/HTML dashboard (no build step)
tests/ # pytest suite (130+ tests)
- Async everywhere. All agent, bus, memory, and tool interfaces are async.
- Protocol-oriented. Core interfaces (
AgentProtocol,ToolProtocol,MemoryStoreProtocol,BaseChannelAdapter) are PythonProtocolclasses. Implement the protocol, don't subclass the concrete class. - Ruff config: line-length 100, target Python 3.11, lint rules E/F/I/UP.
- Lazy imports for optional dependencies. Agent backends and tools with heavy deps are imported inside functions, not at module level.
- Create a file in
src/Mudabbir/tools/builtin/. - Subclass
BaseToolfromtools/protocol.py. - Implement
name,description,parameters(JSON Schema), andexecute(**params) -> str. - Add the class to
tools/builtin/__init__.pylazy imports. - Add the tool to the appropriate policy group in
tools/policy.py. - Write tests.
- Create a file in
src/Mudabbir/bus/adapters/. - Extend
BaseChannelAdapter. - Implement
_on_start(),_on_stop(), andsend(message). - Use
self._publish_inbound()to push incoming messages to the bus. - Add any new dependencies as optional extras in
pyproject.toml.
Mudabbir handles API keys, OAuth tokens, and shell execution. Keep these in mind:
- Never log or expose credentials. Use
credentials.pyfor secret storage. - New config fields that hold secrets must be added to the
SECRET_FIELDSlist incredentials.py. - Shell-executing tools must respect the Guardian AI safety checks.
- New API endpoints need auth middleware.
- Test for injection patterns if your feature handles user input.
Use Conventional Commits:
feat: add Spotify playback tool
fix: handle empty WebSocket message
docs: update channel adapter guide
refactor: simplify model router thresholds
test: add coverage for injection scanner
Keep the subject line under 72 characters. Add a body if the change needs explanation.
- Branch is based on
dev(notmain) - PR targets the
devbranch - Tests pass (
uv run pytest --ignore=tests/e2e) - Linting passes (
uv run ruff check .) - No secrets or credentials in the diff
- New config fields are added to
Settings.save()dict - New secret fields are added to
SECRET_FIELDSincredentials.py - New tools are registered in the appropriate policy group
- New optional dependencies are declared in
pyproject.tomlextras
- PRs are reviewed by maintainers. We aim to respond within a few days.
- Small, focused PRs get reviewed faster than large ones.
- If your PR has been open for a week with no response, ping us in the issue.
Open an issue with:
- What you expected to happen
- What actually happened
- Steps to reproduce
- Your OS, Python version, and Mudabbir version (
mudabbir --version)
Open a Discussion or comment on a relevant issue. We're around.