Potlane
Runs multiple AI sub-agents against independent Penpot tabs without extra Penpot users, providing a local MCP gateway and Chrome extension for lane-based isolation and coordination.
README
<p align="center"> <img src="docs/assets/potlane-hero.png" alt="Potlane routes three independent AI agents through one local MCP gateway into three isolated Penpot browser lanes." width="100%" /> </p>
Potlane
Parallel MCP lanes for Penpot, under one user account.
Distribution: potlane on npm ·
Chrome extension ZIP and release notes ·
Chrome Web Store listing
Potlane lets an orchestrator run multiple AI agents against independent Penpot tabs without creating extra Penpot users or patching Penpot. A local MCP gateway routes each official Penpot tool call through a named lane; the Chrome extension owns the matching browser tab and official plugin instance.
[!IMPORTANT] Potlane is an unofficial community project and is not affiliated with or endorsed by Penpot or Kaleidos.
What you get
- One MCP endpoint for any number of agent lanes.
- One signed-in Penpot account shared by all lanes.
- Strict one-lane-to-one-tab binding with a fresh private routing token on every rebind.
- Serial execution inside one lane and real parallel execution across different lanes.
- Automatic background tab provisioning and safe plugin reconnect after extension or browser reload.
- Confirmed cleanup of one idle lane or all idle lanes from the side panel.
- Durable cleanup intent when one managed tab is closed; full-window restore remains safe.
- Quarantine for ambiguous, timed-out, or partially applied mutations, with no automatic mutation retry.
- Secret-safe local audit events, strict request validation, bounded sessions, and loopback-only networking.
The current release was validated against self-hosted Penpot 2.17.0-RC5 with three independent agent
workloads, retained design pages, and measured concurrent execution. Read the
real end-to-end evidence.
Extension preview
<p align="center"> <img src="docs/assets/chrome-web-store/screenshot-1280x800.png" alt="Potlane Chrome side panel monitoring three independent agent lanes next to three retained Penpot E2E designs." width="100%" /> </p>
The release preview renders the real side-panel component and production styles with deterministic demo state. The Support, Dashboard, and Pricing cards are actual exports retained from the three-agent E2E run.
How it works
flowchart LR
A1["Agent 1"] -->|"lane A"| G["Potlane gateway"]
A2["Agent 2"] -->|"lane B"| G
A3["Agent 3"] -->|"lane C"| G
G -->|"private token A"| R["Official Penpot MCP router"]
G -->|"private token B"| R
G -->|"private token C"| R
R <-->|"plugin WebSocket A"| T1["Penpot tab A"]
R <-->|"plugin WebSocket B"| T2["Penpot tab B"]
R <-->|"plugin WebSocket C"| T3["Penpot tab C"]
E["Potlane Chrome extension"] --> T1
E --> T2
E --> T3
The extension is required because it owns tabs and visible official plugin iframes. The gateway is required because a Manifest V3 extension cannot expose the localhost MCP HTTP endpoint expected by agent clients. Docker and a Penpot fork are not required.
Inside one lane, calls are queued because Penpot plugin code runs in mutable tab-local state. Different lanes have independent queues, so they can execute simultaneously. The gateway persists an in-flight mutation before dispatch; any ambiguous result quarantines that lane until a human- or agent-verified reconciliation.
Install
Requirements:
- Node.js
22.23+(Node.js 24 LTS recommended) - Chrome
114+ - Penpot
2.17+with the official MCP service enabled in multi-user mode
1. Start the gateway
npx potlane
The gateway listens only on 127.0.0.1:4711 by default. On startup it writes a ready-to-use private
orchestrator configuration to the mcp.json path printed in the terminal. The file is mode 0600 and lives
beside runtime state in .potlane/.
Run npx potlane --help to see the supported environment variables. Keep the gateway terminal open while
agents use Potlane.
2. Install the Chrome extension
Install Potlane from the Chrome Web Store, then pin it and open its side panel.
For an unreleased development build:
git clone https://github.com/webcredo/potlane.git
cd potlane
corepack enable
pnpm install --frozen-lockfile
pnpm build
Open chrome://extensions, enable Developer mode, choose Load unpacked, and select
apps/extension/.output/chrome-mv3.
[!NOTE] Use the gateway and extension from the same Potlane release. The Chrome Web Store and signed source-build IDs are trusted by default; a differently signed build must set
POTLANE_EXTENSION_IDSfor the gateway.
3. Complete the one-time Penpot setup
- Disable Penpot's built-in single-tab MCP connection.
- In a Penpot workspace, open Plugins and install the official manifest:
http://localhost:9001/plugins/mcp/manifest.json. - Give the official plugin the requested permissions. Penpot stores that install for the signed-in user, not once per project.
- Add the generated private
mcp.jsonto Codex, Claude, or another MCP orchestrator.
Potlane can detect whether the official plugin is installed, but it cannot silently grant plugin permissions. That one-time confirmation remains a user action.
4. Create lanes through MCP
Ask the orchestrator to call potlane_create_lane for every independent task. New MCP-created lanes carry
automatic provisioning intent: Potlane creates a dedicated background Penpot tab, opens the installed
official plugin, rotates a private routing token, and brings the lane to ready without side-panel
interaction.
The main orchestrator endpoint owns lane creation, selection, pause, recovery, and scope updates. If separate
agent processes need hard lane-level capabilities, obtain each agent's config from the authenticated
GET /api/lanes/:id/mcp-config endpoint. That scoped endpoint cannot list, select, pause, rebind, or call
tools in another lane.
Every generated MCP configuration contains a local bearer token. Treat it like a password and never commit it, paste it into issues, or include it in screenshots.
Lane cleanup and recovery
- Closing one Potlane-managed tab records durable deletion intent. The lane is deleted as soon as it is idle, including after a temporary gateway outage.
- Closing an entire Chrome window preserves lanes so Chrome session restore can reconnect them.
- A live replacement binding cancels stale deletion intent.
- The side panel can delete one lane or all lanes only after an explicit confirmation.
- Busy, in-flight, uncertain, or recovery lanes are never deleted by browser cleanup.
- A failed mutation is never retried automatically. Inspect the design, replace the old tab/plugin execution context, and explicitly reconcile the quarantined lane.
This behavior prevents both immortal agent lanes and unsafe cleanup of work that may still be running.
Developer setup
Potlane is a pnpm monorepo:
| Path | Responsibility |
|---|---|
apps/gateway |
Public potlane npm CLI, MCP server, lane registry, upstream routing, audit log |
apps/extension |
WXT/React Chrome MV3 extension, tab lifecycle, plugin discovery, side panel |
packages/protocol |
Shared strict types, lane status, scope overlap, safe-delete rules |
scripts/test-penpot-rc.ts |
Live integration harness for the real Penpot MCP router |
docs |
Architecture, compatibility contract, development guide, and E2E evidence |
Start both development processes:
corepack enable
pnpm install --frozen-lockfile
pnpm dev
WXT writes the unpacked extension to apps/extension/.output/chrome-mv3. After background/content-script
changes, use Reload on chrome://extensions; after side-panel-only changes, reopening the panel is often
enough. Keep the gateway in a separate terminal so its logs remain visible.
pnpm package:extension creates the Chrome Web Store artifact in an isolated production output. The
resulting ZIP does not contain the local manifest key; the unpacked development output keeps that public
key so its extension ID remains stable between rebuilds.
Before opening a pull request:
pnpm verify # formatting/lint, strict types, unit tests, production builds
pnpm test:integration:penpot # real local Penpot router + mock plugin sockets
pnpm package:extension # Chrome Web Store zip
pnpm --filter potlane pack # npm tarball
Unit tests never require Docker, Chrome, or a live Penpot. The integration harness requires the local Penpot MCP service but does not edit a real design. Manual release validation is documented in docs/development.md.
When changing lifecycle code, preserve these invariants:
- one active binding per lane and one lane per managed tab;
- status reports must match both the bound tab ID and token generation;
- no automatic retry after a mutation may have reached the plugin;
- no deletion while work is busy, in-flight, uncertain, or recovering;
- no credentials, tool arguments, code, results, or raw private URLs in audit events.
Read CONTRIBUTING.md before your first change. Pull requests should explain the user-visible result, routing/lifecycle risk, test evidence, and any Penpot upstream behavior they depend on.
Security and boundaries
Potlane isolates execution contexts and routing, not Penpot permissions. Every lane still acts as the same signed-in user. Scope declarations are coordination warnings, not a security sandbox; agents can conflict if they intentionally edit the same Penpot object.
The gateway binds to loopback, protects MCP with a random local bearer secret, validates the exact Chrome
extension request shape, and never returns gateway or lane secrets in public state. Local state, generated
MCP configs, and audit logs are written under .potlane/ and must remain private. See
SECURITY.md for the threat model and private reporting instructions.
Documentation
- Architecture and lifecycle
- Developer and release guide
- Penpot compatibility contract
- Real three-agent E2E evidence
- Privacy policy
- Chrome Web Store listing copy
- Changelog
Support the project
If Potlane saves you time, you can support continued maintenance on Ko-fi:
Contributions, reproducible bug reports, and careful compatibility testing are equally valuable.
Apache License 2.0. See LICENSE.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。