A local-first personal relationship manager that imports your contacts from 15+ sources and helps you stay in touch. Designed to work alongside AI coding agents like Claude Code. Built with Deno + React + SQLite. Open-source personal CRM.
Unlike SaaS tools (Dex, Clay, Folk) that require manual data entry or subscriptions, Orbit auto-imports from every platform you actually use, merges duplicates, and gives you a unified view of all your relationships. Unlike Monica (the main open-source alternative), Orbit is CLI-first and focuses on automated import rather than manual logging.
Because all your contacts live in a single SQLite database with rich metadata (messages, LinkedIn profiles, calendar events, tags), you can use an AI agent to query across your entire network. For example: "Who in my contacts works in philanthropy or has funding capacity for a non-profit?" or "When did I last talk to anyone at a16z?" - the agent can search your CRM, look up context, and even add people to a Google Sheet for outreach.
All data stays on your machine in a single SQLite file.
- Auto-import from 15+ sources (see table below)
- Fuzzy duplicate detection + merge UI with redirect tracking for re-import stability
- LinkedIn/Instagram profile enrichment via RapidAPI
- Stay-in-touch reminders with snooze and "contacted" logging
- Contact timeline (messages, calls, calendar events, manual notes across all sources)
- Profile picture pipeline (Apple Contacts, LinkedIn, image search)
- Google Sheets integration for outreach tracking
- Favorites, tags, archive, notes
- Full-text search across contacts and messages
- CLI lookup tool (
deno task lookup "name")
- Install Deno and Node.js
- Clone this repo
- Grant your terminal Full Disk Access (System Settings > Privacy & Security) for iMessage/WhatsApp/Call History
- Copy
server/.env.exampletoserver/.envand fill in API keys (optional, only needed for enrichment) - Run:
npm install --prefix client # Install client dependencies
./dev.sh # Start server + client at http://localhost:5173
deno task sync # Import iMessage, WhatsApp, calls, Apple Contacts + dedupYour crm.db SQLite database will be created automatically on first sync.
| Source | Script | Data imported | How to get the export |
|---|---|---|---|
| iMessage | import-imessage.ts |
Messages, contacts | Automatic (reads ~/Library/Messages/chat.db) |
import-whatsapp.ts |
Messages | Automatic (reads WhatsApp Desktop local DB) | |
| Apple Contacts | import-contacts.ts |
Names, phones, emails, photos | Automatic (reads ~/Library/Application Support/AddressBook/) |
| Call History | import-call-history.ts |
Phone calls | Automatic (reads macOS CallHistory.storedata) |
import-linkedin.ts |
Connections, company, title | Download your data > Connections CSV | |
| X/Twitter | import-x.ts |
Followers, following, bios | Any Chrome extension that exports followers/following as CSV |
| X/Twitter DMs | import-twitter-dms.ts |
DM history | Twitter data export |
import-instagram.ts |
DMs, followers | Download your information | |
import-facebook.ts |
Messenger history | Download your information (JSON format) | |
| Google Calendar | import-google-calendar.ts |
Meeting attendees | Google Takeout > Calendar, or calendar.google.com > Settings > Export |
| Google Contacts | import-google-contacts.ts |
Email addresses | contacts.google.com > Export > Google CSV |
| Gmail | import-mbox-contacts.ts |
Email sender names | Google Takeout > Mail > mbox format |
| Substack | import-substack.ts |
Subscribers | Substack dashboard > Subscribers > Export |
| LinkedIn enrichment | enrich-linkedin.ts |
Full profile, experience, education | Fresh LinkedIn Profile Data (RapidAPI) |
| Instagram enrichment | enrich-instagram.ts |
Bio, follower count | Instagram Scraper 2025 (RapidAPI) |
# Core sync (run regularly to pick up new messages)
deno task sync
# Social platforms (run after downloading new exports)
deno task import-linkedin # Reads Connections.csv from exports/
deno task import-x # Reads Twitter CSV from exports/ or ~/Downloads
deno task import-instagram # Reads Instagram JSON export from exports/
deno task import-facebook # Reads Facebook JSON export from exports/
# Google data (run after Google Takeout / calendar export)
deno task import-google-contacts # Reads ~/Downloads/google-contacts.csv
deno task import-google-calendar # Reads ICS files (unzip Takeout to /tmp/gcal_export/)
deno task import-mbox # Parses mbox From headers for email->name mapping
# Enrichment (uses RapidAPI credits)
deno task enrich-linkedin 100 # Enrich next 100 unenriched contactsFor outreach tracking via Google Sheets:
- Create an OAuth 2.0 Web Client in Google Cloud Console
- Add
http://localhost:3000/oauth2callbackas an authorized redirect URI - Set
GOOGLE_CLIENT_IDandGOOGLE_CLIENT_SECRETinserver/.env - Run
deno task run src/sheets-auth.tsand complete the OAuth flow in your browser - Token is saved to
.sheets-token.json(gitignored) and auto-refreshes
Recommended import order for best contact matching:
deno task sync(iMessage, WhatsApp, Apple Contacts - gives you names + phone numbers)import-linkedin(adds email addresses + company/title)import-x(adds Twitter usernames, profile pics)import-google-contacts(links more email addresses to existing contacts)import-mbox(builds email->name map from Gmail, links calendar attendees)import-google-calendar(matches attendees by email - needs emails from steps 2-5)
The mbox trick: Google Calendar ICS files often have email-only attendees (no display names). The mbox import parses From: headers from your Gmail export to build a 15k+ email->name mapping, which dramatically improves calendar attendee matching.
Browsing your data: Install DB Browser for SQLite or TablePlus to browse crm.db directly. Useful for ad-hoc queries the web UI doesn't cover.
CLI lookup: Quick contact info without opening the browser:
$ deno task lookup "Isaiah"
=== Jane Smith (id: 42) ===
LinkedIn: Software Engineer at Acme Corp
Messages: 812 | First: 2022-03-15 | Last: 2026-04-10
Phones: +15551234567
Emails: [email protected]
Recent messages:
2026-04-10 [imessage] them: sounds good!
2026-04-09 [imessage] me: want to grab coffee this week?
2026-03-15 [calendar] me: 1:1 catch-up (+1 attendees)
The CRM uses a merge-redirect system for re-import stability: when you merge two contacts, it records which source IDs (Apple Contacts ID, LinkedIn URL, X username, email) pointed to the merged-away contact, so the next time you re-import, the data flows to the correct contact automatically.
Each import script is idempotent - you can re-run them safely. Messages are deduped by source-specific IDs (iMessage ROWID, etc.), and contacts are matched by email > phone > name.
- Server: Deno, SQLite (
@db/sqlite), HTTP API - Client: React, Vite, Tailwind CSS, shadcn/ui (base-ui)
- Data: Single SQLite file (
crm.db), profile photos on disk
MIT