local-first · aplicaciones web · criptografía aplicada · accesibilidad
Mi Balance
PWA para iPhone que registra ingresos y gastos y calcula la tasa de ahorro mensual. Los datos nunca salen del dispositivo, las copias de seguridad van cifradas y funciona sin conexión.
- Rol
- Diseño, implementación y pruebas
- Periodo
- agosto 2026
- Estado
- terminado
- Visibilidad
- Caso de estudio
Repositorio privado. No hay servidor ni cuenta, así que no existe nada que publicar.
El problema
Las aplicaciones de finanzas personales piden una cuenta, suben tus movimientos a un servidor y viven de eso. Para saber cuánto ahorras al mes no necesito darle mis cuentas a nadie.
Mi Balance hace lo contrario: todo pasa en el dispositivo. No hay servidor, ni cuenta, ni sincronización, ni analítica.
Las decisiones que cargan peso
Sin backend. No es una limitación, es la característica. El dato vive en IndexedDB y sólo se mueve si el usuario exporta una copia.
La garantía la impone el navegador. Podría prometer en la documentación que la aplicación no envía datos. En su lugar hay una política de seguridad de contenido con connect-src none: cualquier intento de conexión saliente falla en el navegador. Una promesa verificable vale más que una promesa escrita.
Cifrado con parámetros explícitos. La copia de seguridad usa AES-256-GCM con una clave derivada por PBKDF2-HMAC-SHA-256 y 600 000 iteraciones, y añade datos autenticados con la versión del formato. Esto último evita el caso raro y desagradable de restaurar un archivo de otra versión y quedarte con datos a medias.
Restauración atómica. Validar, previsualizar y reemplazar en una sola transacción. Si algo falla, no hay estado intermedio.
Céntimos enteros. Guardar dinero en coma flotante es un error que se descubre tarde y se arregla mal.
Lo que no salió bien
Escribí el registro del proyecto con la misma honestidad que este portfolio, y ahí queda constancia de un fallo crítico que encontré yo mismo: el borrado total de datos no hacía nada, porque la pantalla de ajustes recibía la base de datos como nula y salía antes de tocar nada.
Ese fallo vale más que el código que sí funcionó, porque demuestra que la revisión existe. Un proyecto que sólo cuenta lo que salió bien no está contando el proyecto.