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.
@@ -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.