Local-First Personal CRM: Desktop app for tracking relationships, follow-ups, and notes about people. SQLite-backed, no account required, one-time purchase with optional sync. The Obsidian model applied to contact management for the privacy-first crowd.
Find a file
JoePro e9724fb28b feat: initial MVP — Tauri + React + SQLite, full CRUD, FTS, export
- Tauri 2 desktop app with React + TypeScript frontend
- SQLite backend with FTS5 full-text search (rusqlite)
- Contact management: add, edit, delete with tags and notes
- Interaction log per contact (call, email, meeting, coffee, message, other)
- Follow-up reminders with due dates and complete/delete
- FTS5 search across contacts and interaction notes
- Export to JSON or CSV via native file dialog
- Dark theme, no account, no sync required
2026-03-20 22:14:48 -05:00
src feat: initial MVP — Tauri + React + SQLite, full CRUD, FTS, export 2026-03-20 22:14:48 -05:00
src-tauri feat: initial MVP — Tauri + React + SQLite, full CRUD, FTS, export 2026-03-20 22:14:48 -05:00
.gitignore feat: initial MVP — Tauri + React + SQLite, full CRUD, FTS, export 2026-03-20 22:14:48 -05:00
index.html feat: initial MVP — Tauri + React + SQLite, full CRUD, FTS, export 2026-03-20 22:14:48 -05:00
package.json feat: initial MVP — Tauri + React + SQLite, full CRUD, FTS, export 2026-03-20 22:14:48 -05:00
README.md docs: initial README 2026-03-20 21:58:39 -05:00
tsconfig.json feat: initial MVP — Tauri + React + SQLite, full CRUD, FTS, export 2026-03-20 22:14:48 -05:00
vite.config.ts feat: initial MVP — Tauri + React + SQLite, full CRUD, FTS, export 2026-03-20 22:14:48 -05:00

Local Personal CRM

Track your relationships without giving them to a cloud.


Overview

Local Personal CRM is a desktop application for managing personal and professional relationships — contacts, interaction history, follow-up reminders, and notes — all stored locally in SQLite. It is built for people who want full ownership and control of their relationship data: no accounts, no cloud dependency, no subscription, and it works fully offline. The target user is developers, indie hackers, consultants, and privacy-first professionals who already trust tools like Obsidian or Logseq for their notes and want the same guarantees applied to their contact data.


Features

  • Contact management — add and edit contacts with name, company, email, phone, tags, and notes
  • Interaction log — track every call, email, meeting, or coffee chat with a full timeline per contact
  • Follow-up reminders — create tasks with due dates tied to specific contacts so nothing falls through the cracks
  • Full-text search — search across all contacts, notes, and interaction history instantly
  • SQLite-backed local storage — all data lives in a single file you control; no account, no sync required to get started
  • Runs fully offline — zero network dependency for core functionality
  • User-controlled data file — the database is a plain .db or .sqlite file on your filesystem; back it up, move it, own it
  • Export — dump contacts and interaction data to JSON or CSV at any time

Why Local-First

Most CRM tools treat your relationship data as a product. They store it on their servers, reserve the right to export or delete it on their terms, and add friction — accounts, logins, subscriptions — before you can do anything useful. Local Personal CRM inverts that.

Your data lives on your machine. There is no server. There is no account. There is no SaaS dependency. This is the Obsidian model applied to contact management: your relationships are as private as your notes, and just as portable.

The benefits are concrete:

  • Privacy — your contact data never leaves your machine unless you explicitly export it
  • Ownership — the SQLite file is yours forever, regardless of what happens to this project
  • No vendor lock-in — export to JSON or CSV and take your data anywhere at any time
  • Works offline — no internet connection required for any feature, ever
  • Longevity — a SQLite file from 2026 will be readable in 2036 with standard tools

Tech Stack

The stack below reflects the current design intent. TBD items have not yet been decided.

  • Runtime / framework: TBD (e.g. Electron, Tauri, or native with Qt/WinUI)
  • Database: SQLite
  • Language: TBD (e.g. TypeScript + Rust if Tauri, TypeScript if Electron)
  • UI toolkit: TBD (e.g. React, Svelte, Solid, or native)
  • Packaging: TBD (e.g. DMG for macOS, MSI/EXE for Windows, AppImage/Flatpak for Linux)

Getting Started

Prerequisites

  • [TBD] A supported operating system: macOS (Intel or Apple Silicon), Windows 10+, or Linux (TBD which distributions)
  • [TBD] Runtime dependencies if any (e.g. Node.js >= 18, Rust toolchain)

Install

Pre-built releases will be available at [TBD: releases page URL] when the first stable version ships.

To install from source:

[TBD] git clone <repo-url>
[TBD] cd LocalPersonalCRM
[TBD] npm install   # or yarn / pnpm / cargo, depending on stack

Run Locally

[TBD] npm run dev    # or cargo run / go run / etc.

The app will open with an empty database on first launch, stored at the default data directory (see Data Location below).

Build / Package

[TBD] npm run build     # production build
[TBD] npm run package   # platform-specific installer (DMG, MSI, AppImage, etc.)

Output artifacts will appear in [TBD: output directory, e.g. dist/ or release/].


Data Location

On first launch, the app creates a SQLite database at:

  • macOS: ~/Library/Application Support/LocalPersonalCRM/data.db
  • Windows: %APPDATA%\LocalPersonalCRM\data.db
  • Linux: ~/.local/share/LocalPersonalCRM/data.db

The exact path will be logged on startup and accessible via app settings.


Data Model

All data is stored in a single SQLite file. The schema is designed to be simple, self-contained, and portable.

contacts

Column Type Description
id INTEGER Primary key, auto-increment
name TEXT Full name
company TEXT Company or organization
email TEXT Email address
phone TEXT Phone number
tags TEXT Comma-separated tag list
notes TEXT Free-form notes about the contact
created_at TEXT ISO 8601 timestamp
updated_at TEXT ISO 8601 timestamp

interactions

Column Type Description
id INTEGER Primary key, auto-increment
contact_id INTEGER Foreign key → contacts.id
type TEXT Interaction type: call, email, meeting, coffee, message, other
date TEXT ISO 8601 date of the interaction
notes TEXT Free-form notes about what happened
created_at TEXT ISO 8601 timestamp

followups

Column Type Description
id INTEGER Primary key, auto-increment
contact_id INTEGER Foreign key → contacts.id
due_date TEXT ISO 8601 date the follow-up is due
note TEXT Short description of what needs to be done
completed INTEGER 0 = pending, 1 = completed
created_at TEXT ISO 8601 timestamp

The database includes an FTS5 virtual table (planned for v1) that indexes contact names, notes, company, tags, and interaction notes for fast full-text search without loading the full dataset into memory.


Roadmap

v1 — MVP

  • Add / edit / delete contacts
  • Log interactions with type and date
  • Create and manage follow-up reminders
  • Full-text search across contacts and notes
  • Export contacts and interactions to JSON or CSV
  • First stable release and one-time purchase unlock

Post-launch

  • Optional encrypted sync (iCloud, Dropbox, self-hosted WebDAV)
  • iOS / Android companion app
  • Read-only email and calendar integration (Google Calendar, Apple Calendar)
  • Import from Google Contacts, LinkedIn CSV, vCard
  • Relationship strength scoring (frequency, recency, engagement weight)
  • Bulk tagging and filtering
  • Dark mode and theming

Pricing

  • One-time purchase: Price TBD
  • No subscription — you buy once, you own it
  • 14-day money-back guarantee — if it doesn't work for you, reach out for a full refund
  • Optional sync add-on: Future paid upgrade (pricing TBD) — encrypted sync via a provider of your choice

Contributing

This is a single-developer project for now. Contributions are welcome, but please open an issue before starting significant work. This lets us discuss direction before you invest time in code.

For small improvements, bug fixes, or documentation corrections, open a pull request directly — no need to open an issue first.

For anything non-trivial (new features, UI changes, schema changes), open an issue first and wait for a response before submitting a PR.


License

License: TBD

The license has not yet been decided. All rights are reserved until a license is chosen and applied to the repository. Do not assume this project is open source until a license file (e.g. LICENSE) is present in the repository.