
ReachLog
ReachLog is a small outreach and contact manager for keeping track of who you’ve contacted, what you’ve discussed and when to follow up. It brings contacts, companies and email conversations together in a local application that works with your existing email account.

Images
About ReachLog
ReachLog is a small outreach and contact manager for keeping track of who you’ve contacted, what you’ve discussed and when to follow up. It brings contacts, companies and email conversations together in a local application that works with your existing email account.
I built it for my own freelance outreach. The CRMs I tried had plenty of functionality, but I kept running into the same combination: things I didn’t need and missing bits I actually cared about. I wanted to open a contact, see the conversation and know where things stood.
Apparently, my solution to being annoyed by a CRM was to build another one. Fair enough.
You can import contacts from CSV with duplicate checks, search through your list, keep company details together and prepare messages using drafts and templates. Conversation history and follow-ups stay alongside the contact, so you can pick things up without reconstructing the whole exchange from your inbox.
Email was a big part of getting this right. ReachLog sends through your own SMTP account and uses IMAP to sync messages and replies. You keep using your mailbox, with a place to organise the work around it.
There are also the less exciting things that become quite exciting when they’re missing: do-not-contact controls, exports and backups. Keeping track of who should be left alone matters just as much as remembering who needs a follow-up.
It’s built with TypeScript, Next.js, React and SQLite, runs locally with a browser interface, and is available through npm.
This started with a fairly ordinary problem in my own work. I’m still using that as the measure for what belongs in it: does this actually make keeping up with people easier?
Release history
Version 0.2.1
Added
- Save to history on the dashboard for email SMTP accepted but ReachLog could not record. Recovery saves the original sender, recipient and send date without sending again or scheduling another follow-up.
- A due follow-up count in desktop and mobile navigation, with guidance for using the app without Telegram reminders.
- Contacts exports in CSV and JSON, including email verification state and linked target counts.
reachlog verify-backup <file>to check a compressed SQLite backup, report its schema and record counts, and reject damaged or incomplete backups before restoring.
Changed
- Header search includes message subjects, bodies and addresses, plus contact form text and URLs. Search treats
%,_and backslashes literally. - Background tasks distinguish paused, enabled, never run, failed, skipped and interrupted states, with clearer timestamps and Run now behavior.
- Send review distinguishes failed sends from accepted messages missing their local records, and records the outcome of manual review.
Fixed
- Sending to a recipient with an unresolved accepted send is blocked, including through another target for that recipient.
- Recovering older email preserves newer replies, target state, drafts and follow-ups; it uses the original thread and does not count recovery as another SMTP attempt. Recovery and its audit event commit together, and repeating recovery does not duplicate the message.
- Recovery refuses to guess a missing original sender from current SMTP settings, and links sends whose messages are already in history.
- Restored send events use the original send date so activity totals do not count them as new sends today.
- Removed the unreachable local notification channel and corrected the worker message when Telegram is disabled.
- ESLint ignores runtime copies under
.data/so local captured packages do not break release checks.
Upgrade
- No new database migration or dependency changes. The schema remains at 0007, and existing schedule settings are preserved.
- Keep your data directory and back up the database before upgrading. Protect
connections.jsonand.envseparately from SQLite backups.
External download
Version 0.2.0
Added
- Built-in scheduling for mailbox sync, Telegram follow-up reminders, and SQLite backups, with opt-in schedules, editable intervals, Run now, and visible last-run, last-success, next-run, and failure states.
- Guided SMTP, IMAP, and Telegram setup in Settings, with immediate configuration updates, private credential storage, connection tests, mailbox discovery, and local Proton Bridge presets.
- Email template management with contact variables, previews, editable populated messages, and undo when replacing a composer draft.
- Regression coverage for upgrades, credential handling, local SMTP/IMAP protocols, Telegram checks, templates, scheduler coordination, worker lifecycle, and failures.
Changed
- The CLI and source development server supervise background scheduling.
--no-schedulerandREACHLOG_SCHEDULER_ENABLED=falsesupport existing external scheduling. - Worker locks renew during long tasks. Competing mail-sync, follow-up, and backup workers report a skipped run with exit code 75.
- Failed follow-up notifications now produce a failed worker result and remain eligible for retry.
- Environment and
.envsettings retain precedence and are identified as read-only in the connection forms. Existing configurations continue to work. - Build-time configuration and database paths are isolated from runtime data.
Fixed
- Unresolved template variables are blocked at both the composer and server before sending. Incomplete drafts can still be saved.
- Connection test failures return safe messages without exposing provider credentials or tokens.
- Template field labels remain stable when validation errors appear. Warning and error color shades now coexist with the existing theme aliases.
- Scheduler coordination recovers after an expired lease, including sleep and wake, and completed runs clear the queued message.
- Added a browser icon to eliminate the missing favicon request.
Upgrade
- Keep the existing data directory and back up the database before upgrading.
- Database migration 0007 adds templates and schedule state without rewriting existing contacts, messages, drafts, or earlier migrations.
- All built-in schedules start paused after upgrade. Enable them explicitly, or continue using external workers.
- Saved connection credentials are separate from SQLite backups. Back up
connections.jsonand.envsecurely when migrating machines.
External download
Version 0.1.0
- Initial packaged CLI release with persistent SQLite data, isolated demo mode, outreach tracking, CSV import and export, SMTP/IMAP support, manual follow-ups, persistent drafts, and native SQLite backups.
External download


















