How I Built a Personal CRM with Claude Code (No Airtable, No SaaS)

6 min read
#crm#claude-code#automation#ai

I built a personal CRM with Claude Code. It's just a filesystem of markdown files. No UI, no database, no SaaS login.

It works with Claude Code, Cursor, and OpenClaw. It auto-populates from my meetings and emails. And it's actually useful.

Here's how it works — and why you might want one too.

Why Build This?

1. AI-native by design

I use Claude Code, Cursor, Codex and OpenClaw every day.

I want them to know who I've talked to, what we discussed, and what matters to each person.

With a SaaS CRM, you're stuck with their proprietary interface, integrations and features.

With markdown files, any AI tool can read and use my CRM. Claude Code can reference past conversations, draft personalized emails, and suggest who to reach out to — all because the context lives in files it can access.

P.S - my agents are called Goose (or Geese).

Goose can also use context from my other notes (non-CRM related stuff). For example - notes about my product, positioning, ICP, messaging, etc. That's all super useful context.

2. Completely customizable

Every CRM forces you into their schema: "Contact," "Company," "Deal Stage." But relationships don't fit neat boxes.

With markdown files, I structure it however I want. Custom fields, tags, freeform notes. I can change the format anytime. I can write custom enrichment scripts to pull exactly the data I care about.

3. Do things

Here's where it gets powerful. I can tell Goose:

"Find all the people I've met who would be good design partners for my new product. Then draft a personalized email to each one, referencing our previous meetings and explaining why I think they'd be a good design partner."

Claude Code reads through all my person files, filters by context, drafts the emails, and I just review and send. That workflow is impossible in traditional CRMs.

Or: "Who have I talked to about GTM automation in the last 3 months?"
Or: "Pull everyone who works in B2B SaaS and might need recruiting help."

The CRM becomes a queryable knowledge base, not just a contact list. And I can put any agent to work on it.

Claude Code could do deep research on every single person if I wanted. No limits. Full control.

The Architecture

It's dead simple: one markdown file per person.

supernotes/people/
  matthew-newman.md
  amaya-rousseau.md
  jane-smith.md

Each file has:

  • Frontmatter (YAML): name, email, LinkedIn, company, title, tags
  • Body (markdown): freeform notes, meeting summaries, context

Example:

---
name: Matthew Newman
email: matt@example.com
linkedin: https://linkedin.com/in/matthewn
company: Acme Corp
title: Head of Growth
tags: [prospect, saas, met-2026-01]
---

# Context
Met at SaaS conference Jan 2026. Runs growth at Acme (Series B, $10M ARR).

# Meetings
**[[2026-01-15]]:** Matthew / Shiv Intro Call

# Follow-ups
- Send case study (due 2026-01-20)
- Intro to Sarah at XYZ

That's it.

There's also a .md file per meeting, which is linked.

Why Markdown Files?

Goose (agent) prefers markdown files to CRM APIs. This CRM is for Goose to use, not for me to use.

Also: .md files are portable. No vendor lock-in, no API rate limits, no code to maintain, just text files in git.

How It Gets Populated

I don't manually create these. Goose does this automatically from a few sources:

1. Calendar sync: It pulls my calendar every day, sends me a pre-meeting brief in Slack every morning and adds the person / meeting to my .md CRM.

2. Meeting notes sync
After the meeting, it syncs my meeting notes from Notion → markdown files. It matches the person's name or creates a file if it doesn't already exist, and appends meeting summaries. (actually need a better system for this, because i'd prefer the full transcript in my filesystem but Notion API doesn't expose that afaik)

3. Email threads
Then it searches Gmail for relevant email conversations, summarizes them, and updates their file.

4. LinkedIn + Web enrichment
For new people, it also enriches them by pulling their profile from LinkedIn + searches the web for any info it can find about them and adding to my .md file.

All of this happens automatically with cron jobs.

Other plugins that could make this better:

  • LinkedIn posts scraper (via Apify) — pull recent posts for priority contacts, gives way more context about what they're thinking about. I've been playing with this a little.
  • Twitter activity
  • Github activity

It took just a few hours brainstorming with Goose to set all this up, and it's already been super useful.

And it compounds over time.

The context will get richer, the models will get smarter, the agents will get better.

I want a CRM built for Goose, not for Shiv.