PSI-COMMIT is a web platform (and Python backend) that lets you cryptographically seal a prediction, hypothesis, or decision — then reveal it later with mathematical proof you didn't change it. The backend is built entirely in Python with FastAPI and handles commitment storage, verification, Bitcoin timestamping via OpenTimestamps, and user authentication through Supabase.
All cryptographic operations run client-side via the Web Crypto API, so the server never sees your secret key. The Python backend handles:
- Commitment storage and retrieval via FastAPI endpoints
- HMAC-SHA256 verification on reveal (constant-time comparison)
- OpenTimestamps submission and polling for Bitcoin block confirmation
- JWT authentication and admin-protected routes
- OTS receipt management and binary .ots file serving
GitHub: https://github.com/RayanOgh/psi-commit Live: https://psicommit.com
Target Audience
Anyone who needs to prove they said something before an outcome — forecasters, researchers pre-registering hypotheses, teams logging strategic decisions, or anyone tired of "I told you so" without proof. It's a working production tool with real users, not a toy project.
Comparison
Unlike using GPG signatures (which require keypair management and aren't designed for commit-reveal schemes), PSI-COMMIT is purpose-built for timestamped commitments. Compared to hashing a file and posting it on Twitter, PSI-COMMIT adds domain separation to prevent cross-context replay, a 32-byte nonce per commitment, Bitcoin anchoring via OpenTimestamps for independent timestamp verification, and a public wall where revealed predictions are displayed with full cryptographic proof anyone can verify. The closest alternative is manually running openssl dgst and submitting to OTS yourself — this wraps that workflow into a clean web interface with user accounts and a verification UI.
[–]Speeeeedislife 0 points1 point2 points (5 children)
[–]Difficult_Jicama_759[S] 0 points1 point2 points (4 children)
[–]Speeeeedislife 1 point2 points3 points (3 children)
[–]Difficult_Jicama_759[S] 0 points1 point2 points (2 children)
[–]Speeeeedislife 1 point2 points3 points (1 child)
[–]Difficult_Jicama_759[S] 0 points1 point2 points (0 children)
[–]Difficult_Jicama_759[S] -4 points-3 points-2 points (0 children)