关于 killbottleneck
killbottleneck 是面向团队的可自托管项目与流程地图应用,用于协调人员和 AI Agent 的工作。它结合目标地图、任务、协作和可选 AI 功能,并内置 MCP 服务与 REST API。
主要功能
- 01可视化目标与流程地图
- 02任务、评论和地图共享
- 03时间追踪与每日任务概览
- 04可选 AI 助手和地图摘要
- 05支持 JSON 导入与导出
适用场景
- 01梳理团队目标和项目流程
- 02查看每日工作并记录时间
- 03借助 AI 起草或更新项目地图
- 04通过 MCP 让 AI 客户端读取或编辑地图
MCP 相关
内置 MCP 服务提供地图与目标操作、人员和组合数据、日历事件、提醒及规则等工具。客户端可通过 Streamable HTTP 连接实例的 `/mcp` 端点,也可在本地运行 npm 包。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y killbottleneck-mcpKB_URLAddress of your killBottleneck instance, e.g. https://company.killbottleneck.com or http://192.168.1.10:8090KB_API_KEY密钥API key issued in the app (user menu -> API keys). Use a read-write scope for editing.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
20收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| archived | boolean | 否 |
详细介绍
killBottleneck
English | Čeština
网站 ·
文档 ·
更新日志 ·
许可证
🧪 公开测试版。 killBottleneck 功能已完备,目前处于测试阶段——云端版和可自托管版均如此;它们其实是同一个应用。我们在这里测试的是可自托管部分:安装、反向代理、自有 SMTP 和升级。安装后(见下方的快速入门),尽情尝试找出问题,并告诉我们结果:错误 → Issues,想法 → Discussions。测试版平稳下来后,我们就会发布 v1.0。
以可视化方式呈现你的项目、公司及其流程——人们和 AI Agent 可以共同协作的目标图谱,完全托管在你自己的服务器上:数据绝不会离开公司。**免费自托管,内含 REST API 和 MCP 服务。**秉持开源精神,但不允许将其转售为托管服务——详见许可证。

这里没有任何东西会偷偷向外发送数据。默认安装时,服务不会向任何地方发送请求,应用也不会从第三方 CDN 加载任何内容——包括字体,所有资源都由你自己的实例提供。任何可能离开你网络的操作,都由你自行启用:
| 出站请求 | 发生时机 | 关闭方法 |
|---|---|---|
| GitHub Releases API | 由用户的浏览器检查版本——而非服务 | KB_UPDATE_CHECK=0 |
| 你配置的 AI 端点 | 仅当 KB_AI_PROVIDER ≠ none 时;可以使用你自己的 Ollama 或任何你选择的端点 | KB_AI_PROVIDER=none(默认) |
| Google(登录、Drive 选择器) | 仅当你配置了 KB_GOOGLE_* 时 | 留空这些变量(默认) |
没有遥测、没有分析,也没有许可证检查。
目录 — 本 README 是完整参考文档;简明版请见网站。
- 快速入门
- 不使用 AI 时的功能 · 在手机上使用
- AI 功能(可选)
- 通过 MCP 使用 AI 助手
- 由谁执行步骤:人员还是自动化 — 包含你自己的 Agent 可用的Webhook 约定
- 将项目迁移到其他位置(JSON 导出/导入)
- 外观(皮肤) · 通知 · 时区和重复模板
- 数据与备份 · 团队 · 注册与注册码
- 使用 Google 登录 · 附件 · 电子邮件(SMTP)
- HTTPS(从外部访问) · 更新
- 许可证 — fair-code · 联系
快速入门
你只需要 Docker。然后:
cp .env.example .env # optional — the defaults are fine
docker compose up -d
killBottleneck 运行于 http://SERVER-IP:8090。同一局域网内的同事只需在浏览器中打开该地址。
**第一个注册的用户会自动成为管理员。**其他人可以自行注册,也可以由管理员在“管理”中邀请他们(这会创建一个临时密码账户,供管理员转交给受邀者)。
不使用 AI 时的功能
完整的目标地图编辑器(节点、边、状态、备注),每位用户可创建多张地图,可对目标发表评论,与同事共享地图(只读/可编辑),公开地图,以及导出为图片/PDF。

“我的一天”面板(首页和“任务”页面均有):可点击查看逾期/今天/一周内/阻碍他人事项的概览,基于你的数据实时计算;日期旁显示命名日;可导出适用于手机的纵向 PNG 图片——提供完整版本(含任务名称)和匿名版本(隐去名称,适用于社交媒体)。使用 HTTPS 时,还可以点击分享…(调用手机原生的 Web 分享对话框,不涉及第三方服务)。
时间跟踪:顶部栏中的 ⏱ 计时器(点击一次即可开始“空白”计时——可在计时过程中或之后指定项目/客户/目标),每个任务和地图中的每个目标上都有计时器(计时不会更改状态——纯粹是辅助功能),左侧“时间跟踪”面板用于查看记录(起止时间、事后指定),用户菜单中的“已用时间”对话框(今天/本周,按项目和客户细分),客户名录(项目→客户,因此也会按客户汇总时间),以及在忘记停止计时器时于 12 h 后自动停止。**收件箱行为:**停止计时并添加备注(例如“与客户通话”)的未分配计时记录,也会自动保存为灵感,放入你的储存区。
在手机上
在手机上打开同一实例时,会切换到简化视图:查看今天的任务、勾选完成、添加任务和阅读消息——无需在小屏幕上操作地图画布。你可以随时切回完整视图,也可以将应用添加到主屏幕(使用 HTTPS),让它像原生应用一样运行。
更多内容请参阅简化视图指南。
## AI 功能(可选)
助手位于地图旁边的侧边栏中。它会与你一起规划一天(晨间简报、晚间规划),从照片、PDF 或语音便笺中整理笔记,通过几个问题起草完整项目,准备会议、回顾一周;对于管理者,它还能主持团队会议。它会自行读取你的地图;它提出的每项更改都会作为一张卡片供你确认——不会擅自写入任何内容。它撰写的电子邮件、笔记和摘要会作为文档保存在聊天旁边。除了助手,还有节点上的魔杖(子步骤、里程碑、KPI、风险)、AI 项目摘要以及“我的一天”中的每日鼓励。
可通过 .env 中的 KB_AI_PROVIDER 启用 AI:
openai— 任何兼容 OpenAI 的 API:OpenAI、OpenRouter、Groq、Mistral、Together, 或你自己的 vLLM / LM Studio / llama.cpp / liteLLM 代理。设置KB_AI_URL=https://openrouter.ai/api/v1(基地址,通常以/v1结尾)、KB_AI_TOKEN=<your API key>和KB_AI_MODEL=<exact model name>。如果所用服务提供 Whisper / 转录模型,语音便笺会由同一服务转录;服务提供商会向你收取请求费用。api— 兼容 killBottleneck API 契约的远程 AI 服务:输入服务提供商提供给你的 地址和令牌。无需自己的 GPU,也无需维护。 (可运行魔杖、摘要和鼓励;助手需要ollama或openai。)ollama— 你自己的本地模型:安装 Ollama,拉取模型 (ollama pull gpt-oss:20b),并设置KB_AI_URL=http://IP:11434+KB_AI_MODEL=gpt-oss:20b。 所有内容都在你这边运行,数据不会离开你的网络。(语音便笺需要你自己的 语音转文字服务——见下文。)custom— 使用你自己的端点,并遵循相同的 API 契约 (契约文档见此处)。
除非为助手单独设置模型
(KB_CHAT_PROVIDER/URL/MODEL/TOKEN),否则助手使用相同的模型。读取照片需要视觉模型(KB_VISION_*,或在“管理 → AI”中勾选 助手读取图像)。语音便笺支持任何符合 OpenAI 格式的语音转文字服务(KB_TRANSCRIBE_PROVIDER=openai + KB_TRANSCRIBE_URL —
speaches、whisper.cpp、OpenAI……);录音本身绝不会被存储。浏览器仅允许在 HTTPS(或 localhost)下使用麦克风,前置反向代理必须允许约 5 MB 的请求正文通过(语音便笺或照片会随请求发送)。
更多信息请参阅助手指南。
使用 AI 时,地图数据会发送到你选择的端点;使用 none(默认值)时,数据绝不会离开你的服务器。
每日 AI 鼓励(“我的一天”面板中的一句话):用 1–2 句话按“阻碍他人 → 逾期 → 今天”的优先级给出建议,偶尔引用谚语。它会由 cron 作业在早晨生成(KB_SUMMARY_HOUR,默认值为 6),仅针对最近 KB_SUMMARY_ACTIVE_DAYS 天内登录过的账户(默认值为 14,0 = 所有人);其他用户打开应用时才会生成。也可以为摘要单独指定一个(较小、更快的)模型:
KB_SUMMARY_PROVIDER/URL/MODEL/TOKEN——未设置时使用上述通用 AI 配置。没有 AI 时,面板仍可完整使用,只是没有这一句话。AI 不会列出任务清单(这些清单根据你的数据计算生成,且可点击);任务名称在放入提示词之前也会经过清理。
通过 MCP 使用 AI 助手(Claude Desktop、Claude Code,……)
killBottleneck 内置了一个 MCP 服务(mcp/):将 AI 助手连接到你自己的实例,即可通过对话构建地图——“把这些会议记录整理成一张地图”、批量编辑、勾选已完成的事项。自托管和托管实例的使用方式相同,只有地址不同。
-
在应用中:用户菜单 → API keys → 创建一个具有 Read and write 权限范围的新密钥(只读访问使用 Read only 即可)。令牌只会显示一次。建议为密钥设置有效期,并在停止使用后撤销。
-
无需安装任何内容——该服务已发布到 npm,名称为
killbottleneck-mcp,因此首次使用时由npx获取。(想从此代码仓库运行?执行cd mcp && npm install,然后使用node /absolute/path/mcp/index.js代替下方的npx命令。) -
在助手中注册该服务:
Claude Code:
claude mcp add killbottleneck \ -e KB_URL=http://SERVER-IP:8090 \ -e KB_API_KEY=kb_user_... \ -- npx -y killbottleneck-mcpClaude Desktop(
claude_desktop_config.json→mcpServers):{ "mcpServers": { "killbottleneck": { "command": "npx", "args": ["-y", "killbottleneck-mcp"], "env": { "KB_URL": "http://SERVER-IP:8090", "KB_API_KEY": "kb_user_..." } } } }
工具(20 个):list_maps、get_map、create_map、add_nodes、update_node、delete_node、
list_people、get_portfolio、get_org_structure、日历事件和定时提醒(create_event、
list_events、create_reminder),以及规则工具(create_rule、list_rules、
update_rule、delete_rule、list_rule_runs、list_rule_templates、save_rule_template、
delete_rule_template)。有指派人或截止日期的目标就是任务——没有单独的任务记录。通过 API 指定
owner 会将地图作为协作者共享给此人,因此相关工作会显示在对方的“我的一天”中(响应会列出共享对象)。
**远程使用,无需在本地运行任何内容:**每个实例也会直接通过 /mcp
(Streamable HTTP,密钥和工具相同)提供 MCP 服务——claude mcp add --transport http killbottleneck https://your-instance/mcp --header "Authorization: Bearer kb_user_...";claude.ai 连接器通过 OAuth 登录。
详情:MCP 服务。
**安全性:**密钥以其所有者的身份操作——它能查看和编辑的内容与所有者在应用中能操作的完全相同,
包括共享地图和团队地图(edit/own = 完整写入权限;work 和 read = 仅能查看所有者自己节点的状态,
与在应用中勾选完成的权限完全相同);它永远不会读取账户角色,因此管理员的密钥也无法查看任何人的
私有地图,其他人的公开地图同样无法访问(404)。管理功能、AI 设置和用户均无法访问。写入操作可以
新增、编辑和删除目标与任务;不能通过 API 删除整张地图,也不能删除地图的顶点。限制:每个密钥
每分钟最多 120 次读取和 30 次写入,每次调用最多 200 个节点,每个账户最多 20 个密钥。通过冲突检测
来处理与打开的编辑器同时操作的情况(编辑器会提示重新加载,助手会自行重新加载地图)。注意:add_nodes 会重新布局整张地图。MCP 工具的输出为英文(助手始终能理解);服务器错误消息则使用账户所设语言。
每个步骤由谁执行:人员还是自动化
对于地图中的每个目标,你都可以指定由人员还是自动化来执行。自动化背后是否有 AI Agent 或定时 cron 作业,不是你需要操心的事——构建自动化的人自然清楚。
重要提示:**目标的负责人始终是人类。**即使步骤由自动化执行,也必须有人负责;此人会收到通知, 并且该目标会计入其“我的一天”。自动化负责执行工作;人负责承担责任。
对于自动化步骤,你还需要记录由哪个自动化执行——这记录的是当前的实际情况(“n8n 已经替我们执行这个步骤”),而不是一条命令。这样就能一目了然地看出地图中的哪些部分由人员完成,哪些由机器完成。
“我希望这个流程可以自动化”
对于任何目标,你都可以勾选请求将此步骤自动化,还可以选择添加一句说明原因。请求会发送给AI Agent 管理员——这是用户身上的一项独立标记(用户管理 → AI 管理员),与其角色无关;管理员和普通成员都可以在保留自身角色的同时拥有此标记。
管理员构建自动化并将其记录到目标上后,请求会自动移除,发起请求的人也会收到消息,告知其目标现已实现自动化。完整流程如下:
person: ☑ I would like this automated ("I upload subtitles by hand, 20 minutes")
↓
the AI manager gets a notification → decides → builds an n8n workflow
↓
the manager records it on the goal: "n8n — subtitle translation"
↓
the requester gets a notification: "your goal is now automated by n8n — subtitle translation"
目标上的附件
你可以将文件上传到任何目标。对于已设置自动化的目标,上传文件会立即启动自动化——无需在其他地方填写表单,只需附上需要处理的内容即可(通常是字幕、源材料或导出文件)。
只有有权访问项目的人才能看到附件。文件受到保护:仅凭链接无法获取文件内容。
AI Agent 注册表
AI Agent 管理员(或管理员)会在 AI Agent 注册表中维护自动化目录,其中包含名称、webhook 地址、签名密钥以及启用/禁用状态。对于某个目标,自动化通过名称选择——团队成员看不到地址或密钥。当目标上的名称与注册表中的某个 Agent 匹配时,killBottleneck 可以自行启动该 Agent。
谁可以启动自动化。 每个 Agent 都可以设置一份允许的电子邮件地址列表。列表为空表示任何可以编辑任意地图的人都可以启动自动化——在公司内部这通常没问题,但如果你允许承包商访问某个实例,就应该加以限制:否则,任何可以编辑地图的人都能启动你的任意 n8n 工作流,并向其中输入自己的文本(目标的标题和描述会随负载发送给 Agent)。
每个项目最多可有 200 个附件;此外,还可以为整个实例设置可选的空间限制(KB_FILES_MB,单位为 MB;0 = 完全禁用上传,留空 = 不设限制——如果使用共享磁盘,请设置此值,以免托管实例的空间被占满)。⚠️ 之前的 FLOWMAP_MAP_FILES_MB 是每个项目的配额,默认值为 200 MB——如果你已设置该变量,它仍会对你生效;但如果没有设置,现在就完全不限制空间。
一次自动化运行:killBottleneck → n8n → 返回
自动化会在以下情况启动:
- 有附件上传到目标,或
- 目标轮到处理——它一直在等待子目标,而这些子目标刚刚全部完成,或
- 有人手动将目标切换为“进行中”(这也是重试失败运行的方式)
运行中的自动化在报告结果或过期之前,不会再次启动。
发出的请求(向 Agent 地址发送 POST 请求,并附带 X-Signature 标头 = 使用 Agent 密钥对整个请求正文计算的 HMAC-SHA256):
{
"run_id": "…", "run_token": "kbr_…",
"callback_url": "https://your-instance/api/kb/agent-callback",
"files_url": "https://your-instance/api/kb/agent-files?run_token=kbr_…",
"files": [{ "id": "…", "name": "subtitles.sbv", "size": 1234, "url": "https://…?run_token=kbr_…" }],
"map_id": "…", "map_title": "…",
"node_id": "…", "node_title": "…",
"description": "…", "deadline": "2026-08-01",
"owner": "[email protected]", "triggered_by": "[email protected]"
}
Agent 使用其运行令牌下载文件;files_url 是一个实时列表,因此也能看到运行期间添加的附件。报告结果后,令牌就会过期。
报告结果(向 callback_url 发送 POST 请求,无需登录——运行令牌用于验证身份):
{ "run_id": "…", "run_token": "kbr_…", "status": "done", "result": "Translated into 3 languages" }
status 为 done 或 failed。令牌仅适用于一个目标和一次报告——使用同一个令牌再次调用不会成功。
目标在收到 done 后会完成,并由此启动后续流程:下一个目标会解除阻塞,负责人也会收到可以开始处理的通知。如果下一个目标也是自动化目标,它会立即启动——这样各个步骤就会自行串联起来。
设置 Agent 应回调的地址。 callback_url 由服务器组装,而非浏览器;若未配置,则使用 PocketBase 的“Application URL”,安装后该地址为 http://localhost:8090。因此,在另一台机器上运行的 Agent 会回调到自身,运行也会一直挂起,直至超时。在 .env 中:
KB_PUBLIC_URL=https://killbottleneck.yourcompany.com
KB_AGENT_TIMEOUT_MIN=90
只要 Agent 能访问该地址即可——在可自托管的部署中,局域网内的 http://192.168.1.10:8090 完全可以。托管实例(killBottleneck Cloud)会自动设置此项。
你的 n8n 是否位于同一网络? Webhook 地址由服务器调用,因此这会构成典型的内部网络扫描攻击向量——所以 killBottleneck 默认拒绝调用私有地址(10.x、192.168.x、172.16–31.x、localhost、云元数据地址)。在 n8n 与 killBottleneck 相邻运行的可自托管部署中,可以允许此类地址:
KB_ALLOW_PRIVATE_WEBHOOKS=1
若未设置此项,运行会标记为失败,AI Agent 管理员也会收到说明原因的消息。 必须填写 Agent 的密钥——否则请求会使用空密钥签名,接收方将得不到任何保护,因此 killBottleneck 会直接拒绝此类运行。当前生效的地址始终显示在 AI Agent 注册表底部;若地址指向 localhost,注册表会发出警告。此设置仅与自动化有关——如果你不使用自动化,就无需设置此变量。
自动化未完成时
运行状态会直接显示在目标的对话框中——待处理/运行中/已完成/失败;失败时还会显示原因。将目标切换回“进行中”即可重启运行。
各状态的含义:
| 状态 | 当前情况 |
|---|---|
| pending | 运行已加入队列,会在一分钟内发出(一次地图保存最多发送少量 Webhook,因此不会让任何人久等) |
| running | Agent 已接手任务,但尚未报告结果 |
| done / failed | Agent 已报告结果,或运行已过期 |
如果运行在 KB_AGENT_TIMEOUT_MIN 分钟内(默认值为 90)未报告结果,监控程序会将其标记为失败,并通知负责人和 AI Agent 管理员——因此目标绝不会悄无声息地一直挂起。
最常见的失败原因:Agent 未在注册表中或已停用;未设置密钥;其地址指向私有网络,但未设置 KB_ALLOW_PRIVATE_WEBHOOKS=1;或 Webhook 无法访问。详细信息(包括连接错误)会记录在服务器日志中——docker compose logs killbottleneck——这些信息不会显示在应用中。
将项目移动到其他位置(JSON 导出和导入)
可以将项目导出为 .json 文件,然后在其他位置导入——可在同事之间以及不同实例之间传递。在编辑器中选择:导出 → 导出 JSON,然后选择包含名称或不包含名称。导入入口位于“新建项目”按钮旁边的菜单中。
文件包含:标题、描述、完整的目标结构(包括状态、截止日期、每个步骤的执行者和自动化请求)以及关联的任务。“不包含名称”选项会清除负责人和受派人,但会保留自动化的名称,因为它们描述的是流程。
**从 Asana 或 Trello 切换:**同一导入功能也支持 **Asana 项目导出文件(CSV)**和 Trello 看板导出文件(JSON)。分区/列表会变成地图分支,任务/卡片会变成目标,子任务和清单会变成子目标;状态(已完成)、截止日期、描述以及——对于 Asana——受派人都会保留(此实例中不存在的邮箱会被清除并计数)。所有转换都在浏览器本地完成——不会调用 Asana 或 Trello。限制:每个文件最多包含 400 个条目。
不会转移的内容:附件、评论、共享、归档和编号序列。导入始终会创建一个由导入者拥有的新项目,并重新生成目标标识符(以免与原项目冲突),且不会与任何人共享,也不会发送通知——如需协作,必须手动共享项目。分配给此实例中不存在的邮箱地址的任务会被移除,导入时会告知移除的数量。
外观(皮肤)

在头像菜单 → 外观中,每个人都可以从十二种内置皮肤中选择一种——Indigo(默认)、High contrast、Terminal、Paper、Ocean、Forest、Midnight、Plum、Peach、Graphite、Ruby 或 Rose。选择会保存到账户中,因此会应用于所有设备、浅色和深色模式,也适用于简化版精简视图(其中的选择器位于列表下方)。
自定义皮肤:皮肤是一个小型 JSON 文件(kb-skin v1 格式),包含一组颜色(HSL)、字体和圆角半径。外观对话框可以导出当前皮肤(对于内置皮肤,会导出其定义——“拿来修改”),也可以从文件导入或粘贴导入他人的皮肤。设计上不支持任意 CSS:客户端和服务端都会对值进行白名单校验,因此共享的皮肤无法执行或发送任何内容。绝不会下载网页字体——只使用应用自带字体和系统字体;未知字体会安全地回退到字体栈中的下一个字体。
**公司外观:**管理员可以在组织管理后台设置整个实例的默认皮肤——该皮肤会应用于所有尚未自行选择皮肤的用户,包括登录页面。用户自己的选择始终优先。
v1 版本中皮肤不会改变的内容(这是有意设计的):状态颜色(红/琥珀/绿 = 逾期/进行中/已完成,在任何地方都保持相同且易于辨认)。地图导出(PNG/PDF)会忠实呈现屏幕效果——保留当前皮肤和浅色/深色模式,包括背景颜色;但不包含背景插画。项目仪表板 PDF 和“我的一天”图片则刻意保持浅色,以便发送给任何人。
社区皮肤和开源皮肤编辑器: https://github.com/tengolabs/killbottleneck-skins — 皮肤是免费的数据(CC0),编辑器采用 MIT 许可证。可直接在浏览器中试用编辑器,无需安装: https://tengolabs.github.io/killbottleneck-skins/.
通知
页眉中的铃铛会显示最近 20 条事件;带筛选和分页的完整列表位于
/notifications。通知设置也在这里,所有人都可以单独开启或关闭各类通知。
以下情况会发送通知:有任务或目标分配给你(包括已存在的地图中的任务或目标);有人评论任务或目标;有人与你共享项目;等待中的目标已解除阻塞;截止日期临近或已过(每天汇总一次,而不是每项单独发送);有人发出自动化请求及其完成情况;自动化完成或失败;计时器自动停止。
截止日期提醒会在早上发送;使用 KB_DEADLINE_HOUR 设置提醒时间(默认值为 7,即容器的本地时间)。已读通知会在 30 天后清理。
电子邮件渠道已就绪,但只有配置 SMTP 后才会启用(见下文);在此之前,它会在设置中显示为灰色。
时区和循环模板
你可以设置模板,让系统据此自动创建项目(例如“每周一”或“每月第 N 天”)。若要让“星期一”和创建时间与你的本地时间一致,请在 .env 中进行设置:
TZ=Europe/Prague # your time zone (empty = UTC)
KB_AUTO_HOUR=5 # the hour (0–23) from which projects are created on a given day
- 如果服务器在该时段处于休眠状态(已关闭),项目会在当天之后的下一个时段创建,而不会跳过。
- 时区设置适用于整个实例——对于分布在多个时区的团队,使用的是服务器的时区,而不是每位用户各自的时区。
- 循环任务(完成后移动截止日期)会特意按 UTC 计算,因此跨越午夜或夏令时变更不会使截止日期偏移一天。
数据和备份
所有数据都存储在 ./pb_data 文件夹中(SQLite 和上传的文件)。使用随附脚本进行备份:
./backup.sh # creates kb-backup-YYYY-MM-DD.tgz
./backup.sh restore FILE # restores data from a backup
(手动备份:复制 pb_data 文件夹;恢复时,将其放回原处。)
备份可以加密:设置 KB_BACKUP_PASSPHRASE 后,脚本会生成 kb-backup-….tgz.gpg(GPG、AES-256)。restore 可接受加密归档和较旧的未加密归档。请勿将密码短语保存在服务器上——没有它,任何人都无法读取备份。
带走你的所有数据
我的账户中有下载我的所有数据选项:生成一个 JSON 文件(killbottleneck.export/1),其中包含你能看到的所有项目——每个项目的格式都与单个地图导出的格式相同,因此可以导入到其他位置——以及任务、规则、评论、变更日志、附件列表、创意暂存区、时间记录、外部联系人和通知。即使试用期已过,此功能仍可使用;从导出文件上传数据可以将项目(含规则)和创意暂存区恢复到另一个实例中。自托管用户还可以使用 ./backup.sh,备份整个 pb_data 文件夹,包括上传的文件。
团队
一个实例 = 一个团队。角色:管理员(管理用户和角色、组织设置——名称和徽标)、经理(邀请成员、查看和管理所有任务)、成员(自己的任务和共享地图)。管理员和经理还会在顶部栏看到组织,用于俯瞰团队和共享项目(绝不会统计私人项目)。你可以从管理页面邀请成员,也可以直接从任务页面邀请。
注册和注册密钥
第一个注册的账户将成为管理员。如果此实例可从互联网访问,请在 .env 中设置 KB_SETUP_CODE——之后每次注册都需要该密钥,这样只有知道地址的人才能创建账户是不够的。将密钥提供给你希望允许加入的人员;此外,管理员可以直接邀请用户(邀请无需密钥)。留空 = 无需密钥即可注册。
使用 Google 登录(可选)
用户可以使用 Google 登录,无需使用电子邮件和密码。设置方法:
- 在 Google Cloud Console 中前往 APIs & Services → Credentials → Create credentials → OAuth client ID → 选择类型 Web application。
- 在 Authorized redirect URIs 下添加:
https://YOUR-DOMAIN/api/oauth2-redirect - 将 Client ID 和 Client secret 复制到
.env:KB_GOOGLE_CLIENT_ID=…apps.googleusercontent.com KB_GOOGLE_CLIENT_SECRET=… - 执行
docker compose up -d——“使用 Google 登录”按钮便会自动显示。
变量留空 = 关闭 Google 登录(不显示按钮)。在启用了注册密钥的实例上,Google 登录仅供现有用户使用——无法通过 Google 创建新账户(没有输入密钥的方式),因此必须先使用密钥创建账户。
为目标添加附件:文件或链接
你可以将上传的文件或链接(Drive、OneDrive、SharePoint、特定电子邮件,任何 https:// 链接)固定到任意目标。链接有三个优点:不占用空间,团队始终打开当前版本,文件也会留在原处。
上传文件可占用的空间由 KB_FILES_MB 控制——它适用于整个实例,而非单个项目:
| 值 | 行为 |
|---|---|
| 留空 | 不限量(自托管的默认设置——使用你自己的磁盘) |
| 数字 | 以 MB 为单位的上限,例如 5000 = 5 GB |
0 | 禁止上传,只能将附件添加为链接 |
托管实例使用 0:这样服务提供商不会存放你的文档,只保存指向文档的链接。链接必须以 http:// 或 https:// 开头——出于安全原因,浏览器无法打开网络驱动器路径(\\server\folder),因此应将其放在描述中。
电子邮件(SMTP,可选)
在 PocketBase 管理界面中配置 SMTP:http://SERVER-IP:8090/_/ → Settings → Mail
settings(超级用户账户会在首次启动时创建——你可以在 docker compose logs 中找到链接)。配置 SMTP 后:
- 新用户会收到电子邮件邀请(其中包含设置密码的链接);未配置 SMTP 时,管理员会看到一个临时密码,可手动交给用户。
- 用户可以自行重置密码。
HTTPS(从外部访问)
killBottleneck 本身通过 HTTP 运行——若要从局域网外访问,请使用 VPN 或反向代理。以下是使用 Caddy 的示例(自动签发 HTTPS 证书):
# Caddyfile
killbottleneck.your-domain.com {
reverse_proxy 127.0.0.1:8090
}
通过 docker-compose.override.yml 将其添加到 compose 配置中(更新时不会覆盖该文件):
services:
caddy:
image: caddy:2
ports: ["80:80", "443:443"]
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
volumes:
caddy_data:
HTTPS 还会启用“我的一天”图片的分享…功能(Web Share API——手机原生分享对话框,无需第三方服务),以及将应用添加到手机主屏幕的功能(service worker 只能在安全上下文中运行)。浏览器不允许在普通 HTTP 下使用这两项功能;在 HTTPS 域名下,它们会自动显示,无需配置。
在代理中启用压缩——节省三分之二的流量
killBottleneck 本身不会压缩响应(在 PocketBase 中无法安全地启用压缩,否则会破坏 API 拒绝超大请求体时的行为)。主要前端文件未压缩时为 488 kB,gzip 压缩后为 157 kB——使用移动数据时,首次打开应用,这种差异最明显。只需添加一行:
# Caddyfile
killbottleneck.your-domain.com {
encode gzip zstd
reverse_proxy 127.0.0.1:8090
}
(在 nginx 中:gzip on; gzip_types application/javascript text/css;。如果使用 Cloudflare 或类似服务,压缩会自动进行——无需配置。)
更新
git pull # or download the new version
docker compose up -d --build
数据库迁移会在启动时自动运行。进行较大更新前,建议先备份(./backup.sh)。
始终使用
--build:应用及其服务端逻辑都已打包到镜像中,因此每次更新(代码变更、.env中的TZ等变量)后,都需要运行docker compose up -d --build,而不能只运行restart。
一次性操作,适用于从旧版本更新到 v0.11: 产品更名后,容器名称从 flowmap 改为 killbottleneck。旧容器占用了端口 8090,因此新容器无法启动——请先停止并移除旧容器:
docker rm -f flowmap
docker compose up -d --build
数据保存在磁盘上的 ./pb_data 文件夹中,而不在容器内,因此不会丢失任何数据。.env 中的 FLOWMAP_* 变量仍可继续使用,无需改写。
备注
- 地图的公开链接只会分享地图画布——通过链接无法查看任务和任务评论。
- 许可证:fair-code——可持续使用许可证(见下方的许可证部分)。
许可证 — fair-code
killBottleneck 并非严格意义上(OSI)的“开源”项目——我们对此直言不讳。它采用 fair-code 模式:源代码公开,你可以下载、运行、修改和使用;对绝大多数人来说,它带来的好处与经典开源软件相同。 可以采用经典开源许可的部分包括:皮肤编辑器(MIT)和整个 皮肤库,其中包括验证器(CC0)。
你可以使用完整的 killBottleneck——包含所有功能,包括团队协作和 AI 功能。没有精简版“免费版本”,也没有任何功能被锁在付费墙后。你甚至可以 免费自行提供 AI 能力——在自己的机器上使用自己的模型(Ollama),或使用自己的 API 密钥。我们提供托管云服务(包含 AI)只是为了方便无处运行 killBottleneck 的用户——这只是便利选项,并非使用条件。
你可以免费且毫无限制地使用 killBottleneck:
- 在自己的电脑或服务器上运行——数据由你掌控。
- 在公司中充分用于自己的工作和团队协作。
- 接入自己的 AI(本地模型或自己的 API 密钥),也可以完全不使用 AI。
- 根据需要任意修改。
- 提供与 killBottleneck 相关的服务(部署、咨询、为客户定制)。
我们保留的权利——也是让 killBottleneck 得以持续发展的方式:
- 托管 killBottleneck 并向用户收取访问费用。
- 将其贴牌——以其他品牌发布。
- 将其转售为付费服务。
这是我们的业务,也是我们得以持续添加功能、修复错误并维护 killBottleneck 的方式。我们积极鼓励你基于 killBottleneck 进行开发,并按需使用;只要不把它变成与我们竞争的托管服务即可。完整条款:LICENSE。 第三方组件仍遵循其原始许可证(MIT、Apache-2.0、BSD 等)——许可证文本完整列表见 THIRD-PARTY-LICENSES.md。
权利持有人:Tengo, s.r.o.,ID No. 03339165,Dolní Valy 205, 262 72 Březnice, Czech Republic。 想要将 killBottleneck 托管为服务、以自己的品牌发布或转售吗?许可证不允许这样做——但我们提供商业许可证,请联系 [email protected]。
本节的捷克语版本见 README.cs.md。
由 Richard Pobrislo (LinkedIn, Ctrl+Alt+AI) 开发——只有一位开发者,因此下方的支持渠道也相应如此。
代码 100% 由 AI 编写——使用 Claude Fable 5、Claude Opus 5 和 Claude Opus 4.8,并由人类指导。每次发布前都会经过自动回归测试套件和人工逐项点击测试;发布说明会列出已验证的内容以及有意未验证的内容。
联系方式
| 渠道 | 用途 |
|---|---|
| GitHub Issues / Discussions | 报告错误和提出改进建议——公开进行,让其他人也能看到 |
| [email protected] | 安全问题(请勿在公开议题中报告)——参见 SECURITY.md |
| [email protected] | 付费方案:托管实例 |
| [email protected] | 商业许可——托管为服务、贴牌、转售 |
| [email protected] | 其他所有事宜 |
我们不接受外部贡献者提交的代码(参见 CONTRIBUTING.md)—— 但欢迎大家提出想法和报告错误。
支持项目
killBottleneck 采用 fair-code 模式——整个产品(所有功能)均可免费自托管, 并将始终如此。如果它对你有所帮助:
- 关注我们的 YouTube 频道,获取教程和 AI 资讯;
- 加入我们的 Discord。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。