A CRM for one person is a short list of tables: contacts, companies, a note history, follow-up tasks and a pipeline of deals with stages. An agent builds that on SQLite in an afternoon. The weekend goes on what Less Annoying CRM wraps around it: logging email from Google or Outlook, calendar sync that stays correct, a CSV import that does not create duplicates, and permissions once a second person logs in. Skip those and you have a tidy address book with a pipeline; add them and you maintain mail credentials and a sync job yourself.
Before you buildThere is no free plan, but the 30-day trial has nothing locked, so run it next to your build for a month before cancelling. Alone, you pay $15 a month, $180 a year.
Build me a small contact manager to replace Less Annoying CRM, scaled down to one person. Requirements: - Node.js 22 + TypeScript: a Fastify server with server-rendered pages (Eta) and a little vanilla JS. `npm start` serves http://localhost:4810 only. - Storage: better-sqlite3 in ./data/crm.db: contacts, companies (a contact can belong to several), notes with an editable date, tasks (due date, done flag, linked contact), pipelines with ordered stages, and deals linked to a contact or company with a value and a stage. An FTS5 index covers names, notes and custom field values. - Custom fields: define text, number, date, dropdown and checkbox fields per record type on a settings page. - Contact page: one timeline of notes, tasks, deals and logged emails, newest first, with a note box on top. - Today page: tasks due today or overdue, and deals that have sat in one stage longer than a number of days set in .env (default 14). - Pipeline page: one column per stage; moving a card changes the stage and writes a timeline entry. - Import and export: CSV import (`papaparse`) with a column-mapping step and a dry run that lists likely duplicates by email, or by name + company; CSV export of contacts, companies, notes, tasks and deals; vCard export of contacts. - Email logging: poll one IMAP folder named in .env (`imapflow`), match each message to a contact by sender or recipient address and save it on the timeline with the subject and the first 2,000 characters. - One password in .env protects every page (signed cookie). - Single user. No accounts, no telemetry, local-first. Outbound calls: your IMAP server only. - Out of scope: two-way calendar sync, several users and permissions, mobile apps, sending email, Mailchimp or Zapier connections. - README: setup, the .env keys, backing up ./data, and a warning that Gmail needs 2-step verification and an app password before IMAP will work.
Opens your agent with the prompt filled in, you press enter. Or copy it and paste it into an empty folder.
The first prompt builds the core. Run these one at a time in the same folder to grow it into your own Less Annoying CRM.
Add a Less Annoying CRM importer to the contact manager in this folder. Requirements: - A command `crm import-lacrm <folder>` that reads the CSV files from Settings > Export in a Less Annoying CRM account: contacts and companies, notes (one per line), tasks, pipelines and pipeline item updates. - Read each file's header row first and print the column mapping chosen; stop and ask when a column is ambiguous instead of guessing. - Match notes, tasks and deals to contacts by email, then by name + company. Keep the original note dates. - `--dry-run` is the default and prints counts of created, skipped and unmatched rows; `--apply` writes. Running it twice must not create duplicates. - Update the README with the export steps.
Add a daily digest to the contact manager in this folder. Requirements: - A scheduled job (`node-cron`) at DIGEST_TIME in .env sends one email through nodemailer SMTP with tasks due today, overdue tasks and deals stuck in a stage for too long. - Each line links to the record on the local address in BASE_URL; send nothing on days with no items. - A "send test digest" button on the settings page and a `crm digest --print` command that prints the email to the terminal. - Update the README with the SMTP keys.
Add a calendar feed to the contact manager in this folder. Requirements: - A read-only iCalendar feed at /feed/<token>.ics with every open task that has a due date, as an all-day event titled with the contact's name, built with the `ics` package. - The token is a random 32-byte string stored hashed in SQLite, with a button to rotate it. - The feed is the only route allowed without the password, and it is rate-limited. - Update the README with how to subscribe from Apple Calendar and Google Calendar, and a note that the feed is only reachable from outside through a tunnel or a VPS.
Add duplicate merging to the contact manager in this folder. Requirements: - A Duplicates page that groups contacts sharing an email address, a phone number, or the same normalised name + company, with a score for each group. - Merge two or more records into one: choose the surviving record, pick a value per conflicting field, and move all notes, tasks, deals and logged emails onto the survivor. - Show a preview of the result before merging; keep the merged-away records in a trash table for 30 days with an undo button. - Update the README.
It is one plan at a flat per-seat price, aimed at a small office that wants contacts, notes and follow-ups in one place without a CRM administrator. Reviewers keep coming back to the plain interface, the price and the support line, and the usual complaints are thin automation, email and reporting.
Estimate · Runs on your own machine for nothing. A $5 VPS is only needed if you want to reach it from your phone. The build is token usage on your agent plan.
Checked 2026-10-19 against Less Annoying CRM's docs: 1, 2, 3, 4, 5, 6
| Plan | Monthly | Annual, per month | What you get |
|---|---|---|---|
| Everything included | $15 | — | Unlimited contacts and companies (the page suggests staying under about 50,000 in total), unlimited pipelines and custom fields, 25 GB of file storage per user, tasks, calendar sync, email logging, user permissions, mobile access and free email and phone support. |
No free plan; the 30-day trial needs no credit card and the pricing FAQ says nothing is locked during it.
Kinda. The core is a weekend build with the prompt on this page, but real gaps remain: Email logging from Google or Outlook that files messages onto contact profiles on its own, Calendar sync with Google Calendar and Outlook, with events saved to the contact.
About $15 a month on the Everything included plan per seat, $180 a year (checked 2026-10-19).
Email logging from Google or Outlook that files messages onto contact profiles on its own; Calendar sync with Google Calendar and Outlook, with events saved to the contact; Per-user permissions so teammates see only the records they should; The Zapier and Mailchimp connections, the public API and mobile access; Free human support from the vendor's coaches, which the FAQ says is open to non-paying users too. If any of those matter to you, keep paying.
Yes: Twenty (open source), EspoCRM (open source), Frappe CRM (open source).