Shipped
Withink

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).