Shipped

Withink
A live, private diary at withink.me: one entry per day, zero-knowledge encryption, offline-first editor, flashbacks, insights, and full ZIP export.
Overview
Withink is the only live product in this portfolio - a calm, private diary built for a 10-year habit, not sessions. One entry per day with a grace-period writing window; content is encrypted client-side so the server cannot read entries; the editor autosaves through an offline queue and syncs on reconnect. Flashbacks resurface anniversary entries (Redis-cached), insights show streaks and mood without shaming, and media lives on R2 with deep reference scrubbing on delete. Two surfaces share one backend: app.withink.me and withink.me over wildcard-cookie sessions.
What Users Can Do
- Write today's single entry in a distraction-free rich-text editor with mood tracking and autosave state.
- Write offline - the local queue syncs safely when back online.
- Revisit past entries via anniversary-prioritized flashbacks and search with highlighted matches.
- Track streaks, yearly heatmap, and mood trends in insights.
- Lock the diary with a local PIN (Diary Lock) with auto-lock on tab switch.
- Export everything as a ZIP (entries, images, metadata) and delete-for-real on account close.
Why I built this
- To ship a real product with retention constraints instead of another demo - calm beats gamified.
- Tradeoff: client-side zero-knowledge encryption over server-readable storage - even I cannot read entries, at the cost of no server search over content.
- Tradeoff: one entry per day with a writing-window firewall over infinite notes - forces the daily ritual, simplifies conflict resolution.
- Tradeoff: offline queue + visible save state over fire-and-forget saves - users never wonder if words are safe.
- To learn product engineering: pricing windows (14/90-day edit limits), device limits, export-as-freedom, and privacy-plainly copy.
Tech Stack
Next.js
TypeScript
PostgreSQL
Prisma
Redis
Tailwind
Turborepo
After launch & Impact
- Live in production at withink.me + app.withink.me (Turborepo, 100+ commits) with email + Google auth and wildcard sessions.
- Zero-knowledge by default: encryption keys never leave the browser; server holds no decryption capability outside lock-session and legacy migration.
- Offline writes sync with zero reported lost entries across airplane-mode and tunnel tests (20+ forced disconnects).
- Flashback reads served from Redis cache with p95 under 90ms; diary open p95 under 350ms on Hetzner-class hardware.
- Media upload to R2 with ownership checks and broken-reference cleanup - delete purges DB rows and stored objects.
- Honest limit: single-region deploy, no public status page yet; next is backups drill + multi-region reads.
Future Plans
- Publish a public status page and automated backup-restore drills.
- Add multi-region read replicas for flashbacks and search.
- Ship native-feeling mobile PWA install flow with background sync.
- Add yearly-print export (PDF book of a year of entries).