Skip to content

Repository files navigation

Orbit

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.

Features

  • 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")

Setup

  1. Install Deno and Node.js
  2. Clone this repo
  3. Grant your terminal Full Disk Access (System Settings > Privacy & Security) for iMessage/WhatsApp/Call History
  4. Copy server/.env.example to server/.env and fill in API keys (optional, only needed for enrichment)
  5. 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 + dedup

Your crm.db SQLite database will be created automatically on first sync.

Import Sources

SourceScriptData importedHow to get the export
iMessageimport-imessage.tsMessages, contactsAutomatic (reads ~/Library/Messages/chat.db)
WhatsAppimport-whatsapp.tsMessagesAutomatic (reads WhatsApp Desktop local DB)
Apple Contactsimport-contacts.tsNames, phones, emails, photosAutomatic (reads ~/Library/Application Support/AddressBook/)
Call Historyimport-call-history.tsPhone callsAutomatic (reads macOS CallHistory.storedata)
LinkedInimport-linkedin.tsConnections, company, titleDownload your data > Connections CSV
X/Twitterimport-x.tsFollowers, following, biosAny Chrome extension that exports followers/following as CSV
X/Twitter DMsimport-twitter-dms.tsDM historyTwitter data export
Instagramimport-instagram.tsDMs, followersDownload your information
Facebookimport-facebook.tsMessenger historyDownload your information (JSON format)
Google Calendarimport-google-calendar.tsMeeting attendeesGoogle Takeout > Calendar, or calendar.google.com > Settings > Export
Google Contactsimport-google-contacts.tsEmail addressescontacts.google.com > Export > Google CSV
Gmailimport-mbox-contacts.tsEmail sender namesGoogle Takeout > Mail > mbox format
Substackimport-substack.tsSubscribersSubstack dashboard > Subscribers > Export
LinkedIn enrichmentenrich-linkedin.tsFull profile, experience, educationFresh LinkedIn Profile Data (RapidAPI)
Instagram enrichmentenrich-instagram.tsBio, follower countInstagram Scraper 2025 (RapidAPI)

Import Commands

# 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 contacts

Google Sheets Integration

For outreach tracking via Google Sheets:

  1. Create an OAuth 2.0 Web Client in Google Cloud Console
  2. Add http://localhost:3000/oauth2callback as an authorized redirect URI
  3. Set GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET in server/.env
  4. Run deno task run src/sheets-auth.ts and complete the OAuth flow in your browser
  5. Token is saved to .sheets-token.json (gitignored) and auto-refreshes

Tips

Recommended import order for best contact matching:

  1. deno task sync (iMessage, WhatsApp, Apple Contacts - gives you names + phone numbers)
  2. import-linkedin (adds email addresses + company/title)
  3. import-x (adds Twitter usernames, profile pics)
  4. import-google-contacts (links more email addresses to existing contacts)
  5. import-mbox (builds email->name map from Gmail, links calendar attendees)
  6. 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: jane@example.com
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)

How It Works

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.

Tech Stack

  • 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

License

MIT

About

Orbit - local-first personal relationship manager. Auto-import contacts from iMessage, WhatsApp, LinkedIn, X, IG, Google Cal, and 10+ more sources.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages