mcpField
K
killbottleneck

killbottleneck

本地服务
github.com/tengolabs生产力10今天更新

关于 killbottleneck

killbottleneck 是面向团队的可自托管项目与流程地图应用,用于协调人员和 AI Agent 的工作。它结合目标地图、任务、协作和可选 AI 功能,并内置 MCP 服务与 REST API。

主要功能

  1. 01可视化目标与流程地图
  2. 02任务、评论和地图共享
  3. 03时间追踪与每日任务概览
  4. 04可选 AI 助手和地图摘要
  5. 05支持 JSON 导入与导出

适用场景

  1. 01梳理团队目标和项目流程
  2. 02查看每日工作并记录时间
  3. 03借助 AI 起草或更新项目地图
  4. 04通过 MCP 让 AI 客户端读取或编辑地图

MCP 相关

内置 MCP 服务提供地图与目标操作、人员和组合数据、日历事件、提醒及规则等工具。客户端可通过 Streamable HTTP 连接实例的 `/mcp` 端点,也可在本地运行 npm 包。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"com-killbottleneck-killbottleneck": {
"command": "npx",
"args": [
"-y",
"killbottleneck-mcp"
],
"env": {
"KB_URL": "<KB_URL>",
"KB_API_KEY": "<KB_API_KEY>"
}
}
}
}
启动命令npx -y killbottleneck-mcp
需要配置的环境变量
KB_URLAddress of your killBottleneck instance, e.g. https://company.killbottleneck.com or http://192.168.1.10:8090
KB_API_KEY密钥API key issued in the app (user menu -> API keys). Use a read-write scope for editing.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmkillbottleneck-mcp0.63.0

工具

20

收录的工具列表 · 更新于 2 周前

参数类型必填说明
archivedboolean否

详细介绍

killBottleneck

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 是完整参考文档;简明版请见网站。

快速入门

你只需要 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 助手连接到你自己的实例,即可通过对话构建地图——“把这些会议记录整理成一张地图”、批量编辑、勾选已完成的事项。自托管和托管实例的使用方式相同,只有地址不同。

  1. 在应用中:用户菜单 → API keys → 创建一个具有 Read and write 权限范围的新密钥(只读访问使用 Read only 即可)。令牌只会显示一次。建议为密钥设置有效期,并在停止使用后撤销。

  2. 无需安装任何内容——该服务已发布到 npm,名称为 killbottleneck-mcp,因此首次使用时由 npx 获取。(想从此代码仓库运行?执行 cd mcp && npm install,然后使用 node /absolute/path/mcp/index.js 代替下方的 npx 命令。)

  3. 在助手中注册该服务:

    Claude Code:

    claude mcp add killbottleneck \
      -e KB_URL=http://SERVER-IP:8090 \
      -e KB_API_KEY=kb_user_... \
      -- npx -y killbottleneck-mcp
    

    Claude 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,因此不会让任何人久等)
runningAgent 已接手任务,但尚未报告结果
done / failedAgent 已报告结果,或运行已过期

如果运行在 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 登录,无需使用电子邮件和密码。设置方法:

  1. 在 Google Cloud Console 中前往 APIs & Services → Credentials → Create credentials → OAuth client ID → 选择类型 Web application。
  2. 在 Authorized redirect URIs 下添加:https://YOUR-DOMAIN/api/oauth2-redirect
  3. 将 Client ID 和 Client secret 复制到 .env:
    KB_GOOGLE_CLIENT_ID=…apps.googleusercontent.com
    KB_GOOGLE_CLIENT_SECRET=…
    
  4. 执行 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 模式——整个产品(所有功能)均可免费自托管, 并将始终如此。如果它对你有所帮助:

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。