Saltar al contenido
Espejo Caso de estudio

Espejo, por dentro

Quería un diario digital donde nadie pudiera leer mis entradas. Ni el servidor, ni la base de datos, ni yo si pierdo la contraseña. Así nació Espejo.

Offline-first con IndexedDB como fuente de verdadCifrado en cliente: el servidor solo ve blobsUX de bienestar, sin gamificación
espejo.day ↗
Problema

Las apps de journaling presionan con rachas y gamificación. Y ninguna ofrece privacidad real: tus entradas viven en texto plano en servidores ajenos.

Arquitectura

Offline-first con sync opcional. El servidor nunca ve el contenido.

  • IndexedDB (Dexie) como fuente de verdad: funciona sin conexión
  • Cifrado AES-256-GCM + PBKDF2 (310k iteraciones) en cliente
  • Supabase para sync opcional entre dispositivos (solo blobs cifrados)
  • Soft-delete + last-write-wins para resolución de conflictos
UX

Diseñada desde la psicología del bienestar.

  • Check-in emocional antes de escribir: menos fricción en días difíciles
  • Modo contemplación: lectura inmersiva con tipografía serif
  • Favoritos semánticos (claridad, semilla, ancla, victoria, cicatriz)
  • Year in Review estilo Spotify Wrapped
  • Nudges con prioridad: cuidado > insight > celebración
Stack
  • Next.js 16 (App Router) + React 19 + TypeScript
  • TipTap (rich text), Tailwind 4, shadcn/ui (Radix)
  • Vitest + Testing Library (unit) / Playwright (E2E)
  • Vercel (deploy) + Sentry (errors) + CSP/HSTS headers
Next.jsReactTypeScriptSupabaseDexieTipTapTailwindPlaywright
Aprendizaje

Cuando algo se usa de verdad, piensas el código distinto.

Offline-first con E2EE no es trivial. Migrar esquemas en IndexedDB, resolver conflictos de sync sin ver los datos, gestionar la pérdida de contraseña cuando es la clave de cifrado. Cada problema te obliga a pensar más allá del happy path.

Todo lo anterior suena bien en la teoría. Pero no tienes que creerme — pruébalo tú mismo.

Prueba el cifrado
Escribe algo. Mira cómo se cifra. Intenta leerlo sin la clave.
Escribe
Clave
Cifrado
Descifrado