Unofficial community Docker image for nanobot — the lightweight, open-source AI agent for your tools, chats, and workflows.
This image bundles nanobot with a set of commonly-needed tools so you can spin up a full-featured AI agent environment with a single docker pull. It is not affiliated with the nanobot project — all credit for nanobot itself belongs to the HKUDS team.
| Component | Purpose |
|---|---|
| nanobot | AI agent framework v0.3.0 (installed from PyPI wheel, prebuilt WebUI included) |
| Fabric | AI augmentation patterns (257+ pre-downloaded) |
| gws | Google Workspace CLI (Gmail, Calendar, Drive, Docs, Sheets) |
| GitHub CLI | gh for issues, PRs, Actions, API access |
| PinchTab | Headless browser automation (Chromium-based) |
| nextcloudcmd | Nextcloud sync client for vault synchronization |
| MCP servers | Obsidian + Memory (via npx, no global install) |
| tmux | Terminal multiplexer for interactive sessions |
| pip-audit | Python dependency security scanning |
| ebooklib / Pillow | EPUB generation and image processing |
| watchdog / lightrag-hku / ollama | Vault watching, RAG indexing, Ollama client |
docker pull ghcr.io/orrinwitt/nanobot-docker:latestdocker run -d \
--name nanobot \
-v /path/to/nanobot-data:/root/.nanobot \
-p 18790:18790 \
ghcr.io/orrinwitt/nanobot-docker:latestOnly
/root/.nanobotneeds to be mounted. All tools are included in the image.Replace
/path/to/nanobot-datawith a persistent directory on your host. This is whereconfig.json, your workspace, secrets, vault, and any custom scripts (including the optional startup hook) will live.
An example compose file is included in the repo. The quickest way to deploy:
curl -O https://raw.githubusercontent.com/orrinwitt/nanobot-docker/main/docker-compose.example.yml
docker compose -f docker-compose.example.yml up -dSee docker-compose.example.yml for the full reference.
# Pull a specific nanobot version
docker pull ghcr.io/orrinwitt/nanobot-docker:v0.3.0
# Pull a verified stable build
docker pull ghcr.io/orrinwitt/nanobot-docker:v0.3.0-stableSee Releases for the full version history and changelogs.
| Tag | Description |
|---|---|
latest |
Most recent build from main |
v0.3.0 |
Pinned to nanobot v0.3.0 |
v0.3.0-stable |
Same as v0.3.0, marks a verified stable build |
main |
Latest commit on main (unstable) |
<sha> |
Specific commit hash |
Everything persists under /root/.nanobot:
| Path | Purpose |
|---|---|
/root/.nanobot/config.json |
nanobot configuration (providers, models, tools) |
/root/.nanobot/workspace/ |
Workspace (skills, memory, vault) |
/root/.nanobot/workspace/secrets/ |
Credentials and API keys |
/root/.nanobot/workspace/vault/ |
Obsidian vault (optional, for MCP Obsidian + Nextcloud sync) |
See the nanobot documentation for how to configure providers, models, and tools.
The entrypoint (baked into the image) checks for a user-provided startup.sh on the mounted volume and runs it before starting nanobot. This lets you add custom startup logic — starting databases, syncing files, launching sidecar services — without modifying the image.
Path inside container: /root/.nanobot/workspace/scripts/startup.sh
Path on your host: <your-volume>/workspace/scripts/startup.sh (where <your-volume> is the directory you mounted at /root/.nanobot)
# Create your startup script on the volume (using the Quick Start mount path)
cat > /path/to/nanobot-data/workspace/scripts/startup.sh << 'EOF'
#!/bin/sh
# Start a database, sync files, launch services, etc.
pg_ctlcluster 17 main start
nextcloudcmd -u user -p pass /root/.nanobot/workspace/vault https://cloud.example.com
EOF
chmod +x /path/to/nanobot-data/workspace/scripts/startup.shThe script runs with output redirected to /tmp/startup-hook.log inside the container. Failures are non-fatal — nanobot will still start even if the script errors. If the file doesn't exist, the hook is silently skipped.
MCP servers run via npx (cached automatically, no global install). Add them to your config.json:
{
"mcpServers": {
"obsidian": {
"command": "npx",
"args": ["-y", "@mauricio.wolff/mcp-obsidian", "/root/.nanobot/workspace/vault"],
"transport": "stdio",
"disabled": false
},
"memory": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-memory"],
"transport": "stdio",
"disabled": false
}
}
}257+ patterns are pre-downloaded at build time (no boot-time download delay). Custom patterns persist in your volume at workspace/skills/fabric/patterns/ and are copied into the image on boot.
Configure Fabric via ~/.config/fabric/.env (mount from secrets/fabric.env):
OPENAI_API_KEY=your-api-key
OPENAI_API_BASE_URL=https://your-gateway/api/v1
DEFAULT_MODEL=your-model
DEFAULT_VENDOR=OpenAI
FABRIC_DISABLE_RESPONSES_API=true# List available patterns
fabric --list
# Use a pattern
echo "content" | fabric --pattern summarize
cat file.txt | fabric --pattern extract_wisdomSee: https://github.com/danielmiessler/fabric
The gws CLI provides access to Google services. Authenticate by placing your OAuth credentials at workspace/secrets/gws-auth-user.json — the entrypoint copies them to the right location on boot.
gws auth login
gws gmail list
gws calendar list
gws drive files listSee: https://github.com/googleworkspace/cli
gh auth login
gh issue list
gh workflow run build.yml
gh run list --limit 5PinchTab auto-starts on container boot. Token auth is configured via /root/.pinchtab/config.json in your volume.
# Quick test
curl -X POST http://localhost:9867/navigate \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com"}'| Endpoint | Method | Description |
|---|---|---|
/navigate |
POST | Navigate to a URL |
/screenshot |
POST | Take a screenshot |
/click |
POST | Click an element by ref |
/type |
POST | Type text into an element |
/scroll |
POST | Scroll the page |
/page |
GET | Get page info and element refs |
/tabs |
GET | List open tabs |
/close |
POST | Close a tab |
/health |
GET | Health check |
See: https://github.com/pinchtab/pinchtab
The vault can be synced to a Nextcloud instance using nextcloudcmd. Place your Nextcloud credentials in secrets/credentials.json and add a sync script to workspace/scripts/.
See: https://github.com/nextcloud/desktop
# Build for a specific nanobot version
docker build --build-arg NANOBOT_VERSION=v0.3.0 -t nanobot-docker .
# Build for latest nanobot release
docker build -t nanobot-docker .This repo includes a daily workflow that checks for new releases of:
When a new nanobot version is detected, the workflow:
- Updates
NANOBOT_VERSIONin the Dockerfile - Commits and pushes to
main(triggers a new image build) - Creates a git tag and GitHub Release with a link to the upstream release notes
Manual trigger: Actions → "Auto-Update from Upstream" → Run workflow.
This Docker image configuration is licensed under the MIT License. See LICENSE.
nanobot is licensed under the MIT License by HKUDS. See their repository for details.