- 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 |
||
|---|---|---|
| src | ||
| src-tauri | ||
| .gitignore | ||
| index.html | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
| vite.config.ts | ||
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
.dbor.sqlitefile 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 |
Full-Text Search
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.