Folk

folk.appcontributed by Samuele Ongaro

YES

Replaceable in one session with an AI coding agent.

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.

Promptfree, for everyone, and the only version there is
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

PlanBilled monthlyBilled yearlyLast 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

$0

An open-source CRM with a modern data model, self-hostable.

twentyhq/twentyfree · open source

Monica

$0

A 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

Interest · last 30 dayspeak 2/day
views01230 Aug4 Sept9 Sept14 Sept19 Sept24 Sept28 Sept
— views— prompt copies none yet— votes none yet

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

All 19 in CRM & sales

Not sending yet

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

Esc