contacts
Add, enrich, and manage contacts in Joel's Vault. Fire the Inngest enrichment pipeline for full multi-source dossiers, or create quick contacts manually. Use when: 'add a contact', 'enrich this person', 'who is X', 'VIP contact', 'update contact', or any task involving the Vault/Contacts directory.
By joelhooks · 3,270 installs
npx skills add joelhooks/joelclaw --skill contacts
Source repository · Upstream listing
Contacts
Manage contacts in ~/Vault/Contacts/ . Each contact is a markdown file with YAML frontmatter.
Contact File Location
Index file: ~/Vault/Contacts/index.md — wikilink list of all contacts.
Frontmatter Schema
Sections
See ~/Vault/Contacts/Matt Pocock.md for a fully enriched example.
Adding a Contact
Option 1: Fire the Enrichment Pipeline (preferred)
Send an Inngest event. The contact enrich function fans out across Slack, Roam, web/GitHub, Granola, Brain backed recall, and other indexed sources, synthesizes with LLM, and writes the Vault file.
Depth modes:
full (~60s, ~$0.05): All 7 sources + LLM synthesis. Use for new contacts or periodic refresh.
quick (~10s, ~$0.01): Slack + memory only. Good for real time VIP detection.
Hints are optional but help: Any known identifiers (Slack ID, GitHub, email, Twitter, website) seed the search and improve results.
Option 2: Quick Manual Create
For simple contacts where enrichment is overkill:
Write to ~/Vault/Contacts/Person Name.md and add [[Person Name]] to index.md .
Updating Contacts
Re run enrichment with the existing vault path:
The synthesizer merges new data with existing content — it won't discard existing facts unless contradicted.
VIP Contacts (ADR 0151)
Mark vip: true in frontmatter. VIPs get deep enrichment + ongoing monitoring .
Deep Enrichment Playbook (one time)
Every VIP gets the full treatment. This is what we did for Kent C. Dodds (Feb 26, 2026):
Step Source What to Capture
1. Web presence Web search {name} + {org} Bio, role, location, personal details
2. Podcast/interviews Web search {name} podcast interview Appearance list, own podcasts, audiences
3. Joel collaborations Their website, appearances pages Joint podcasts, co organized events, shared projects
4. Career timeline Defuddle 2 3 key interview transcripts Origin story, career arc, key decisions, values
5. GitHub profile GitHub API or web Repos, followers, orgs, contribution patterns
6. X/Twitter profile X API v2 (use x api skill) Bio, followers, recent tweets, engagement
7. Key relationships Cross reference transcripts + contacts Who they work with, who they mention, who we know in common
8. Content catalog Website crawl (defuddle) Courses, blog posts, open source projects
9. Audience reach Podcast counts, social followers Conference circuit, community presence
Index to Typesense after enrichment:
Batch import appearances/content to discoveries collection (NDJSON, action=upsert )
Tag all docs with person's name slug (e.g. kent c dodds ) for filtering
Fields: id , title , url , summary , tags[] , timestamp
Write a Vault/Resources/{name} media appearances.md reference doc linking back to contact
Output sections in the vault note:
Background & Story (origin, career timeline)
Teaching/Work Philosophy (or equivalent for non educators)
Key Relationships (cross linked [[wikilinks]] to other contacts)
Audience & Reach
Content/Products
Podcast/Collaboration History with Joel
Recent Activity (timestamped)
Ongoing Monitoring (Phase 2 4 of ADR 0151)
Channel Tool Signal
Google Alerts joelclawbot Google account Name mentions in news, blogs, press
X/Twitter list joelclaw X account Tweets, engagement
GitHub activity GitHub API (polling) New repos, releases
Podcast RSS Feed monitoring New episodes
Website changes Periodic defuddle + diff Blog posts, launches, bio changes
High signal (immediate): course launches, role changes, mentions of Joel/egghead/Skill, fundraising.
Low signal (daily/weekly digest): regular tweets, blog posts, OSS activity.
Current VIPs
Get notified to Joel via gateway after enrichment
Are refreshed weekly via scheduled cron
Have priority in channel intelligence pipeline (ADR 0131, ADR 0132)
Get ongoing monitoring when ADR 0151 Phase 2+ is implemented
Roam Research Enrichment
Joel's Roam archive ( ~/Code/joelhooks/egghead roam research/ ) contains the full egghead era graph (2019 2024). Many contacts have extensive history there.
Quick Search (Python regex)
People Taxonomy
People are tagged with relationship prefixes in Roam:
[[collaborator/Name]] — Strategic partners (Ian Jones, Alex Hillman)
[[client/Name]] — egghead instructors (Matt Pocock, Jacob Paris)
[[staff/Name]] — egghead team (Will Johnson, Daniel Miller, Maggie Appleton)
[[name]] (no prefix) — Informal references (Zac is [[zac]] )
Page Title Search
Adding to Contacts
When extracting person data from Roam, add roam tag to frontmatter:
This enables future re queries and cross referencing.
Datalog Queries (advanced)
The EDN file is Datomic style. Clojure scripts exist at scripts/ for structured analysis. See the roam research skill for full Datalog patterns.
Resolving Unknown People
When you encounter a Slack user ID ( <@U0XXXXXXX ):
Then fire enrichment with the resolved name and hints.
Inngest Function
Function: contact enrich ( packages/system bus/src/inngest/functions/contact enrich.ts )
Event: contact/enrich.requested
ADR: ~/Vault/docs/decisions/0133 contact enrichment pipeline.md
Concurrency: 3 max
Sources: Slack, Slack Connect, Roam archive, GitHub/web, Granola meetings, Brain backed recall, and other indexed sources
Privacy
Contact files are in Vault (private, not in public repos)
Slack data stays private — never surface in public content
Email/phone are stored for Joel's reference only