← Volver a proyectos

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.

Página de inicio de Sumant, aplicación de finanzas personales

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

React · Vite · TypeScript
React Router · Zustand
TanStack Query · Zod

Local-first

IndexedDB (Dexie)
Cola de sincronización
IA on-device (ONNX · WASM)

Nube

Supabase Auth · PostgreSQL
RLS por usuario
Edge Functions · Stripe

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

App React · Vite · TypeScript (PWA)
Estado / State Zustand · TanStack Query · React Hook Form + Zod
Datos locales / Local data IndexedDB (Dexie)
Backend Supabase — Auth · PostgreSQL · RLS · Edge Functions
IA on-device / On-device AI Transformers.js · ONNX Runtime (WebAssembly)
Landing Next.js App Router · next-intl
Panel interno / Admin Next.js · 2FA (TOTP)
Pagos / Payments Stripe (checkout · portal · webhooks)
UI Tailwind CSS · Radix UI · Recharts
Tests Vitest · Testing Library · Playwright
Observabilidad / Observability Sentry
Hosting Cloudflare Pages · Vercel · Supabase (UE / EU)

Qué hay detrás de este proyecto

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.