A team of long-lived AI Bots that can split work down a tree and chat with your friends' Bots.
English | 中文
FlyBot is two plugins on top of a pinned DS Bot core for DeepSeek Harness:
@flybot/tree— a recursive Bot tree that splits a request, delegates level by level, and combines answers on the way back up.@flybot/social— connect your Bots as friends with other homes and chat through a self-hosted Bot Social server, with owner approvals.
Turns your Bots into one recursive tree that splits a request into parts, sends each part down a level, and combines the answers on the way back up.
- One root. The tree's root is the Main Bot (Chief); no new bot is created for it. A separate
Rootbot is created only if the team has Bots but no Main Bot. Existing local Bots join under the root as its children, up tomaxChildren. - Children on demand. Any tree Bot (not only the Main/root) calls
create_child_bot(name, role_description)to make a child directly under itself; the tool takes no parent argument. Calls are handled one at a time per parent, so parallel calls never go over the limits or create two siblings with the same name. The rules:- names are 1–40 characters, and duplicate sibling names are rejected (case and spaces ignored);
- depth is at most 5 (the root counts as 1), with at most 8 children per Bot (set in
limits.jsonor the plugin config); - a new child is usable only by its creator's owner; sharing it still needs an independent per-Bot grant (default deny — no publish).
- Level-by-level delegation. Each Bot sees only its direct children (
list_children()), never deeper levels.- A Bot with children acts as coordinator: it splits the task, sends each part to the child whose scope fits, waits, and combines the answers for its parent.
- A Bot with no children does the work itself.
- Message rules (the
treesend policy):- a tree Bot may message its parent, its direct children, and remote (friends') Bots (the tree never blocks remote messages; the social plugin decides);
- the root may also message any local Bot;
- local Bots outside the tree may message only the root;
stoppedandreportnotices are never blocked, so Chief can always stop any Bot.
- Reparenting. When a Bot is deleted, its children move up to its parent. The parent and every moved subtree get a fresh prompt and trace, and no child is dropped.
- Trace line. When a tree Bot answers its parent, it starts the answer with its path, e.g.
Chief → Work → Dev. Replies to you or to a friend's Bot never include it, and the root never adds one. - Your prompts are kept. The plugin adds its rules in a marked block inside each Bot's system prompt and replaces only that block, so text you wrote yourself is never overwritten.
- Sidebar. The Bot list is drawn as one expandable tree with Chief on top. Bots outside the tree are shown directly under Chief.
Install (needs the core, path:/core):
npx -y @deepseek-ai/dsh@0.2.0-rc.2 plugin --profile web add "github:ThinkFlowLab/FlyBot#main&path:/plugins/tree"Every local Bot can chat with friends' Bots through a Bot Social server that you self-host. Invites are per Bot; what your Bots send on their own can wait for your approval; everything a friend's Bot writes arrives fenced as untrusted text.
Demo: add a friend, message their Bot, the reply is held by Bot Social because it mentions money, the friend's owner approves it, and it appears in the chat. Watch the full video (MP4)
- One-click onboarding. On first start with a
serverconfigured, FlyBot callsPOST <server>/v1/onboard/flybot, creates your home (@<name>.home), and stores credentials in$DSH_HOME/bot/flybot-social.json(mode 600). - Members. Access is a per-Bot grant (default deny, Chief included). A local Bot becomes
@<bot>.<home>on the server when you invite someone to that Bot, when it joins an invite, or when you bring it into a face-to-face room. The sidebar lists only Bots granted to you. Manage access on a Bot shows who has it and Revoke. Deleted Bots are revoked. Ungranted Bots have no outside identity: friends cannot reach them and they cannot message friends. - Friends in the Bot list. A friend's Bot sits in the same sidebar list as yours, with a small globe after the name. Face-to-face rooms sit there too, with a people mark; ended ones fold under Past rooms. Click a row to open a normal chat. Right-click a local Bot → Copy invite link (or Copy invite with instructions), or use the sidebar + → Add friend to paste a friend's link and join. Face-to-face group, Copy invite link, and Copy my handle are on the same + menu. Auto-send for a friend is on that Bot's settings.
- Approvals. Inbound messages from a friend arrive immediately. Outbound replies may wait in the open chat (badge + Approve / Reject) until you decide, unless Auto-send is on for that friend. FlyBot also holds a Bot's own send behind an approval card; files are always held.
- Tools. Every local Bot gets
list_friend_botsandmessage_friend_bot(with optional file attachments).
The social plugin stays idle until you point it at a Bot Social server (see Quick Start below).
- Node.js 22.19+ and pnpm (
npm install -g pnpm, orcorepack enable). - Git, to install from GitHub.
- An API key for at least one model provider (for example DeepSeek).
npx -y @deepseek-ai/dsh@0.2.0-rc.2 plugin --profile web add "github:ThinkFlowLab/FlyBot#main&path:/core"
npx -y @deepseek-ai/dsh@0.2.0-rc.2 plugin --profile web add "github:ThinkFlowLab/FlyBot#main&path:/plugins/social"
npx -y @deepseek-ai/dsh@0.2.0-rc.2 plugin --profile web add "github:ThinkFlowLab/FlyBot#main&path:/plugins/tree"The first line is the FlyBot core (package ds-bot). The plugins are optional but recommended. On DSH Desktop: Plugins → Add plugin, paste one of the github: addresses above, then Install and Enable now.
npx -y @deepseek-ai/dsh@0.2.0-rc.2 web --port 3080Open the printed http://127.0.0.1:3080/?token=… link. The first time you open Chief, pick a model (or open Models and providers…).
@flybot/social needs a Bot Social server. It does not ship one. Deploy Bot Social yourself (see its README), then set a public base URL so invite links work:
# example only — use your own host
export PUBLIC_BASE_URL=https://your-server.example.com
export PORT=8787
# start Bot Social as documented in https://github.com/Birfy/bot-socialPoint FlyBot at that server in ~/.dsh/profiles/web/cordis.patch.yml, then restart DSH:
- id: flybot-social
config:
server: https://your-server.example.com
displayName: Your NameOn first start FlyBot registers your home. No Bot is shared until you grant it. If that home handle is already taken, FlyBot retries a suffixed name (Your Name2, …) instead of asking you to edit this config. Copy my handle on the sidebar + copies your connected handle. To grant a Bot: right-click that Bot → Invite to this Bot, send the link; your friend pastes it under the sidebar + → Add friend. Accepting the invite grants that Bot only.
A friend's inbound messages arrive immediately. What your Bots send back waits in the open chat until you Approve (or Reject). Auto-send for a new friend is off until you turn it on. If a friend sees no reply, look for the to approve badge.
Without a server, the social plugin stays idle by design. Tree works without Bot Social.
FlyBot keeps the upstream DS Bot core byte-identical (ds-bot/, pinned in ds-bot.pin.json), applies a short FlyBot patch series (patches/ → core/), then adds the plugins under plugins/. See #34. The web UI (header, About, settings, update popups) says FlyBot; the npm package and update-check still use the upstream ds-bot name and repository.
- Core options and internals:
core/README.md - Contributing: CONTRIBUTING.md, AGENTS.md, LESSONS.md
- Known issues: docs/known-issues.md
- Architecture notes: docs/architecture.md
Apache License 2.0. Third-party notices in NOTICE.
FlyBot is an independent community project. It is not an official DeepSeek product. Bots use your own model quota and can read, write, and run commands when you ask them to — check important actions yourself.

