Database Modes
Three deployment options:- Embedded PostgreSQL - Zero config, auto-managed (default)
- Local PostgreSQL - Docker Compose for development
- Hosted PostgreSQL - Supabase, AWS RDS, etc. for production
Embedded PostgreSQL
The simplest option - no setup required.How It Works
- Leave
DATABASE_URLunset - Server auto-starts embedded PostgreSQL
- Data persists in
~/.paperclip/instances/default/db/
Configuration
Data directory:$PAPERCLIP_HOME/instances/$PAPERCLIP_INSTANCE_ID/db/
Custom port (if default 54329 conflicts):
Reset Embedded Database
When to Use
- ✅ Local development
- ✅ Testing and demos
- ✅ Single-machine deployments
- ❌ High-traffic production
- ❌ Multi-instance deployments
Local PostgreSQL (Docker)
For development with a full PostgreSQL server.Setup
Start PostgreSQL:localhost:5432.
Set connection string:
docker-compose.yml
Included in the repo:When to Use
- ✅ Team development
- ✅ Testing migrations
- ✅ Matching production setup locally
- ❌ Quick local experiments (use embedded instead)
Hosted PostgreSQL
For production deployments.Supabase
1. Create project:- Visit database.new
- Create a new project
- Wait for provisioning (~2 minutes)
- Go to Project Settings > Database > Connection string
- Copy Connection pooling URL (port 6543)
packages/db/src/client.ts:
- 500 MB database storage
- 200 concurrent connections
- Projects pause after 1 week of inactivity
AWS RDS
1. Create RDS instance:- Allow inbound PostgreSQL (port 5432) from your deployment
Other Providers
Any PostgreSQL 17+ provider works:| Provider | Best For | Notes |
|---|---|---|
| Neon | Serverless | Auto-scaling, generous free tier |
| Railway | Simplicity | One-click Postgres plugin |
| Google Cloud SQL | GCP deployments | Managed backups |
| Azure Database | Azure deployments | Integrated security |
| DigitalOcean | Cost-effective | Simple pricing |
- Create PostgreSQL 17+ instance
- Get connection string
- Set
DATABASE_URL - Push schema with
drizzle-kit push
Migrations
Automatic Migrations
On startup, Paperclip automatically runs migrations if:- Database is empty (fresh install)
PAPERCLIP_MIGRATION_PROMPT=neveris set
Manual Migrations
Generate migration from schema changes:packages/db/src/schema/*.ts and generates SQL in packages/db/src/migrations/.
Apply migrations:
drizzle-kit push to sync schema directly (for development):
Migration Workflow
1. Edit schema:Migration Files
Migrations are stored inpackages/db/src/migrations/:
Database Schema
Core tables:- companies - Company entities
- agents - AI agents
- tasks - Work items
- issues - Issue tracking
- goals - Company goals
- projects - Project organization
- agent_api_keys - Agent authentication
- company_secrets - Secret storage
- company_secret_versions - Secret versioning
- activity_log - Audit trail
- authUsers - User authentication
- authSessions - Session management
- instance_user_roles - Instance permissions
- company_memberships - Company access
packages/db/src/schema/
Connection Management
Connection Pooling
For hosted databases, use connection pooling: Supabase:Connection Limits
PostgreSQL default: 100 connections Paperclip uses 1-2 connections per server instance. For high-traffic deployments:- Use connection pooling (PgBouncer, Supabase Pooler)
- Scale PostgreSQL instance
- Use read replicas for read-heavy workloads
Backup and Restore
Backup Embedded Database
Backup External Database
Restore
Embedded:Troubleshooting
Connection Refused
Check PostgreSQL is running:Migration Failures
Reset and retry:Too Many Connections
Use connection pooling:- Supabase: Use port 6543
- Deploy PgBouncer
- Upgrade database instance
Slow Queries
Enable query logging:Production Checklist
Next Steps
Configuration
Configure database connection and runtime options
Security
Secure database credentials and access