EarnProof is an open-source, privacy-focused income and payment verification protocol built on Stellar.
This repository contains the Next.js web application for public education, developer-facing setup pages, wallet-authenticated proof creation, public proof verification, and initial shells for issuer discovery and system status.
EarnProof helps people prove financial facts without revealing more financial information than necessary.
Primary tagline:
Prove your income, not your entire financial history.
The first implementation targets Stellar testnet and Freighter. The application should always make the active network visible and avoid implying that EarnProof provides credit decisions, legal identity verification, tax certification, or loan approval.
Implemented:
- Next.js App Router application
- TypeScript
- Tailwind CSS
- Public layout shell
- Responsive public navigation
- Footer
- Landing page
- How it works page
- Privacy page
- Developer page
- Public verification page connected to the backend proof verification endpoint
- Worker proof creation route at
/proofs/create - Freighter wallet challenge signing flow through
@stellar/freighter-api - Authenticated payment sync, payment listing, and manual classification controls
- Minimum-income proof creation form
- Issuer directory shell
- Status page shell
- Shared API client
- Public environment configuration
- EarnProof logo and favicon
Planned next:
- Verification-state component tests
- Proof revocation controls
- Richer worker dashboard around the create-proof flow
- Fixture-backed smoke tests
- Next.js
- React
- TypeScript
- Tailwind CSS
- Freighter API
- TanStack Query
- React Hook Form
- Zod
- ESLint
app/
developers/
how-it-works/
issuers/
privacy/
status/
verify/
components/
common/
layout/
config/
hooks/
lib/
api/
validation/
public/
npm install
cp .env.example .env.local
npm run devDefault local URL:
http://localhost:3000
If port 3000 is already in use:
npm run dev -- --port 3001NEXT_PUBLIC_APP_URL=http://localhost:3000
NEXT_PUBLIC_API_URL=http://localhost:4000/api/v1
NEXT_PUBLIC_STELLAR_NETWORK=testnet
NEXT_PUBLIC_STELLAR_NETWORK_PASSPHRASE=Test SDF Network ; September 2015No secret keys belong in this frontend repository or any public environment variable.
npm run lint
npm run build
npm audit --omit=devCache-Control policy by route, API response caching, and stale/offline UI behavior are documented in docs/cache-policy.md.
Supported browsers/devices, required feature fallbacks, dependency upgrade tiers, and emergency patch handling are documented in docs/browser-support.md and docs/dependency-policy.md.
npm run test # component/unit tests (Jest + React Testing Library)
npm run test:e2e # end-to-end flows (Playwright)
npm run test:e2e:a11y # accessibility scans: axe + keyboard interaction (Playwright)See docs/testing-guide.md for how tests are
organized, how to mock the API client and Freighter, and what a new test
should look like; tests/README.md for the
top-level tests/ directory specifically; and
docs/accessibility-testing.md for
what the automated accessibility gate covers and what still needs a
manual screen-reader pass.
- Show Stellar testnet status on relevant screens.
- Hide sensitive amounts by default.
- Show a disclosure preview before proof creation.
- Clearly distinguish valid, expired, revoked, invalid, and unverified issuer states.
- Do not expose full wallet history on verification pages.
- Do not put secret keys or signing material in client code.
- Keep public verification views limited to intentionally disclosed claim data.
Promoting a preview build to production, verifying it, and rolling it back if needed are covered in docs/release-runbook.md.
earnproof-backend: API, payment indexing, proof generation, credential signing, and verification.earnproof-contracts: Soroban issuer registry, proof commitment registry, revocation state, and protocol configuration.earnproof-sdk: Future TypeScript SDK for integrations.earnproof-specification: Future credential and verification standard.