Shayaak — Wellness Web App
A consent gate the model cannot get past, enforced at four call sites, with a provider swap behind one setting.
- The problem
- An app you write your private thoughts into is only worth trusting if those thoughts stay private — and most of them post everything to a third-party model by default.
- What I built
- A complete consumer product: web and iOS, accounts, two billing rails, and an AI companion that runs against either a hosted model under zero data retention or a local one, switched by a single setting. Journal text never leaves the server.
- Where it is now
- Live at shayaak.com, through four App Store review cycles, running on a server I administer with nightly backups.
Technical detail
React (Vite) frontend, Node/Express REST backend with 10 route modules, SQLite persistence, and session-based auth with bcrypt, Helmet, and rate limiting. The AI companion "Saya" runs over a provider-neutral adapter — one env var switches between hosted model under zero-data-retention and local Ollama fallback.
Privacy architecture: journal text never leaves the server, note access is a single user-facing switch enforced at four call sites, and an explicit consent gate blocks the provider call until the user agrees. Dual-rail subscription billing: Stripe on web + Apple In-App Purchase on iOS with server-side JWS receipt verification.