Potlane

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.

Category
Visit Server

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.

CI npm version Chrome extension License Buy me a coffee on Ko-fi

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_IDS for the gateway.

3. Complete the one-time Penpot setup

  1. Disable Penpot's built-in single-tab MCP connection.
  2. In a Penpot workspace, open Plugins and install the official manifest: http://localhost:9001/plugins/mcp/manifest.json.
  3. Give the official plugin the requested permissions. Penpot stores that install for the signed-in user, not once per project.
  4. Add the generated private mcp.json to 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

Support the project

If Potlane saves you time, you can support continued maintenance on Ko-fi:

Support Potlane on Ko-fi

Contributions, reproducible bug reports, and careful compatibility testing are equally valuable.

Apache License 2.0. See LICENSE.

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured