Sistema web local para gestión de gastos personales y compartidos con división configurable de porcentajes, autenticación con PIN y backup automático.
- Sistema de autenticación con PIN (4 dígitos por usuario)
- PIN Maestro para acceso de emergencia (por defecto: 0000)
- Gestión de PINs modificables desde configuración
- Sesiones persistentes con localStorage
- Toggle de tema claro/oscuro en Configuración
- Paleta optimizada para ambos modos con CSS variables en todo el proyecto
- Persistencia automática de preferencia
- Transiciones suaves entre temas
- 100% compatible: Todos los componentes, modales y HTML generado dinámicamente usan CSS variables
- Vista principal con gráficos en tiempo real
- 3 tarjetas de estadísticas: Ingresos, Gastos, Balance
- Checklist de gastos fijos del mes con seguimiento de pago
- Resumen por categoría con totales
- Últimos movimientos con acceso rápido al historial
- Selector de mes para análisis histórico
- Modales de registro rápido para gastos e ingresos
- Sección en el dashboard con recomendaciones por persona
- Regla 50/30/20 como base (personalizable): Necesidades / Deseos / Ahorro / Inversión
- Cálculo automático: Compara gastos reales vs metas configuradas
- Barra de progreso hacia meta de ahorro+inversión
- Configuración por persona desde la página de settings
- Registro rápido con modal y botones de categorías frecuentes
- Categorías con emojis ( Arriendo, Café, Luz, etc.)
- Tres tipos de gastos: Fijo, Variable, Diario
- División automática según porcentajes configurables (ej: 70/30)
- Gastos compartidos y personales
- Completamente editable (modificar/eliminar cualquier registro)
- Registro de pagos entre personas
- Modal dedicado para registrar liquidaciones
- Tracking histórico de todos los pagos
- Integración con balance automática
- Cierre manual de meses con botón + confirmación
- Protección contra modificaciones en meses cerrados
- Reapertura de meses si es necesario
- Validación automática al intentar agregar gastos/ingresos
- Backup diario automático a las 00:00
- Almacenamiento en
/data/backups/backup-YYYY-MM-DD.json - Retención de últimos 30 días
- Backup inicial al iniciar el servidor
- Accesible desde todas las páginas (enlace en navegación)
- Reportes mensuales detallados con 6 gráficos
- Balance de quién debe a quién
- Comparación mensual de gastos variables
- Análisis de presupuesto diario
- Exportación a CSV y JSON
- Vista consolidada de gastos e ingresos en una sola tabla
- Diferenciación visual: Ingresos en verde (+), gastos en rojo
- CRUD completo: Editar y eliminar tanto gastos como ingresos
- Estadísticas integradas: Total ingresos, gastos y balance neto
- Filtros avanzados:
- Por tipo de transacción (gastos/ingresos/ambos)
- Por persona (pagador o receptor)
- Búsqueda en descripción
- Rango de montos (mín/máx)
- Tipo de gasto y común/personal
- Menú hamburguesa en móvil con navegación colapsable
- Dropdowns táctiles para submenús de categorías
- Layout adaptativo en todas las páginas
- Gestión dinámica de personas (1 o más, agregar/eliminar libremente)
- Porcentajes de división predeterminados y por mes
- Configuración de ahorro/inversión por persona (regla 50/30/20)
- Categorías personalizables con emojis y páginas dedicadas por tipo
- Cambio de tipo de categoría (mover entre Fijo/Variable/Diario con migración opcional)
- Gestión de PINs individual y maestro
- Control de meses cerrados
- Importación masiva desde CSV/Excel
- Exportación completa de datos (JSON y CSV)
- Toggle de modo oscuro/claro
- Node.js 14 o superior
- npm o yarn
- Instala las dependencias:
npm install- Configura el entorno (opcional):
# Copia el archivo de ejemplo
cp .env.example .env
# Edita .env si necesitas cambiar puerto o habilitar red local- Inicia el servidor:
npm start- Abre tu navegador en:
http://localhost:3000
Para acceder desde otros dispositivos en tu red WiFi:
Crea o edita el archivo .env en la raíz del proyecto:
HOST=0.0.0.0
PORT=3000Windows (CMD o PowerShell):
ipconfigBusca "Dirección IPv4" o "IPv4 Address" → ejemplo: 192.168.1.100
Mac/Linux (Terminal):
ifconfig
# o
ip addr showBusca "inet" → ejemplo: 192.168.1.100
npm startDeberías ver:
Access from other devices on your network:
Find your IP with: ipconfig (Windows) or ifconfig (Mac/Linux)
Then use: http://YOUR_IP:3000
Desde cualquier dispositivo conectado a la MISMA WiFi:
http://192.168.1.100:3000
(Reemplaza 192.168.1.100 con TU IP local)
Windows:
# Ejecuta PowerShell como Administrador
New-NetFirewallRule -DisplayName "Expense Tracker" -Direction Inbound -Protocol TCP -LocalPort 3000 -Action AllowLinux (Ubuntu/Debian):
sudo ufw allow 3000/tcp
sudo ufw reloadMac:
- Preferencias del Sistema → Seguridad y Privacidad → Firewall
- Opciones de Firewall → Añadir aplicación → Node
- Configura tu PIN en la pantalla de login
- Selecciona tu usuario
- Ingresa un PIN de 4 dígitos
- El sistema lo guardará automáticamente
- Accede al Dashboard
- Verás las gráficas y estadísticas del mes actual
- Usa el botón "+ Gasto" para registrar gastos rápidamente
- Selecciona categorías con un click usando los botones rápidos
- Configura tu sistema (Opcional)
- Ve a Configuración
- Ajusta nombres y porcentajes si es necesario
- Cambia los PINs si lo deseas
- El PIN Maestro por defecto es 0000
- Registra tus ingresos
- Ve a la sección "Ingresos"
- Usa los botones rápidos para categorías comunes
- Los ingresos se reflejan automáticamente en el dashboard
- Sección Ahorro e Inversiones en dashboard con regla 50/30/20 personalizable
- 👤 Soporte dinámico de personas (1 o más, agregar/eliminar desde configuración)
- Menú hamburguesa responsive en todas las páginas
- Enlace a Reportes accesible desde toda la navegación
- Dark mode global: ~100 colores hardcoded reemplazados por CSS variables
- Páginas dedicadas para gestión de categorías (Fijos, Variables, Diarios, Ingresos)
- Cambio de tipo de categoría con migración opcional de gastos históricos
- Importación masiva desde CSV/Excel
- Fix: Personas dinámicas en edición de ingresos (antes hardcoded)
Los datos se almacenan en formato JSON en la carpeta data/:
[
{
"id": "1703012345678",
"type": "variable",
"category": "Supermercado",
"amount": 85.50,
"date": "2024-12-20",
"paidBy": "User1",
"isShared": true,
"description": "Compra semanal",
"createdAt": "2024-12-20T10:30:00.000Z"
}
]{
"fijo": [
{ "name": "Arriendo", "emoji": "" },
{ "name": "Gym", "emoji": "" },
{ "name": "Cuotas", "emoji": "" }
],
"variable": [
{ "name": "Supermercado", "emoji": "" },
{ "name": "Luz", "emoji": "" },
{ "name": "Agua", "emoji": "" }
],
"diario": [
{ "name": "Café", "emoji": "" },
{ "name": "Transporte", "emoji": "" },
{ "name": "Comida", "emoji": "" }
]
}{
"persons": ["User1", "User2"],
"currentMonth": "2025-01",
"splitPercentages": {
"User1": 70,
"User2": 30
},
"monthlyPercentages": {
"2025-01": { "User1": 60, "User2": 40 }
},
"savingsConfig": {
"User1": { "needsPercent": 50, "wantsPercent": 30, "savingsPercent": 10, "investmentPercent": 10 },
"User2": { "needsPercent": 50, "wantsPercent": 30, "savingsPercent": 10, "investmentPercent": 10 }
}
}Gastos recurrentes con monto predecible:
- Arriendo
- Cuotas
- Gym
- Suscripciones
Gastos recurrentes con monto variable:
- Supermercado
- Servicios (luz, agua, gas)
- Internet
Gastos del día a día:
- Café
- Transporte
- Comidas
- Compras pequeñas
- Común: Se divide según el porcentaje configurado (ej: 50/50)
- Personal: No se divide, cada uno asume sus gastos personales
El sistema calcula automáticamente:
- Total pagado por cada persona en gastos comunes
- Lo que debería pagar según su porcentaje
- Balance final: diferencia entre lo pagado y lo que corresponde
Ejemplo:
- Gastos comunes totales: €1000
- User1 (70%): debe €700, pagó €800 → Le deben €100
- User2 (30%): debe €300, pagó €200 → Debe €100
- Todos los datos se almacenan localmente en tu equipo
- No hay conexión a internet ni servicios externos
- Tú controlas completamente tus datos
npm start # Inicia el servidor
npm run dev # Inicia con nodemon (reinicio automático)expense-tracker/
├── server.js # Servidor Express (refactorizado)
├── package.json
├── start.bat # Lanzador Windows (abre navegador + WSL)
├── src/ # Código fuente backend
│ ├── routes/ # Rutas de la API
│ │ ├── expenses.js
│ │ ├── expensesConfig.js # Configuración por tipo de gasto
│ │ ├── incomes.js
│ │ ├── categories.js
│ │ └── config.js # Config general + auto-migraciones
│ ├── services/ # Servicios
│ │ ├── fileService.js # Manejo centralizado de JSON
│ │ └── backupService.js # Sistema de backups
│ └── utils/ # Utilidades
│ └── validators.js # Validación (gastos, ingresos, config, ahorro)
├── data/ # Datos JSON (se crea automáticamente)
│ ├── months/ # Datos mensuales separados
│ │ └── YYYY-MM/ # Un directorio por mes
│ │ ├── expenses.json
│ │ └── incomes.json
│ ├── categories.json
│ ├── income-categories.json
│ ├── config.json # Personas, porcentajes, ahorro, meses cerrados
│ ├── settlements.json # Liquidaciones entre personas
│ ├── expenses-config/ # Config por tipo de gasto
│ │ ├── fixed.json
│ │ ├── variable.json
│ │ └── daily.json
│ └── backups/ # Backups automáticos diarios
└── public/ # Frontend
├── index.html # Dashboard principal
├── login.html # Login con PIN
├── history.html # Historial unificado
├── incomes.html # Registro de ingresos
├── reports.html # Reportes y análisis
├── settings.html # Configuración general
├── fixed-expenses.html # Config gastos fijos
├── variable-expenses.html # Config gastos variables
├── daily-expenses.html # Config gastos diarios
├── incomes-config.html # Config categorías de ingresos
├── favicon.svg
├── css/
│ └── styles.css # Estilos (CSS variables, dark mode, responsive)
└── js/
├── auth.js # Autenticación con PIN
├── utils.js # Utilidades comunes + menú hamburguesa
├── dashboard.js # Dashboard + ahorro/inversiones
├── login.js # Lógica de login
├── history.js # Historial con filtros avanzados
├── incomes.js # Registro de ingresos
├── reports.js # Reportes y gráficos
├── settings.js # Config + personas dinámicas + ahorro
├── fixed-expenses.js # Config gastos fijos
├── variable-expenses.js # Config gastos variables
├── daily-expenses.js # Config gastos diarios
└── incomes-config.js # Config categorías ingresos
- Backend: Node.js + Express (arquitectura modular)
- Frontend: HTML5, CSS3, JavaScript vanilla
- Gráficos: Chart.js
- Almacenamiento: JSON local (simple y portable)
- Validación de datos en backend (tipos, rangos, fechas válidas)
- IDs únicos con UUID (previene colisiones)
- Código modular (separación de rutas, servicios y utilidades)
- Backups automáticos diarios con retención de 30 días
- URL relativa del API (funciona en red local)
- Uso personal: Diseñado para uso en red local confiable
Este es un proyecto personal, pero si encuentras bugs o tienes sugerencias, siéntete libre de:
- Reportar issues
- Sugerir mejoras
- Hacer fork del proyecto
MIT License - Uso libre para proyectos personales y comerciales.
Puedes personalizar fácilmente:
- Tema: Modo claro u oscuro desde Configuración
- Colores: Edita las variables CSS en
styles.css - Nombres de personas: En Configuración
- Categorías: En Configuración
- Porcentajes: En Configuración (pueden variar cada mes)
- Registra gastos diariamente para no olvidar ninguno
- Revisa el balance mensualmente para mantener cuentas claras
- Exporta respaldos periódicamente
- Ajusta los porcentajes al inicio de cada mes si es necesario
- Usa descripciones en gastos importantes para recordar detalles
Desarrollado con ❤ por @sergiobstoj