Paperclip Recovery Playbook
Use this when Paperclip is broken enough that normal operator flow is not enough. Start with the layer that is actually failing:- local dev loop
- Docker/base compose stack
- hosted ingress / Cloudflare tunnel
- plugin or data restore
1. Local Dev Reset
Use this when the embedded database, watcher state, or startup loop is wedged.status: okbootstrapStatus: ready
2. Restore Company Data
After a database reset the Tremor company is gone. Restore it:3. Reinstall Plugins
The server now attempts to restore plugin registry metadata fromplugins-registry.backup.json on startup when the backup file exists. After a full DB reset:
- restart the server once and check whether plugins/configs were restored automatically
- if a plugin package is missing locally or the backup file does not exist, reinstall it from:
| Plugin | Key |
|---|---|
| Agent Skills | tremor.agent-skills |
| Company Intake | tremor.company-intake |
| Project Flight Plan | tremor.project-flight-plan |
| Role Skill Heatmap | role-skill-heatmap |
4. Port Conflicts
If the server will not start because3100 is taken:
5. Watcher Missed Changes
Thetsx watcher can miss some server-side TypeScript edits. Force a full restart:
6. Docker / Compose Recovery
For the base stack:cloudflared is involved, restart the overlay first, then check the tunnel connector health.
7. Hosted Ingress Recovery
Use this sequence when public hostnames return errors but local origin is healthy:- Confirm
obs-proxycan serve the hostname locally. - Confirm
cloudflaredis running and the tunnel connector is healthy. - Confirm the hostname is published on the tunnel.
- Confirm the DNS record is a proxied
CNAMEto the tunnel target. - Confirm the Cloudflare Access app matches the hostname and has an Allow policy.
404/openresty and cloudflared sees no traffic, treat it as a DNS or hostname-binding issue before touching the application.
Root Cause
The embedded PostgreSQL process is fragile under repeated fast restarts. Eachpnpm dev:stop + pnpm dev cycle can leave orphaned postmaster.pid lock files or stale node processes holding ports.
The hosted monitor has a separate failure mode: tunnel health or hostname publication can drift independently of the local origin. That is why the recovery steps above separate local reset, compose restart, and Cloudflare ingress validation.
Plugin Restore Boundary
Plugin registry restore is no longer hypothetical, but it is not magic:- it restores registry/config/settings records from the instance backup file
- it still depends on package availability and the presence of that backup file
- after a destructive reset, verify plugin presence rather than assuming every plugin is fully restored