Files
paperclip-docs/docs/reference/deploy/docker.md
T
2535f6c99c Release docs for paperclip v2026.1012.0 (#149)
## Summary

Release docs for Paperclip **v2026.1012.0** (parent tag commit
`bba6a45f`).

- **Window:** `v2026.1005.0` → `v2026.1012.0`. That is 132 commits and
1,242 files, with no compare truncation.
- **Branch:** cut from `nightly` (`fe556e1`). Nightly had drafted
against parent master up to `abbd8800`. The release was cut from master
at `22a3ea3` (Oct 6), so nightly's last 39 commits are post-tag.
- **Review:** every changed page was checked by hand against a checkout
of the tag. The tag-accuracy gate was then re-run on the result.

**Headline doc changes:**
- **New pages:**
- [Assistant connections
(MCP)](docs/experimental/assistant-connections.md), with the [Assistant
MCP API](docs/reference/api/assistant-mcp.md) and [`paperclipai
mcp`](docs/reference/cli/mcp.md) references
- [Saved connection
instructions](docs/connectors/connection-instructions.md)
  - [Check AI account usage](docs/connectors/ai-usage.md)
- [Task-pinned AI routing](docs/experimental/task-pinned-ai-routing.md)
  - [Neon](docs/connectors/neon.md)
- **Breaking changes documented:**
- Restore locks moved to SQLite (#14869). [Update
Paperclip](docs/how-to/update-paperclip.md) now has a "stop everything
first" upgrade and rollback flow.
- Stored tool grants are enforced as written (#14915). This is covered
in the [Tool Gateway API](docs/reference/api/tool-gateway.md) and the
[Access model](docs/connectors/access-model.md).
- **Other release coverage:**
- The connection-instructions contract for HTTP and process adapters
(`connectionInstructions`, `PAPERCLIP_CONNECTION_INSTRUCTIONS_FILE`).
- Much shorter default instructions, and default config grants for new
agents.
  - The `update_skill` tool.
  - Aggregator accounts gathered into one catalog.
  - Chat-first navigation and the combined inbox.
  - The rebuilt New task dialog.
  - "Model at capacity" and "Model unavailable".
  - Sonnet 5.5, GPT-6.1 Sol and new harness pins.
- The supported remote Codex range, and Codex resuming after a server
restart.
  - Watchdog thresholds of 5 and 15 minutes.
  - `tool_discovery_busy`.
  - The Docker provider pack.
- A changelog entry, and 75 pages stamped `paperclip_version:
v2026.1012.0`.

### ⚠ Post-tag leaks removed

These document parent `master` features that are **not in
v2026.1012.0**. They stay on `nightly` for the next release.

- **Pages removed (7):**
  - `administration/agent-commentary.md` (b508a05c)
  - `guides/org/agent-identity.md` (a590ab76)
  - `reference/cli/runtime.md` (a6306ba6)
  - `connectors/custom-model-providers.md` (9f7057e1)
  - `connectors/enterpret.md` (88ff98b8)
  - `connectors/superagent.md` (8cbd21b3)
  - `connectors/telem.md` (f77fcbf4)

Their nav entries and catalog rows are already removed, and no page
links to them.
- **Reverted to `main`:**
- `roles-and-permissions.md`, `administration/company.md` and
`add-a-human-teammate.md`. Operator's 14 default keys come from
582911ba.
- The costs guide and `api/costs.md`. Durable accounting, by-user costs
and per-account quota come from 799e4d55, eab93fd4 and 892b0b36.
  - `adapters/cursor-local.md` (a6306ba6)
- `deploy/database.md` and `deploy/environment-variables.md`, which
carried agent identity and complaints.
  - `browser-use-cloud.md`
  - `back-up-and-restore-a-company.md`
- **Sections trimmed:**
- The assistant MCP pages now match the tag:
`paperclip:read`/`paperclip:write`/`offline_access` only, 10 direct
tools, and no file transfer (2d0c1381, 99a9de99).
- Server-host sign-in for Anthropic, OpenAI and xAI is back to the
terminal-command flow (e38d6d16, 2ca0d26a).
  - OpenRouter is OpenCode-only again (9f7057e1).
  - Requested vs granted OAuth scopes are removed (ea8e6861).
  - PR review waits are removed (228f0e28).
- Historical-question reminders and "No project" in the composer are
removed (faa8e452, ee3c728b).
  - Plugin lifecycle hooks are removed (1cebdd4c).
  - Cursor on the Runner is removed (a6306ba6).
  - The aggregator "Waiting for sign-in" status is removed.
  - Source links pinned to post-tag commits now point at the tag commit.

### ⚠ Drift

Checked against the tag:
- **High:** the `operator` default grants were **real** drift. Fixed by
reverting the post-tag tables.
- **High:** the agent-identity paths and env vars were real at nightly
but are post-tag. They're removed (see above).
- **High:** `PAPERCLIP_WORKSPACE_GIT_SCAN_*`,
`PAPERCLIP_WORKSPACE_GIT_SNAPSHOT_TIMEOUT_MS`, `PAPERCLIP_RUNNER_API_*`
and `PAPERCLIP_CLOUD_CONNECTOR_*` are known false positives. They are
read through helpers the checker doesn't scan.
- **High:** `PAPERCLIP_ID_CONNECTOR_*` is documented as retired, which
is intentional.
- Verify: the `/accounting/*`, `costs/by-user` and
`agents/{id}/identity` routes are no longer documented, because they're
post-tag.
- Verify: `agent-avatars`, `companies/import/transfers*` and
`chats/{agentRef}` are known param/constant-registration false
positives.

### ⚠ Verification Failures / review notes

- **`reference/cli/mcp.md`:** the gate flags `--device` and `--url`.
This is a false positive: both are `requiredOption`s in
`cli/src/commands/mcp.ts` at the tag.
- **New pages the gate can't auto-confirm:** each was verified by hand
at the tag. They are assistant-connections, task-pinned-ai-routing,
ai-usage and connection-instructions.
- **`neon.md`:** says "open **Connectors**", following the Supabase
guide. The parent's notes call the screen "Apps → Browse".
- **`connection-intents.md`:** the AgentMail card details ("shares the
key with every person in the company", "resumes after reload") are only
partly confirmed.
- **`task-chat.md`:** the queued-message details came from an earlier
nightly and couldn't be traced to a specific commit.
- **Upstream inconsistency:** the Codex adapter's in-code doc string
(`codex-local/src/index.ts:181`) contradicts the code about the bypass
flag. Our docs follow the code.

### Screenshots

**126 of 350 screenshots are stale** across 26 routes (see
`SCREENSHOTS_PENDING.md`). None were recaptured in this PR.

### Other open PRs

- **#143** (Browser Use Cloud + Neon, targets `main`): both are now
covered here. Suggest closing it.
- **#140** (Enterpret, targets `main`): Enterpret is post-tag
(88ff98b8). Suggest retargeting it to `nightly` or closing it.

## Checks

- [x] `npm run docs:build`
- [x] `npm run docs:test` (all suites)
- [x] `sync:lint-links` and `sync:verify-nav`. The only orphans are the
7 pages above plus 4 intentional ones.
- [x] `check-tag-accuracy` re-run. The only remaining flags are the ones
explained above.
- [x] Removed the 7 post-tag pages listed above (`cbece5b`), plus fixes
from a second, independent verification pass
- [ ] After the squash-merge, run `node scripts/sync/realign-nightly.mjs
release/v2026.1012.0 --push`, then flip `nightly`'s `.sync-state.json`
back to `branch_mode: nightly`.
- [ ] Confirm the `docs/v2026.1012.0` tag and that docs.paperclip.ing
serves the new changelog entry.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>
Co-authored-by: DevRel Gemini <[email protected]>
Co-authored-by: Paperclip <[email protected]>
Co-authored-by: Dotta <[email protected]>
Co-authored-by: ClaudeCoder <[email protected]>
2026-10-13 13:45:13 +02:00

5.5 KiB

paperclip_version, seo_title, seo_description
paperclip_version seo_title seo_description
v2026.1012.0 Deploy Paperclip with Docker Run a self-contained instance without installing Node or pnpm on the host. Covers the quickstart image, manual builds, and configuration.

Docker

Use Docker when you want a self-contained Paperclip instance without installing Node or pnpm on the host machine.

This page covers the quickstart image, the manual image build, the cloud image variant, and what persists between container restarts.


Compose Quickstart

The recommended path is the compose-based quickstart:

docker compose -f docker/docker-compose.quickstart.yml up --build

Open the app at:

http://localhost:3100

Defaults:

  • host port 3100
  • data directory ./data/docker-paperclip

Override them with environment variables:

PAPERCLIP_PORT=3200 PAPERCLIP_DATA_DIR=../data/pc \
  docker compose -f docker/docker-compose.quickstart.yml up --build

Note: PAPERCLIP_DATA_DIR is resolved relative to the compose file in docker/, so ../data/pc maps to data/pc in the repository root.


Manual Image Build

If you want a plain container run instead of compose, build and start the image manually:

docker build --target production -t paperclip-local .
docker run --name paperclip \
  -p 3100:3100 \
  -e HOST=0.0.0.0 \
  -e PAPERCLIP_HOME=/paperclip \
  -v "$(pwd)/data/docker-paperclip:/paperclip" \
  paperclip-local

Use this when you want tight control over the container lifecycle or are embedding Paperclip into a larger Docker workflow.

Note: Name the production stage explicitly. The Dockerfile declares a cloud stage after production, and a build with no --target picks the last stage in the file — so leaving it off would quietly give you the cloud variant instead. Paperclip's own published image is pinned the same way.


Cloud Image Variant

Paperclip publishes a second image alongside the regular one: the cloud variant. If you are self-hosting, you almost certainly want the plain tag. The cloud variant exists for managed deployments and carries extra weight you do not need.

The only difference is what is pre-built inside it. The cloud variant is the production image plus a small set of sandbox-provider plugins that have already been compiled. Managed instances receive a plugins.autoInstall list through PAPERCLIP_MANAGED_CONFIG and install those plugins from the bundled catalog at boot, which works only when each plugin's dist/ output is already present in the image. The default image ships the plugin source but not the build output, so auto-install skips those plugins and logs that the bundle is not present.

Cloud images are published under the same tag set as the regular image, each tag carrying a -cloud suffix:

  • sha-<short>-cloud
  • latest-cloud
  • <version>-cloud

You can build the variant yourself by naming the cloud stage:

docker build --target cloud -t paperclip-cloud .

Which plugins get built in is controlled by the CLOUD_BUNDLED_PLUGINS build argument — a space-separated list of directory names under packages/plugins/sandbox-providers. It defaults to daytona:

docker build --target cloud \
  --build-arg CLOUD_BUNDLED_PLUGINS="daytona" \
  -t paperclip-cloud .

Every name you add pulls that plugin's dependencies into the image, so keep the list to what your deployment actually auto-installs. An unknown directory name fails the build rather than shipping a variant that is quietly missing a plugin.


What Persists

All persistent data lives under the bind mount:

  • embedded PostgreSQL data
  • uploaded assets
  • the local secrets key
  • agent workspace data

If the bind mount is removed, the instance starts fresh on the next run.


LLM Adapter Support

The Docker image pre-installs the local CLI tools used by the built-in local adapters, so they work inside the container out of the box:

  • claude for claude_local
  • codex for codex_local
  • opencode for opencode_local
  • gemini for gemini_local

The image sets GEMINI_SANDBOX=false so the Gemini CLI runs safely inside the container without its own sandbox layer.

If you want those adapters to run inside the container, pass the relevant API keys:

docker run --name paperclip \
  -p 3100:3100 \
  -e HOST=0.0.0.0 \
  -e PAPERCLIP_HOME=/paperclip \
  -e OPENAI_API_KEY=sk-... \
  -e ANTHROPIC_API_KEY=sk-... \
  -e GEMINI_API_KEY=... \
  -v "$(pwd)/data/docker-paperclip:/paperclip" \
  paperclip-local

Without those keys, the app still runs. The adapter environment test will simply report missing prerequisites for the relevant adapter.

Remote runner provider pack

The standard image also bundles the remote runner's provider pack at /opt/paperclip-runner/provider-pack and points PAPERCLIP_RUNNER_REMOTE_PROVIDER_PACK_PATH at it. Remote OpenCode and ACPX runs need that pack, so with it in place they no longer fail with runner_remote_provider_artifact_incompatible.

If you build your own image on top of the standard one, you inherit the pack automatically. If you build from source, pass the full 40-character Git SHA as a build argument — the pack only builds when the commit is known, and a local build without it skips the pack with a log line:

docker build --target production \
  --build-arg PAPERCLIP_BUILD_COMMIT="$(git rev-parse HEAD)" \
  -t paperclip-local .

Tip: If you are testing adapter behavior inside Docker, verify the bind mount first. Most surprising failures come from lost state, not the container image itself.