Discover which of your contacts are already on the platform — without disclosing your address book.
PrivateConnect is a privacy-preserving contact discovery product concept and frontend MVP. Instead of uploading a full address book to a central service, the user imports a small batch of contacts, the system prepares identifiers locally, and the product reveals only confirmed overlap.
The goal is simple:
show the matches, hide everything else.
Traditional contact discovery usually requires sending an address book to a server so it can compare contacts against a central registry. That model leaks far too much information: it tells the platform who you know, who you searched for, and which non-users exist in your graph.
PrivateConnect is designed around a narrower and more defensible privacy model:
- only confirmed matches should be revealed
- non-matching contacts should remain hidden
- discoverability should remain user-controlled
- the privacy workflow should be understandable to the user
PrivateConnect helps a user answer one question:
Which of my contacts are already here?
The product flow is intentionally constrained:
- Create a profile and control discoverability
- Import up to 10 contacts
- Normalize contacts locally
- Run a staged private discovery flow
- Show only matched profiles
- Keep non-matching contacts outside the visible result set
This repository currently represents a polished frontend MVP / demo branch.
It includes:
- a complete end-to-end frontend journey
- local profile creation and profile editing
- explicit discovery progress states
- a seeded demo registry
- matched-only results rendering
- local/session-based demo storage for the flow
/— landing page/onboard— profile creation/discover— contact import and discovery/results— matched results only/profile— profile and discoverability settings
The discovery experience is intentionally explicit. The progress states are part of the product story, not just loading UI.
idlenormalizingencryptingsubmittingprocessingcompletefailed
These states make the privacy workflow legible to reviewers, judges, and users.
PrivateConnect is built around selective reveal.
- confirmed matches
- match count
- protected non-match count
- the full submitted contact list
- non-matching contacts
- unnecessary identity data for unmatched entries
- a broad contact-upload reveal surface
The result view is intentionally narrow by design.
In plain language:
- the user prepares a small contact batch
- identifiers are normalized locally
- the product runs a private discovery flow
- only confirmed overlap is surfaced back to the user
- non-matching entries remain outside the visible result model
The intended architecture has three layers:
┌───────────────────────────────────────────────────────────────────┐
│ Frontend (Next.js) │
│ - Wallet connection │
│ - Contact import │
│ - Local normalization │
│ - Encryption / request submission │
│ - Progress UI │
│ - Result rendering │
└───────────────────────────────┬───────────────────────────────────┘
│
▼
┌───────────────────────────────────────────────────────────────────┐
│ Solana Program (Anchor) │
│ - Owns public state │
│ - Stores profiles / discoverability records │
│ - Queues confidential computation │
│ - Receives callback output │
└───────────────────────────────┬───────────────────────────────────┘
│
▼
┌───────────────────────────────────────────────────────────────────┐
│ Arcium Confidential Compute │
│ - Compares encrypted identifiers │
│ - Computes overlap privately │
│ - Returns compact result │
└───────────────────────────────────────────────────────────────────┘
The intended confidential-compute model is:
- the frontend prepares identifiers client-side
- guest query inputs are encrypted for confidential processing
- registry-side discoverability data is held in a confidentially matchable form
- Arcium executes the overlap computation over encrypted inputs
- the result is compact and scoped to the requesting user flow
For the MVP, the confidential output is intentionally small and bounded so the result model stays practical and reviewer-friendly.
cd app
npm install
npm run devOpen:
http://localhost:3000
Go to /onboard and create a discoverable profile.
Go to /discover and paste this sample batch:
bob@example.com
carol@example.com
dave@example.com
eve@example.com
stranger1@test.com
stranger2@test.com
stranger3@test.com
stranger4@test.com
stranger5@test.com
stranger6@test.com
The product runs through the staged discovery flow and redirects to /results.
You should see:
-
3 confirmed matches
-
matched profiles for:
- Bob
- Carol
- Dave
-
7 protected non-matches
That is the key demo story: the product reveals the overlap, not the full list.
- the product is not designed as a broad contact-upload system
- the discovery states are explicit and understandable
- the result view reveals only confirmed overlap
- non-matching contacts do not become visible identities
- discoverability remains user-controlled
PrivateConnect reframes contact discovery from:
- “upload your address book and let the server decide”
into:
- “compute overlap privately and reveal only what is necessary”
That makes the UX clearer and the privacy story stronger.
This MVP intentionally keeps the demo bounded and legible.
-
identifier type: email
-
max batch size: 10
-
seeded secure matches: 3
-
result model:
- matched profiles
- total checked
- protected non-match count
- it keeps the flow understandable
- it makes the result surface compact
- it supports a strong reviewer demo
- it prevents the UI from over-claiming functionality beyond the MVP
app/
├── src/
│ ├── components/
│ │ ├── ContactImporter.tsx
│ │ ├── DiscoveryProgress.tsx
│ │ ├── MatchCard.tsx
│ │ ├── PrivacyExplainer.tsx
│ │ └── WalletButton.tsx
│ ├── hooks/
│ │ └── useDiscovery.ts
│ ├── lib/
│ │ ├── constants.ts
│ │ ├── mockDiscovery.ts
│ │ └── normalize.ts
│ ├── pages/
│ │ ├── _app.tsx
│ │ ├── index.tsx
│ │ ├── onboard.tsx
│ │ ├── discover.tsx
│ │ ├── results.tsx
│ │ └── profile.tsx
│ └── styles/
│ └── globals.css
This project is intentionally built around four product principles:
Users should understand that discovery is not a plain contact upload.
Only overlap should be surfaced.
Users should be able to opt in or out.
The UI should communicate the privacy model without exaggerated claims.
- clear privacy-oriented product framing
- complete end-to-end frontend flow
- explicit discovery states
- controlled result scope
- polished dark-mode interface
- profile and discoverability controls
- demo-ready narrative for review
The next engineering step is to replace mock discovery orchestration with real confidential matching infrastructure.
That future path is expected to include:
- local normalization
- deterministic identifier derivation
- encrypted matching inputs
- Solana-owned state and orchestration
- confidential computation callbacks
- compact overlap-safe result handling
PrivateConnect is a privacy-preserving contact discovery experience designed around one core principle:
reveal only the overlap.
It turns contact discovery from a broad contact-upload pattern into a narrower, clearer, and more defensible privacy product.
MIT




