Skip to content
Subscribe

CRM System Architecture

Status: Production (132+ contacts)

The CRM is a file-based contact management system. Every person mentioned in agent interactions gets an entry. Entries are markdown files with YAML frontmatter, stored in a vault for cross-referencing.

Each person gets either a single markdown file or a directory:

memory/entities/people/
├── jane-smith.md # Simple contact
├── john-doe/ # Rich contact
│ ├── PROFILE.md # Main profile
│ ├── summary.md # AI-generated summary
│ └── items.json # Structured data
---
name: "Full Name"
slug: first-last
domain: consulting | school | family
tags: [vip, investor, professor]
email: email@example.com
company: "Company Name"
role: "Title"
relationship: client | colleague | professor | family
last_contact: 2026-04-10
---
## Notes
- Met at [event] on [date]
- Interested in [topic]
## Interaction Log
- 2026-04-10: Discussed X via email
- 2026-04-09: Initial outreach on LinkedIn

The key rule that makes CRM automatic:

“CRM Everything: whenever a person’s name comes up, check or create their entry with contact info and interaction log.”

This single instruction in the agent’s system prompt means contacts accumulate passively through normal conversations. No manual data entry required.

The dashboard CRM page:

  • Reads all contacts from the people directory
  • Parses both single .md files and directory structures
  • Search by name, email, company
  • Filter by domain
  • Expandable cards with full contact details

Since cloud hosting can’t read local filesystem at runtime, a build-time snapshot generator creates crm-snapshot.json. The API route tries filesystem first, falls back to snapshot.

A separate VIP list tracks high-priority contacts for email triage and morning briefing prioritization.