← All docs

Identity Verification

How we ensure one person = one account without compromising privacy.

The Requirement

Every account on the platform must belong to a unique, real human. This is non-negotiable — voting, contracts, certification, and community trust all depend on it.

Proposed Design (Three Layers)

Layer 1 — Government Identity Verification (Device-Local)

Verification is handled through existing KYC providers who already have government API access. The critical design choice: identity data stays on the user's device. The platform never receives raw identity information.

How it works:

  1. User initiates verification from the app
  2. KYC provider verifies the user's identity (Aadhaar eKYC, passport scan, etc.)
  3. Provider issues a signed credential directly to the user's device — containing verified attributes (name, age bracket, district, etc.) and the raw identity number
  4. The credential is cryptographically signed by the provider — the user cannot modify it without invalidating the signature
  5. The phone and our server jointly compute a deduplication hash via OPRF — the server never sees the ID number, the phone never sees the key
  6. Only the final hash is sent to the platform server — for one-account-per-human enforcement
  7. All identity data remains on-device, never transmitted to the platform

What exists today vs what we'd build:

Starting point: India launches on DigiLocker/Aadhaar offline (already supports device-local credentials). EU launches on eIDAS wallets. Other jurisdictions start with commercial providers under a negotiated device-local flow, or fall back to a model where the provider verifies and we receive only a pass/fail + dedup-eligible identifier (not full identity data).

The platform does not hold a government API license directly. We integrate with providers who do — no 12-18 month license wait, no risk of denial.

Cost: KYC providers charge ₹5-20 per verification in India, $1-3 elsewhere. Passed to the user as a one-time registration fee.

What this proves: You are a real person with a government-issued identity. You are unique (no duplicate accounts). The platform proved this without ever seeing your identity data.

Deduplication — How "One Person, One Account" Actually Works

The one-account guarantee requires detecting if someone has already registered. The platform needs exactly one piece of information: a unique, irreversible identifier per person. Nothing else.

Primary (India — 95% of users): OPRF-based deduplication

The hash is computed jointly by the phone and the server using an Oblivious Pseudo-Random Function (OPRF, RFC 9497). Neither side sees the other's secret:

  1. User verifies via KYC provider — provider issues signed credential containing Aadhaar number to the user's device.
  2. Phone reads the Aadhaar number from the credential and blinds it (multiplies by a random factor r known only to the phone).
  3. Phone sends the blinded value to the platform server. The server sees a random-looking value — cannot derive the ID number from it.
  4. Server applies the HMAC key (stored in HSM) to the blinded value, returns the evaluated result.
  5. Phone unblinds the result (removes r) to produce the final hash. The phone never learned the key.
  6. Phone sends the final hash to the server for dedup check.
  7. Server checks the hash against existing records. Match = duplicate, rejected. No match = new user, hash stored.

What each party sees:

Why not let the KYC provider compute the hash: Creates dependency on the provider for a core security function. Provider switching becomes complex. The platform should control its own dedup logic.

Security properties:

Implementation: Libraries exist for OPRF in Rust, Go, and JavaScript (based on RFC 9497). Used in production by Apple (Private Set Intersection), Cloudflare (Privacy Pass), and in the OPAQUE password protocol.

Why HMAC and not plain hash: Aadhaar is 12 digits (10^12 possibilities) — a plain SHA-256 hash is brute-forceable in hours. HMAC with a secret key means the hash cannot be reversed without the key.

Fallback (no Aadhaar, international users): Face deduplication (1:N matching)

For users verifying with non-Aadhaar documents (Voter ID, Passport, PAN, international IDs):

  1. User completes verification + face scan via KYC provider.
  2. Provider performs 1:N face matching — checking the new face against ALL previously registered faces in their system.
  3. Match found = duplicate account attempt, rejected.
  4. No match = new user, enrolled in provider's face registry.

The platform never stores face embeddings or biometric templates. The KYC provider maintains the face registry and performs dedup checks — returning only pass/fail to the platform.

Known limitation: This creates provider dependency. The face registry lives with the provider — if we switch providers or they shut down, dedup continuity for these users breaks. We can't self-host the registry without storing biometric data on our servers (contradicts the architecture). This is acceptable because face dedup is a bridge, not the target state.

Upgrade path: Users who verified via face dedup can upgrade to OPRF-based dedup at any time once they have a supported ID (Aadhaar, SSN, etc.). Their account transitions to the standard mechanism and they're no longer dependent on the face registry. The goal is to move as many users as possible onto OPRF-based dedup over time.

International expansion: Each country gets a primary dedup ID where one exists (SSN in US, National Insurance number in UK, BSN in Netherlands). Face dedup is the universal fallback for countries without a single dominant identifier.

Provider switching (primary path): The OPRF hash is computed by the phone + server using the platform's key. The KYC provider is only involved in issuing the credential — not in hash computation. Switching providers has zero impact on OPRF-based deduplication. Only face-dedup users are affected by provider changes.

Layer 2 — Face Scan (Liveness Check)

For high-stakes actions (voting, large contracts, governance decisions), communities can require a face scan that matches the government ID photo.

What this proves: The person using the account right now is the person who registered it.

Layer 3 — OTP (Bot Friction + Second Factor)

One phone number per account at registration. OTP is a second factor, not the primary auth.

What this does NOT do: OTP alone does not grant account access. A recycled or swapped SIM cannot be used to take over an account.

Login model:

SIM recycling / swap protection:

Shared phone households:

What this proves: Bot farms can't operate at scale without massive SIM acquisition. Legitimate users aren't locked out by SIM issues because identity lives in Layer 1, not Layer 3.

Combined Effect

To game the system you would need: a real government ID + a face that matches it + a unique phone number — per account. This is effectively one-human-one-account.

Verification Layers

Layer 1: Government ID via KYC provider Layer 2: Face Scan liveness check Layer 3: OTP second factor Proves: Uniqueness Proves: Current holder Prevents: Bot-scale attacks Combined guarantee Real government ID + matching face + unique phone = one human, one account

Privacy Guarantees

The platform never receives identity data. These guarantees are enforced by architecture, not policy alone.

GuaranteeWhat it means
Identity data never reaches the platformRaw identity information (name, ID number, address, DOB) stays on the user's device. The platform receives only a deduplication hash — computed jointly by the phone and server via OPRF, irreversible, containing no personal information.
No selling or sharingThere is nothing to sell. The platform holds a hash and a pass/fail status. No identity data exists on platform servers.
No profiling from verificationVerification produces a hash for dedup and a pass/fail. Attributes (age bracket, district, gender) live on-device and are presented only when the user chooses to prove them.
Minimum data principleThe platform stores: one HMAC per user (for dedup), verification status (pass/fail), timestamp. Nothing else.
Non-reversible storageEven if the database leaks, no one can reverse the HMAC to an ID number without the key derivation secret (stored separately in HSM/secrets manager).
Face data: platform never storesFor face-dedup users, the KYC provider maintains face embeddings for 1:N matching. The platform receives only pass/fail — no biometric data touches our systems.
Liveness checks not retainedLiveness checks for high-stakes actions produce pass/fail. Biometric data is processed in real-time by the provider and discarded.
Device-local credentialsThe signed credential on your device is the source of truth. If you delete it, re-verification with the KYC provider reissues it. The platform has no copy.
Open-source verification logicAnyone can audit exactly what data flows where. No black boxes.

Two Paths: Anonymous or Public Identity

The platform knows you're real. What others see is your choice.

Path 1: Anonymous Participation

Pseudonymous participation with verified-human backing. Privacy without enabling manipulation.

Path 2: Public Profile — Citizen of the World

You can also choose to show up as yourself. The profile you build over time becomes useful.

What a public profile is:

A reputation ledger. It accumulates from what you do on the platform.

What others seeHow it's built
Where you're from (granularity you choose: country, state, or city)From your verified attributes
How long you've been verifiedTimestamp of verification
Review accuracy (% of reviews rated helpful/accurate by peers)Computed from peer ratings
Trust scoreEigenTrust graph propagation
Communities you participate inYour activity
Skills you're certified inExpert evaluations
Contributions to the platformPublic ledger

Example: "Verified user from Jaipur, Rajasthan — 2 years on platform, 94% review accuracy, certified solar installer." Backed by verified identity and observable history.

Constraints:

The incentive structure:

Anonymous users have full access. Public profiles accumulate standing. When someone from Rajasthan writes a review of a local electrician, or when a certified plumber answers a question — the credibility is visible. Connections (professional, community, geographic) compound over time.

Granularity controls:

Verification = Constitutional Rights

Completing identity verification grants you constitutional rights on the platform. These rights are encoded in the company's Articles of Association / Operating Agreement — legally enforceable, not just a Terms of Service promise.

What happens at verification:

  1. KYC provider confirms your identity
  2. You're shown the platform constitution: your rights, the governance model, and what protections exist
  3. You accept the terms (digitally signed, enforceable)
  4. You're enrolled as a verified user with full constitutional rights

What verification gives you:

Why this works:

Why not user ownership: We explored making every user a legal co-owner (member-governed LLC). It doesn't work at scale — no precedent for million-member LLCs, tax filing nightmare (K-1s for every member), near-impossible to raise capital, FEMA ambiguity for Indian members. The trust model (proven by Patagonia, Signal, Mozilla) gives users real control (vote, elect, remove leaders) through governance rights, while the trust prevents anyone — including the founder — from overriding that control. Same outcome as ownership, without the legal complexity of million-member shareholding.

Cost

Identity verification APIs charge per check (₹5-20 in India, $1-3 elsewhere). A small fee covers the verification cost and serves as a minor friction barrier against frivolous account creation.

Account Recovery

Phone lost or number changed (still have password):

  1. Log in with password on a new device.
  2. Bind a new phone number (requires face scan to confirm identity).

Password forgotten (still have phone):

  1. OTP to existing number + face scan → reset password.

Both lost (phone and password):

  1. Re-verify with government ID through the same API.
  2. Complete a face scan matching your original verification.
  3. Set new password, bind new phone number.

In all cases, you must prove you're the same person. A recycled SIM alone never grants access — the new SIM owner cannot log in without the password, and cannot reset the password without passing a face scan against the original verified identity.

Age Threshold

Age is verified through the government ID layer during registration. Jurisdictional restrictions are applied based on the user's verified location.

People Without Government ID

An estimated 850 million people globally lack government-issued ID. The platform must still be useful to them without compromising the trust guarantees that verified identity provides.

Access tiers:

TierRequirementCan doCannot do
VerifiedGovernment ID + OTPEverything — review, vote, contract, sell, certify, govern
VouchedN verified members vouch + OTPDiscussion, chat, browse marketplace, buy (not sell)Review, vote, contract, sell, certify, govern
UnverifiedEmail/phone onlyBrowse, read, searchParticipate in any way that requires trust

Why three tiers:

The platform's value comes from verified identity — trusted reviews, one-person-one-vote, no bots. Weakening this weakens everything. But reading, browsing, and buying don't require the same trust guarantees as reviewing, voting, or signing contracts. People without ID can still benefit from the platform. They just can't do things that require others to trust their uniqueness.

Vouched tier: If N verified members (community decides the threshold — likely 3-5) personally vouch for someone, that person gains limited participation rights. This isn't full verification — it's a social trust layer. Vouchers are accountable: if the vouched person turns out to be a duplicate or bot, vouchers lose reputation.

Path to full access: As governments expand digital ID systems (India went from ~50% to ~95% Aadhaar coverage in a decade), more people gain access to full verification. The platform doesn't solve the ID gap — it works within it while remaining useful to those affected.

Verified Attributes (Opt-In, Device-Local)

The signed credential on your device contains verified attributes (age bracket, district, etc.). These stay on-device by default. When a platform feature requires an attribute (geo-fenced voting, age-gated communities), your app presents a signed proof from the credential — the platform verifies the provider's signature without ever storing the underlying data.

What's In the Credential (On Your Device)

AttributeGranularityWhat's in the credentialWhat's NOT in the credential
AgeBracket (18-25, 26-35, etc.)Age bracket onlyDate of birth, exact age
LocationDistrict / cityDistrict nameStreet address, pin code, GPS
GenderCategorySelf-declared gender
LanguageLanguages spokenLanguage list

Key principles:

What This Enables

Hard Boundaries (Never Stored, Never Asked)

These attributes are NEVER collected, stored, or derived — regardless of user consent:

No feature on this platform will ever require these. If a use case seems to need them, the use case is redesigned or rejected. This is a constitutional constraint — encoded in the trust deed, not just a policy decision.

Data Trust Guarantees

GuaranteeHow it's enforced
Open-source attribute logicAnyone can audit exactly what's stored and how it's used
Third-party auditsAnnual independent audit of data practices (published publicly)
Cryptographic deletion proofsWhen you revoke an attribute, the platform generates a verifiable proof of deletion
Purpose trust protectionTrust deed explicitly prohibits selling, sharing, or monetizing user attributes — trustees can block any attempt
No derived profilingThe platform never combines attributes to build user profiles or segments

Identity as Infrastructure (Zero-Knowledge Proofs)

The platform's identity layer becomes useful beyond the platform itself — without compromising privacy.

The Problem

External services (lending platforms, freelance marketplaces, co-ops) need to verify that a user is real, unique, and has certain attributes. Traditional approaches: (a) share raw data with third parties (privacy violation), or (b) the third party calls back to the platform to verify (the platform sees who authenticates where — surveillance).

The Solution: ZK Proofs Generated On-Device

Zero-knowledge proofs let users prove attributes to third parties without revealing the underlying data, and without the platform knowing which third parties they authenticate with.

How it works:

  1. User already has a signed credential on their device (issued during verification — the same credential used for on-platform attribute proofs)
  2. When a third-party service needs proof (e.g., "this person is 18+"), the user's device generates a ZK proof locally from the credential
  3. The third party verifies the proof cryptographically — no need to contact the platform
  4. The platform never knows which third parties the user authenticated with (unlinkability)

The device-local credential architecture means ZK proofs for third parties require no additional infrastructure — the credential is already there.

What can be proved without revealing:

Third party needs to knowWhat's revealedWhat's NOT revealed
"User is 18+"True/falseExact age, DOB, name
"User is in Maharashtra"True/falseDistrict, address
"User is a unique human"True/falseIdentity, any personal data
"User has 4+ star trust score"True/falseExact score, review history

Building Blocks

Architecture

Platform User Device Third Party Issues cryptographic credential Credential signed by platform, stored on device Generates ZK proof locally No raw data leaves device Sends ZK proof Only proof transmitted, not underlying data Verifies proof mathematically No need to contact platform Platform never knows where user authenticates

Phased Rollout

PhaseWhatWhen
Milestone 2Verified attributes on-platform (opt-in, categorical)With identity verification launch
Phase 2ZK credential issuance + on-device proof generationWhen core platform is stable
Phase 2+Ecosystem SDK for third parties to verify proofsAfter internal ZK infrastructure is proven

Ecosystem Revenue

Why This Is Hard (And Why We Build It Anyway)

ZK proof infrastructure is complex — circuit design, trusted setup ceremonies, mobile-optimized provers, credential revocation. This is not a weekend project.

But the alternative is worse: either we don't provide identity as infrastructure (limiting the platform's value), or we provide it by sharing data with third parties (violating our privacy commitments). ZK proofs are the only architecture that satisfies both goals simultaneously.

We build this incrementally. Internal attributes first (simple, immediate value). ZK infrastructure when the team and revenue can support it. The design is ready — the implementation follows the platform's growth.

Open Questions

Data Protection Compliance (DPDPA 2023, GDPR)

The platform does not process, receive, or store identity data. KYC providers (Digio, Signzy, etc.) handle all identity document processing and issue signed credentials directly to the user's device. The platform's server never sees raw identity information.

What the platform stores:

What the platform does NOT store:

What lives on the user's device:

Compliance requirements (implemented before Milestone 2 launch):

The platform's data footprint is near-zero by architecture. There is no identity data to breach, sell, or misuse — because it was never received.

What This Is

This is a proposed design. If someone contributes a better approach that achieves the same guarantees (one-human-one-account, privacy-preserving, scalable), we adopt it. The principle is fixed. The implementation is open to improvement.