A self-hosted personal CRM schema for tracking the people in your life. An accounts row scopes every record, and each contacts row is the spine that activities, reminders, gifts, and life events branch off.
What this Monica CRM schema covers
Contacts with addresses, jobs, pets, and custom fields
Activities, calls, conversations, and a journal
Reminders, stay-in-touch intervals, and important dates
Directed relationships, gifts, debts, and life events
vCard import/export and CardDAV sync
A few decisions the diagram can't show:
Almost every table carries an account_id, even pivots like contact_tag, so a tenant's data deletes and exports as one unit.
relationships.contact_is and of_contact both point at contacts, and relationship_types holds forward and reverse labels so one row reads both ways.
Each type table has a default_* seed sibling copied per account, so an account can customize its own reference data.
Only contacts soft-deletes via deleted_at, and audit_logs.author_name is denormalized so the trail survives a user deletion.
Good fork target for an account-scoped CRM with customizable reference data. The contacts table is wide, with six nullable date/reminder foreign keys, so a birthday auto-pairs a special_dates row with a reminders row.
Self-hosted personal relationship manager — Monica is a self-hosted personal relationship manager, a CRM for friends and family. People use it to remember the details of the lives around them.