frm
maintain meaningful relationships
A CLI personal relationship manager backed by CardDAV. Single binary, no database — your contacts live in your existing address book, interaction history in a local file.
go install github.com/justinabrahms/frm@latest
Or download a binary from Releases.
What it looks like
$ frm check
Overdue contacts:
Alice Johnson last: 3 weeks ago every: 2w
Bob Chen last: 2 months ago every: 1m
$ frm log "Alice Johnson" --note "caught up over coffee"
Logged interaction with Alice Johnson.
$ frm triage
Dana Williams — dana@example.com
(m)onthly (q)uarterly (y)early (c)ustom (i)gnore (s)kip (Q)uit
> m
✓ Tracking Dana Williams every 1m
$ frm stats
Tracked: 42 Ignored: 15 Overdue: 2 Groups: 3
Get started in three steps
Connect your address book
Run frm init to connect iCloud, Fastmail, or any CardDAV server.
Triage your contacts
Run frm triage to walk through contacts and decide how often to stay in touch — monthly, quarterly, yearly, or a custom interval like 2w.
Check in regularly
Run frm check to see who is overdue. After you reach out, log it: frm log "Alice" --note "caught up over coffee".
Built for automation
Every command supports --json for structured output and
--dry-run for safe previews. An AI agent can drive your entire
relationship maintenance workflow: check who needs attention, prepare context
before meetings, and triage new contacts automatically.
Read the Agent Integration Guide to learn more.
Explore the docs
Getting Started
Installation, setup, and your daily workflow.
Command Reference
Every command, flag, and example.
Agent Integration
JSON output, triage loops, and automation scripts.
How it works
frm stores metadata directly on your contacts using custom vCard fields in your CardDAV server. There is no separate database to manage or sync.
X-FRM-FREQUENCY— tracking interval (e.g.2w,1m)X-FRM-IGNORE— permanently hide from triage and checkX-FRM-GROUP— freeform group tagX-FRM-SNOOZE-UNTIL— suppress until a specific date
Interaction history lives in ~/.frm/log.jsonl. This is the only
local state — back it up or symlink it to a synced directory.