Repository navigation
Releases: YoshiDev22/habit-tracker
Release list
Finanzas 0.4.0 — Presupuesto del mes
La primera con su propio número. El presupuesto del mes, los fijos que vienen en Movimientos, la campana de avisos, las Novedades de Finanzas y todo el panel lateral en un mismo lugar.
Nuevo
- Presupuesto (pestaña nueva): tu ingreso del mes (la primera vez, el de tu sueldo) y grupos con su parte en %, cada uno con lo teórico, lo planeado y el dinero que queda sin planear. Empieza con la referencia 50/30/20 o con grupos propios. Cada renglón es una estimación o un fijo (Hacer fijo). El presupuesto nunca crea movimientos.
- Programados en Movimientos: el siguiente cobro de cada fijo que aún no llega sale en su día, sin sumarse; tocarlo abre tus fijos.
- Campana de avisos, arriba a la derecha: los anuncios para todas las cuentas y los mensajes para la tuya. El aviso de acceso a Finanzas aquí es una bienvenida. Los avisos de Habit Tracker se quedan en su campana.
- Novedades de Finanzas: al entrar después de una actualización y en el panel lateral › Novedades. Si hay versión nueva con la página abierta, ofrece Actualizar.
Cambios
- El panel lateral abre cada opción dentro de sí mismo (Configuración y sus páginas, Datos, Novedades y el aviso de privacidad), con ‹ y Escape para regresar. En computadora no cambia de ancho; en un teléfono, una página ocupa la pantalla.
- El aviso de privacidad menciona el presupuesto y la cifra del banco del estado de cuenta.
v1.31.0 — Meses sin intereses como en el estado de cuenta
Meses sin intereses capturados tal como vienen en el estado de cuenta, sus mensualidades en Movimientos, lo que queda de cada uno a la vista y colores por tipo de movimiento.
Nuevo
- Meses sin intereses como en tu estado de cuenta: en el menú de una tarjeta, Meses sin intereses pide las columnas de la tabla del banco (descripción, monto original, saldo pendiente, pago requerido, número de pago "11 de 12" y el corte de ese estado de cuenta). La app arma el plan desde ahí y avisa si el pago requerido o el saldo pendiente no cuadran.
- Mensualidades en Movimientos: cada mensualidad de meses sin intereses sale en su día de corte ("Meses sin intereses · 11 de 12"). Solo se enseña: la compra, o la deuda inicial, ya la contó.
- Lo que queda de cada compra a meses, en Estado de cuenta de la tarjeta: en grande, con una barra de los pagos que lleva y el total de lo que queda en meses sin intereses.
- Colores por tipo: los ingresos en verde, los gastos y compras en rojo y las transferencias entre tus cuentas en gris, también en el total de cada día y en las vistas previas al importar.
Cambios
- Tarjetas más limpias: en Cuentas › Tarjetas cada tarjeta enseña solo cuánto pagar y antes de cuándo; la línea del corte, Corregir con tu estado de cuenta y los meses sin intereses quedan tras Detalle.
- Los centavos que sobran de una compra a meses van en los últimos pagos, como en los estados de cuenta (antes iban en los primeros).
- Los meses sin intereses dicen "10 de 12 pagos".
Para actualizar
Sin cambios en la base de datos ni en las dependencias: git pull y reiniciar la app y el panel.
v1.30.1 — Estado de cuenta de cada tarjeta
Correcciones de Finanzas tras probarla con datos reales: las tarjetas enseñan el pago correcto, cada una tiene su estado de cuenta desglosado, el saldo inicial se ve en Movimientos y la importación ya no salta filas por la moneda.
Nuevo
- Estado de cuenta de cada tarjeta: en el menú de una tarjeta con corte y pago, Estado de cuenta dice cuánto pagar y antes de cuándo; al tocarlo se desglosa (deuda al corte, meses sin intereses de cortes después, lo ya pagado y lo que falta). Ahí mismo se escribe lo que pide el banco, se anotan los meses sin intereses y se paga.
Correcciones
- Una tarjeta dada de alta después de su corte, con el pago aún por venir, enseñaba el corte siguiente (y su pago un mes después). Ahora enseña el pago de ese corte, con la deuda con la que se dio de alta, y se puede corregir con la cifra del banco.
- El saldo inicial de cada cuenta (o la deuda inicial de una tarjeta) se ve en Movimientos, en su día. Solo se enseña: no cuenta como ingreso ni en el total del día ni en el Resumen.
- Importar datos: un archivo que dice USD en cuentas que son en pesos (otra app puede llamar USD a cualquier "$") saltaba esas filas. La vista previa tiene Moneda del archivo para tomarla como la tuya; una moneda que no usa ninguna de tus cuentas empieza como tu moneda principal.
Para actualizar
Sin cambios en la base de datos ni en las dependencias: git pull y reiniciar la app y el panel.
v1.30.0 — Finanzas tras su primera prueba
Finanzas a partir de su primera prueba real: saldos desde un día, tarjetas que pasan al siguiente corte, un menú por cuenta, exportar e importar tus datos y un panel lateral.
Nuevo
- Finanzas: menú de cada cuenta. Tocar una cuenta abre su menú: Editar, Ajustar saldo (el real de hoy, sin crear movimientos), Movimientos (solo los de esa cuenta), Ingreso, Gasto y Transferencia desde ella y, en una tarjeta, Pagar y Meses sin intereses.
- Finanzas: meses sin intereses que ya traías. Desde el menú de la tarjeta se anotan los que le quedan a una deuda de antes (mensualidad y meses que faltan), y el estado de cuenta los pide en sus cortes.
- Finanzas: el monto del banco. En el corte en curso puedes escribir lo que pide tu estado de cuenta para no generar intereses; manda sobre el cálculo hasta el siguiente corte.
- Finanzas: Datos. Exporta tus movimientos a CSV (todos o los del periodo, listo para Excel) e importa un CSV con varias cuentas a la vez, el que exporta la app u otro con columnas parecidas. Las cuentas y categorías que falten se crean al confirmar, y lo que ya existe no se duplica. Hasta 5 000 movimientos de una vez.
- Finanzas: panel lateral. La inicial de tu cuenta, arriba a la izquierda, abre Configuración, Datos, el aviso de privacidad y el regreso a la app.
- Finanzas: ocultar el total con el 👁 junto a él (se recuerda en el dispositivo).
Cambios
- Saldo inicial a un día. El saldo con el que empieza una cuenta es el de un día (por defecto, el de su alta): solo los movimientos de ese día en adelante lo mueven. Los meses viejos que cargues después salen en el resumen como historial, sin cambiar el saldo.
- Tarjetas: el siguiente corte. Cuando ya pasó la fecha límite del último corte (o la tarjeta se dio de alta después de él), el estado de cuenta enseña el próximo corte y lo que llevas para él.
- Subir estado de cuenta: un solo botón; dentro eliges el archivo CSV o pegas las filas. Explica qué formato acepta, con un CSV de ejemplo para descargar, y en la vista previa se corrige cada fila (fecha, concepto, monto, tipo y categoría).
- Categorías: el ✎ de la barra de arriba las ordena (tocar una y luego otra las cambia de lugar).
- Enter guarda también mientras escribes la nota de un movimiento.
- El botón Agregar de Movimientos es más discreto.
Para actualizar
python3 scripts/migrate.py antes de reiniciar: agrega fin_accounts.opening_date y, solo al agregarla, pone a las cuentas con saldo inicial el día de su alta (los movimientos anteriores pasan a ser historial; se cambia en Editar cuenta). La tabla fin_statements la crea la app al arrancar.
v1.29.0 — Finanzas en prueba
Finanzas personales en prueba, por invitación, una barra de arriba más compacta y columnas que se ocultan en el tablero.
Nuevo
- Finanzas (en prueba; el acceso se da por cuenta, desde el panel de administración o con
grant_module.py --module finance). Una página aparte,/finance, con la misma sesión que la app y la pestaña Finanzas como enlace:- Cuentas de efectivo, débito y crédito, con su saldo (el inicial más sus movimientos). Las tarjetas llevan límite y disponible, día de corte y de pago, y su estado de cuenta: el último corte, la fecha límite y cuánto pagar para no generar intereses.
- Pagar la tarjeta propone ese monto o toda la deuda, y acepta otro (pagar de más).
- Compras a meses sin intereses: la compra cuenta completa el día que se hace, y el estado de cuenta pide cada mensualidad en su corte.
- Dividir un cargo en varias categorías.
- Categorías en un anillo; tocar una abre el monto con un teclado calculadora, la cuenta, la fecha y, si se repite, su periodicidad (mensual, quincenal en dos días cualquiera, anual).
- Fijos: el sueldo y los gastos que se repiten se anotan solos en su fecha.
- Periodo: el tuyo (mes o quincena), un día, la semana, el mes, el año, siempre o un rango. El resumen tiene la gráfica de gasto por día (o por mes) con su eje.
- Pegar un estado de cuenta o un CSV, con vista previa y sin duplicar lo que ya está.
- La primera vez pide el consentimiento expreso para guardar datos financieros y guarda su fecha; sin él, la API de Finanzas no guarda ni enseña nada.
- Panel de administración: da y quita el acceso a Finanzas en Gestionar, como Maker e IA. El panel solo cuenta movimientos, nunca montos ni conceptos.
- Tablero: ocultar columnas. Los filtros tienen una fila Columnas: apagar un chip oculta esa columna (siempre queda una, y Mover a… la ofrece como "(oculta)"). Se recuerda en el dispositivo, por tablero. ▾ Filtros pliega las filas y, plegado, dice cuántos filtros hay activos.
- Panel de administración: su propio icono en la pestaña del navegador.
Cambios
- Barra de arriba: ya no ocupa una franja propia. A la altura del título quedan la campanita y un círculo con tu inicial (con el contorno del plan Maker si lo tienes); al tocarlo se despliegan tu nombre, el tema, ⚙️, la versión y Cerrar sesión.
- Tiempo en las tarjetas: en corto y en la línea de las etiquetas ("1.5h/3h"); al lado del título lo partía en varias líneas. Lo exacto, al pasar el cursor.
- Aviso de privacidad: qué guarda Finanzas, para qué, que no va a la IA ni a nadie más, que el consentimiento es expreso y cómo dejar de usarla. Descargar mis datos y Borrar mi cuenta ya incluyen tus datos de Finanzas.
Para quien desarrolla
core.jsreúne lo que comparten la app y la página de Finanzas (token,apiFetch, modales, confirmación, tema, dinero y tablas pegadas). La regla de las series de cobros vive enbackend/series.py, para Costos y Finanzas.
Para actualizar
python3 scripts/migrate.py antes de reiniciar: las tablas de Finanzas son nuevas y las crea la app al arrancar; migrate.py solo completa columnas en bases que ya las tenían. Luego reiniciar la app y el panel, y dar el acceso a Finanzas a quien la vaya a probar. El aviso de privacidad cambió: avisarlo con un 📢 (panel de administración o scripts/announce.py).
v1.28.1 — El registro sin correos
Cambios
- El servicio diario de los reportes escribe en el registro del servidor el número de la cuenta, ya no su correo, y los cobros de los gastos recurrentes ya no incluyen el nombre del gasto. El registro se guarda 30 días y el aviso de privacidad no menciona correos ni conceptos ahí. (El borrado de cuentas ya escribía solo el número.) Para saber de quién es un número, el panel de administración, pestaña Cuentas.
Para actualizar Sin cambios en la base de datos ni en las dependencias: git pull y reiniciar la app y el panel. El servicio diario de los reportes toma el cambio en su siguiente corrida, sin cambiar su plantilla.
v1.28.0 — Tus datos y el aviso de privacidad
Descarga tus datos, el aviso de privacidad de la app y un aviso cuando hay versión nueva; y en el panel de administración, gráficas.
Nuevo
- Descargar mis datos, en Mi perfil: un archivo JSON con todo lo que la app guarda de tu cuenta (tus datos personales, hábitos y notas, tableros y tareas, tiempo, costos, reportes, problemas reportados y eventos de seguridad de tu cuenta). Sin la contraseña, que solo se guarda cifrada. Hasta 5 descargas al día.
- Aviso de privacidad en
/privacidad: qué datos se guardan y dónde, para qué, quién más los trata, cuánto tiempo, cómo limitar su uso, cómo ejercer los derechos de acceso, rectificación, cancelación y oposición (acceso con Descargar mis datos, cancelación con Borrar mi cuenta) y cómo se avisan los cambios, con un descargo de proyecto en desarrollo. Se enlaza en el registro, antes de crear la cuenta, en la pantalla de entrar y en Mi perfil. - Aviso de versión nueva: una pestaña que dejas abierta días, o la app instalada en el teléfono, seguía con la versión con la que abrió. Ahora, al volver a ella (y cada 30 minutos), si hay una más nueva, una franja ofrece Actualizar. Nunca recarga sola.
- Panel de administración: gráficas. El Resumen suma cuentas nuevas por semana, la última actividad por grupos, los módulos en uso y los últimos días de IA y de seguridad; IA y Seguridad tienen columnas por día con su periodo; Problemas, chips con cuántos hay de cada estado.
Cambios
- Borrar mi cuenta sugiere descargar antes todo con Descargar mis datos.
- La nota interna de un problema reportado, en el panel, sale también en el Descargar mis datos de quien lo reportó (es un dato sobre esa persona). El panel lo dice junto al campo.
Para quien desarrolla
- Navegadores que quedaban abiertos: desde que las pruebas de navegador entraron al repo (2026-09-24, v1.15.0), en Windows cada
pytest -m uidejaba procesos de Edge o Chrome vivos hasta reiniciar. Corregido; el README dice cómo revisar y cerrar los que hayan quedado. - Las pruebas de navegador ya no fallan a veces por "Failed to fetch": cancelaban sus propias peticiones al entrar dos veces seguidas a la app.
Para actualizar Sin cambios en la base de datos ni en las dependencias: git pull y reiniciar la app y el panel. Antes, en backend/.env, los datos de tu instancia para el aviso de privacidad: PRIVACY_EMAIL (sin él, la página avisa que falta el contacto) y PRIVACY_HOSTING, y si aplican PRIVACY_BACKUPS, PRIVACY_PROXY y PRIVACY_AI (ver backend/.env.example). El aviso dice que los registros del servidor y las copias de respaldo se borran a los 30 días: configúralos así antes de publicarlo, o cambia esa frase.
v1.27.1 — Al día al volver y fin de un recurrente
Cambios
- Al volver a la app después de un rato en otra pestaña (30 s o más), se vuelven a pedir los tableros, la lista y Reportes: lo que se registró en otro dispositivo aparece sin recargar. No pasa con una ventana abierta ni mientras escribes en un campo, para no perder lo que llevas.
- La pestaña Costos (plan Maker) aparece junto con las demás al entrar, en vez de unos segundos después.
Correcciones
- Poner a un gasto recurrente una fecha de fin anterior a cobros ya anotados dejaba esos cobros sumando en la hoja, el resumen y los reportes. Ahora pregunta si se borran (con todas sus partes, si iba repartido) o se conservan.
- Al registrar tiempo a mano o corregir un registro se podía poner una hora de hoy que aún no llegaba. El formulario lo avisa y el servidor lo rechaza; los registros del cronómetro no cambian.
Para actualizar
Sin cambios en la base de datos ni en las dependencias: basta con git pull y reiniciar el servicio.
v1.27.0 — Reportar un problema y panel de administración
Reportar un problema desde la app, y el panel de administración (aún no se despliega): cuentas, uso de la IA, problemas, avisos, seguridad y una bitácora de cada cambio.
Nuevo
- Reportar un problema, en Mi perfil: qué pasó (de 10 a 2000 caracteres) y, si quieres, detalles técnicos que ves tal cual antes de enviarlos (versión, pestaña, pantalla, navegador y los últimos errores de la sesión; nunca lo que escribes en la app). Hasta 5 al día.
- Avisos nuevos en la campanita: 🛠️ cuando se cierra un problema que reportaste, y 💬 los avisos para tu cuenta (más textos de IA por un día, acceso a un módulo).
- Panel de administración (para quien administra la instancia): un proceso aparte de la app, solo en
127.0.0.1, que irá detrás de Cloudflare Access. Resumen y cuentas (correo enmascarado, registro, última actividad y solo conteos, nunca contenido), uso de la IA por día, problemas reportados con su estado, una nota interna y otra para la persona, avisos para todas las cuentas o para una, eventos de seguridad (contraseñas equivocadas, bloqueos y tokens rechazados por IP, con alertas) y una bitácora de cada cambio. Desde la ficha de una cuenta: dar o quitar Maker e IA, textos de IA extra por hoy, desactivarla o reactivarla y cancelar su borrado.scripts/admin_dev.pylo abre en tu máquina.
Cambios
- Una cuenta desactivada sale al momento de todos sus dispositivos y, al entrar, ve que está desactivada. Sus datos quedan intactos.
scripts/announce.pysigue las reglas del panel: como mucho 3 avisos vigentes y 30 s entre dos publicaciones.- Mi perfil › Novedades dice la fecha de cada versión.
Para actualizar
Esta versión cambia la base de datos. Correr python3 scripts/migrate.py antes de reiniciar el servicio: agrega a users la última actividad y la fecha de registro (las cuentas que ya existen quedan sin fecha). Sin la migración, la app no arranca y el log dice qué correr. Las tablas nuevas (reportes de problemas, avisos por cuenta, IA extra, bitácora, eventos de seguridad) se crean solas al reiniciar.
Los eventos de seguridad guardan la IP completa durante 30 días; los borra el servicio diario de los reportes (purge_accounts.py), sin cambiar su plantilla. Para que esas IPs sean las de tus usuarios y no la del proxy, uvicorn tiene que confiar en Caddy (--forwarded-allow-ips); el panel avisa si no es así.
El panel de administración no se instala todavía: necesita Cloudflare Tunnel y Access.
v1.26.0 — Centro de avisos
La campanita se vuelve un centro de avisos, y la app puede avisar de un mantenimiento a todas las cuentas.
Nuevo
- Centro de avisos en la campanita, en tres grupos: Pendientes (registros por confirmar y días sin anotar, con su botón), Avisos (tu reporte automático está listo, las novedades de la versión) y Hechos. El círculo rojo cuenta los pendientes y los avisos sin leer; abrir la campanita marca los avisos como leídos. Un pendiente se resuelve solo al hacerlo (anotar el día, confirmar el registro) y pasa a Hechos. Lo que ya no está pendiente se borra a los 60 días.
- Días sin anotar: Anotar abre el día en el calendario; Descartar lo quita sin anotarlo.
- Avisos para todas las cuentas (mantenimiento, una caída): salen con 📢 en todas las campanitas mientras estén vigentes y desaparecen al terminar. Solo se publican desde el servidor; ninguna cuenta puede mandarlos.
Cambios
- La ventana "¿Olvidaste anotar ayer?" se queda; si la cierras sin contestar, el día sigue en la campanita. "No, no lo hice" también lo quita de ahí.
Para actualizar
Sin migración ni dependencias nuevas: git pull y reiniciar el servicio. Las tablas de avisos se crean solas al arrancar. Para avisar de un mantenimiento, desde la raíz del repo y ya con la 1.26 corriendo: .venv/bin/python scripts/announce.py --title "…" --body "…" --hours 24 (--list para verlos, --end ID para quitarlo de todas las campanitas).