@edspencer/paddock

中文文档
0.83.1发布于 2026/11/05MITES Module构建来源已验证近 30 天下载 2175

Project-first launchpad for Claude Code: server-hosted, persistent, resumable sessions organized by project.

原始使用文档
文档目录8 节
  1. Credentials
  2. What else Paddock does and does not take from your ~/.claude
  3. Open your own projects
  4. Options
  5. Security
  6. Requirements
  7. Other ways to run it
  8. Links

Paddock

Project-first launchpad for Claude Code — server-hosted, persistent, resumable sessions organized by project, in a web UI.

npx @edspencer/paddock

Then open http://127.0.0.1:7233.

Or point it at work you've already done — see Open your own project.

First run downloads ~250 MB. Paddock drives Claude Code, and the Claude Agent SDK ships a per-platform binary of that size. It cannot be skipped — installing with --omit=optional produces a Paddock whose chats all fail. Later runs reuse the npm cache and start immediately. For repeated use, npm i -g @edspencer/paddock is friendlier than bare npx.

Credentials

Paddock runs Claude Code on your behalf, so it needs Claude credentials:

claude setup-token                  # Claude Max/Pro
export ANTHROPIC_API_KEY=sk-ant-…   # or API billing

If you already use Claude Code on this machine, there is nothing to do. Paddock keeps a Claude home of its own under the data dir, but not a login of its own: it uses the one you already have — the macOS Keychain entry on a Mac, your ~/.claude/.credentials.json elsewhere (symlinked in, never copied). Reading a login writes nothing, and nothing else is shared with it.

To give Paddock its own instead, set claude: { credentials: own } in <data-dir>/paddock.config.yaml; a login is then a token in the environment as above, or a one-off CLAUDE_CONFIG_DIR=<data-dir>/claude-home claude login. Either way, Paddock says at startup if it can find no credentials at all.

What else Paddock does and does not take from your ~/.claude

Apart from that login: nothing, by default. Your CLAUDE.md, agents/, commands/ and plugins/ are not loaded, the hooks your settings.json binds to tool use do not run, your transcripts are not touched, and your ~/.claude.json MCP servers are not attached. Each is one key in <data-dir>/paddock.config.yaml:

claude:
  transcripts: host    # own | host, default own — whose session transcripts
  credentials: host    # own | host, default host — the one shared by default
  instructions: host   # own | host, default own — CLAUDE.md, agents, commands, plugins
  hooks: host          # own | host, default own — shell commands settings.json binds
  mcpServers: host     # own | host, default own — the servers in your ~/.claude.json

instructions: own is worth knowing about if you have curated a ~/.claude/CLAUDE.md: your Paddock agents will not see it until you set host. Each project's own CLAUDE.md always applies. hooks is off by default because inheriting someone's shell commands is not a thing to discover after the fact; the rest of your settings.json — permissions, model, statusline — applies either way.

To give this instance an MCP server your machine does not have — the case host cannot serve — declare it in a sibling mcpServers: block of the same file, using env:VAR_NAME anywhere a string goes so the token stays out of the git-tracked file (keep driveMode on its default session for a server holding a credential — batch passes the definition to claude as a command-line argument, where any local user can read it):

mcpServers:
  notion:
    command: npx
    args: ["-y", "@notionhq/notion-mcp-server"]
    env:
      NOTION_TOKEN: env:NOTION_TOKEN

Open your own projects

A brand-new instance is empty, so it opens on Discover. That reads your Claude Code history, works out which directories on this machine you have actually been using claude in, and offers them as projects — with conversation counts, last-used dates and git remotes, so you can tell them apart.

Tick the ones you want and press Import. Each becomes a project pointing at that directory, with its conversations copied in as chats you can resume — so instead of an empty instance you are looking at your own work. Expand a row first if you would rather pick individual conversations than take the lot. Discover stays in the sidebar afterwards; it is not only a first-run screen.

Nothing is written into the directories you import. No .paddock/, no .chats/, no .gitignore edit, no CLAUDE.md. The project record and the copied transcripts both live in the data dir, and the project simply points at the path.

Your ~/.claude is not touched either. Transcripts are copied, with their timestamps preserved — the originals are never moved or deleted, and your terminal claude keeps working exactly as before. To share one set of transcripts between Paddock and your terminal rather than keeping a copy, set claude: { transcripts: host } in <data-dir>/paddock.config.yaml. (Your login is already shared, which is why there is nothing to log into — see Credentials above.)

Options

  -p, --port <port>       HTTP/WS port (default 7233)
      --host <host>       Bind address (default 127.0.0.1)
  -d, --data-dir <path>   Projects + state (default ~/.paddock)
  -o, --open              Open the app in your browser once it is listening
      --verbose           Show the server's own logs (quiet by default)
  -v, --version           Print the version
  -h, --help              Show help

Your projects, chats and settings persist between runs in ~/.paddock, or wherever --data-dir points. It is one directory: move it to move your instance, delete it to start over. Where you run paddock from has no effect on which instance you get.

Security

Paddock binds loopback only with authentication disabled, which is the right default for a laptop. It refuses to start if you bind a routable interface while auth is off — to expose it on a network, configure PADDOCK_AUTH_MODE first. See AUTH.md.

Requirements

Node.js 22 or newer.

Other ways to run it

A multi-arch Docker image is published alongside this package, and is the better fit for a server deployment:

docker run -d -p 127.0.0.1:7233:7233 -v /srv/paddock-data:/data \
  -e CLAUDE_CODE_OAUTH_TOKEN=… \
  -e PADDOCK_DANGEROUSLY_ALLOW_OPEN=1 \
  ghcr.io/edspencer/paddock:latest

PADDOCK_DANGEROUSLY_ALLOW_OPEN=1 is required: the image binds 0.0.0.0 and the default auth mode is none, and Paddock refuses to bind a routable interface unauthenticated unless told to. Publishing on 127.0.0.1: is what makes that safe — Paddock runs code and spends Claude tokens, so put an auth mode or a reverse proxy in front of it before exposing the port to a network.

MIT © Ed Spencer

版本与发布记录

@edspencer/paddock 共发布 47 个版本,首次发布于 2026/08/03;过去 12 个月发布了 47 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.83.1latest2026/11/058 天前
0.83.02026/11/058 天前
0.82.12026/11/058 天前
0.82.02026/11/058 天前
0.81.02026/11/058 天前
0.80.02026/11/058 天前

其他发布通道:bootstrap → 0.0.1。

关于 @edspencer/paddock 的常见问题

@edspencer/paddock 是什么?

Project-first launchpad for Claude Code: server-hosted, persistent, resumable sessions organized by project.

如何安装 @edspencer/paddock?

在项目目录运行 npm install @edspencer/paddock,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 paddock,可以用 npx paddock 直接运行。

@edspencer/paddock 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/edspencer__paddock 是否存在。

@edspencer/paddock 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@edspencer/paddock 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=22。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@edspencer/paddock 可以商用吗?

@edspencer/paddock 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@edspencer/paddock 的下载量有多少?

根据 npm 官方下载统计,@edspencer/paddock 在 2026/10/13 – 2026/11/11 这 30 天内被下载 2,175 次,日均约 73 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@edspencer/paddock 还在维护吗?

最新版本 0.83.1 发布于 2026/11/05(8 天前);至今共发布 47 个版本,其中过去 12 个月发布了 47 个;首次发布于 2026/08/03。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。