papercliped 2.2.1 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +6 -0
- package/README.md +8 -4
- package/dist/site/markdown.js +26 -5
- package/dist/site/site.js +8 -1
- package/package.json +1 -1
- package/site/docs/connect-your-paperclip.md +139 -93
- package/site/docs/faq.md +10 -1
- package/site/docs/getting-started.md +1 -1
- package/site/docs/host-coolify.md +78 -0
- package/site/docs/host-fly.md +129 -0
- package/site/docs/host-railway.md +105 -0
- package/site/docs/host-render.md +79 -0
- package/site/docs/host-vps.md +202 -0
- package/site/docs/hosting.md +105 -0
- package/site/docs/prompts.md +349 -0
- package/site/docs/signup.md +1 -1
- package/site/docs/troubleshooting.md +7 -1
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# Host Paperclip on Fly.io
|
|
2
|
+
|
|
3
|
+
Fly.io runs the official Paperclip image on a small virtual machine in the region you pick, with a volume for its data and a free `https://` address. Everything happens from the `fly` command line.
|
|
4
|
+
|
|
5
|
+
**You'll end up with:** Paperclip at `https://<app>.fly.dev` (or your own domain), always on, connected to Papercliped.
|
|
6
|
+
|
|
7
|
+
**Time:** about 20 minutes. **Cost:** a `shared-cpu-1x` machine with 2 GB is about $11 a month, `shared-cpu-2x` with 4 GB about $22, plus the volume ($0.15 per GB a month). Fly has no free allowance for new accounts and needs a card. Check Fly's pricing page for current numbers.
|
|
8
|
+
|
|
9
|
+
## Before you start
|
|
10
|
+
|
|
11
|
+
Install `flyctl` (see Fly's install page; on macOS `brew install flyctl`, on Linux `curl -L https://fly.io/install.sh | sh`, on Windows `pwsh -Command "iwr https://fly.io/install.ps1 -useb | iex"`), then:
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
fly auth login
|
|
15
|
+
mkdir paperclip-fly && cd paperclip-fly
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## 1. Create the app
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
fly launch --image ghcr.io/paperclipai/paperclip:latest --no-deploy
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Pick an app name (this becomes `https://<app>.fly.dev`) and a region near you. Say **no** to any database Fly offers; Paperclip brings its own.
|
|
25
|
+
|
|
26
|
+
## 2. Create the volume
|
|
27
|
+
|
|
28
|
+
Use the same region you picked (for example `iad`, `lhr`, `fra`, `syd`):
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
fly volumes create paperclip_data --size 10 --region iad
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 3. Write `fly.toml`
|
|
35
|
+
|
|
36
|
+
Replace the file `fly launch` made with this, changing `app`, `primary_region` and the URL:
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
app = "your-app-name"
|
|
40
|
+
primary_region = "iad"
|
|
41
|
+
|
|
42
|
+
[build]
|
|
43
|
+
image = "ghcr.io/paperclipai/paperclip:latest"
|
|
44
|
+
|
|
45
|
+
[env]
|
|
46
|
+
PAPERCLIP_DEPLOYMENT_MODE = "authenticated"
|
|
47
|
+
PAPERCLIP_DEPLOYMENT_EXPOSURE = "public"
|
|
48
|
+
PAPERCLIP_PUBLIC_URL = "https://your-app-name.fly.dev"
|
|
49
|
+
PORT = "3100"
|
|
50
|
+
|
|
51
|
+
[[mounts]]
|
|
52
|
+
source = "paperclip_data"
|
|
53
|
+
destination = "/paperclip"
|
|
54
|
+
|
|
55
|
+
[http_service]
|
|
56
|
+
internal_port = 3100
|
|
57
|
+
force_https = true
|
|
58
|
+
auto_stop_machines = "off"
|
|
59
|
+
auto_start_machines = true
|
|
60
|
+
min_machines_running = 1
|
|
61
|
+
|
|
62
|
+
[[http_service.checks]]
|
|
63
|
+
method = "GET"
|
|
64
|
+
path = "/api/health"
|
|
65
|
+
interval = "30s"
|
|
66
|
+
timeout = "5s"
|
|
67
|
+
grace_period = "60s"
|
|
68
|
+
|
|
69
|
+
[[vm]]
|
|
70
|
+
size = "shared-cpu-2x"
|
|
71
|
+
memory = "4gb"
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
`auto_stop_machines = "off"` matters: a stopped machine stops your agents mid-task.
|
|
75
|
+
|
|
76
|
+
## 4. Add the secrets and deploy
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
fly secrets set BETTER_AUTH_SECRET=$(openssl rand -hex 32) PAPERCLIP_TOOL_ACTION_SIGNING_SECRET=$(openssl rand -hex 32)
|
|
80
|
+
fly deploy --ha=false
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Add your agents' keys the same way if you use them: `fly secrets set ANTHROPIC_API_KEY=... OPENAI_API_KEY=...`.
|
|
84
|
+
|
|
85
|
+
`--ha=false` keeps it to **one machine**: a volume belongs to one machine, and two copies of Paperclip must never share data.
|
|
86
|
+
|
|
87
|
+
## 5. Create your account
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
fly ssh console
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Inside the machine:
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
HOME=/paperclip gosu node npx --yes paperclipai auth bootstrap-ceo --data-dir /paperclip --base-url https://your-app-name.fly.dev
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Open the invite link it prints, create your account and your first company. Optionally close public sign-ups afterwards: `fly secrets set PAPERCLIP_AUTH_DISABLE_SIGN_UP=true`.
|
|
100
|
+
|
|
101
|
+
To sign agents in with a subscription instead of keys, run `HOME=/paperclip gosu node claude` (or `codex`) in the same console. The login is saved on the volume.
|
|
102
|
+
|
|
103
|
+
## 6. Your own domain (optional)
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
fly certs add paperclip.yourdomain.com
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Create the DNS records it prints, then change `PAPERCLIP_PUBLIC_URL` in `fly.toml` to the new address and `fly deploy` again.
|
|
110
|
+
|
|
111
|
+
## 7. Check and connect
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
curl https://your-app-name.fly.dev/api/health
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
You want `"status":"ok"`, `"deploymentExposure":"public"` and `"bootstrapStatus":"ready"`. Then [connect Papercliped](/docs/hosting#connect-papercliped) and send *"Catch me up on my Paperclip."*
|
|
118
|
+
|
|
119
|
+
## Updates and backups
|
|
120
|
+
|
|
121
|
+
- **Update:** `fly deploy` pulls the newest `latest` image. It restarts the machine, so runs in progress stop; update when agents are idle.
|
|
122
|
+
- **Backups:** Fly snapshots volumes daily (`fly volumes snapshots list`). Keep your own copy for anything important.
|
|
123
|
+
|
|
124
|
+
## Troubleshooting
|
|
125
|
+
|
|
126
|
+
- **Health check failing:** `fly logs`. Usually a missing secret or a public URL without `https://`.
|
|
127
|
+
- **"This hostname is not allowed":** `PAPERCLIP_PUBLIC_URL` doesn't match the address you opened.
|
|
128
|
+
- **Two machines running:** `fly scale count 1`. Never run more than one.
|
|
129
|
+
- More: [Troubleshooting](/docs/troubleshooting).
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Host Paperclip on Railway
|
|
2
|
+
|
|
3
|
+
Railway runs the official Paperclip image for you: no server to look after, a free `https://` address, and a dashboard for everything. The fewest steps of any always-on option.
|
|
4
|
+
|
|
5
|
+
**You'll end up with:** Paperclip at `https://<name>.up.railway.app` (or your own domain), its data on a Railway volume, connected to Papercliped.
|
|
6
|
+
|
|
7
|
+
**Time:** about 15 minutes. **Cost:** Railway bills by usage. Paperclip with 1–2 GB of memory, always on, is roughly **$10–25 a month** on the Hobby plan ($5 a month including $5 of usage). Railway's free plan is too small for Paperclip (0.5 GB of memory). Check Railway's pricing page for current numbers.
|
|
8
|
+
|
|
9
|
+
## Before you start
|
|
10
|
+
|
|
11
|
+
- A Railway account on the **Hobby** plan (or the trial, to try it).
|
|
12
|
+
- Two random secrets. Make each with `openssl rand -hex 32`, or have your password manager generate a 64-character password of letters and numbers.
|
|
13
|
+
|
|
14
|
+
> **About community templates:** Railway's template gallery has community-made Paperclip templates. They're not made by Paperclip or by us. They can be quicker, but check that they set `PAPERCLIP_DEPLOYMENT_EXPOSURE=public` and attach a volume at `/paperclip`. The steps below use the official image directly, so you know exactly what's running.
|
|
15
|
+
|
|
16
|
+
## 1. Create the service
|
|
17
|
+
|
|
18
|
+
1. In Railway, **New Project → Docker Image** (or **Deploy a Docker Image**).
|
|
19
|
+
2. Image: `ghcr.io/paperclipai/paperclip:latest`. Railway creates the service and starts a first deploy; it's fine if that one doesn't work yet.
|
|
20
|
+
|
|
21
|
+
## 2. Add the volume
|
|
22
|
+
|
|
23
|
+
Right-click the service (or use the command palette) → **Attach Volume**. Mount path: **`/paperclip`**. This is where Paperclip keeps its database, secrets key, uploads, workspaces and agent logins. Without it, everything is lost on each deploy.
|
|
24
|
+
|
|
25
|
+
## 3. Get your address
|
|
26
|
+
|
|
27
|
+
Service → **Settings → Networking → Generate Domain**. If Railway asks for the port, enter **3100**. Note the address, like `https://paperclip-production-1234.up.railway.app`.
|
|
28
|
+
|
|
29
|
+
Want your own domain? Use **Custom Domain** instead, add the CNAME record Railway shows at your DNS provider, and use that address below.
|
|
30
|
+
|
|
31
|
+
## 4. Add the settings
|
|
32
|
+
|
|
33
|
+
Service → **Variables → Raw Editor**, paste and fill in:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
PAPERCLIP_DEPLOYMENT_MODE=authenticated
|
|
37
|
+
PAPERCLIP_DEPLOYMENT_EXPOSURE=public
|
|
38
|
+
PAPERCLIP_PUBLIC_URL=https://YOUR-ADDRESS
|
|
39
|
+
BETTER_AUTH_SECRET=YOUR-FIRST-SECRET
|
|
40
|
+
PAPERCLIP_TOOL_ACTION_SIGNING_SECRET=YOUR-SECOND-SECRET
|
|
41
|
+
PORT=3100
|
|
42
|
+
ANTHROPIC_API_KEY=
|
|
43
|
+
OPENAI_API_KEY=
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
`PAPERCLIP_PUBLIC_URL` must be exactly your address from step 3, with `https://` and no slash at the end. Leave the API keys empty if you'll sign agents in with a subscription (step 7).
|
|
47
|
+
|
|
48
|
+
**Optional managed database:** add a Postgres from **New → Database → PostgreSQL** and set `DATABASE_URL=${{Postgres.DATABASE_URL}}`. Without it Paperclip uses its built-in Postgres on the volume, which is cheaper and fine for most people.
|
|
49
|
+
|
|
50
|
+
## 5. Health check and memory
|
|
51
|
+
|
|
52
|
+
- Service → **Settings → Deploy → Healthcheck Path:** `/api/health`.
|
|
53
|
+
- Keep **serverless / app sleeping off**. A sleeping Paperclip stops your agents.
|
|
54
|
+
- Watch memory in the **Metrics** tab for the first days; you pay per GB used.
|
|
55
|
+
|
|
56
|
+
Deploy (Railway usually redeploys after variable changes; otherwise press **Deploy**).
|
|
57
|
+
|
|
58
|
+
## 6. Create your account
|
|
59
|
+
|
|
60
|
+
Install the Railway CLI (`npm i -g @railway/cli`), then in a terminal:
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
railway login
|
|
64
|
+
railway link
|
|
65
|
+
railway ssh
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Pick your project and service when asked. Inside the container:
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
HOME=/paperclip gosu node npx --yes paperclipai auth bootstrap-ceo --data-dir /paperclip --base-url https://YOUR-ADDRESS
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Open the invite link it prints, create your account and your first company. Then, optionally, add `PAPERCLIP_AUTH_DISABLE_SIGN_UP=true` to the variables to close public sign-ups.
|
|
75
|
+
|
|
76
|
+
## 7. Sign in your agents
|
|
77
|
+
|
|
78
|
+
Put `ANTHROPIC_API_KEY` / `OPENAI_API_KEY` in the variables, or sign in with a subscription from `railway ssh`:
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
HOME=/paperclip gosu node claude
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
The login is saved on the volume.
|
|
85
|
+
|
|
86
|
+
## 8. Check and connect
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
curl https://YOUR-ADDRESS/api/health
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
You want `"status":"ok"`, `"deploymentExposure":"public"` and `"bootstrapStatus":"ready"`. Then [connect Papercliped](/docs/hosting#connect-papercliped) and send *"Catch me up on my Paperclip."*
|
|
93
|
+
|
|
94
|
+
## Updates and backups
|
|
95
|
+
|
|
96
|
+
- **Update:** service → **Deployments → Redeploy** pulls the latest `latest` image. A service with a volume has a short downtime on each deploy, and runs in progress stop, so do it when agents are idle.
|
|
97
|
+
- **Backups:** Railway volumes have backups in the volume's settings; turn on scheduled backups. If you use Railway Postgres, it has its own backups.
|
|
98
|
+
|
|
99
|
+
## Troubleshooting
|
|
100
|
+
|
|
101
|
+
- **Deploy fails its health check:** look at the deploy logs. Usually a missing `BETTER_AUTH_SECRET`, or `PAPERCLIP_PUBLIC_URL` not starting with `https://`.
|
|
102
|
+
- **"This hostname is not allowed":** `PAPERCLIP_PUBLIC_URL` doesn't match the address you opened, or exposure isn't `public`.
|
|
103
|
+
- **Everything reset after a deploy:** the volume isn't mounted at exactly `/paperclip`.
|
|
104
|
+
- **Agents are killed or slow:** give the service more memory (2–4 GB).
|
|
105
|
+
- More: [Troubleshooting](/docs/troubleshooting).
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Host Paperclip on Render
|
|
2
|
+
|
|
3
|
+
Render runs the official Paperclip image as a web service with a persistent disk and a free `https://` address.
|
|
4
|
+
|
|
5
|
+
**You'll end up with:** Paperclip at `https://<name>.onrender.com` (or your own domain), its data on a Render disk, connected to Papercliped.
|
|
6
|
+
|
|
7
|
+
**Time:** about 15 minutes. **Cost:** Paperclip needs at least 2 GB of memory, which is Render's **Standard** instance (about $25 a month), plus the disk ($0.25 per GB a month; 10 GB is plenty to start). Render's free instances **sleep and can't have a disk**, and the 512 MB Starter instance is too small, so neither works for Paperclip. Check Render's pricing page for current numbers.
|
|
8
|
+
|
|
9
|
+
## Before you start
|
|
10
|
+
|
|
11
|
+
- A Render account with a payment method.
|
|
12
|
+
- Two random secrets. Make each with `openssl rand -hex 32`, or have your password manager generate a 64-character password of letters and numbers.
|
|
13
|
+
|
|
14
|
+
## 1. Create the web service
|
|
15
|
+
|
|
16
|
+
1. **New → Web Service → Existing Image** (deploy an existing image from a registry).
|
|
17
|
+
2. Image URL: `ghcr.io/paperclipai/paperclip:latest`.
|
|
18
|
+
3. Pick a region near you and the **Standard** instance type (2 GB) or larger.
|
|
19
|
+
|
|
20
|
+
## 2. Add the settings
|
|
21
|
+
|
|
22
|
+
Under **Environment Variables**, add:
|
|
23
|
+
|
|
24
|
+
| Key | Value |
|
|
25
|
+
| --- | --- |
|
|
26
|
+
| `PAPERCLIP_DEPLOYMENT_MODE` | `authenticated` |
|
|
27
|
+
| `PAPERCLIP_DEPLOYMENT_EXPOSURE` | `public` |
|
|
28
|
+
| `PAPERCLIP_PUBLIC_URL` | `https://YOUR-SERVICE.onrender.com` (you'll see the exact name after creating it; update this then) |
|
|
29
|
+
| `BETTER_AUTH_SECRET` | your first secret |
|
|
30
|
+
| `PAPERCLIP_TOOL_ACTION_SIGNING_SECRET` | your second secret |
|
|
31
|
+
| `PORT` | `3100` |
|
|
32
|
+
| `ANTHROPIC_API_KEY`, `OPENAI_API_KEY` | optional, for your agents |
|
|
33
|
+
|
|
34
|
+
## 3. Add the disk and health check
|
|
35
|
+
|
|
36
|
+
Under **Advanced**:
|
|
37
|
+
|
|
38
|
+
- **Add Disk:** mount path **`/paperclip`**, size 10 GB. This is where Paperclip keeps its database, secrets key, uploads, workspaces and agent logins.
|
|
39
|
+
- **Health Check Path:** `/api/health`.
|
|
40
|
+
|
|
41
|
+
Create the service. When it's live, check that `PAPERCLIP_PUBLIC_URL` matches the address Render shows at the top of the page exactly; if not, fix it (Render redeploys).
|
|
42
|
+
|
|
43
|
+
**Your own domain:** **Settings → Custom Domains → Add**, create the DNS record Render shows, and change `PAPERCLIP_PUBLIC_URL` to the new address.
|
|
44
|
+
|
|
45
|
+
**Optional managed database:** create a Render Postgres (a paid one; the free one is deleted after 30 days) and set `DATABASE_URL` to its **Internal** URL. Without it Paperclip uses its built-in Postgres on the disk.
|
|
46
|
+
|
|
47
|
+
## 4. Create your account
|
|
48
|
+
|
|
49
|
+
Open the service's **Shell** tab and run:
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
HOME=/paperclip gosu node npx --yes paperclipai auth bootstrap-ceo --data-dir /paperclip --base-url https://YOUR-SERVICE.onrender.com
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Open the invite link it prints, create your account and your first company. Optionally, add `PAPERCLIP_AUTH_DISABLE_SIGN_UP=true` afterwards to close public sign-ups.
|
|
56
|
+
|
|
57
|
+
## 5. Sign in your agents
|
|
58
|
+
|
|
59
|
+
Add `ANTHROPIC_API_KEY` / `OPENAI_API_KEY`, or sign in with a subscription from the Shell tab (`HOME=/paperclip gosu node claude`). The login is saved on the disk.
|
|
60
|
+
|
|
61
|
+
## 6. Check and connect
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
curl https://YOUR-SERVICE.onrender.com/api/health
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
You want `"status":"ok"`, `"deploymentExposure":"public"` and `"bootstrapStatus":"ready"`. Then [connect Papercliped](/docs/hosting#connect-papercliped) and send *"Catch me up on my Paperclip."*
|
|
68
|
+
|
|
69
|
+
## Updates and backups
|
|
70
|
+
|
|
71
|
+
- **Update:** **Manual Deploy → Deploy latest reference** pulls the newest `latest` image. A service with a disk can't do zero-downtime deploys: the old instance stops first, so runs in progress end. Update when agents are idle.
|
|
72
|
+
- **Backups:** Render takes daily snapshots of disks; you can restore them from the disk's settings. Keep your own copy too for anything important.
|
|
73
|
+
|
|
74
|
+
## Troubleshooting
|
|
75
|
+
|
|
76
|
+
- **Deploy fails:** read the logs. Usually a missing `BETTER_AUTH_SECRET`, or a public URL without `https://`.
|
|
77
|
+
- **"This hostname is not allowed":** `PAPERCLIP_PUBLIC_URL` doesn't match the address you're opening.
|
|
78
|
+
- **Data gone after a deploy:** the disk isn't mounted at exactly `/paperclip`.
|
|
79
|
+
- More: [Troubleshooting](/docs/troubleshooting).
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# Host Paperclip on a VPS with Docker
|
|
2
|
+
|
|
3
|
+
A small rented server running the official Paperclip image, with Caddy in front for the `https://` certificate. This is the best value for a Paperclip that's on all the time, and every step is copy and paste.
|
|
4
|
+
|
|
5
|
+
**You'll end up with:** Paperclip at `https://paperclip.yourdomain.com`, restarting by itself, with its data on the server's disk, connected to Papercliped.
|
|
6
|
+
|
|
7
|
+
**Time:** about 30 minutes. **Cost:** the server (about €5–12 a month) and a domain.
|
|
8
|
+
|
|
9
|
+
## Before you start
|
|
10
|
+
|
|
11
|
+
- **A domain** you can add DNS records to (any registrar works). You'll use a subdomain like `paperclip.yourdomain.com`.
|
|
12
|
+
- **An SSH key.** On macOS, Linux and Windows 10+, run `ssh-keygen` in a terminal and press Enter at each question if you don't have one.
|
|
13
|
+
|
|
14
|
+
## 1. Rent the server
|
|
15
|
+
|
|
16
|
+
Pick **Ubuntu 24.04**, at least **2 GB of memory (4 GB recommended)**, and add your SSH key when asked.
|
|
17
|
+
|
|
18
|
+
| Provider | A plan that fits (Oct 2026, approx.) | Notes |
|
|
19
|
+
| --- | --- | --- |
|
|
20
|
+
| Hetzner | CX23 (2 vCPU, 4 GB), about €5.50 | Best value; EU and US locations |
|
|
21
|
+
| DigitalOcean | Basic Droplet 2 GB, about $12 | Choose a *Droplet*, not App Platform |
|
|
22
|
+
| Linode (Akamai) | Shared 2 GB, about $12 | |
|
|
23
|
+
| Oracle Cloud Always Free | Ampere A1, $0 | Free but fiddly: see [Oracle notes](#oracle-cloud-free-tier) |
|
|
24
|
+
|
|
25
|
+
Note the server's **public IPv4 address**.
|
|
26
|
+
|
|
27
|
+
## 2. Point your domain at it
|
|
28
|
+
|
|
29
|
+
At your DNS provider, add an **A record**: name `paperclip`, value the server's IP. (If your DNS is on Cloudflare, set it to **DNS only**, the grey cloud, so Caddy can get its certificate.) It usually works within a few minutes.
|
|
30
|
+
|
|
31
|
+
## 3. Install Docker and open the firewall
|
|
32
|
+
|
|
33
|
+
Connect to the server (`ssh root@YOUR_IP`), then:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
curl -fsSL https://get.docker.com | sh
|
|
37
|
+
ufw allow 22/tcp && ufw allow 80/tcp && ufw allow 443/tcp && ufw allow 443/udp
|
|
38
|
+
ufw --force enable
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 4. Create the settings
|
|
42
|
+
|
|
43
|
+
Replace `paperclip.yourdomain.com` with your address:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
mkdir -p ~/paperclip && cd ~/paperclip
|
|
47
|
+
cat > .env <<EOF
|
|
48
|
+
DOMAIN=paperclip.yourdomain.com
|
|
49
|
+
BETTER_AUTH_SECRET=$(openssl rand -hex 32)
|
|
50
|
+
PAPERCLIP_TOOL_ACTION_SIGNING_SECRET=$(openssl rand -hex 32)
|
|
51
|
+
ANTHROPIC_API_KEY=
|
|
52
|
+
OPENAI_API_KEY=
|
|
53
|
+
EOF
|
|
54
|
+
chmod 600 .env
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Leave the two API keys empty if you'll sign your agents in with a subscription instead (step 8).
|
|
58
|
+
|
|
59
|
+
## 5. Create the Docker Compose file
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
cat > docker-compose.yml <<'EOF'
|
|
63
|
+
services:
|
|
64
|
+
paperclip:
|
|
65
|
+
image: ghcr.io/paperclipai/paperclip:latest
|
|
66
|
+
container_name: paperclip
|
|
67
|
+
restart: unless-stopped
|
|
68
|
+
pids_limit: 2048
|
|
69
|
+
environment:
|
|
70
|
+
PAPERCLIP_DEPLOYMENT_MODE: authenticated
|
|
71
|
+
PAPERCLIP_DEPLOYMENT_EXPOSURE: public
|
|
72
|
+
PAPERCLIP_PUBLIC_URL: https://${DOMAIN}
|
|
73
|
+
BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET}
|
|
74
|
+
PAPERCLIP_TOOL_ACTION_SIGNING_SECRET: ${PAPERCLIP_TOOL_ACTION_SIGNING_SECRET}
|
|
75
|
+
TRUST_PROXY: uniquelocal
|
|
76
|
+
ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}
|
|
77
|
+
OPENAI_API_KEY: ${OPENAI_API_KEY}
|
|
78
|
+
volumes:
|
|
79
|
+
- paperclip-data:/paperclip
|
|
80
|
+
caddy:
|
|
81
|
+
image: caddy:2
|
|
82
|
+
restart: unless-stopped
|
|
83
|
+
ports: ["80:80", "443:443", "443:443/udp"]
|
|
84
|
+
environment:
|
|
85
|
+
DOMAIN: ${DOMAIN}
|
|
86
|
+
volumes:
|
|
87
|
+
- ./Caddyfile:/etc/caddy/Caddyfile:ro
|
|
88
|
+
- caddy-data:/data
|
|
89
|
+
- caddy-config:/config
|
|
90
|
+
depends_on: [paperclip]
|
|
91
|
+
volumes:
|
|
92
|
+
paperclip-data:
|
|
93
|
+
caddy-data:
|
|
94
|
+
caddy-config:
|
|
95
|
+
EOF
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
What this does: runs the official image (no building), keeps everything Paperclip stores in the `paperclip-data` volume, and only Caddy is reachable from the internet. Paperclip uses its built-in Postgres on that volume.
|
|
99
|
+
|
|
100
|
+
## 6. Create the Caddy file
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
cat > Caddyfile <<'EOF'
|
|
104
|
+
{$DOMAIN} {
|
|
105
|
+
reverse_proxy paperclip:3100
|
|
106
|
+
}
|
|
107
|
+
EOF
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Caddy gets and renews the certificate by itself and passes Paperclip's live updates (WebSockets) through.
|
|
111
|
+
|
|
112
|
+
## 7. Start it and create your account
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
docker compose up -d
|
|
116
|
+
docker compose logs -f paperclip
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Wait until the log says the server is listening (press Ctrl+C to stop watching; Paperclip keeps running). Then create the one-time invite for your admin account:
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
docker compose exec -u node paperclip npx --yes paperclipai auth bootstrap-ceo --data-dir /paperclip --base-url https://paperclip.yourdomain.com
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Open the link it prints, create your account, and set up your first company.
|
|
126
|
+
|
|
127
|
+
Optional, once you have your account: add `PAPERCLIP_AUTH_DISABLE_SIGN_UP: "true"` under `environment:` and run `docker compose up -d` to close public sign-ups.
|
|
128
|
+
|
|
129
|
+
## 8. Sign in your agents
|
|
130
|
+
|
|
131
|
+
Either put `ANTHROPIC_API_KEY` / `OPENAI_API_KEY` in `.env` and run `docker compose up -d`, or sign in with your subscription inside the container:
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
docker compose exec -it -u node paperclip claude
|
|
135
|
+
docker compose exec -it -u node paperclip codex
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Logins are saved in the `paperclip-data` volume, so they survive restarts and updates.
|
|
139
|
+
|
|
140
|
+
## 9. Check and connect
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
curl https://paperclip.yourdomain.com/api/health
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
You want `"status":"ok"`, `"deploymentExposure":"public"` and `"bootstrapStatus":"ready"`. Then [connect Papercliped](/docs/hosting#connect-papercliped) and send *"Catch me up on my Paperclip."*
|
|
147
|
+
|
|
148
|
+
## Updates
|
|
149
|
+
|
|
150
|
+
When your agents are idle (an update restarts Paperclip and stops runs in progress):
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
cd ~/paperclip && docker compose pull && docker compose up -d
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
To pin a version instead of `latest`, use a tag like `ghcr.io/paperclipai/paperclip:2026.1005.0` and read Paperclip's release notes before changing it.
|
|
157
|
+
|
|
158
|
+
## Backups
|
|
159
|
+
|
|
160
|
+
Everything is in the `paperclip-data` volume. The safest copy is with Paperclip stopped:
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
cd ~/paperclip && docker compose stop paperclip
|
|
164
|
+
docker run --rm -v paperclip_paperclip-data:/data -v "$PWD":/backup alpine tar czf /backup/paperclip-$(date +%F).tgz -C /data .
|
|
165
|
+
docker compose start paperclip
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Copy the `.tgz` somewhere off the server. Many providers also sell automatic server snapshots for a small fee.
|
|
169
|
+
|
|
170
|
+
## Use a separate Postgres (optional)
|
|
171
|
+
|
|
172
|
+
For bigger setups, add a Postgres service and point Paperclip at it:
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
db:
|
|
176
|
+
image: postgres:17-alpine
|
|
177
|
+
restart: unless-stopped
|
|
178
|
+
environment:
|
|
179
|
+
POSTGRES_USER: paperclip
|
|
180
|
+
POSTGRES_PASSWORD: change-me-long-random
|
|
181
|
+
POSTGRES_DB: paperclip
|
|
182
|
+
volumes:
|
|
183
|
+
- pgdata:/var/lib/postgresql/data
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Then add `DATABASE_URL: postgres://paperclip:change-me-long-random@db:5432/paperclip` to Paperclip's `environment:` and `pgdata:` under `volumes:`. Do this on a fresh install; moving existing data needs a database export and import.
|
|
187
|
+
|
|
188
|
+
## Oracle Cloud free tier
|
|
189
|
+
|
|
190
|
+
Oracle's Always Free Ampere A1 servers are free but take extra steps:
|
|
191
|
+
|
|
192
|
+
- Open ports 80 and 443 in **two places**: the VCN's security list in the Oracle console, **and** the server's own firewall (Oracle's Ubuntu images ship strict `iptables` rules; allow 80 and 443 there or replace them with `ufw`).
|
|
193
|
+
- A1 servers are ARM; the Paperclip image supports ARM, so nothing else changes.
|
|
194
|
+
- Free capacity is often "out of host capacity" in popular regions, and Oracle can reclaim idle free servers. Fine for trying things, risky for anything you rely on.
|
|
195
|
+
|
|
196
|
+
## Troubleshooting
|
|
197
|
+
|
|
198
|
+
- **Caddy can't get a certificate:** the A record isn't pointing at the server yet, port 80 or 443 is closed, or Cloudflare's orange-cloud proxy is on. Check with `docker compose logs caddy`.
|
|
199
|
+
- **"This hostname is not allowed":** `PAPERCLIP_DEPLOYMENT_EXPOSURE` isn't `public`, or `PAPERCLIP_PUBLIC_URL` doesn't match the address you're using.
|
|
200
|
+
- **The container keeps restarting:** run `docker compose logs paperclip`. A missing `BETTER_AUTH_SECRET` or a public URL that isn't `https://` stops it at startup.
|
|
201
|
+
- **Agents fail straight away:** they have no API key or login (step 8).
|
|
202
|
+
- More: [Troubleshooting](/docs/troubleshooting).
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Host your Paperclip
|
|
2
|
+
|
|
3
|
+
Papercliped connects your AI app to **your** Paperclip over the internet, so your Paperclip needs a public `https://` address. This section takes you from nothing to a running Paperclip with a public address, connected to Papercliped, with one complete guide per hosting option.
|
|
4
|
+
|
|
5
|
+
Already have Paperclip running at a public `https://` address? Skip to [Connect Papercliped](#connect-papercliped).
|
|
6
|
+
|
|
7
|
+
## Pick where to run it
|
|
8
|
+
|
|
9
|
+
| Option | Cost per month (Oct 2026, approx.) | Effort | Best for | Guide |
|
|
10
|
+
| --- | --- | --- | --- | --- |
|
|
11
|
+
| **Your own computer + a tunnel** | Free (plus a domain, if you want one) | Medium | Trying it out; a computer that's always on | [At home, with a tunnel](/docs/connect-your-paperclip) |
|
|
12
|
+
| **A VPS with Docker** (Hetzner, DigitalOcean, Linode…) | about €5–12 | Medium | Best value for daily use, full control | [VPS with Docker](/docs/host-vps) |
|
|
13
|
+
| **Railway** | about $10–25 (usage-based) | Easy | The fewest steps, no server to look after | [Railway](/docs/host-railway) |
|
|
14
|
+
| **Render** | about $25+ (2 GB plan) plus disk | Easy | A dashboard you already know | [Render](/docs/host-render) |
|
|
15
|
+
| **Fly.io** | about $11–22 plus volume | Medium | Command-line people, pick your region | [Fly.io](/docs/host-fly) |
|
|
16
|
+
| **Coolify** on a VPS | your VPS (8 GB recommended) | Easy–medium | A point-and-click panel on your own server | [Coolify](/docs/host-coolify) |
|
|
17
|
+
|
|
18
|
+
Prices change; check the provider's pricing page before you sign up.
|
|
19
|
+
|
|
20
|
+
**Not recommended:** free tiers that **sleep** (Render free, Railway's free plan) or hosts with **no persistent disk** (DigitalOcean App Platform). Paperclip keeps its database, secrets key, uploads, agent workspaces and agent logins on disk, and a sleeping server stops your agents mid-task. Use a DigitalOcean *Droplet* with the [VPS guide](/docs/host-vps) instead.
|
|
21
|
+
|
|
22
|
+
**Not sure?** Start at home with a tunnel to try everything for free. When you want it running all the time, move to a VPS (cheapest) or Railway (easiest).
|
|
23
|
+
|
|
24
|
+
## What every option needs
|
|
25
|
+
|
|
26
|
+
Every guide sets these up. If you're doing something we don't cover, this is the checklist.
|
|
27
|
+
|
|
28
|
+
1. **Paperclip in authenticated, public mode.** Paperclip has two modes: `local_trusted` (no login, only on your own computer) and `authenticated` (people sign in). An internet-facing Paperclip must be `authenticated` with `public` exposure. Never put a `local_trusted` Paperclip behind a public address.
|
|
29
|
+
2. **Its public address set explicitly.** Paperclip builds sign-in links and checks hostnames from it.
|
|
30
|
+
3. **Two long random secrets.** One for sign-ins, one for signing tool-action approvals.
|
|
31
|
+
4. **A persistent disk** at Paperclip's data folder (`/paperclip` in the Docker image, `~/.paperclip` otherwise).
|
|
32
|
+
5. **At least 2 GB of memory, 4 GB if you run several agents.** Agents run as programs inside the same machine.
|
|
33
|
+
6. **Always on.** A restart or redeploy stops any agent run in progress, so avoid hosts that sleep, and update when your agents are idle.
|
|
34
|
+
7. **Nothing blocking `/api/*`.** No login wall, bot challenge or "under attack" mode in front of Paperclip's API, or Papercliped can't reach it.
|
|
35
|
+
|
|
36
|
+
### The settings
|
|
37
|
+
|
|
38
|
+
| Setting | Value | Why |
|
|
39
|
+
| --- | --- | --- |
|
|
40
|
+
| `PAPERCLIP_DEPLOYMENT_MODE` | `authenticated` | People sign in (the Docker image's default) |
|
|
41
|
+
| `PAPERCLIP_DEPLOYMENT_EXPOSURE` | `public` | Internet-facing. The Docker image defaults to `private`, which refuses unknown hostnames |
|
|
42
|
+
| `PAPERCLIP_PUBLIC_URL` | `https://paperclip.example.com` | Your public address, exactly as people will type it |
|
|
43
|
+
| `BETTER_AUTH_SECRET` | 64 random hex characters | Signs sign-in sessions. Required |
|
|
44
|
+
| `PAPERCLIP_TOOL_ACTION_SIGNING_SECRET` | 64 random hex characters | Signs tool-action approvals |
|
|
45
|
+
| `PORT` | `3100` | Paperclip's port (the image's default; some hosts need it set) |
|
|
46
|
+
| `DATABASE_URL` | optional | Leave unset to use Paperclip's built-in Postgres on the disk, or point it at a managed Postgres |
|
|
47
|
+
| `TRUST_PROXY` | optional | Tells Paperclip which proxy in front of it to believe about the visitor's address (`uniquelocal` behind Caddy in Docker). Leave unset if unsure |
|
|
48
|
+
| `ANTHROPIC_API_KEY`, `OPENAI_API_KEY` | optional | Keys for the agents that use Claude Code or Codex. You can sign in inside the server instead (see each guide) |
|
|
49
|
+
|
|
50
|
+
Make a secret with:
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
openssl rand -hex 32
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
No `openssl`? Any password manager can generate a 64-character random password; use letters and numbers only.
|
|
57
|
+
|
|
58
|
+
### Your first account
|
|
59
|
+
|
|
60
|
+
In public mode, Paperclip doesn't show a "claim this instance" button (anyone on the internet could press it). Instead you run one command on the server, which prints a **one-time invite link** for the first admin:
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
npx --yes paperclipai auth bootstrap-ceo --data-dir /paperclip --base-url https://paperclip.example.com
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Each guide shows exactly where to run it. Open the link, create your account, and you're the admin. Once you have your account, you can close public sign-ups by setting `PAPERCLIP_AUTH_DISABLE_SIGN_UP=true` and restarting; invite teammates from inside Paperclip.
|
|
67
|
+
|
|
68
|
+
### Your agents' keys
|
|
69
|
+
|
|
70
|
+
The official Paperclip image already includes the Claude Code, Codex, OpenCode and Gemini command-line tools, plus git and the GitHub CLI. Your agents need one of:
|
|
71
|
+
|
|
72
|
+
- **An API key** as a setting: `ANTHROPIC_API_KEY` for Claude Code agents, `OPENAI_API_KEY` for Codex agents.
|
|
73
|
+
- **Your subscription login**, done once inside the server (for example `claude` or `codex`, then follow the sign-in). The login is saved on the persistent disk, so it survives restarts.
|
|
74
|
+
|
|
75
|
+
## Check it works
|
|
76
|
+
|
|
77
|
+
From any computer (your phone on mobile data is a good test):
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
curl https://paperclip.example.com/api/health
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
On Windows PowerShell use `curl.exe`. A healthy answer is JSON that includes:
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
"status":"ok", "deploymentMode":"authenticated", "deploymentExposure":"public", "bootstrapStatus":"ready"
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
`"bootstrapStatus":"bootstrap_pending"` means nobody has created the first account yet (see [Your first account](#your-first-account)).
|
|
90
|
+
|
|
91
|
+
## Connect Papercliped
|
|
92
|
+
|
|
93
|
+
1. Add the connector in your AI app. In Claude: **Settings → Connectors → Add custom connector**, address `{{MCP}}/mcp`. Other apps: [Any AI app](/docs/other-ai-apps), [ChatGPT](/docs/chatgpt).
|
|
94
|
+
2. On the Papercliped page choose **Connect your Paperclip** and enter your public address (just `https://paperclip.example.com`, no path).
|
|
95
|
+
3. Approve the request in your Paperclip (you'll be asked to sign in), pick a username, save the secret key you're shown once, and choose **Read only** or **Full control**. Details: [Create your account](/docs/signup).
|
|
96
|
+
4. Leave **Also install the Papercliped plugin** ticked to manage your connections from inside Paperclip ([Paperclip plugin](/docs/paperclip-plugin)).
|
|
97
|
+
5. Send your first prompt: *"Catch me up on my Paperclip."* Then try more from the [prompt gallery](/docs/prompts).
|
|
98
|
+
|
|
99
|
+
## Keep it safe
|
|
100
|
+
|
|
101
|
+
- Use long random secrets and keep them out of chats, screenshots and Git.
|
|
102
|
+
- Keep Paperclip up to date, and update when agents are idle.
|
|
103
|
+
- Back up the data disk (each guide says how).
|
|
104
|
+
- Expose only Paperclip, nothing else on the machine.
|
|
105
|
+
- You can cut Papercliped's access at any time: disconnect apps in the [Paperclip plugin](/docs/paperclip-plugin), or revoke the key in Paperclip.
|