Sumant
Aplicación de finanzas personales local-first: apuntar un gasto o importar el extracto del banco sin conectar la cuenta bancaria y sin que los datos salgan del dispositivo salvo para sincronizar.
El problema
Llevar las finanzas personales suele obligar a elegir entre una hoja de cálculo que hay que mantener a mano o una aplicación que pide conectar el banco, verificar la identidad y confiar en que los movimientos se guardan en un sitio del que no sabes nada.
Sumant parte de la idea contraria: la aplicación se usa en segundos, no necesita credenciales bancarias y los datos se escriben primero en el propio dispositivo. La cuenta existe para sincronizar entre móvil y escritorio, no para poder usar el producto.
La solución
Cuentas y movimientos
núcleo del producto
- Varias cuentas por usuario: efectivo, banco, tarjeta, ahorro u otras, cada una con su divisa (14 disponibles).
- Gastos, ingresos y transferencias entre cuentas, con categorías y subcategorías propias.
- Importes almacenados en céntimos como entero: el signo lo marca el tipo de movimiento, no el número.
Presupuestos, objetivos y gastos fijos
planificación
- Presupuestos por categoría con periodo diario, semanal o mensual.
- Objetivos de ahorro con importe y fecha límite.
- Gastos recurrentes y suscripciones, además de patrimonio neto con activos y deudas.
Importación de extractos
CSV · XLSX · Norma 43
- Detección automática del separador, de la fila de cabecera y del significado de cada columna, con plantillas reutilizables para el mismo banco.
- Lector del formato AEB Norma 43, el fichero estándar que exportan los bancos españoles.
- Detección de duplicados y agrupación por comercio para revisar y categorizar por lotes en lugar de movimiento a movimiento.
Uso diario
PWA · ES/EN
- Dashboard, estadísticas, búsqueda y filtros sobre el histórico.
- Modo privado que difumina todos los importes de la pantalla.
- Instalable como PWA y operativa sin conexión; interfaz en español e inglés.
Arquitectura
El sistema son tres superficies en un monorepo: la aplicación, la web pública y un panel interno de operación. La decisión que condiciona todo lo demás es que la interfaz nunca espera a la red: escribe en la base de datos del navegador y la sincronización ocurre después, en segundo plano.
Cliente
Local-first
Nube
- Los identificadores se generan en el cliente, así que se pueden crear datos sin conexión sin riesgo de colisión al subirlos.
- Cada entidad sincronizable lleva marca de actualización y borrado lógico: eliminar algo no rompe la sincronización de los demás dispositivos.
- Los conflictos se resuelven por última escritura, que es suficiente para un producto de un solo usuario y evita arrastrar un motor de resolución que nadie necesita.
- En PostgreSQL cada tabla de usuario aplica seguridad a nivel de fila, de modo que la separación entre cuentas la garantiza la base de datos y no el cliente.
- La web pública y el panel interno son aplicaciones aparte: la landing hace marketing, SEO y formularios, y el panel exige doble factor y registra las acciones.
Retos técnicos
Sincronizar sin romper la experiencia local
Las escrituras no esperan a la red, así que hay que recordar qué está pendiente de subir. La aplicación mantiene una cola de operaciones y una marca de progreso por tabla, de modo que al reconectar solo pide lo que ha cambiado desde la última vez. La descarga se pagina y la subida se agrupa en lotes para no chocar con el límite de tamaño de petición del backend, y el intervalo consultado se solapa ligeramente para tolerar desfases de reloj entre dispositivos.
Leer el extracto de cualquier banco
Cada banco exporta a su manera: separadores distintos, cabeceras en filas distintas, fechas e importes con formatos distintos. En vez de mantener un lector por banco, el importador deduce la estructura del fichero, propone el mapeo de columnas por sinónimos y permite guardarlo como plantilla. Para el caso español se añade un lector del formato AEB Norma 43, que al ser estándar cubre a la mayoría de bancos con un único parser.
No duplicar movimientos
Reimportar un extracto solapado es lo normal, no la excepción. Cada movimiento genera una huella a partir de sus datos estables, que permite detectar lo que ya existe antes de escribir nada. Los movimientos restantes se agrupan por comercio para poder categorizar decenas de golpe.
Categorizar sin sacar los datos del dispositivo
La sugerencia de categoría y la búsqueda por significado funcionan con embeddings calculados en el propio navegador, con un modelo autoalojado que se ejecuta sobre ONNX Runtime compilado a WebAssembly. No se envía ningún movimiento a un servicio de IA externo y los embeddings ni siquiera entran en la sincronización: se quedan en el dispositivo que los generó. Es la decisión que hace que la promesa de privacidad sea una propiedad de la arquitectura y no una frase en la política de privacidad.
Cambiar el esquema local sin perder datos
La base de datos vive en el navegador del usuario, así que no hay ventana de mantenimiento ni forma de migrar por lotes desde el servidor. Cada cambio de modelo es una versión de esquema con su función de migración, y el arranque de la aplicación tiene que ser capaz de llevar cualquier versión antigua hasta la actual.
Stack técnico
Qué hay detrás de este proyecto
- Un producto llevado de principio a fin: idea, arquitectura, desarrollo, despliegue y mantenimiento continuado.
- Decisiones de arquitectura frontend tomadas con criterio y con sus contrapartidas asumidas, no copiadas de una plantilla.
- Modelado de datos pensado desde el principio para sincronizar y para migrar.
- Privacidad tratada como un requisito técnico que condiciona el diseño.
- Operación real del producto: monorepo, tests automatizados, monitorización de errores y pagos.
Proyecto propio en desarrollo activo. El repositorio es privado; esta página resume la arquitectura y las decisiones técnicas. Sumant es gratuito con un plan PRO de pago único, y los datos de uso no forman parte de este resumen.