Skip to content

Database Schema

The worker uses Cloudflare D1 (SQLite) with Drizzle ORM. The schema is defined in worker/src/db/schema.ts.

ColumnTypeDescription
idtext PKUUID, auto-generated
message_idtextOriginal Message-ID header
sendertextEnvelope sender address
from_headertextFrom header (may include display name)
to_headertextTo header
subjecttextSubject line
body_previewtextFirst 500 chars of body text
raw_sizeintegerRaw message size in bytes
spf_passbooleanWhether SPF passed
dkim_passbooleanWhether DKIM passed
statustextpending, approved, rejected, or forwarded
classificationtextcold_outreach, spam, newsletter, legitimate, unknown
classification_reasontextHuman-readable reason for classification
raw_storage_keytextR2 key for raw MIME (optional)
created_attextISO datetime, defaults to now
actioned_attextISO datetime when approved/rejected
ColumnTypeDescription
addresstext PKEmail address
display_nametextDisplay name from From header
statustextallowed, blocked, or unknown
email_countintegerTotal emails received from sender
first_seentextISO datetime of first email
last_seentextISO datetime of most recent email
notestextOptional notes
ColumnTypeDescription
keytext PKSetting name
valuetextSetting value

Default settings keys:

  • destination_email — where approved mail gets forwarded
  • auto_forward_allowed"true" or "false", auto-forward from allowed senders
  • auto_reject_blocked"true" or "false", silently drop from blocked senders

Generate a new migration after schema changes:

Terminal window
cd worker
bun run db:generate

Apply migrations:

Terminal window
# Local
bun run db:migrate:local
# Production
bun run db:migrate:remote