A lightweight CRM built around your contacts: it pulls people in from your inbox and LinkedIn, groups them, and reminds you who you have not spoken to.
Build me a personal CRM that replaces Folk: the people I know, grouped, with the last-contacted date filling itself in. STACK - Node 20+ with Fastify, server-rendered HTML with a little vanilla JS - SQLite through better-sqlite3, WAL mode, with FTS5 for search - A browser extension, Manifest V3, for capturing a person from a page - Caddy in front THE DATA MODEL - people: id, full_name, first_name, last_name, headline, company, role, location, notes_md, created_at, updated_at, archived_at - identifiers: id, person_id, kind, value, is_primary — email, phone, profile URL, domain. A person is the set of their identifiers, which is what makes deduplication possible - groups: id, name, colour, description; memberships: group_id, person_id, added_at - fields: id, key, label, kind — custom fields defined once - values: person_id, field_id, value_text, value_num, value_json - interactions: id, person_id, kind, direction, subject, snippet, occurred_at, source, external_id — email, meeting, call, note, message - reminders: id, person_id, due_at, note, cadence_days, completed_at - merges: id, kept_id, merged_id, at, payload_json — reversible, because an accidental merge is otherwise unrecoverable - Every interaction append-only. The last-contacted date is derived from them, never typed FILLING IT IN WITHOUT DATA ENTRY, WHICH IS THE PRODUCT - Mail sync: connect a mailbox read-only over IMAP or the provider's API, and record one interaction per message with a counterpart — the address, the direction, the subject and a short snippet. Never store the body - Calendar sync: one interaction per meeting with its attendees, from a read-only feed - Both run on a schedule, incrementally, with a cursor, and both are idempotent by external identifier - Say clearly what is stored: addresses, subjects, times and a snippet. Not the correspondence. A personal CRM that quietly ingests a mailbox is a liability, and the restraint is what makes it usable - The last-contacted date, the frequency and the direction balance all fall out of this table for free, and nobody ever updates a record THE EXTENSION - On a profile page or a company site, one click captures the person: name, headline, company, location and the profile URL - Per-host adapters, each a single function reading the page into a person. Fixtures and tests per adapter, because these break when the host changes and a failing test is better than a mystery - Shows immediately whether this person is already known, and where — so a duplicate is prevented rather than merged later - Talks only to your own server, with a token, and asks for permission per host rather than for all sites - The README says plainly that respecting a site's terms is your responsibility, and that this is for people you already deal with DEDUPLICATION AND MERGING - Candidates found by exact identifier match first, then by name similarity with the same company or a shared domain - A review screen showing both records side by side with the differences highlighted - Merging keeps every identifier, every interaction and every note, and is reversible from the merges table - Never merge automatically. A wrongly merged pair of people is worse than two duplicates GROUPS AND VIEWS - Groups as tags with colours; a person can be in many - Views as saved queries: a group, a field value, a last-contacted threshold, a location, a text search - A table view with configurable columns, and a card view - Sort by last contacted ascending, which is the single most useful screen in a personal CRM — the people you are letting slip KEEPING IN TOUCH - A cadence per person or per group: every month, every quarter, every year - The overdue list is the home screen, ranked by how far past the cadence they are - Snooze, complete with a note that becomes an interaction, or drop the cadence - One digest email a week with who is due. Never a notification per person SEARCH AND ESCAPE - FTS5 across names, companies, notes and interaction subjects - Export everything as CSV and JSON in one command, including interactions - Import from a CSV with a mapping step and a dry run PRIVACY - This database is a list of everyone you know and when you last spoke. Encrypt at rest, require authentication, and never expose an endpoint you do not need - Mail and calendar credentials encrypted with a key from the environment - No third-party enrichment service, ever. Sending your contact list to somebody who sells data is the opposite of the point OPERATIONS - .env: DATABASE_PATH, BASE_URL, SESSION_SECRET, ENCRYPTION_KEY, HASH_SALT, SMTP_URL - Migrations on boot, each once - Nightly backup off the machine, restore script - Health endpoint reporting the age of the last mail and calendar sync WHAT MATTERS MOST Mail sync and deduplication. Build those two and use it for a month with your own mailbox — a CRM whose last-contacted dates are filled in by hand is a CRM that is six weeks out of date within six weeks. Give me the repository, the extension with one host adapter and its fixture, migrations, .env.example, and a README with deploy steps behind Caddy and the exact list of what is stored from a mailbox.
What you lose
- A browser extension that captures a person from LinkedIn or a website in one click, which is the habit the product sells
- Mail and calendar sync that fills in the last-contacted date without anyone updating a record
- Deduplication across sources, which is harder than it looks once the same person arrives three ways
If you would rather not build
- A spreadsheet with a last-contacted column, which is honestly competitive
What it costs
read from their page 15 Aug 2026
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $30/mo | — | 15 Aug 2026 |
Their pricing page is where these came from. Seeing a different price? Tell us.
The escape hatch
open source · no votes, no paid placement
Twenty
$0An open-source CRM with a modern data model, self-hostable.
twentyhq/twentyfree · open source
Monica
$0A personal CRM built around remembering people rather than deals.
monicahq/monicafree · open source
Why this verdict
our own opinion · changed only by a person
74/100
Verdict yes at 74. The going-cold list is the whole product and is one query; the enrichment extension is what you would miss.
History
tracked since 10 Aug 2026 · nothing is ever overwritten
Questions about Folk
answered from the record above
Is Folk free?
No — the plan we track is $30 a month. Standard at $30 per member per month billed monthly, $24 annually; Premium is $60 monthly.
Can you replace Folk by building your own?
YES. Replaceable in one session with an AI coding agent. Replacement score 74 out of 100, build time one session. Read what you lose before you decide.
How much does Folk cost?
$30 a month on Standard — $360 a year. Recorded 14 Aug 2026.
What do you lose by replacing Folk?
A browser extension that captures a person from LinkedIn or a website in one click, which is the habit the product sells; Mail and calendar sync that fills in the last-contacted date without anyone updating a record; Deduplication across sources, which is harder than it looks once the same person arrives three ways. If any of those carry weight for you, keep paying.
Is there an open-source alternative to Folk?
Yes: Twenty, Monica. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

