Prove you're eligible to report without revealing who you are.
Speak up. Stay private.
Live demo · Screenshots · Run locally
Anonymous reporting has a fundamental trade-off: institutions need to verify that a report comes from a legitimate member, while reporters may fear revealing their identity.
VEIL separates the proof from the person.
Identity → Eligibility → Report → Verification
VEIL lets verified institutional members submit and track incident reports using a pseudonymous identity.
Reporters
- Verify eligibility
- Submit reports
- Stay pseudonymous
- Track status
- Communicate anonymously
Administrators
- Review reports
- Request information
- Respond to reporters
- Manage status
- Maintain an audit trail
Verified reporter. Protected identity. Accountable report.
The raw credential never leaves the browser, the report is filed under a pseudonym, and anyone can check a report's audit trail without seeing its content.
sequenceDiagram
autonumber
actor R as Reporter
participant B as Browser
participant S as VEIL server
actor A as Administrator
actor P as Anyone
R->>B: Institutional ID + secret
B->>B: commitment = SHA-256(id:secret)
B->>S: POST /api/verify-eligibility (commitment only)
S->>S: Is commitment in the eligible set?
S-->>B: Pseudonym + session token
B->>S: POST /api/reports (pseudonym, category, description)
S->>S: Append "report_submitted" to the report's hash chain
A->>S: Review, reply, update status
S->>S: Append each action to the hash chain
P->>S: GET /api/verify/:reportId
S-->>P: Chain intact? Event types, times and hashes only
| Home | Reporter dashboard |
|---|---|
![]() |
![]() |
| Administrator dashboard | Public verification |
![]() |
![]() |
- Frontend: HTML, CSS, Vanilla JavaScript
- Backend: Node.js
- Privacy: Midnight
- Smart Contracts: Compact
- Verification: Zero-knowledge proof design
Sensitive report content stays off-chain.
Midnight is used where privacy and verifiability matter.
The Compact layer handles eligibility and integrity logic while the application keeps sensitive reporting data private.
Blockchain is not used as a database for personal information.
- Privacy-first reporting workflow
- Eligibility verification
- Pseudonymous identities
- Anonymous two-way communication
- Admin dashboard
- Report status tracking
- Audit & public verification
- Midnight Compact integration
- Making Midnight meaningful rather than decorative
- Designing what should be private vs. verifiable
- Integrating evolving Midnight tooling
- Delivering a complete workflow within hackathon scope
Privacy and accountability don't have to be opposites.
The key question became:
How can a system verify a claim without requiring it to know everything about the person?
That principle shaped VEIL's architecture.
- Anonymous credentials
- Institutional digital credentials
- Encrypted evidence
- Emergency reporting
- Case escalation
- Mobile apps
- Cross-institution verification
Live: https://veil-zeta-rosy.vercel.app
node server.jsThen open:
http://localhost:8787
Demo credentials and an admin token are printed on startup.
Run the tests (Node 18+, no dependencies):
node --testThe Compact verification logic is currently modeled with equivalent server-side hashing and set-membership checks.
The intended circuit is:
contracts/report_verification.compact
The contract is not yet deployed on-chain.
Reports are kept in a JSON file (data/store.json locally, or the directory
set by VEIL_DATA_DIR). On Vercel, or wherever data/ isn't writable, the
store lives in the system temp directory instead, so live-demo data is not
persistent and can reset between requests that land on different instances.
MIT



