{"repo":"HKUDS/nanobot","free":true,"listed":false,"github":"https://github.com/HKUDS/nanobot","clone":"git clone https://github.com/HKUDS/nanobot.git","description":"Ultra-lightweight, open-source, self-hosted personal AI agent framework in Python with WebUI, tools, memory, MCP, multi-agent workflows, automation, and chat apps","language":"Python","stars":47066,"topics":["agent-framework","ai-agent","ai-agents","chatbot","chatops","discord-bot","llm-agents","llms","local-llm","mcp","model-context-protocol","multi-agent","openai-compatible","openclaw","personal-ai-assistant","python","self-hosted","telegram-bot-ai-assistant","webui","workflow-automation"],"license":"MIT","category":"ai_agent_framework","readme_excerpt":"<picture>\n  <source media=\"(prefers-color-scheme: dark)\" srcset=\"./images/readme-cover-dark.svg\">\n  <img alt=\"nanobot README cover\" src=\"./images/readme-cover-light.svg\">\n</picture>\n\n<div align=\"center\">\n  <p>\n    <a href=\"https://nanobot.wiki/docs/latest/getting-started/nanobot-overview\">English</a> |\n    <a href=\"https://nanobot.wiki/cn/docs/latest/getting-started/nanobot-overview\">简体中文</a> |\n    <a href=\"https://nanobot.wiki/zh-Hant/docs/latest/getting-started/nanobot-overview\">繁體中文</a> |\n    <a href=\"https://nanobot.wiki/es/docs/latest/getting-started/nanobot-overview\">Español</a> |\n    <a href=\"https://nanobot.wiki/fr/docs/latest/getting-started/nanobot-overview\">Français</a> |\n    <a href=\"https://nanobot.wiki/id/docs/latest/getting-started/nanobot-overview\">Bahasa Indonesia</a> |\n    <a href=\"https://nanobot.wiki/ja/docs/latest/getting-started/nanobot-overview\">日本語</a> |\n    <a href=\"https://nanobot.wiki/ko/docs/latest/getting-started/nanobot-overview\">한국어</a> |\n    <a href=\"https://nanobot.wiki/ru/docs/latest/getting-started/nanobot-overview\">Русский</a> |\n    <a href=\"https://nanobot.wiki/vi/docs/latest/getting-started/nanobot-overview\">Tiếng Việt</a>\n  </p>\n  <p>\n    <a href=\"https://github.com/HKUDS/nanobot\"><img src=\"https://img.shields.io/github/stars/HKUDS/nanobot?style=flat&logo=github\" alt=\"GitHub stars\"></a>\n    <a href=\"https://pypi.org/project/nanobot-ai/\"><img src=\"https://img.shields.io/pypi/v/nanobot-ai\" alt=\"PyPI version\"></a>\n    <a href=\"https://pepy.tech/project/nanobot-ai\"><img src=\"https://static.pepy.tech/badge/nanobot-ai\" alt=\"PyPI downloads\"></a>\n    <a href=\"https://github.com/HKUDS/nanobot/actions/workflows/ci.yml\"><img src=\"https://github.com/HKUDS/nanobot/actions/workflows/ci.yml/badge.svg?branch=main\" alt=\"Test Suite\"></a>\n    <a href=\"https://pypi.org/project/nanobot-ai/\"><img src=\"https://img.shields.io/badge/python-%3E%3D3.11-blue\" alt=\"Python 3.11 or newer\"></a>\n    <a href=\"./LICENSE\"><img src=\"https://img.shields.io/github/license/HKUDS/nanobot\" alt=\"MIT License\"></a>\n    <a href=\"https://nanobot.wiki/docs/latest/getting-started/nanobot-overview\"><img src=\"https://img.shields.io/badge/docs-nanobot.wiki-blue\" alt=\"nanobot documentation\"></a>\n  </p>\n  <p>\n    <a href=\"https://discord.gg/MnCvHqpUGB\">Discord</a> ·\n    <a href=\"https://x.com/nanobot_project\">X</a> ·\n    <a href=\"./COMMUNICATION.md\">WeChat / Feishu</a>\n  </p>\n</div>\n\n# nanobot\n\n🐈 **nanobot** is an ultra-lightweight, open-source, self-hosted personal AI agent framework written in Python. It runs in a WebUI, terminal, or chat apps and combines tools, long-term memory, MCP integrations, model routing, multi-agent delegation, scheduled automation, and an OpenAI-compatible API in a small, readable core.\n\n## Start Here\n\n| You want to... | Go to |\n|---|---|\n| Install nanobot with no terminal/config background | [Start Without Technical Background](./docs/start-without-technical-background.md) |\n| Install quickly and get one CLI reply | [Install](#-install) and [Quick Start](#-quick-start) |\n| Open the bundled browser UI | [WebUI](#-webui) |\n| Connect Telegram, Discord, WeChat, Slack, Email, Mattermost, or another chat app | [Chat Apps](./docs/chat-apps.md) |\n| Configure providers, fallback models, Langfuse, MCP, web tools, or security | [Docs](./docs/README.md) and [Configuration](./docs/configuration.md) |\n| Understand or extend the internals | [Architecture](./docs/architecture.md) and [Development](./docs/development.md) |\n| Deploy to the cloud or keep nanobot running as a service | [Deployment](./docs/deployment.md) |\n\n## What can nanobot do?\n\nnanobot is a self-hosted personal AI agent runtime. It can:\n\n- run in a browser WebUI or terminal\n- connect to Telegram, Discord, Slack, WeChat, Email, Mattermost, and other chat apps\n- use tools such as files, shell, web search, web fetch, MCP, cron, image generation, and subagents\n- keep session history and long-term memory through Dream\n- run long-horizon goals and scheduled automations\n- expose a Python SDK and OpenAI-compatible API for integrations\n- deploy as a long-running local or server-side agent gateway\n\n## 💡 Why nanobot\n\n- **Persistent workflows**: goals, memory, tools, and chat context survive long-running work.\n- **Chat-native reach**: WebUI, API, Telegram, Feishu, Slack, Discord, Teams, email, and Mattermost.\n- **Model freedom**: OpenAI-compatible APIs, local LLMs, image generation, search, and fallbacks.\n- **Small core**: readable internals with MCP, memory, deployment, and automation built in.\n- **Own your stack**: inspect, customize, self-host, and extend without a giant platform.\n\n## 📦 Install\n\n> [!IMPORTANT]\n> If you want the newest features and experiments, install from source.\n>\n> If you want the most stable day-to-day experience, install from PyPI or with `uv`.\n\nPick **one** install method:\n\nPrerequisites: Python 3.11 or newer. Git is only needed for a source install. Published packages already include the WebUI; a current-source install needs `bun` or `npm` to build it.\n\nIf terminals, API keys, or config files are new to you, use the guided zero-background walkthrough in [Start Without Technical Background](./docs/start-without-technical-background.md) instead of this compact README path.\n\n**One-command setup**\n\nmacOS / Linux:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/HKUDS/nanobot/main/scripts/install.sh | sh\n```\n\nWindows PowerShell:\n\n```powershell\nirm https://raw.githubusercontent.com/HKUDS/nanobot/main/scripts/install.ps1 | iex\n```\n\nThe default command installs or upgrades `nanobot-ai` from PyPI. On a fresh local desktop, it then starts `nanobot webui` so you can configure the first provider and model in **Settings → Models**. SSH, headless, existing-config, and older-release paths keep the terminal setup wizard. The installer avoids system-wide pip installs by using an active virtual environment, `uv`, `pipx`, or a managed venv under `~/.nanobot/venv`. It also prints the exact command it used to run nanobot; reuse that full command below if `nanobot` is not on `PATH`.\n\nTo preview the plan without changing your environment, pass `--dry-run`; combine it with `--dev` when you want to preview the main-branch install.\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/HKUDS/nanobot/main/scripts/install.sh | sh -s -- --dry-run\n```\n\n```powershell\n& ([scriptblock]::Create((irm https://raw.githubusercontent.com/HKUDS/nanobot/main/scripts/install.ps1))) --dry-run\n```\n\nTo install the current `main` branch instead, pass `--dev`:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/HKUDS/nanobot/main/scripts/install.sh | sh -s -- --dev\n```\n\n```powershell\n& ([scriptblock]::Create((irm https://raw.githubusercontent.com/HKUDS/nanobot/main/scripts/install.ps1))) --dev\n```\n\nIf you prefer to inspect the script first, open [`scripts/install.sh`](./scripts/install.sh) or [`scripts/install.ps1`](./scripts/install.ps1).\n\n**Install with `uv`**\n\n```bash\nuv tool install nanobot-ai\n```\n\n**Install from PyPI with pip**\n\n```bash\npython -m pip install nanobot-ai\n```\n\nIf pip reports `externally-managed-environment` on macOS or Linux, use the one-command installer, `uv tool install nanobot-ai`, `pipx install nanobot-ai`, or install inside a virtual environment.\n\n**Install from source**\n\n`bun` or `npm` must be available. From an activated virtual environment:\n\n```bash\ngit clone https://github.com/HKUDS/nanobot.git\ncd nanobot\npython -m pip install .\n```\n\nOn Windows, if pip reports that it cannot launch `npm`, run `cd webui`, `npm.cmd install --package-lock=false`, `npm.cmd run build`, and `cd ..` in order, then retry the install. Contributors who need an editable checkout should follow [`CONTRIBUTING.md`](./CONTRIBUTING.md) and [`webui/README.md`](./webui/README.md).\n\nVerify the install:\n\n```bash\nnanobot --version\n```\n\nIf `nanobot` is not on `PATH`, invoke it through the method that installed it: reuse the recommended installer's command, use `uv tool run --from nanobot-ai nanobot ...` or `pipx run --spec nanobot-ai nanobot ...`, or use the Python executable from the environment where pip installed the package.\n\n## 🚀 Quick Start\n\n**Open nanobot in your browser**\n\n```bash\nnanobot webui\n```\n\nThis is the recommended first run. The launcher creates the config and workspace when needed, safely enables the local WebSocket channel after confirmation, starts the gateway, and opens [`http://127.0.0.1:8765`](http://127.0.0.1:8765). A fresh install can open before a model is configured, so setup continues in the browser instead of beginning in a JSON file. The first-run WebUI binds to localhost by default and is not exposed to your LAN.\n\n**Your first three steps**\n\n1. Open **Settings → Models** and choose a provider, credential, and model.\n2. Start a new topic and send `Hello!` to verify the connection.\n3. Before project work, choose the intended workspace and access mode from the composer.\n\nAny normal reply means the provider, model, workspace, and browser gateway are working together.\n\n**Keep nanobot running after you close the terminal**\n\n```bash\nnanobot webui --background\n```\n\nThis starts the same full gateway as `nanobot webui`, opens the browser, and leaves channels and automations running after the launcher exits. Complete first-time model setup with foreground `nanobot webui` before switching to background mode.\n\n```bash\nnanobot gateway status\nnanobot gateway logs\nnanobot gateway restart\nnanobot gateway stop\n```\n\n**Prefer a gateway-first workflow?**\n\n```bash\nnanobot gateway\n```\n\nThis skips WebUI setup and browser opening, then runs the same complete gateway in the current terminal. It is the familiar entry point if you are coming from OpenClaw or already operate agents as long-lived services. The WebUI remains available when its channel is configured; open it manually when needed.\n\nUse `nanobot gateway --background` for the same direct entry point without keeping the terminal attached. For automatic startup and supervision by the operating system, see [Deployment](","default_branch":"main","files":1242,"tree":[".agent/design.md",".agent/gotchas.md",".agent/security.md",".dockerignore",".gitattributes",".github/ISSUE_TEMPLATE/bug_report.yml",".github/ISSUE_TEMPLATE/config.yml",".github/ISSUE_TEMPLATE/feature_request.yml",".github/workflows/ci.yml",".gitignore","AGENTS.md","CLAUDE.md","COMMUNICATION.md","CONTRIBUTING.md","Dockerfile","LICENSE","README.md","SECURITY.md","THIRD_PARTY_NOTICES.md","conftest.py","core_agent_lines.sh","docker-compose.bwrap.yml","docker-compose.yml","docs/README.md","docs/agent-social-network.md","docs/architecture.md","docs/automations.md","docs/channel-package-guide.md","docs/chat-apps.md","docs/chat-commands.md","docs/cli-reference.md","docs/concepts.md","docs/configuration.md","docs/deployment.md","docs/development.md","docs/guides/README.md","docs/guides/ai-agent-memory.md","docs/guides/ai-agent-webui.md","docs/guides/build-a-personal-ai-agent.md","docs/guides/chat-app-ai-agent.md","docs/guides/configure-langfuse-observability.md","docs/guides/configure-mcp-tools.md","docs/guides/configure-model-fallback.md","docs/guides/configure-ollama-prompt-cache.md","docs/guides/configure-openai-compatible-provider.md","docs/guides/configure-web-search.md","docs/guides/deploy-nanobot-gateway.md","docs/guides/discord-ai-agent.md","docs/guides/email-ai-agent.md","docs/guides/feishu-ai-agent.md","docs/guides/long-running-ai-agent.md","docs/guides/mattermost-ai-agent.md","docs/guides/mcp-tools-for-ai-agents.md","docs/guides/openai-compatible-agent-api.md","docs/guides/python-ai-agent-sdk.md","docs/guides/qq-ai-agent.md","docs/guides/secure-local-ai-agent.md","docs/guides/self-hosted-ai-agent.md","docs/guides/slack-ai-agent.md","docs/guides/telegram-ai-agent.md","docs/guides/wechat-ai-agent.md","docs/guides/whatsapp-ai-agent.md","docs/image-generation.md","docs/memory.md","docs/multiple-instances.md","docs/my-tool.md","docs/openai-api.md","docs/provider-cookbook.md","docs/providers.md","docs/python-sdk.md","docs/quick-start.md","docs/release-archive.md","docs/start-without-technical-background.md","docs/troubleshooting.md","docs/websocket.md","docs/webui.md","entrypoint.sh","hatch_build.py","images/nanobot_arch.png","images/nanobot_logo.png","images/nanobot_logo.svg","images/nanobot_mark.svg","images/nanobot_webui.png","images/readme-cover-dark.svg","images/readme-cover-light.svg","nanobot/__init__.py","nanobot/__main__.py","nanobot/agent/__init__.py","nanobot/agent/autocompact.py","nanobot/agent/automation_turns.py","nanobot/agent/context.py","nanobot/agent/context_governance.py","nanobot/agent/cron_turns.py","nanobot/agent/goal_permission.py","nanobot/agent/hook.py","nanobot/agent/hooks/__init__.py","nanobot/agent/hooks/file_edit_activity.py","nanobot/agent/loop.py","nanobot/agent/memory.py","nanobot/agent/model_presets.py","nanobot/agent/model_runtime.py","nanobot/agent/plugins.py","nanobot/agent/progress_hook.py","nanobot/agent/runner.py","nanobot/agent/skills.py","nanobot/agent/subagent.py","nanobot/agent/tools/__init__.py","nanobot/agent/tools/_windows_job.py","nanobot/agent/tools/apply_patch.py","nanobot/agent/tools/base.py","nanobot/agent/tools/cli_apps.py","nanobot/agent/tools/context.py","nanobot/agent/tools/cron.py","nanobot/agent/tools/exec_session.py","nanobot/agent/tools/file_state.py","nanobot/agent/tools/filesystem.py","nanobot/agent/tools/image_generation.py","nanobot/agent/tools/loader.py","nanobot/agent/tools/long_task.py","nanobot/agent/tools/mcp.py","nanobot/agent/tools/mcp_oauth.py","nanobot/agent/tools/message.py","nanobot/agent/tools/path_utils.py","nanobot/agent/tools/registry.py","nanobot/agent/tools/runtime_control.py","nanobot/agent/tools/sandbox.py","nanobot/agent/tools/schema.py","nanobot/agent/tools/search.py","nanobot/agent/tools/self.py","nanobot/agent/tools/sessions.py","nanobot/agent/tools/shell.py","nanobot/agent/tools/spawn.py","nanobot/agent/tools/web.py","nanobot/agent/turn_delivery.py","nanobot/agent/turn_hooks.py","nanobot/api/__init__.py","nanobot/api/runtime.py","nanobot/api/server.py","nanobot/apps/__init__.py","nanobot/apps/cli/__init__.py","nanobot/apps/cli/service.py","nanobot/apps/cli/utils.py","nanobot/apps/protocol.py","nanobot/audio/__init__.py","nanobot/audio/transcription.py","nanobot/audio/transcription_registry.py","nanobot/bus/__init__.py","nanobot/bus/events.py","nanobot/bus/outbound_events.py","nanobot/bus/progress.py","nanobot/bus/queue.py","nanobot/bus/runtime_events.py","nanobot/channels/__init__.py","nanobot/channels/_manifest.py","nanobot/channels/_setup.py","nanobot/channels/base.py","nanobot/channels/connect.py","nanobot/channels/contracts.py","nanobot/channels/dingtalk/__init__.py","nanobot/channels/dingtalk/manifest.py","nanobot/channels/dingtalk/runtime.py","nanobot/channels/dingtalk/tests/__init__.py","nanobot/channels/dingtalk/tests/test_dingtalk_channel.py","nanobot/channels/dingtalk/tests/test_validation.py","nanobot/channels/dingtalk/webui/index.ts","nanobot/channels/dingtalk/webui/locales/en.json","nanobot/channels/dingtalk/webui/locales/es.json","nanobot/channels/dingtalk/webui/locales/fr.json","nanobot/channels/dingtalk/webui/locales/id.json","nanobot/channels/dingtalk/webui/locales/ja.json","nanobot/channels/dingtalk/webui/locales/ko.json","nanobot/channels/dingtalk/webui/locales/pt-BR.json","nanobot/channels/dingtalk/webui/locales/vi.json","nanobot/channels/dingtalk/webui/locales/zh-CN.json","nanobot/channels/dingtalk/webui/locales/zh-TW.json","nanobot/channels/discord/__init__.py","nanobot/channels/discord/manifest.py","nanobot/channels/discord/runtime.py","nanobot/channels/discord/tests/__init__.py","nanobot/channels/discord/tests/test_discord_channel.py","nanobot/channels/discord/validation.py","nanobot/channels/discord/webui/index.ts","nanobot/channels/discord/webui/locales/en.json","nanobot/channels/discord/webui/locales/es.json","nanobot/channels/discord/webui/locales/fr.json","nanobot/channels/discord/webui/locales/id.json","nanobot/channels/discord/webui/locales/ja.json","nanobot/channels/discord/webui/locales/ko.json","nanobot/channels/discord/webui/locales/pt-BR.json","nanobot/channels/discord/webui/locales/vi.json","nanobot/channels/discord/webui/locales/zh-CN.json","nanobot/channels/discord/webui/locales/zh-TW.json","nanobot/channels/email/__init__.py","nanobot/channels/email/manifest.py","nanobot/channels/email/runtime.py","nanobot/channels/email/tests/__init__.py","nanobot/channels/email/tests/test_email_channel.py","nanobot/channels/email/tests/test_validation.py","nanobot/channels/email/validation.py","nanobot/channels/email/webui/index.ts","nanobot/channels/email/webui/locales/en.json","nanobot/channels/email/webui/locales/es.json","nanobot/channels/email/webui/locales/fr.json","nanobot/channels/email/webui/locales/id.json","nanobot/channels/email/webui/locales/ja.json","nanobot/channels/email/webui/locales/ko.json","nanobot/channels/email/webui/locales/pt-BR.json","nanobot/channels/email/webui/locales/vi.json","nanobot/channels/email/webui/locales/zh-CN.json","nanobot/channels/email/webui/locales/zh-TW.json","nanobot/channels/feishu/__init__.py","nanobot/channels/feishu/config.py","nanobot/channels/feishu/connect.py","nanobot/channels/feishu/instances.py","nanobot/channels/feishu/manifest.py","nanobot/channels/feishu/runtime.py","nanobot/channels/feishu/tests/__init__.py","nanobot/channels/feishu/tests/test_connect.py","nanobot/channels/feishu/tests/test_feishu_card_extraction.py","nanobot/channels/feishu/tests/test_feishu_domain.py","nanobot/channels/feishu/tests/test_feishu_lazy_import.py","nanobot/channels/feishu/tests/test_feishu_login.py","nanobot/channels/feishu/tests/test_feishu_markdown_rendering.py","nanobot/channels/feishu/tests/test_feishu_media_filename_security.py","nanobot/channels/feishu/tests/test_feishu_mention.py","nanobot/channels/feishu/tests/test_feishu_mentions.py","nanobot/channels/feishu/tests/test_feishu_post_content.py","nanobot/channels/feishu/tests/test_feishu_reaction.py","nanobot/channels/feishu/tests/test_feishu_reply.py","nanobot/channels/feishu/tests/test_feishu_streaming.py","nanobot/channels/feishu/tests/test_feishu_table_split.py","nanobot/channels/feishu/tests/test_feishu_tool_hint_code_block.py","nanobot/channels/feishu/tests/test_feishu_ws.py","nanobot/channels/feishu/validation.py","nanobot/channels/feishu/websocket.py","nanobot/channels/feishu/webui/FeishuAssistantsPanel.tsx","nanobot/channels/feishu/webui/FeishuConnectFlow.tsx","nanobot/channels/feishu/webui/index.tsx","nanobot/channels/feishu/webui/locales/en.json","nanobot/channels/feishu/webui/locales/es.json","nanobot/channels/feishu/webui/locales/fr.json","nanobot/channels/feishu/webui/locales/id.json","nanobot/channels/feishu/webui/locales/ja.json","nanobot/channels/feishu/webui/locales/ko.json","nanobot/channels/feishu/webui/locales/pt-BR.json","nanobot/channels/feishu/webui/locales/vi.json","nanobot/channels/feishu/webui/locales/zh-CN.json","nanobot/channels/feishu/webui/locales/zh-TW.json","nanobot/channels/manager.py","nanobot/channels/matrix/__init__.py","nanobot/channels/matrix/manifest.py","nanobot/channels/matrix/runtime.py","nanobot/channels/matrix/tests/__init__.py","nanobot/channels/matrix/tests/test_matrix_channel.py","nanobot/channels/matrix/tests/test_validation.py","nanobot/channels/matrix/validation.py","nanobot/channels/matrix/webui/index.ts","nanobot/channels/matrix/webui/locales/en.json","nanobot/channels/matrix/webui/locales/es.json","nanobot/channels/matrix/webui/locales/fr.json","nanobot/channels/matrix/webui/locales/id.json","nanobot/channels/matrix/webui/locales/ja.json","nanobot/channels/matrix/webui/locales/ko.json","nanobot/channels/matrix/webui/locales/pt-BR.json","nanobot/channels/matrix/webui/locales/vi.json","nanobot/channels/matrix/webui/locales/zh-CN.json","nanobot/channels/matrix/webui/locales/zh-TW.json","nanobot/channels/mattermost/__init__.py","nanobot/channels/mattermost/manifest.py","nanobot/channels/mattermost/runtime.py","nanobot/channels/mattermost/tests/__init__.py","nanobot/channels/mattermost/tests/test_mattermost_channel.py","nanobot/channels/mattermost/webui/index.ts","nanobot/channels/mattermost/webui/locales/en.json","nanobot/channels/mattermost/webui/locales/es.json","nanobot/channels/mattermost/webui/locales/fr.json","nanobot/channels/mattermost/webui/locales/id.json","nanobot/channels/mattermost/webui/locales/ja.json","nanobot/channels/mattermost/webui/locales/ko.json","nanobot/channels/mattermost/webui/locales/pt-BR.json","nanobot/channels/mattermost/webui/locales/vi.json","nanobot/channels/mattermost/webui/locales/zh-CN.json","nanobot/channels/mattermost/webui/locales/zh-TW.json","nanobot/channels/mochat/__init__.py","nanobot/channels/mochat/manifest.py","nanobot/channels/mochat/runtime.py","nanobot/channels/msteams/__init__.py","nanobot/channels/msteams/manifest.py","nanobot/channels/msteams/runtime.py","nanobot/channels/msteams/tests/__init__.py","nanobot/channels/msteams/tests/test_msteams.py","nanobot/channels/msteams/webui/index.ts","nanobot/channels/msteams/webui/locales/en.json","nanobot/channels/msteams/webui/locales/es.json","nanobot/channels/msteams/webui/locales/fr.json","nanobot/channels/msteams/webui/locales/id.json","nanobot/channels/msteams/webui/locales/ja.json","nanobot/channels/msteams/webui/locales/ko.json","nanobot/channels/msteams/webui/locales/pt-BR.json","nanobot/channels/msteams/webui/locales/vi.json","nanobot/channels/msteams/webui/locales/zh-CN.json","nanobot/channels/msteams/webui/locales/zh-TW.json","nanobot/channels/napcat/__init__.py","nanobot/channels/napcat/manifest.py","nanobot/channels/napcat/runtime.py","nanobot/channels/napcat/tests/__init__.py","nanobot/channels/napcat/tests/test_napcat_channel.py","nanobot/channels/napcat/webui/index.ts","nanobot/channels/napcat/webui/locales/en.json","nanobot/channels/napcat/webui/locales/es.json","nanobot/channels/napcat/webui/locales/fr.json","nanobot/channels/napcat/webui/locales/id.json","nanobot/channels/napcat/webui/locales/ja.json","nanobot/channels/napcat/webui/locales/ko.json","nanobot/channels/napcat/webui/locales/pt-BR.json","nanobot/channels/napcat/webui/locales/vi.json","nanobot/channels/napcat/webui/locales/zh-CN.json","nanobot/channels/napcat/webui/locales/zh-TW.json","nanobot/channels/plugin.py","nanobot/channels/qq/__init__.py","nanobot/channels/qq/manifest.py","nanobot/channels/qq/runtime.py","nanobot/channels/qq/tests/__init__.py","nanobot/channels/qq/tests/test_qq_ack_message.py","nanobot/channels/qq/tests/test_qq_channel.py","nanobot/channels/qq/tests/test_qq_media.py","nanobot/channels/qq/webui/index.ts","nanobot/channels/qq/webui/locales/en.json","nanobot/channels/qq/webui/locales/es.json","nanobot/channels/qq/webui/locales/fr.json","nanobot/channels/qq/webui/locales/id.json","nanobot/channels/qq/webui/locales/ja.json","nanobot/channels/qq/webui/locales/ko.json","nanobot/channels/qq/webui/locales/pt-BR.json","nanobot/channels/qq/webui/locales/vi.json","nanobot/channels/qq/webui/locales/zh-CN.json","nanobot/channels/qq/webui/locales/zh-TW.json","nanobot/channels/registry.py","nanobot/channels/signal/__init__.py","nanobot/channels/signal/manifest.py","nanobot/channels/signal/runtime.py","nanobot/channels/signal/tests/__init__.py","nanobot/channels/signal/tests/test_signal_channel.py","nanobot/channels/signal/tests/test_signal_markdown.py","nanobot/channels/signal/webui/index.ts","nanobot/channels/signal/webui/locales/en.json","nanobot/channels/signal/webui/locales/es.json","nanobot/channels/signal/webui/locales/fr.json","nanobot/channels/signal/webui/locales/id.json","nanobot/channels/signal/webui/locales/ja.json","nanobot/channels/signal/webui/locales/ko.json","nanobot/channels/signal/webui/locales/pt-BR.json","nanobot/channels/signal/webui/locales/vi.json","nanobot/channels/signal/webui/locales/zh-CN.json","nanobot/channels/signal/webui/locales/zh-TW.json","nanobot/channels/slack/__init__.py","nanobot/channels/slack/manifest.py","nanobot/channels/slack/runtime.py","nanobot/channels/slack/tests/__init__.py","nanobot/channels/slack/tests/test_slack_channel.py","nanobot/channels/slack/tests/test_validation.py","nanobot/channels/slack/validation.py","nanobot/channels/slack/webui/index.ts","nanobot/channels/slack/webui/locales/en.json","nanobot/channels/slack/webui/locales/es.json","nanobot/channels/slack/webui/locales/fr.json","nanobot/channels/slack/webui/locales/id.json","nanobot/channels/slack/webui/locales/ja.json","nanobot/channels/slack/webui/locales/ko.json","nanobot/channels/slack/webui/locales/pt-BR.json","nanobot/channels/slack/webui/locales/vi.json","nanobot/channels/slack/webui/locales/zh-CN.json","nanobot/channels/slack/webui/locales/zh-TW.json","nanobot/channels/telegram/__init__.py","nanobot/channels/telegram/manifest.py","nanobot/channels/telegram/runtime.py","nanobot/channels/telegram/tests/__init__.py","nanobot/channels/telegram/tests/test_telegram_channel.py","nanobot/channels/telegram/tests/test_validation.py","nanobot/channels/telegram/validation.py","nanobot/channels/telegram/webui/index.ts","nanobot/channels/telegram/webui/locales/en.json","nanobot/channels/telegram/webui/locales/es.json","nanobot/channels/telegram/webui/locales/fr.json","nanobot/channels/telegram/webui/locales/id.json","nanobot/channels/telegram/webui/locales/ja.json","nanobot/channels/telegram/webui/locales/ko.json","nanobot/channels/telegram/webui/locales/pt-BR.json","nanobot/channels/telegram/webui/locales/vi.json","nanobot/channels/telegram/webui/locales/zh-CN.json","nanobot/channels/telegram/webui/locales/zh-TW.json","nanobot/channels/validation.py","nanobot/channels/websocket/__init__.py","nanobot/channels/websocket/manifest.py","nanobot/channels/websocket/runtime.py","nanobot/channels/websocket/tests/__init__.py","nanobot/channels/websocket/tests/conftest.py","nanobot/channels/websocket/tests/test_websocket_channel.py","nanobot/channels/websocket/tests/test_websocket_envelope_media.py","nanobot/channels/websocket/tests/test_websocket_http_routes.py"],"storefront":"/r/HKUDS","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/HKUDS/nanobot/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}