* docs: refresh README roadmap, anchors, and product sync (#1211) Align EN/CN README with shipped features and current install/channel docs; fix GitHub heading anchors and drop obsolete extras examples. Co-authored-by: jubaoliang <jubaoliang@tencent.com> Co-authored-by: Cursor <cursoragent@cursor.com> * fix(dashboard): define missing --fn-bg-container theme variable (#1216) Dark-theme surfaces that use var(--fn-bg-container, #fff) — most visibly the knowledge-base Markdown preview body, toolbar and outline panel — resolved to a white background while text stayed light, leaving preview content invisible. Define the variable as #ffffff (light) and #141414 (dark), and point the Admin/Users badge tints that borrowed the name for a translucent fill at --fn-bg-tertiary so their look is unchanged. Fixes #1215 * feat(dashboard): let each account customize the sidebar (#1218) Store group order, item placement, and hidden entries on the user so navigation can be rearranged without showing items the account cannot access. Co-authored-by: jubaoliang <jubaoliang@tencent.com> Co-authored-by: Cursor <cursoragent@cursor.com> * style(dashboard): apply Prettier to files that drifted from the formatter (#1222) Co-authored-by: jubaoliang <jubaoliang@tencent.com> Co-authored-by: Cursor <cursoragent@cursor.com> * feat: store role-template id on users.role and harden mobile composer (#1220) Collapse the dual user_role_id / role model so users.role and invites.role hold the template public id, block deleting roles still in use, and keep the chat composer visible under mobile browser visualViewport. Co-authored-by: jubaoliang <jubaoliang@tencent.com> Co-authored-by: Cursor <cursoragent@cursor.com> * docs: use product names for sibling project links in the README (#1225) Link labels now match the product names while the repository URLs stay unchanged. Co-authored-by: jubaoliang <jubaoliang@tencent.com> Co-authored-by: Cursor <cursoragent@cursor.com> * docs(publish): bump version badges in all localized READMEs (#1229) Co-authored-by: jubaoliang <jubaoliang@tencent.com> Co-authored-by: Cursor <cursoragent@cursor.com> * fix: load plugins that still import harness_agent (#1260) Marketplace plugins written before the octop_harness rename fail to install and enable with ModuleNotFoundError. Alias that import onto the installed package. Co-authored-by: jubaoliang <jubaoliang@tencent.com> Co-authored-by: Cursor <cursoragent@cursor.com> * fix(backup): skip the Octop-owned _builtin_skills prefix on zip import (#1255) POST /workspace/archive writes archive entries straight into the workspace; _safe_zip_name only blocks traversal, so a zip could plant files under _builtin_skills/ and .octop/_builtin_skills/. That prefix is owned by Octop: DELETE and POST /workspace/move refuse it via _assert_workspace_mutable and sync_octop_builtin_skills only prunes its own retired names, so planted skills both load as kind=builtin and stay irremovable through the API. This restores the #1105 guard (filter plus warnings reporting) together with its regression test, which a later "restore prior behaviors" commit had removed along with the filter. Fixes #1254 Co-authored-by: jubaoliang <jubaoliang@tencent.com> * fix(dashboard): define the missing --fn-* design tokens (#1240) About 30 --fn-* custom properties were referenced across dashboard styles but never defined in theme-vars.css. References without a fallback resolved to invalid-at-computed-value-time (transparent surfaces, e.g. the Connectors page sunken wells), and fallbacks were often light-only literals that broke the dark theme. Define the missing tokens for both themes, aligned with their nearest existing design-system values, and fix the misspelled --text-secondary / --border-color references that could never resolve. Fixes #1239 * feat(ollama): allow configuring local model download directory (#1279) * feat(ollama): allow configuring local model download directory Users who move Ollama models off the default path could list custom models but Octop treated them as not downloaded. Persist an OLLAMA_MODELS directory, scan manifests for downloaded names, and pass the path when starting serve. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(ollama): keep service running when saving models dir Saving the download directory no longer sends enabled=false, so a running Ollama daemon is not stopped. Disk-scanned models report size 0 so the UI does not show the manifest file size as the model size. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com> * feat(skills): let octop-assistant answer product and help questions (#1311) Give the bundled assistant a product overview plus links to octop.cloud and the docs, and keep CLI setup for changes on the running instance. Co-authored-by: jubaoliang <jubaoliang@tencent.com> Co-authored-by: Cursor <cursoragent@cursor.com> * fix(ollama): list local models even when Octop service is off (#1316) * fix(ollama): list local models even when Octop service is off Windows users often run Ollama themselves. Octop only queried the daemon when its managed-service toggle was on, so already-pulled models showed as not downloaded. List from a reachable daemon without starting serve, and mark IDs from fetch-models as downloaded. * docs: note Ollama downloaded-model detection when the service toggle is off * fix(mobile): stop the JPEG stream after a run of failed captures (#1309) `_stream_frames` (the mobile JPEG fallback) retried forever: on `TimeoutError` it logged and `continue`d, and on `captured is None` it just `continue`d. A phone unplugged mid-stream, or a dead adb bridge, makes every capture fail at once, so the loop spun at the frame interval indefinitely — a warning per iteration, a log flood, and a canvas frozen on the last frame with nothing ever sent to explain it. The desktop sibling `desktop/stream.py::_stream_loop` already counts consecutive misses, warns once, and after 30 sends an error frame and breaks. This mirrors that: timeouts and `None` both count as misses, the first one is logged once, and at `_CAPTURE_MISS_LIMIT` (30) the stream sends the `{"type": "error", "message": ...}` frame the rest of this router already uses and returns. A successful frame resets the streak, so an occasional dropped frame still does not tear the stream down. Folding the timeout branch into the shared counter also removes the per-iteration warning flood. * fix(cli): read and write cli_state.json through the shared JSON helpers (#1307) `octop.cli.support.state` keeps a private reader/writer for `~/.octop/cli_state.json` and both halves are looser than the rest of the tree. `load()` parses with a bare `json.loads(path.read_text(...))`, so an unparseable file raises a `json.JSONDecodeError` traceback. This file is read by nearly every CLI command (`config`, `agent`, `db`, `acting`, `ctx`, the REPL), so one damaged file aborts all of them at once. `save()` writes with `path.write_text(...)` — truncate, then write. A crash or a full disk mid-write leaves exactly the truncated file that `load()` then refuses, with no warning and no `ensure_root()` in between. `infra/utils/json_file.py` exists for this; its docstring is explicit that a torn write "creates the same precondition" as a hand-edit slip and that callers "must not fall back to an empty dict". Four call sites already route through it (`cli/commands/run.py`, `agents/plugins/manager.py`, `agents/plugins/seed.py`, `setup/service.py`). `load()` now reads via `read_json_object` and translates `JsonFileCorruptError` into `corrupt_config_error(...)` (`CONFIG_FILE_CORRUPT`) — the same policy as every other `OCTOP_HOME` JSON reader. `save()` writes via `write_json_atomic` (mkstemp + `os.replace`) so a reader never observes a partial file. A non-object payload such as `[1, 2]` also raises the typed error now, instead of a stray `dict.update` `TypeError`. * fix(gateway): preserve IM attachment metadata in history (#1276) * fix(docker): ship the langfuse env var the client actually reads (#1258) OCTOP_LANGFUSE_ENABLED is set by .env.example and forwarded by docker-compose.yml, but nothing reads it: Octop keeps the switch in the settings table (observability_langfuse_enabled) and the langfuse client honours LANGFUSE_TRACING_ENABLED. Add a test that fails while a shipped Langfuse variable has no reader. * fix(api): sandbox media preview responses (#1243) media/preview streams user-controlled bytes (chat attachments, tool outputs) inline on the dashboard origin. image/svg+xml is previewable, so a navigated preview URL executed as a live document on the app origin and could run attacker script — the endpoint also accepts the access_token query parameter for media loads. Serve previews with Content-Security-Policy: sandbox and X-Content-Type-Options: nosniff; image/video previews keep working. Fixes #1242 Co-authored-by: jubaoliang <jubaoliang@gmail.com> * feat: add Octop↔Octop cloud collab for remote experts (#1281) * feat: add Octop↔Octop Bridge for remote agent access Enable admin-managed peer connections with WS tunnel, path allowlist, hello_ack handshake, SSRF guards, and Chat shadow-agent hydrate so operators can probe and use remote agents from the local dashboard. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: serialize bridge turn chunks and flag remote experts LangChain HumanMessage objects in peer turn.chunk frames crashed json.dumps; add a bridge JSON default. Show a 远端/Remote badge on shadow experts in the picker and sidebar lists. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: bridge avatars, named remote badges, and auto-reconnect Keep bundled / CDN icon URLs for shadow experts and only proxy uploaded avatars. Show the bridge display name on remote badges. Add a default-on auto-reconnect switch that backs off on disconnect and disables itself after repeated failures, recording the reason in last_error. Co-authored-by: Cursor <cursoragent@cursor.com> * feat: add card/table views for bridge connections Match the storage page card layout and add a Segmented toggle so admins can switch between a card grid and a table of remote links. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: render bridge expert icons correctly on the chat page Encode bridge agent ids in avatar URLs the same way as chat WS paths, fall back to Lucide when the image fails, size portraits to fill the sidebar avatar, and refresh AgentContext when icon_url changes. Co-authored-by: Cursor <cursoragent@cursor.com> * feat: tunnel peer models and knowledge bases for bridge chat Allow read-only GET of peer providers/resolved, active-model, and knowledge-bases (plus capability) through the Bridge tunnel, expose local bridge connection routes, and point the chat composer at those sources when talking to a shadow expert. Hide local connectors for remote sessions. Also allow agent subagents paths on the tunnel. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: scope bridge chat expert picker to peer agents When the active expert is a Bridge shadow, the composer expert picker and @-mentions only list peers on that connection (not local experts). Encode bridge agent ids for skills and subagents list/install paths. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: hint remote chat pickers to manage settings on the peer In Bridge sessions, replace local “manage …” footers for models, skills, knowledge bases, experts, and subagents with a muted “edit on remote” tip and a toast instead of navigating to local admin. Co-authored-by: Cursor <cursoragent@cursor.com> * feat: polish bridge remote UX and tunnel agent status Allowlist GET …/status so hubs can read real peer harness state (peers need this build). Keep history-migration hub-local, skip noisy bridge polls in the UI, move Bridge under Settings, and mark remote experts with cable + name. Co-authored-by: Cursor <cursoragent@cursor.com> * feat: tunnel remote expert catalogs and polish bridge connection UX Hub can edit peer subagents, memory, channels, tools, plugins, and MBTI through the tunnel; surfaces that cannot hop show an in-drawer hint. Peer must run this build so the new allowlist takes effect. Co-authored-by: Cursor <cursoragent@cursor.com> * feat: group cloud-collab experts and unify header-tunneled composer APIs Keep the selected remote expert on disconnect, gate peer-only surfaces in the UI, and stop forking composer/task requests through dedicated bridge endpoints. Co-authored-by: Cursor <cursoragent@cursor.com> * feat: add search to the Experts toolbar Filter my experts, teams, and the library from the existing button row so long catalogs stay scannable. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: keep inbound cloud-collab cards peer-owned Inbound links can only edit name/icon/notes; disconnect, delete, and auto-reconnect stay disabled. Peer offline shows as 离线, peer delete removes the card, and the default inbound name is the short connection id. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: polish inbound cloud-collab UX and unify 对端 copy Peer-initiated links can only edit display info and cannot redial; offline cards may be deleted. Local-only pages hint when a peer expert is selected. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: map peer team speakers onto Bridge shadows Peer team chats stamped local member ids, so the hub fell back to the host avatar. Rewrite roster and stream speakers onto bridge:{cid}:{id} shadows, and keep the local team picker from mixing in peer experts. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: stop rewriting team thread ids in the Bridge tunnel Member job threads are {room}~{agent}. A blanket JSON replace of the peer agent id turned those into hub shadows, so history 404ed on the peer. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: rewrite peer media URLs and keep bridge turn composer fields Live send_file_to_user frames still pointed at peer-local /api/agents/{id}. Map every teammate id in tunneled JSON, and copy the full dashboard turn body so knowledge bases and HITL policy are not dropped on the peer. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: rename bridge probe tests to avoid pytest module clash tests/unit/bridge/test_probe.py collided with tests/unit/mobile/test_probe.py during collection (same basename). Co-authored-by: Cursor <cursoragent@cursor.com> * feat: collapse extra experts on Bridge cards and fill avatars Show at most four experts on a connection card, with the rest behind expand. Portraits fill the 40px ring without a tinted background. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: jubaoliang <jubaoliang@tencent.com> Co-authored-by: lulinzhi37-alt <lulinzhi37@gmail.com> * chore: release 1.0.2b5 Co-authored-by: Cursor <cursoragent@cursor.com> * chore: bump uv.lock to 1.0.2b5 Co-authored-by: Cursor <cursoragent@cursor.com> * fix(ollama): sanitize models dir through host path policy Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: jubaoliang <jubaoliang@tencent.com> Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Dang Zitou <dengzitao888@163.com> Co-authored-by: Frank Zhang <77115469+Master-Frank@users.noreply.github.com> Co-authored-by: XiaoChen <1326713348@qq.com> Co-authored-by: locip123 <116343912+locip123@users.noreply.github.com> Co-authored-by: lihongyuan99 <64824864+lihongyuan99@users.noreply.github.com> Co-authored-by: lulinzhi37-alt <lulinzhi37@gmail.com>
A smarter, self-hosted AI assistant — multi-user, multi-agent.
Highlights · Overview · Core Technology · Features · Roadmap · Quick Start · Contents
English · 中文
Octop is an open-source, self-hosted AI assistant. It's not just a tool — it's a digital life form that can operate in parallel. Through its multi-agent architecture, it builds an intelligent environment that is both independent and collaborative for teams, families, and individuals. Best of all, it runs entirely on your machine — the fully self-hosted design means privacy is never a compromise, while single-process startup makes the powerful web console, CLI, and IM integrations readily accessible.
Chat through the Web Dashboard, Feishu, DingTalk, QQ, WeChat, Telegram, Discord, WeCom, or programmatic HTTP/SSE/WebSocket. Extend capabilities with the expert library, Connectors (OAuth + MCP), and ACP integration for IDE workflows.
✨ Highlights
| Feature | Description | |
|---|---|---|
| 👥 | Multi-user expert team | One admin, shared household; built-in expert library and expert market — switch specialists per scenario |
| 🤝 | Expert sharing | Publish experts and shared skill/sub-agent pools so teammates reuse proven setups instead of rebuilding them |
| 🎭 | MBTI personas | 16 personality templates plus an interactive quiz — give each agent a distinct character |
| 🎯 | AgentTeams (Beta) | A coordinator schedules multiple experts on multi-step work; details |
| 🔒 | Security built-in | JWT multi-user isolation, tool approval, shell command guardrails, and PII redaction — data stays local |
| 🔌 | Connector ecosystem | Tencent suite (Docs, Meeting, News, …); OAuth and MCP gateway extend resource boundaries |
| 💾 | Pluggable workspace backends | Local disk, Docker sandbox, PostgreSQL, or COS/S3 for agent files — separate from the control-plane DB |
| 🧠 | Portable memory | Powered by Octop Memory; memory migrates with the workspace |
| 📚 | Knowledge base | RAG over your documents; share corpora within a deployment and ground answers in your private data |
| 🧩 | Plugins | Extend Octop with third-party plugins; bundled plugins are seeded and toggled on demand |
| ↔️ | ACP bidirectional | octop acp for IDE/terminal AI; delegate to OpenCode / Claude Code with permission gates |
| 💻 | Terminal AI+ | Interactive shell in the browser — AI-assisted command execution and troubleshooting |
| 🌐 | Browser AI+ | Headless Chromium sessions for web automation, screenshots, and remote browsing |
| 🖥️ | Remote desktop | Live screen and input from the dashboard on Linux, Windows, and macOS — remote office work and GUI apps; one-click isolated desktop on headless Linux |
| 🪟 | Desktop client | Native Windows / macOS / Linux apps (and FnOS packages) alongside the web dashboard |
| 🏠 | Self-hosted | Dashboard, CLI, IM channels, and cron in one octop run — all data under ~/.octop/ |
📌 Overview
Octop is a self-hosted AI assistant platform for households and small teams. It runs a single process that serves a web dashboard, a CLI, IM channels (Feishu, DingTalk, QQ, WeChat, Telegram, Discord, WeCom, and more), and cron automation — all sharing one control-plane database under ~/.octop/ (SQLite by default; PostgreSQL optional).
Octop's design goal: keep every conversation, workspace, and credential on your own machine, while giving each user a personal team of specialized agents they can switch between per task.
🐾 What can you do with Octop
- Personal assistant — let a dedicated agent write weekly reports, organize notes, and manage your schedule; memory persists with the workspace.
- Family sharing — one admin account, the whole household; assign different agents and experts per member; share experts and knowledge bases when useful.
- Team helper — AgentTeams or parallel agents, bridging Feishu / DingTalk / WeCom / WeChat to route tasks into group chats.
- Developer boost — delegate coding tasks to OpenCode / Claude Code via ACP, or troubleshoot from the terminal with AI assistance.
- Web automation — use Browser AI+ and remote desktop for forms, screenshots, and GUI apps.
- Scheduled tasks — configure cron in natural language so the agent pushes or runs jobs on time every day.
🧠 Core Technology
| Layer | Technology |
|---|---|
| Language | Python 3.12+ |
| Web framework | FastAPI + uvicorn |
| Agent runtime | Octop Harness |
| Gateway | Octop Gateway |
| Control plane DB | SQLite (WAL, default) or PostgreSQL (optional) |
| Frontend | React 18 + TypeScript + Vite + Ant Design |
| Scheduling | APScheduler |
| ACP | agent-client-protocol |
| Build / quality | hatchling · ruff · mypy · pytest |
Octop is built on the Octop Harness stack — a set of focused runtimes that Octop composes into one process:
- Octop Harness — Agent runtime: model routing, tools, skills, and conversation checkpointing.
- Octop Gateway — multi-platform IM channel bridge that normalizes incoming messages into a single processing pipeline.
- Octop Memory — hierarchical recall with full-text search, so an agent's memory travels with its workspace.
- Octop Browser — CDP-based browser automation with persistent profiles for web tasks.
Instead of an external queue or message broker, Octop routes every surface — Web UI, IM, and cron — through one in-process HarnessProcessor. The result is a single, restart-safe process whose entire state is rebuilt from the control-plane database on boot (local SQLite by default; PostgreSQL optional).
🤔 Features
Server & auth
- Multi-user JWT authentication with admin role
- First-run setup wizard (
octop init) - Interactive API docs at
/api/docs(off by default — set"enable_api_docs": trueinconfig.jsonto enable)
Experts
- Multiple experts per user; each has its own workspace, providers, channels, and cron
- 16 MBTI persona templates + custom system prompt
- Expert library scanned at boot (
infra/agents/experts/library/); expert market and in-deployment expert sharing - AgentTeams (Beta) — coordinator + member experts for multi-step tasks (docs/expert-teams.md)
- Workspace backends (expert files): local disk, Docker sandbox, PostgreSQL, COS/S3, and other remote stores — distinct from the control-plane database
Channels & automation
- IM channels: Feishu, DingTalk, QQ, WeChat, Telegram, Discord, WeCom, and more
- Proactive cron jobs with natural-language and slash-command triggers
- Unified message processing across Web UI, IM, and cron surfaces
Surfaces
- Web dashboard — chat, experts / teams, connectors, channels, cron, knowledge, plugins, settings
- Desktop client — native apps for Windows / macOS / Linux; FnOS packages for NAS
- CLI —
octop run,octop chats,octop acp, admin commands - HTTP/SSE/WebSocket API — full programmatic access
- Remote desktop — dashboard control of the host desktop session
Knowledge & plugins
- Knowledge base — RAG over your documents; optional sharing within the same deployment
- Plugins — install and manage third-party plugins (
octop plugin); bundled plugins are seeded and toggled on demand from the dashboard
ACP (Agent Client Protocol)
Octop supports ACP in two directions:
-
Inbound — external tools use your Octop agent
octop acp --agent main # stdio ACP server for Zed, OpenCode, … -
Outbound — Octop delegates to external coding agents
- Dashboard → ACP (
/acp): configure runners (global per user) - Enable acp_runner per agent, then delegate in chat
- Dashboard → ACP (
Built-in outbound runners include OpenCode, CodeBuddy, Claude Code, and Codex.
Full setup: docs/acp.md.
🧭 Roadmap
Here are our mid-to-long term plans:
Shipped
- Shared resource pool — a central pool of skills and sub-agents that any user can drop into a new expert without rebuilding from scratch.
- Expert sharing — publish your experts to other users in the same deployment, so good configurations are reused instead of recreated.
- PC client — native desktop apps for Windows / macOS / Linux alongside the web dashboard and IM channels.
In progress
- AgentTeams (Beta) — let one coordinator autonomously schedule and orchestrate multiple experts to tackle multi-step tasks.
- Mobile client (closed beta) — native mobile apps currently in internal testing.
Planned
- Browser & terminal polishing — browser skill recording (capture a workflow and replay it as a skill) and a more capable terminal AI assistant.
- Self-evolution — automatically distill everyday conversations into reusable skills, so the assistant grows with you.
- Managed Agents — platform-hosted agent lifecycle (provision, scale, and operate agents without managing the full self-hosted stack yourself).
- Project — project-scoped workspaces that group agents, files, and conversations around a shared goal.
- Cloud–edge continuum — run Octop locally while offloading selected tasks to the cloud, so light work stays on-device and heavier jobs use remote capacity when you need it.
- Plugin marketplace — a curated market to discover, install, and update third-party plugins without leaving Octop.
- Conversational control plane — deepen Octop’s own skills so chat can cover the full dashboard surface: create experts, wire channels, manage knowledge bases, and scaffold plugins end-to-end.
This roadmap may shift as the community grows; treat it as indicative only.
🚀 Quick Start
Prerequisites
- macOS / Linux / Windows
- No pre-installed Python required — the installer uses uv to provision Python 3.12 in an isolated venv under
~/.octop/ - A modern multi-core CPU with a few GB of RAM for the process plus model/embedding caches; enough disk for the database, agent workspaces, and document corpora
1. Install
macOS / Linux — one-line installer (recommended):
curl -fsSL https://finnie-1258344699.cos.ap-guangzhou.myqcloud.com/octop/install.sh | bash
Windows (PowerShell):
irm https://finnie-1258344699.cos.ap-guangzhou.myqcloud.com/octop/install.ps1 | iex
Windows (cmd) — download and run, or from a cloned repo:
curl -fsSL https://finnie-1258344699.cos.ap-guangzhou.myqcloud.com/octop/install.bat -o install.bat
install.bat
After installation, open a new terminal or reload your shell:
source ~/.zshrc # Zsh
# or
source ~/.bashrc # Bash
The installer places octop on your PATH via ~/.octop/bin. Optional extras:
# Download Playwright Chromium for browser automation (skipped if a system Chrome/Chromium is already present)
curl -fsSL https://finnie-1258344699.cos.ap-guangzhou.myqcloud.com/octop/install.sh | bash -s -- --extras browser
See scripts/README.md for all install options (--version, --from-source, --mirror, Windows flags).
Desktop app (GUI, no terminal) — grab the artifact for your platform from GitHub Releases:
| Platform | Artifact |
|---|---|
| Windows | Octop-desktop-windows-amd64-<version>.exe (64-bit) / Octop-desktop-windows-arm64-<version>.exe (ARM64) — NSIS installer |
| macOS | Octop-desktop-darwin-arm64-<version>.dmg (Apple Silicon) / Octop-desktop-darwin-amd64-<version>.dmg (Intel) |
| Linux | Octop-desktop-linux-amd64-<version>.tar.gz / Octop-desktop-linux-arm64-<version>.tar.gz |
| FnOS NAS | Octop-fnos-docker-<version>.fpk (Docker-backed) / Octop-fnos-native-<version>.fpk (no Docker) — install via App Center |
See desktop/README.md for the desktop shell and fnos/README.md for the FnOS packaging guide.
Alternative — PyPI (if you already manage Python yourself):
pip install octop
# optional local ONNX embedding model cache (Models → Local): pip install "octop[local-embedding]"
# Downloads catalog weights under ~/.octop/embedding_models; not chat, not Memory.
# Browser automation uses the bundled Playwright package; install Chromium via the installer --extras browser,
# the dashboard, or: python -m playwright install chromium
From a source checkout with uv:
uv sync --extra local-embedding
2. Initialize
octop init
The interactive wizard creates the SQLite database, JWT secret, and first admin account under ~/.octop/.
3. Run
# Foreground (API + Web dashboard)
octop run
# Custom host / port
octop run --host 0.0.0.0 --port 8088
# Register as a system service (systemd / launchd / Windows service)
octop service start
Open http://127.0.0.1:8088. With Docker, the first init generates a random admin password (written to /data/.octop/credential.txt) unless OCTOP_DEFAULT_PASSWORD is set. Interactive octop init / the setup wizard asks you to choose a password (≥8 characters, letters and digits).
Docker (recommended for production)
# Build and start
docker compose -f docker/docker-compose.yml up -d
# Or build manually
bash docker/docker_build.sh
docker run -d \
-p 8088:8088 \
-v octop-data:/data/.octop \
-e HOME=/data \
-e OCTOP_DEFAULT_PASSWORD="<strong-password-or-omit-for-random>" \
octop:latest
Open http://localhost:8088. First boot creates the admin account and writes the credentials to /data/.octop/credential.txt in the container. With OCTOP_DEFAULT_PASSWORD unset a strong random password is generated; a password you set must be ≥8 characters with letters and digits (weak/common passwords are rejected by the app password policy and fall back to a random one). Override the username via OCTOP_ADMIN_USERNAME.
Password policy: at least 8 characters with letters and digits.
| Variable | Default | Description |
|---|---|---|
OCTOP_PORT |
8088 |
HTTP listen port |
OCTOP_DEFAULT_PASSWORD |
(unset) | First-run admin password (Docker bootstrap). Unset = random password written to credential.txt |
OCTOP_ADMIN_USERNAME |
admin |
First-run admin username |
OCTOP_DATA |
~/.octop |
Host data directory (compose bind mount) |
See .env.example for the full list.
📑 Contents
- Highlights
- Overview
- Core Technology
- Features
- Roadmap
- Quick Start
- Deploy & Use
- Architecture & Dev
- Project Info
📦 Install options
| Method | Platform | Description |
|---|---|---|
| Remote one-liner | macOS / Linux | curl …/octop/install.sh | bash |
| Remote one-liner | Windows | irm …/octop/install.ps1 | iex or install.bat |
| Local script | macOS / Linux | bash scripts/install.sh |
| Local script | Windows | scripts\install.bat or install.ps1 |
| PyPI | Any | pip install octop (optional extras such as local-embedding) |
| Docker | Any | docker/docker-compose.yml |
All install scripts provision an isolated environment at ~/.octop/venv and a ~/.octop/bin/octop wrapper — they do not touch system Python.
Upgrade
octop update replaces only the wheel/binary — your ~/.octop/ database, workspaces, secrets, and config.json are preserved:
octop update # fetch and install the latest octop, then restart the service if one is registered
The schema migrates automatically on next boot; run octop init only if the setup wizard prompts for a migration. Always back up first (octop backup) before a cross-version upgrade.
⚙️ Configuration
All runtime state lives in ~/.octop/. Manage it via CLI or edit files directly.
# LLM providers and models
octop models
octop provider list
# IM channels
octop channel list
octop channel install
# Skills (per agent)
octop skills list --agent main
# Cron jobs
octop cron list
octop cron create --help
# Users (admin)
octop user list
Supported LLM providers
OpenAI-compatible APIs, DashScope (Qwen), Ollama, and other presets — configure per agent in the dashboard or via octop provider.
Supported channels
| Channel | Credentials |
|---|---|
| Feishu | App ID, App Secret |
| DingTalk | App Key, App Secret |
| Bot AppID, Token | |
| QR bind / account credentials; CLI | |
| Telegram | Bot Token |
| Discord | Bot Token; all accessible channels allowed by default, optional channel/DM allowlists; setup and testing |
| WeCom | Corp ID, Agent Secret |
| Web Dashboard | Enabled by default |
Other kinds (e.g. Yuanbao, Xiaoyi, MQTT) are available via the gateway — see channel setup in the dashboard or CLI.
📖 CLI reference
| Command | Description |
|---|---|
octop init |
Bootstrap ~/.octop/ (DB, admin, JWT secret) |
octop run |
Start Octop in the foreground |
octop service start |
Install and start as a system service |
octop service stop |
Stop the system service |
octop agent |
Create, list, start/stop agents |
octop channel |
Install and manage IM channels |
octop chats |
REPL and session management |
octop acp |
Stdio ACP server for IDE integration |
octop cron |
Manage scheduled tasks |
octop models |
Provider presets and model resolution |
octop skills |
Enable/disable per-agent skills |
octop plugin |
Install and manage third-party plugins |
octop backup |
Export / restore backups |
octop clean |
Remove CLI state or wipe ~/.octop/ |
octop memory list |
List running agents eligible for memory maintenance; no database changes. |
octop memory slim [--agent ID] |
Back up and slim SQLite memory through the running host; uses the selected agent or prompts by number. Shows terminal and dashboard progress. Details |
octop memory slim --all |
Sequentially maintain all eligible running agents, with per-agent progress; stops on the first failure. |
octop update |
Check for and install updates |
In signed-in dashboard or local CLI chat, /memory slim explains maintenance for the current agent;
/memory slim --all lists your eligible agents. Add --confirm to start after reviewing the impact.
Use /memory status for progress/results. Chat stays available until maintenance is confirmed and begins.
External IM maintenance requires verified sender permissions and is not enabled yet.
Full reference: docs/cli.md.
🖥️ Web dashboard
After octop run, open http://127.0.0.1:8088.
- Chat — real-time conversation with experts and teams
- Experts — create experts, pick templates / MBTI personas, share or publish experts, configure providers
- AgentTeams (Beta) — coordinator + member experts for multi-step work
- Connectors — OAuth apps and MCP gateways
- Channels — IM platform setup
- Cron — visual cron job management
- Knowledge base — manage document corpora, semantic retrieval, and in-deployment sharing
- Plugins — install, enable, and configure plugins
- Remote desktop — live screen and input from the dashboard
- ACP — configure outbound coding-agent runners
- Settings — users, security, TLS, system
Interactive API docs: http://127.0.0.1:8088/api/docs (disabled by default — enable by setting "enable_api_docs": true in config.json)
📁 Data directory
~/.octop/ ← install & data root
├── config.json # process config (optional database section)
├── octop.db # SQLite — users, agents, channels, cron, …
├── secrets/ # JWT secret, channel tokens
├── agents/<agent_id>/ # per-agent workspace (SOUL.md, skills, …)
├── security/tool_guard/ # shell command allow/deny rules
├── logs/ # runtime logs
├── venv/ # uv-managed Python (installer layout)
└── bin/octop # PATH wrapper → venv/bin/octop
The control plane can also use PostgreSQL — set database in config.json, or OCTOP_DATABASE_* / the first-run wizard. With PostgreSQL, agent memory reuses the same DSN by default (per-agent schema); to keep file-based memory, set "memory": { "backend": { "type": "sqlite" } } in the agent config. See docs/configuration.md and docs/adr/002-database-backends.md.
See docs/configuration.md for env vars and config.json.
🏗️ Architecture
OctopServer
├─ DatabasePool SQLite (WAL) or PostgreSQL
├─ SharedServices DI root — every repo + config
├─ ExpertCatalog scans agents/experts/library/ at boot
├─ UserManager
│ └─ HarnessAgentManager (per user)
│ └─ AgentRuntime (per agent)
│ ├─ HarnessAgent Agent runtime (octop-harness)
│ ├─ HarnessProcessor IM / UI / cron entry point
│ ├─ ChannelManager IM connections (octop-gateway)
│ └─ CronManager APScheduler
└─ FastAPI app (uvicorn)
Single process. Restart rebuilds state from the control-plane database (local SQLite by default; PostgreSQL optional).
See docs/architecture.md, docs/adr/001-single-process-model.md, and docs/adr/002-database-backends.md.
📁 Project layout
src/octop/
config.py env-var config
launch.py OctopServer boot + uvicorn
infra/ business core (agents, gateway, cron, db, users, …)
api/ HTTP layer — FastAPI app, routers, JWT, SSE
cli/ CLI layer — Click commands
dashboard/ built React SPA (wheel artifact)
dashboard/ frontend source (Vite) — edit here, run make build-frontend
docker/ Docker Compose, entrypoint, build & deploy scripts
tests/ unit/ + integration/
🛠️ Development
Prerequisites: Python 3.12+, Node 18+, uv
# Backend
make install # pip install -e ".[dev]"
make all # format-all + lint + typecheck + test (ship bar)
# Frontend (separate terminal)
make dev-frontend # Vite dev server on :5173 (override with VITE_DEV_PORT)
make build-frontend # production build → src/octop/dashboard/
cd dashboard && npx tsc -b
Individual targets: make test, make lint, make typecheck, make format.
🔒 Security & privacy
- Local-first: Config, chats, workspaces, and credentials live under
~/.octop/on your machine. - Multi-user isolation: JWT auth with per-user agents and workspaces.
- PII redaction & tool approval: sensitive data is redacted before it leaves the workspace, and risky tools or shell commands require explicit approval under the guardrail rules.
- Tool guardrails: User-editable shell command rules under
~/.octop/security/tool_guard/. - No vendor lock-in: Swap LLM providers, storage backends, and channels without rewriting agents.
🤝 Contributing
Contributions are welcome:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Run
make all(backend) ormake check-all(full stack) before submitting - Open a Pull Request
See CONTRIBUTING.md for the full guide. Security issues: SECURITY.md.
Module boundaries and coding conventions: AGENTS.md.
📋 Changelog
See CHANGELOG.md for release history.
🔗 Related projects
| Project | Description |
|---|---|
| Octop Harness | Agent runtime — model routing, tools, skills, checkpointing |
| Octop Gateway | Multi-platform IM channel bridge |
| Octop Memory | Hierarchical recall and FTS search |
| Octop Browser | CDP browser automation with persistent profiles |
💬 Community
- Discord — join the English-speaking community: discord.gg/jPas5J8Ua
WeCom Customer Group (CN)
For the customer WeCom support group, scan:
Please scan the QR code to join the group. For any questions or assistance, please contact the group admin directly.
📄 License
This project is licensed under the MIT License.
✨ Contributors
Thanks to all contributors:


