Proyectos

Xialu

Tus finanzas, en tu teléfono.

Construí Xialu para gestionar mis finanzas personales. Ya la uso en mi día a día y sigo desarrollándola.

Mi trabajo
Producto, interfaz e ingeniería
Pruebas
Probada en iPhone; Android pendiente de pruebas
Estado
En desarrollo

Xialu en uso

Qué puedes hacer

  • Cuentas y tarjetas de crédito. Consulta saldos y movimientos por cuenta y moneda.
  • Ingresos y gastos. Registra movimientos, asigna categorías y revisa tu historial.
  • Transferencias y cambio de moneda. Mueve dinero entre cuentas conservando los importes y la tasa de cambio registrados en ese momento.
  • Consulta de tasas de cambio. Consulta tasas de referencia desde Yahoo Finance al cambiar de moneda. Si falla la consulta, puedes usar una cotización guardada o introducir la tasa manualmente.
  • Recordatorios de pago de tarjetas. Configura la fecha de corte y de pago al añadir una tarjeta. Xialu usa el día de pago para programar recordatorios locales cuando hay deuda registrada.
  • Apple Pay y Atajos. Una automatización de Atajos en iOS captura los datos del pago con Apple Pay para revisarlos en Xialu. Confirma el gasto antes de que afecte al saldo. El flujo actualizado sigue en pruebas en dispositivo.
  • Respaldos portables. Exporta tus datos a un formato común para iOS y Android, con cifrado opcional protegido por contraseña. La restauración cruzada sigue pendiente de validación en Android.

Por qué local-first

Consultar un saldo o registrar un gasto no debería esperar a un servidor remoto. Xialu lee y escribe en SQLite en el dispositivo, así que el flujo financiero principal funciona sin conexión. La latencia de red queda fuera de esas operaciones; los respaldos también pasan a ser una parte importante del cuidado de los datos.

La ingeniería detrás de los números

Las transacciones son la fuente de verdad

El saldo de una cuenta se calcula a partir de sus movimientos confirmados y no eliminados. No se puede sobrescribir de forma independiente. Corregir una transacción cambia el saldo derivado y evita mantener dos valores separados que puedan dejar de coincidir.

Una transferencia es una operación atómica

La salida y la entrada se escriben en una sola transacción de base de datos. Si una falla, ninguna se confirma. El registro no puede quedarse con una sola mitad de la transferencia.

El dinero se representa con enteros

Los importes se guardan en unidades mínimas enteras, en lugar de números de coma flotante. Los cambios de moneda históricos conservan sus importes y su tasa: una cotización nueva no reescribe un movimiento anterior.

Contratos que separan las reglas del almacenamiento

Los repositorios de cuentas y transacciones exponen interfaces con implementaciones SQLite. Esto define responsabilidades concretas y permite que sus consumidores dependan de contratos. Así apliqué responsabilidad única e inversión de dependencias, en lugar de acoplar cada pantalla a los detalles de la base de datos.

  1. Interfaz
  2. Servicios de aplicación
  3. Repositorios
  4. SQLite

Cómo la construí

Definí el producto, la interfaz y la arquitectura mediante especificaciones incrementales para los distintos flujos de la app. Por ejemplo, al especificar el flujo de movimientos, establecí que los importes se representaran en unidades mínimas enteras para evitar errores de coma flotante. Los saldos debían derivarse de las transacciones. Corregir un movimiento debía actualizar el saldo sin mantener otro valor que pudiera desincronizarse.

En cada paso, el agente implementaba únicamente lo especificado. Después revisaba el diff y comprobaba el comportamiento antes de aceptarlo. Cerraba cada incremento con un conventional commit antes de escribir la siguiente especificación.

Construida con

Desarrollo asistido por IA

La gata negra del logo es un homenaje a mi gata. 🐈‍⬛

Khala, mi gata negra, descansando sobre una colcha azul