We built LinkedOut because modern networking platforms went… well… off the rails. Somewhere along the way:
- They started training AI models on our personal connections
- Then tried to sell our own insights back to us at enterprise prices
- And finally locked everything behind paywalls thick enough to stop a tank
So we said: “What if we made a networking tool that’s actually… yours?”
LinkedOut is an offline-first, on-device AI networking app designed for people who want powerful features without handing over their entire professional history to the cloud overlords. Everything runs locally: your contacts, your embeddings, your search, your memory of where you met that one guy at that one rooftop thing.
No servers. No tracking. No creepy AI training on your relationships.
Just your network — for you.
-
Vision (OCR): Lightning-fast text extraction from business cards using Google ML Kit.
-
Reasoning (Text): Local LLMs via Cactus SDK (Qwen/Gemma) process fields, create structured JSON, and generate dense vector embeddings.
OCR, GPS capture, and AI model warm-up run in parallel for minimal wait time.
Automatically generates contextual follow-up emails using meeting metadata: Event + Location + Notes → human-sounding draft.
-
Zero-API Geocoding: Converts GPS → City/Country via a local
geonames.dbSQLite file. No Google Maps. No API keys. No data leaks. -
Auto-Tagging: Every contact is stamped with location context at capture time.
-
Map Visualization: Explore your network spatially — recall people via place, not just alphabetically.
-
Natural Language Search: Ask things like:
- “Investors within 50 miles of Denver”
- “Who did I meet last month?”
- “Designers I met in NYC who do AI UX”
-
Intent Router: LLM converts your query into structured JSON:
{ "location": "Denver", "concept": "VC", "time": "last year" } -
Hybrid Filtering: Deterministic filters (location/time) + Vector similarity search for concepts/skills.
-
Summarized Output: Search results appear as clean, actionable Contact Cards.
To balance performance with intelligence:
Lightweight vision layer (ML Kit) handles OCR.
A more capable text model (e.g., Qwen 0.6B) performs:
- Parsing messy OCR → structured
Contactobjects - 1024-dim vector embedding generation
- Chat + semantic reasoning
Lazy-loading ensures fast startup and on-demand heavy lifting.
When a user types a query:
- Parse: LLM extracts structured parameters (location, time, concept).
- Spatial Filter: SQLite search for cities within a radius.
- Temporal Filter: Timestamp-based filtering.
- Vector Rank: Cosine similarity against query embeddings.
- Summarize: Present as Contact Cards in chat.
Stores:
- Contact objects
- Embeddings
- Relationship metadata
Read-only geonames database with ~25k global cities for offline reverse geocoding.
lib/
├── main.dart # App Entry & Dependency Injection
├── app.dart # Routing & Theme Config
├── core/
│ └── utils/ # Helpers (Vector Math, Business Card Regex)
├── data/
│ ├── local/ # Isar Service & Database Logic
│ ├── models/ # Contact Schema (with Embeddings)
│ └── repositories/ # CRUD Ops & Auto-Embedding Logic
├── services/
│ ├── ai/ # Cactus SDK Wrapper (Model Mgmt)
│ ├── location/ # GPS & Offline Geocoding (SQLite)
│ └── search/ # Advanced Search & Intent Parsing
└── presentation/
├── screens/
│ ├── chat/ # Smart Search & Chat UI
│ ├── contact/ # Detail & Edit Views
│ ├── home/ # Dashboard (Alphabetical)
│ ├── onboaring/ # Model Download & Setup
│ ├── profile/ # "Me" Card
│ ├── scan/ # Camera & OCR Review
│ └── timeline/ # Chronological History View
└── widgets/ # Reusable UI Components
- App initializes
- Auto-download required AI models
geonames.dbcopied from assets → local storage
- User taps Scan
- Parallel execution: camera capture + GPS
- OCR via ML Kit
- LLM parses fuzzy fields
- Offline geocoding → “Denver, USA”
- Auto-draft email generated
- User reviews & confirms
- Save to Isar
- Generate vector embeddings
- User asks: “Who are the investors I met in Denver?”
- LLM parses intent
- Spatial → Temporal → Vector ranking
- Display Contact Cards in chat
Place the following in assets/:
geonames.dbcities.csv(fallback)LinkedOut.svg
Run after updating models:
flutter pub run build_runner build --delete-conflicting-outputs
flutter pub get
flutter run
Isar Inspector appears in terminal logs. On physical devices:
adb forward tcp:PORT tcp:PORT

