contacts — Claude Code skill: a people vault with enrichment
Keeps a directory of people as markdown notes in ~/Vault/Contacts/, with an index and an enrichment pipeline that pulls from outside sources.
npx skills add joelhooks/joelclaw --skill contacts -a claude-codeWhat contacts does
Every person gets a file at ~/Vault/Contacts/<Name>.md. The YAML header holds name, role, organizations, a vip flag and handles for Slack, GitHub, X and email; below it sit sections for contact channels, projects, working context and a dated activity log. All notes are listed as wikilinks in ~/Vault/Contacts/index.md. The cheap route is to write the file yourself and add the link.
Heavier lookups go through Inngest. A contact/enrich.requested event triggers contact-enrich, which fans out to Slack, Roam, the web and GitHub, has an LLM merge what it found, then writes the vault file. full covers every source; quick stays on Slack and memory. Known identifiers seed the search, so pass them when you have them. Fire the event with curl against http://localhost:8288/e/$INNGEST_EVENT_KEY — the CLI hits an OTEL import bug under Bun v1.3.9.
Contacts flagged vip: true get a longer checklist: web presence, podcasts and interviews, GitHub and X profiles, a career timeline, shared connections, then indexing of their material in Typesense. The pipeline expects Inngest running, the Roam archive at ~/Code/joelhooks/egghead-roam-research/ and working API access for the sources you enable.
What it helps with
- create a person's note from just a name
- gather a dossier from Slack, GitHub and the web
- flag a VIP and keep their record current
- map who someone has worked with before
- refresh a note without dropping existing facts
Example prompts for the agent
- Add a contact for Matt Pocock, GitHub handle
mattpocock - Enrich this person in full and update
Contacts/Matt Pocock.md - Who is this person from Slack? Look them up in the Roam archive and create a note
How to install contacts
1Skills CLI (Vercel)
npx skills add joelhooks/joelclaw --skill contacts -a claude-code2Manually: put the files in place
~/.claude/skills/contacts/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/contacts/
1Skills CLI (Vercel)
npx skills add joelhooks/joelclaw --skill contacts -a codex2Manually: put the files in place
.agents/skills/contacts/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add joelhooks/joelclaw --skill contacts -a cursor2Manually: put the files in place
.cursor/skills/contacts/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install joelhooks/joelclaw contacts2Manually: put the files in place
.github/skills/contacts/SKILL.md1Skills CLI (Vercel)
npx skills add joelhooks/joelclaw --skill contacts -a gemini-cli2Platform CLI
gemini skills install https://github.com/joelhooks/joelclaw --path skills/contactsManually: put the files in place
.devin/skills/contacts/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add joelhooks/joelclaw --skill contacts -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about contacts
How do I install contacts in Claude Code?
Run npx skills add joelhooks/joelclaw --skill contacts -a claude-code. The skill lands at ~/.claude/skills/contacts/SKILL.md.
What does the contacts skill do?
It writes and updates markdown notes for people in ~/Vault/Contacts/, maintains the index, and can kick off Inngest enrichment that collects data from other sources.
How is full different from quick?
full checks all sources and runs an LLM synthesis; quick uses Slack and memory only. Reach for full on a new person or a scheduled refresh.