Legend
Operations
Time & Billing
Session Tracking
Dev Activity
Finance
Proposed
🗄
PostgreSQL 16 Instance
deploy@147.182.219.223 · Docker container: mission-control-db
Database
mission_control
User: mc_app · Managed via Alembic migrations
Schema · Current
public
20 tables · All Mission Control data
Operations
clients projects developers client_retainers client_epic_overrides
Time & Billing
time_entries invoices invoice_line_items repo_mappings
Session Tracking
claude_sessions session_activity session_prompts session_responses session_tickets
Dev Activity
commits pull_requests jira_issues jira_transitions
Finance (Plaid)
transactions accounts plaid_items categories categorization_rules
No explicit schema segmentation today All 20 tables share public. As new data domains are added (scraped content, etc.), introducing named schemas keeps the namespace clean.
Schema · Proposed
content
Scraped & ingested external content
✦ New
Job Configuration
scraper_jobs
name (PK) · source_type · cron_expression
site_config (JSONB) · collector_config (JSONB)
enabled · created_at · updated_at
Ingested Content
content_items
id (PK, serial) · job_name (FK)
item_id · source_url · title
content (TEXT) · content_type
published_at (TIMESTAMPTZ)
scraped_at (TIMESTAMPTZ)
status · metadata (JSONB)
content_length · error_message
Run History
scraper_runs
id (PK, serial) · job_name (FK)
triggered_by · started_at · completed_at
items_found · items_new · items_skipped
status · error_message · duration_ms
💡
Migration path from SQLite The existing scraper.db on Hetzner maps directly: scraper_jobscontent.scraper_jobs, job_runscontent.content_items + content.scraper_runs.

At a Glance

Current state vs. proposed addition

PostgreSQL Instance
1
Containerized on datastudios-apps droplet (DO · nyc1 · $16/mo)
Databases
1
mission_control — all DataStudios operational data
Current Schemas
1
public — 20 tables, 5 logical domains, no namespace separation
Proposed Schemas
+1
content — 3 tables for scraped content, run history, and job config