# nanobot **Repository Path**: ipcun/nanobot ## Basic Information - **Project Name**: nanobot - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-23 - **Last Updated**: 2026-02-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README
nanobot

nanobot: Ultra-Lightweight Personal AI Assistant

PyPI Downloads Python License Feishu WeChat Discord

๐Ÿˆ **nanobot** is an **ultra-lightweight** personal AI assistant inspired by [OpenClaw](https://github.com/openclaw/openclaw) โšก๏ธ Delivers core agent functionality in just **~4,000** lines of code โ€” **99% smaller** than Clawdbot's 430k+ lines. ๐Ÿ“ Real-time line count: **3,897 lines** (run `bash core_agent_lines.sh` to verify anytime) ## ๐Ÿ“ข News - **2026-02-21** ๐ŸŽ‰ Released **v0.1.4.post1** โ€” new providers, media support across channels, and major stability improvements. See [release notes](https://github.com/HKUDS/nanobot/releases/tag/v0.1.4.post1) for details. - **2026-02-20** ๐Ÿฆ Feishu now receives multimodal files from users. More reliable memory under the hood. - **2026-02-19** โœจ Slack now sends files, Discord splits long messages, and subagents work in CLI mode. - **2026-02-18** โšก๏ธ nanobot now supports VolcEngine, MCP custom auth headers, and Anthropic prompt caching. - **2026-02-17** ๐ŸŽ‰ Released **v0.1.4** โ€” MCP support, progress streaming, new providers, and multiple channel improvements. Please see [release notes](https://github.com/HKUDS/nanobot/releases/tag/v0.1.4) for details. - **2026-02-16** ๐Ÿฆž nanobot now integrates a [ClawHub](https://clawhub.ai) skill โ€” search and install public agent skills. - **2026-02-15** ๐Ÿ”‘ nanobot now supports OpenAI Codex provider with OAuth login support. - **2026-02-14** ๐Ÿ”Œ nanobot now supports MCP! See [MCP section](#mcp-model-context-protocol) for details. - **2026-02-13** ๐ŸŽ‰ Released **v0.1.3.post7** โ€” includes security hardening and multiple improvements. **Please upgrade to the latest version to address security issues**. See [release notes](https://github.com/HKUDS/nanobot/releases/tag/v0.1.3.post7) for more details. - **2026-02-12** ๐Ÿง  Redesigned memory system โ€” Less code, more reliable. Join the [discussion](https://github.com/HKUDS/nanobot/discussions/566) about it! - **2026-02-11** โœจ Enhanced CLI experience and added MiniMax support!
Earlier news - **2026-02-10** ๐ŸŽ‰ Released **v0.1.3.post6** with improvements! Check the updates [notes](https://github.com/HKUDS/nanobot/releases/tag/v0.1.3.post6) and our [roadmap](https://github.com/HKUDS/nanobot/discussions/431). - **2026-02-09** ๐Ÿ’ฌ Added Slack, Email, and QQ support โ€” nanobot now supports multiple chat platforms! - **2026-02-08** ๐Ÿ”ง Refactored Providersโ€”adding a new LLM provider now takes just 2 simple steps! Check [here](#providers). - **2026-02-07** ๐Ÿš€ Released **v0.1.3.post5** with Qwen support & several key improvements! Check [here](https://github.com/HKUDS/nanobot/releases/tag/v0.1.3.post5) for details. - **2026-02-06** โœจ Added Moonshot/Kimi provider, Discord integration, and enhanced security hardening! - **2026-02-05** โœจ Added Feishu channel, DeepSeek provider, and enhanced scheduled tasks support! - **2026-02-04** ๐Ÿš€ Released **v0.1.3.post4** with multi-provider & Docker support! Check [here](https://github.com/HKUDS/nanobot/releases/tag/v0.1.3.post4) for details. - **2026-02-03** โšก Integrated vLLM for local LLM support and improved natural language task scheduling! - **2026-02-02** ๐ŸŽ‰ nanobot officially launched! Welcome to try ๐Ÿˆ nanobot!
## Key Features of nanobot: ๐Ÿชถ **Ultra-Lightweight**: Just ~4,000 lines of core agent code โ€” 99% smaller than Clawdbot. ๐Ÿ”ฌ **Research-Ready**: Clean, readable code that's easy to understand, modify, and extend for research. โšก๏ธ **Lightning Fast**: Minimal footprint means faster startup, lower resource usage, and quicker iterations. ๐Ÿ’Ž **Easy-to-Use**: One-click to deploy and you're ready to go. ## ๐Ÿ—๏ธ Architecture

nanobot architecture

## โœจ Features

๐Ÿ“ˆ 24/7 Real-Time Market Analysis

๐Ÿš€ Full-Stack Software Engineer

๐Ÿ“… Smart Daily Routine Manager

๐Ÿ“š Personal Knowledge Assistant

Discovery โ€ข Insights โ€ข Trends Develop โ€ข Deploy โ€ข Scale Schedule โ€ข Automate โ€ข Organize Learn โ€ข Memory โ€ข Reasoning
## ๐Ÿ“ฆ Install **Install from source** (latest features, recommended for development) ```bash git clone https://github.com/HKUDS/nanobot.git cd nanobot pip install -e . ``` **Install with [uv](https://github.com/astral-sh/uv)** (stable, fast) ```bash uv tool install nanobot-ai ``` **Install from PyPI** (stable) ```bash pip install nanobot-ai ``` ## ๐Ÿš€ Quick Start > [!TIP] > Set your API key in `~/.nanobot/config.json`. > Get API keys: [OpenRouter](https://openrouter.ai/keys) (Global) ยท [Brave Search](https://brave.com/search/api/) (optional, for web search) **1. Initialize** ```bash nanobot onboard ``` **2. Configure** (`~/.nanobot/config.json`) Add or merge these **two parts** into your config (other options have defaults). *Set your API key* (e.g. OpenRouter, recommended for global users): ```json { "providers": { "openrouter": { "apiKey": "sk-or-v1-xxx" } } } ``` *Set your model*: ```json { "agents": { "defaults": { "model": "anthropic/claude-opus-4-5" } } } ``` **3. Chat** ```bash nanobot agent ``` That's it! You have a working AI assistant in 2 minutes. ## ๐Ÿ’ฌ Chat Apps Connect nanobot to your favorite chat platform. | Channel | What you need | |---------|---------------| | **Telegram** | Bot token from @BotFather | | **Discord** | Bot token + Message Content intent | | **WhatsApp** | QR code scan | | **Feishu** | App ID + App Secret | | **Mochat** | Claw token (auto-setup available) | | **DingTalk** | App Key + App Secret | | **Slack** | Bot token + App-Level token | | **Email** | IMAP/SMTP credentials | | **QQ** | App ID + App Secret |
Telegram (Recommended) **1. Create a bot** - Open Telegram, search `@BotFather` - Send `/newbot`, follow prompts - Copy the token **2. Configure** ```json { "channels": { "telegram": { "enabled": true, "token": "YOUR_BOT_TOKEN", "allowFrom": ["YOUR_USER_ID"] } } } ``` > You can find your **User ID** in Telegram settings. It is shown as `@yourUserId`. > Copy this value **without the `@` symbol** and paste it into the config file. **3. Run** ```bash nanobot gateway ```
Mochat (Claw IM) Uses **Socket.IO WebSocket** by default, with HTTP polling fallback. **1. Ask nanobot to set up Mochat for you** Simply send this message to nanobot (replace `xxx@xxx` with your real email): ``` Read https://raw.githubusercontent.com/HKUDS/MoChat/refs/heads/main/skills/nanobot/skill.md and register on MoChat. My Email account is xxx@xxx Bind me as your owner and DM me on MoChat. ``` nanobot will automatically register, configure `~/.nanobot/config.json`, and connect to Mochat. **2. Restart gateway** ```bash nanobot gateway ``` That's it โ€” nanobot handles the rest!
Manual configuration (advanced) If you prefer to configure manually, add the following to `~/.nanobot/config.json`: > Keep `claw_token` private. It should only be sent in `X-Claw-Token` header to your Mochat API endpoint. ```json { "channels": { "mochat": { "enabled": true, "base_url": "https://mochat.io", "socket_url": "https://mochat.io", "socket_path": "/socket.io", "claw_token": "claw_xxx", "agent_user_id": "6982abcdef", "sessions": ["*"], "panels": ["*"], "reply_delay_mode": "non-mention", "reply_delay_ms": 120000 } } } ```
Discord **1. Create a bot** - Go to https://discord.com/developers/applications - Create an application โ†’ Bot โ†’ Add Bot - Copy the bot token **2. Enable intents** - In the Bot settings, enable **MESSAGE CONTENT INTENT** - (Optional) Enable **SERVER MEMBERS INTENT** if you plan to use allow lists based on member data **3. Get your User ID** - Discord Settings โ†’ Advanced โ†’ enable **Developer Mode** - Right-click your avatar โ†’ **Copy User ID** **4. Configure** ```json { "channels": { "discord": { "enabled": true, "token": "YOUR_BOT_TOKEN", "allowFrom": ["YOUR_USER_ID"] } } } ``` **5. Invite the bot** - OAuth2 โ†’ URL Generator - Scopes: `bot` - Bot Permissions: `Send Messages`, `Read Message History` - Open the generated invite URL and add the bot to your server **6. Run** ```bash nanobot gateway ```
WhatsApp Requires **Node.js โ‰ฅ18**. **1. Link device** ```bash nanobot channels login # Scan QR with WhatsApp โ†’ Settings โ†’ Linked Devices ``` **2. Configure** ```json { "channels": { "whatsapp": { "enabled": true, "allowFrom": ["+1234567890"] } } } ``` **3. Run** (two terminals) ```bash # Terminal 1 nanobot channels login # Terminal 2 nanobot gateway ```
Feishu (้ฃžไนฆ) Uses **WebSocket** long connection โ€” no public IP required. **1. Create a Feishu bot** - Visit [Feishu Open Platform](https://open.feishu.cn/app) - Create a new app โ†’ Enable **Bot** capability - **Permissions**: Add `im:message` (send messages) - **Events**: Add `im.message.receive_v1` (receive messages) - Select **Long Connection** mode (requires running nanobot first to establish connection) - Get **App ID** and **App Secret** from "Credentials & Basic Info" - Publish the app **2. Configure** ```json { "channels": { "feishu": { "enabled": true, "appId": "cli_xxx", "appSecret": "xxx", "encryptKey": "", "verificationToken": "", "allowFrom": [] } } } ``` > `encryptKey` and `verificationToken` are optional for Long Connection mode. > `allowFrom`: Leave empty to allow all users, or add `["ou_xxx"]` to restrict access. **3. Run** ```bash nanobot gateway ``` > [!TIP] > Feishu uses WebSocket to receive messages โ€” no webhook or public IP needed!
QQ (QQๅ•่Š) Uses **botpy SDK** with WebSocket โ€” no public IP required. Currently supports **private messages only**. **1. Register & create bot** - Visit [QQ Open Platform](https://q.qq.com) โ†’ Register as a developer (personal or enterprise) - Create a new bot application - Go to **ๅผ€ๅ‘่ฎพ็ฝฎ (Developer Settings)** โ†’ copy **AppID** and **AppSecret** **2. Set up sandbox for testing** - In the bot management console, find **ๆฒ™็ฎฑ้…็ฝฎ (Sandbox Config)** - Under **ๅœจๆถˆๆฏๅˆ—่กจ้…็ฝฎ**, click **ๆทปๅŠ ๆˆๅ‘˜** and add your own QQ number - Once added, scan the bot's QR code with mobile QQ โ†’ open the bot profile โ†’ tap "ๅ‘ๆถˆๆฏ" to start chatting **3. Configure** > - `allowFrom`: Leave empty for public access, or add user openids to restrict. You can find openids in the nanobot logs when a user messages the bot. > - For production: submit a review in the bot console and publish. See [QQ Bot Docs](https://bot.q.qq.com/wiki/) for the full publishing flow. ```json { "channels": { "qq": { "enabled": true, "appId": "YOUR_APP_ID", "secret": "YOUR_APP_SECRET", "allowFrom": [] } } } ``` **4. Run** ```bash nanobot gateway ``` Now send a message to the bot from QQ โ€” it should respond!
DingTalk (้’‰้’‰) Uses **Stream Mode** โ€” no public IP required. **1. Create a DingTalk bot** - Visit [DingTalk Open Platform](https://open-dev.dingtalk.com/) - Create a new app -> Add **Robot** capability - **Configuration**: - Toggle **Stream Mode** ON - **Permissions**: Add necessary permissions for sending messages - Get **AppKey** (Client ID) and **AppSecret** (Client Secret) from "Credentials" - Publish the app **2. Configure** ```json { "channels": { "dingtalk": { "enabled": true, "clientId": "YOUR_APP_KEY", "clientSecret": "YOUR_APP_SECRET", "allowFrom": [] } } } ``` > `allowFrom`: Leave empty to allow all users, or add `["staffId"]` to restrict access. **3. Run** ```bash nanobot gateway ```
Slack Uses **Socket Mode** โ€” no public URL required. **1. Create a Slack app** - Go to [Slack API](https://api.slack.com/apps) โ†’ **Create New App** โ†’ "From scratch" - Pick a name and select your workspace **2. Configure the app** - **Socket Mode**: Toggle ON โ†’ Generate an **App-Level Token** with `connections:write` scope โ†’ copy it (`xapp-...`) - **OAuth & Permissions**: Add bot scopes: `chat:write`, `reactions:write`, `app_mentions:read` - **Event Subscriptions**: Toggle ON โ†’ Subscribe to bot events: `message.im`, `message.channels`, `app_mention` โ†’ Save Changes - **App Home**: Scroll to **Show Tabs** โ†’ Enable **Messages Tab** โ†’ Check **"Allow users to send Slash commands and messages from the messages tab"** - **Install App**: Click **Install to Workspace** โ†’ Authorize โ†’ copy the **Bot Token** (`xoxb-...`) **3. Configure nanobot** ```json { "channels": { "slack": { "enabled": true, "botToken": "xoxb-...", "appToken": "xapp-...", "groupPolicy": "mention" } } } ``` **4. Run** ```bash nanobot gateway ``` DM the bot directly or @mention it in a channel โ€” it should respond! > [!TIP] > - `groupPolicy`: `"mention"` (default โ€” respond only when @mentioned), `"open"` (respond to all channel messages), or `"allowlist"` (restrict to specific channels). > - DM policy defaults to open. Set `"dm": {"enabled": false}` to disable DMs.
Email Give nanobot its own email account. It polls **IMAP** for incoming mail and replies via **SMTP** โ€” like a personal email assistant. **1. Get credentials (Gmail example)** - Create a dedicated Gmail account for your bot (e.g. `my-nanobot@gmail.com`) - Enable 2-Step Verification โ†’ Create an [App Password](https://myaccount.google.com/apppasswords) - Use this app password for both IMAP and SMTP **2. Configure** > - `consentGranted` must be `true` to allow mailbox access. This is a safety gate โ€” set `false` to fully disable. > - `allowFrom`: Leave empty to accept emails from anyone, or restrict to specific senders. > - `smtpUseTls` and `smtpUseSsl` default to `true` / `false` respectively, which is correct for Gmail (port 587 + STARTTLS). No need to set them explicitly. > - Set `"autoReplyEnabled": false` if you only want to read/analyze emails without sending automatic replies. ```json { "channels": { "email": { "enabled": true, "consentGranted": true, "imapHost": "imap.gmail.com", "imapPort": 993, "imapUsername": "my-nanobot@gmail.com", "imapPassword": "your-app-password", "smtpHost": "smtp.gmail.com", "smtpPort": 587, "smtpUsername": "my-nanobot@gmail.com", "smtpPassword": "your-app-password", "fromAddress": "my-nanobot@gmail.com", "allowFrom": ["your-real-email@gmail.com"] } } } ``` **3. Run** ```bash nanobot gateway ```
## ๐ŸŒ Agent Social Network ๐Ÿˆ nanobot is capable of linking to the agent social network (agent community). **Just send one message and your nanobot joins automatically!** | Platform | How to Join (send this message to your bot) | |----------|-------------| | [**Moltbook**](https://www.moltbook.com/) | `Read https://moltbook.com/skill.md and follow the instructions to join Moltbook` | | [**ClawdChat**](https://clawdchat.ai/) | `Read https://clawdchat.ai/skill.md and follow the instructions to join ClawdChat` | Simply send the command above to your nanobot (via CLI or any chat channel), and it will handle the rest. ## โš™๏ธ Configuration Config file: `~/.nanobot/config.json` ### Providers > [!TIP] > - **Groq** provides free voice transcription via Whisper. If configured, Telegram voice messages will be automatically transcribed. > - **Zhipu Coding Plan**: If you're on Zhipu's coding plan, set `"apiBase": "https://open.bigmodel.cn/api/coding/paas/v4"` in your zhipu provider config. > - **MiniMax (Mainland China)**: If your API key is from MiniMax's mainland China platform (minimaxi.com), set `"apiBase": "https://api.minimaxi.com/v1"` in your minimax provider config. > - **VolcEngine Coding Plan**: If you're on VolcEngine's coding plan, set `"apiBase": "https://ark.cn-beijing.volces.com/api/coding/v3"` in your volcengine provider config. | Provider | Purpose | Get API Key | |----------|---------|-------------| | `custom` | Any OpenAI-compatible endpoint (direct, no LiteLLM) | โ€” | | `openrouter` | LLM (recommended, access to all models) | [openrouter.ai](https://openrouter.ai) | | `anthropic` | LLM (Claude direct) | [console.anthropic.com](https://console.anthropic.com) | | `openai` | LLM (GPT direct) | [platform.openai.com](https://platform.openai.com) | | `deepseek` | LLM (DeepSeek direct) | [platform.deepseek.com](https://platform.deepseek.com) | | `groq` | LLM + **Voice transcription** (Whisper) | [console.groq.com](https://console.groq.com) | | `gemini` | LLM (Gemini direct) | [aistudio.google.com](https://aistudio.google.com) | | `minimax` | LLM (MiniMax direct) | [platform.minimaxi.com](https://platform.minimaxi.com) | | `aihubmix` | LLM (API gateway, access to all models) | [aihubmix.com](https://aihubmix.com) | | `siliconflow` | LLM (SiliconFlow/็ก…ๅŸบๆตๅŠจ) | [siliconflow.cn](https://siliconflow.cn) | | `volcengine` | LLM (VolcEngine/็ซๅฑฑๅผ•ๆ“Ž) | [volcengine.com](https://www.volcengine.com) | | `dashscope` | LLM (Qwen) | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) | | `moonshot` | LLM (Moonshot/Kimi) | [platform.moonshot.cn](https://platform.moonshot.cn) | | `zhipu` | LLM (Zhipu GLM) | [open.bigmodel.cn](https://open.bigmodel.cn) | | `vllm` | LLM (local, any OpenAI-compatible server) | โ€” | | `openai_codex` | LLM (Codex, OAuth) | `nanobot provider login openai-codex` | | `github_copilot` | LLM (GitHub Copilot, OAuth) | `nanobot provider login github-copilot` |
OpenAI Codex (OAuth) Codex uses OAuth instead of API keys. Requires a ChatGPT Plus or Pro account. **1. Login:** ```bash nanobot provider login openai-codex ``` **2. Set model** (merge into `~/.nanobot/config.json`): ```json { "agents": { "defaults": { "model": "openai-codex/gpt-5.1-codex" } } } ``` **3. Chat:** ```bash nanobot agent -m "Hello!" ``` > Docker users: use `docker run -it` for interactive OAuth login.
Custom Provider (Any OpenAI-compatible API) Connects directly to any OpenAI-compatible endpoint โ€” LM Studio, llama.cpp, Together AI, Fireworks, Azure OpenAI, or any self-hosted server. Bypasses LiteLLM; model name is passed as-is. ```json { "providers": { "custom": { "apiKey": "your-api-key", "apiBase": "https://api.your-provider.com/v1" } }, "agents": { "defaults": { "model": "your-model-name" } } } ``` > For local servers that don't require a key, set `apiKey` to any non-empty string (e.g. `"no-key"`).
vLLM (local / OpenAI-compatible) Run your own model with vLLM or any OpenAI-compatible server, then add to config: **1. Start the server** (example): ```bash vllm serve meta-llama/Llama-3.1-8B-Instruct --port 8000 ``` **2. Add to config** (partial โ€” merge into `~/.nanobot/config.json`): *Provider (key can be any non-empty string for local):* ```json { "providers": { "vllm": { "apiKey": "dummy", "apiBase": "http://localhost:8000/v1" } } } ``` *Model:* ```json { "agents": { "defaults": { "model": "meta-llama/Llama-3.1-8B-Instruct" } } } ```
Adding a New Provider (Developer Guide) nanobot uses a **Provider Registry** (`nanobot/providers/registry.py`) as the single source of truth. Adding a new provider only takes **2 steps** โ€” no if-elif chains to touch. **Step 1.** Add a `ProviderSpec` entry to `PROVIDERS` in `nanobot/providers/registry.py`: ```python ProviderSpec( name="myprovider", # config field name keywords=("myprovider", "mymodel"), # model-name keywords for auto-matching env_key="MYPROVIDER_API_KEY", # env var for LiteLLM display_name="My Provider", # shown in `nanobot status` litellm_prefix="myprovider", # auto-prefix: model โ†’ myprovider/model skip_prefixes=("myprovider/",), # don't double-prefix ) ``` **Step 2.** Add a field to `ProvidersConfig` in `nanobot/config/schema.py`: ```python class ProvidersConfig(BaseModel): ... myprovider: ProviderConfig = ProviderConfig() ``` That's it! Environment variables, model prefixing, config matching, and `nanobot status` display will all work automatically. **Common `ProviderSpec` options:** | Field | Description | Example | |-------|-------------|---------| | `litellm_prefix` | Auto-prefix model names for LiteLLM | `"dashscope"` โ†’ `dashscope/qwen-max` | | `skip_prefixes` | Don't prefix if model already starts with these | `("dashscope/", "openrouter/")` | | `env_extras` | Additional env vars to set | `(("ZHIPUAI_API_KEY", "{api_key}"),)` | | `model_overrides` | Per-model parameter overrides | `(("kimi-k2.5", {"temperature": 1.0}),)` | | `is_gateway` | Can route any model (like OpenRouter) | `True` | | `detect_by_key_prefix` | Detect gateway by API key prefix | `"sk-or-"` | | `detect_by_base_keyword` | Detect gateway by API base URL | `"openrouter"` | | `strip_model_prefix` | Strip existing prefix before re-prefixing | `True` (for AiHubMix) |
### MCP (Model Context Protocol) > [!TIP] > The config format is compatible with Claude Desktop / Cursor. You can copy MCP server configs directly from any MCP server's README. nanobot supports [MCP](https://modelcontextprotocol.io/) โ€” connect external tool servers and use them as native agent tools. Add MCP servers to your `config.json`: ```json { "tools": { "mcpServers": { "filesystem": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/dir"] }, "my-remote-mcp": { "url": "https://example.com/mcp/", "headers": { "Authorization": "Bearer xxxxx" } } } } } ``` Two transport modes are supported: | Mode | Config | Example | |------|--------|---------| | **Stdio** | `command` + `args` | Local process via `npx` / `uvx` | | **HTTP** | `url` + `headers` (optional) | Remote endpoint (`https://mcp.example.com/sse`) | Use `toolTimeout` to override the default 30s per-call timeout for slow servers: ```json { "tools": { "mcpServers": { "my-slow-server": { "url": "https://example.com/mcp/", "toolTimeout": 120 } } } } ``` MCP tools are automatically discovered and registered on startup. The LLM can use them alongside built-in tools โ€” no extra configuration needed. ### Security > [!TIP] > For production deployments, set `"restrictToWorkspace": true` in your config to sandbox the agent. | Option | Default | Description | |--------|---------|-------------| | `tools.restrictToWorkspace` | `false` | When `true`, restricts **all** agent tools (shell, file read/write/edit, list) to the workspace directory. Prevents path traversal and out-of-scope access. | | `channels.*.allowFrom` | `[]` (allow all) | Whitelist of user IDs. Empty = allow everyone; non-empty = only listed users can interact. | ## CLI Reference | Command | Description | |---------|-------------| | `nanobot onboard` | Initialize config & workspace | | `nanobot agent -m "..."` | Chat with the agent | | `nanobot agent` | Interactive chat mode | | `nanobot agent --no-markdown` | Show plain-text replies | | `nanobot agent --logs` | Show runtime logs during chat | | `nanobot gateway` | Start the gateway | | `nanobot status` | Show status | | `nanobot provider login openai-codex` | OAuth login for providers | | `nanobot channels login` | Link WhatsApp (scan QR) | | `nanobot channels status` | Show channel status | Interactive mode exits: `exit`, `quit`, `/exit`, `/quit`, `:q`, or `Ctrl+D`.
Scheduled Tasks (Cron) ```bash # Add a job nanobot cron add --name "daily" --message "Good morning!" --cron "0 9 * * *" nanobot cron add --name "hourly" --message "Check status" --every 3600 # List jobs nanobot cron list # Remove a job nanobot cron remove ```
Heartbeat (Periodic Tasks) The gateway wakes up every 30 minutes and checks `HEARTBEAT.md` in your workspace (`~/.nanobot/workspace/HEARTBEAT.md`). If the file has tasks, the agent executes them and delivers results to your most recently active chat channel. **Setup:** edit `~/.nanobot/workspace/HEARTBEAT.md` (created automatically by `nanobot onboard`): ```markdown ## Periodic Tasks - [ ] Check weather forecast and send a summary - [ ] Scan inbox for urgent emails ``` The agent can also manage this file itself โ€” ask it to "add a periodic task" and it will update `HEARTBEAT.md` for you. > **Note:** The gateway must be running (`nanobot gateway`) and you must have chatted with the bot at least once so it knows which channel to deliver to.
## ๐Ÿณ Docker > [!TIP] > The `-v ~/.nanobot:/root/.nanobot` flag mounts your local config directory into the container, so your config and workspace persist across container restarts. ### Docker Compose ```bash docker compose run --rm nanobot-cli onboard # first-time setup vim ~/.nanobot/config.json # add API keys docker compose up -d nanobot-gateway # start gateway ``` ```bash docker compose run --rm nanobot-cli agent -m "Hello!" # run CLI docker compose logs -f nanobot-gateway # view logs docker compose down # stop ``` ### Docker ```bash # Build the image docker build -t nanobot . # Initialize config (first time only) docker run -v ~/.nanobot:/root/.nanobot --rm nanobot onboard # Edit config on host to add API keys vim ~/.nanobot/config.json # Run gateway (connects to enabled channels, e.g. Telegram/Discord/Mochat) docker run -v ~/.nanobot:/root/.nanobot -p 18790:18790 nanobot gateway # Or run a single command docker run -v ~/.nanobot:/root/.nanobot --rm nanobot agent -m "Hello!" docker run -v ~/.nanobot:/root/.nanobot --rm nanobot status ``` ## ๐Ÿง Linux Service Run the gateway as a systemd user service so it starts automatically and restarts on failure. **1. Find the nanobot binary path:** ```bash which nanobot # e.g. /home/user/.local/bin/nanobot ``` **2. Create the service file** at `~/.config/systemd/user/nanobot-gateway.service` (replace `ExecStart` path if needed): ```ini [Unit] Description=Nanobot Gateway After=network.target [Service] Type=simple ExecStart=%h/.local/bin/nanobot gateway Restart=always RestartSec=10 NoNewPrivileges=yes ProtectSystem=strict ReadWritePaths=%h [Install] WantedBy=default.target ``` **3. Enable and start:** ```bash systemctl --user daemon-reload systemctl --user enable --now nanobot-gateway ``` **Common operations:** ```bash systemctl --user status nanobot-gateway # check status systemctl --user restart nanobot-gateway # restart after config changes journalctl --user -u nanobot-gateway -f # follow logs ``` If you edit the `.service` file itself, run `systemctl --user daemon-reload` before restarting. > **Note:** User services only run while you are logged in. To keep the gateway running after logout, enable lingering: > > ```bash > loginctl enable-linger $USER > ``` ## ๐Ÿ“ Project Structure ``` nanobot/ โ”œโ”€โ”€ agent/ # ๐Ÿง  Core agent logic โ”‚ โ”œโ”€โ”€ loop.py # Agent loop (LLM โ†” tool execution) โ”‚ โ”œโ”€โ”€ context.py # Prompt builder โ”‚ โ”œโ”€โ”€ memory.py # Persistent memory โ”‚ โ”œโ”€โ”€ skills.py # Skills loader โ”‚ โ”œโ”€โ”€ subagent.py # Background task execution โ”‚ โ””โ”€โ”€ tools/ # Built-in tools (incl. spawn) โ”œโ”€โ”€ skills/ # ๐ŸŽฏ Bundled skills (github, weather, tmux...) โ”œโ”€โ”€ channels/ # ๐Ÿ“ฑ Chat channel integrations โ”œโ”€โ”€ bus/ # ๐ŸšŒ Message routing โ”œโ”€โ”€ cron/ # โฐ Scheduled tasks โ”œโ”€โ”€ heartbeat/ # ๐Ÿ’“ Proactive wake-up โ”œโ”€โ”€ providers/ # ๐Ÿค– LLM providers (OpenRouter, etc.) โ”œโ”€โ”€ session/ # ๐Ÿ’ฌ Conversation sessions โ”œโ”€โ”€ config/ # โš™๏ธ Configuration โ””โ”€โ”€ cli/ # ๐Ÿ–ฅ๏ธ Commands ``` ## ๐Ÿค Contribute & Roadmap PRs welcome! The codebase is intentionally small and readable. ๐Ÿค— **Roadmap** โ€” Pick an item and [open a PR](https://github.com/HKUDS/nanobot/pulls)! - [ ] **Multi-modal** โ€” See and hear (images, voice, video) - [ ] **Long-term memory** โ€” Never forget important context - [ ] **Better reasoning** โ€” Multi-step planning and reflection - [ ] **More integrations** โ€” Calendar and more - [ ] **Self-improvement** โ€” Learn from feedback and mistakes ### Contributors Contributors ## โญ Star History
Star History Chart

Thanks for visiting โœจ nanobot!

Views

nanobot is for educational, research, and technical exchange purposes only