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.
- Interfaz
- Servicios de aplicación
- Repositorios
- 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.