Network Intelligence OS
Import LinkedIn contacts, ask natural-language questions, get ranked answers with evidence.

TL;DR
- CSV-only ingestion, server-side normalized.
- Natural-language ranked search with evidence.
- pgvector embeddings for semantic recall.
- Hardened: row caps, escaped rendering, restricted CORS, least-privilege DB user.
Architecture
Single-tenant. No external fetches. Embeddings precomputed on import.
Problem
Personal LinkedIn networks are searchable by name only. Asking 'who do I know in SF interested in AI infra?' is impossible without exporting a CSV and grep'ing manually. The data is sitting there; the interface is missing.
Approach
CSV importer with server-side normalization (size caps, header validation, no external image fetching, escaped rendering). NLP-driven query layer ranks people with supporting evidence. Built on Next.js 16 + Supabase realtime + pgvector for embedding search. Hardened from the start, not retrofitted.
Deep dive
Why hardening from day one
A network tool is exactly the kind of app that becomes a juicy target — full of personal data with a single user. Designing for least-privilege, no external image fetching, and transactional snapshot replacement from the first commit keeps the threat surface tiny without slowing iteration later.
Evidence-ranked search
Embedding-only ranking gives you uncanny results without explainability. Each hit comes with the field that matched (title, summary, mutual, tag) so the user sees why someone surfaced. Cheap to build, huge trust difference.
Outcome
MVP. Security review documented. Threat model in /docs. Tests at unit (Vitest), integration (Pytest), and e2e (Playwright) levels.
Related


