The Problem: We all have that friend who views a photo but never replies, or leaves you on "read." The social contract of "fair exchange" is broken on most messaging apps.
The Solution: Meet Mentisy — A "Fair Photo Swap" platform where the recipient cannot see what you sent until they send a photo back. It enforces a strict 1:1 exchange of value using a cryptographic "Reply-to-Reveal" protocol.
I engineered Mentisy to feel like a native app while running entirely on the web.
Frontend: Next.js 14 (App Router), TypeScript, Tailwind CSS
Backend: Convex (Real-time Database + Serverless Functions)
Auth: Clerk (Metadata-based role management)
Storage: UploadThing (with orphan file cleanup)
Deployment: Vercel (Edge Network)
🔒 Zero-Trust Security: It's not just a UI blur. The server explicitly strips the sensitive image URL from the API response until the "Swap" transaction is verified. You can't cheat by inspecting the Network tab!
📱 Native-Grade PWA: Built with the Web Share Target API. You can share a photo directly from your Android/iOS Gallery to Mentisy without opening the browser first.
⏳ Server-Side Self-Destruct: Ephemeral messaging that relies on robust backend schedulers (Convex), not just client-side timers, ensuring data is wiped even if the user closes the tab.
🎮 Game Modes: Includes "Reveal Rush" (First to answer wins) and "PicSwap" (Classic fair trade), handling high-concurrency race conditions gracefully.
The "Invisible Timer" Problem: Implemented a "Preload-then-Reveal" logic to ensure users on slow 3G networks get the full viewing duration after buffering, maintaining fairness across devices.
Atomic Transactions: Solved the "Double-Spend" problem where users could try to swap one photo for multiple secrets using ACID database transactions.
Built with