A lightweight personal finance app for tracking income, expenses, budgets, and monthly spending insights.
- App: Flutter (SDK
^3.5.3), multiplataforma (Android, iOS, web, Linux, macOS, Windows). - Backend: Supabase (auth, base de datos y storage).
- Autenticación:
supabase_flutter+google_sign_in(Google Sign-In). - Navegación:
go_router. - Otras libs clave:
pdf+printing(exportar estadísticas en PDF),flutter_colorpicker(selector de color de categorías),intl(formateo de fechas/moneda).
luma/
├── app/ # Proyecto Flutter
│ ├── lib/
│ │ ├── app/ # App shell, router, theming
│ │ ├── core/ # Config, navegación, utils y widgets compartidos
│ │ └── features/ # Módulos por feature (ver abajo)
│ ├── assets/ # Imágenes, logo y fuentes
│ ├── scripts/ # Scripts de build, test y ejecución (.ps1 / .sh)
│ └── pubspec.yaml
└── db/
└── migrations/ # Migraciones SQL del esquema de Supabase/Postgres
accounts— cuentas del usuario (bancos, efectivo, tarjetas, etc.) y sus balances mensualesauth— login / registro (Supabase Auth + Google Sign-In) y preferencias del usuariocategories— categorías de ingresos/gastos (color, ícono/emoji)home— dashboard / pantalla de inicioinvoices— facturas asociadas a serviciosservices— servicios recurrentes (suscripciones, facturas, etc.)transactions— movimientos (ingresos y gastos)transfers— transferencias entre cuentas
Tablas principales: accounts, categories, transactions, services,
invoices, monthly_account_balances.
Las variables de entorno (Supabase y Google) no se empaquetan como archivo:
se compilan dentro de la app con --dart-define-from-file.
- Copiá
app/.env.exampleaapp/.env(está en.gitignore) y completalo:SUPABASE_URL,SUPABASE_PUBLISHABLE_KEY,GOOGLE_WEB_CLIENT_IDyGOOGLE_IOS_CLIENT_ID. - Pasá el archivo en cada comando, desde
app/:
flutter run -d chrome --web-port=5005 --dart-define-from-file=.env
flutter build web --dart-define-from-file=.env
flutter build apk --dart-define-from-file=.env # o scripts/build_apk.*Solo van ahí valores públicos por diseño (URL y publishable key de Supabase,
client IDs de Google); la seguridad de los datos depende de las políticas RLS.
Nunca pongas una service_role key ni ningún secreto en estas variables: al
quedar compiladas, cualquiera puede extraerlas del build.
Si compilás en CI (por ejemplo GitHub Actions), definí esas variables como
secrets/variables y generá el .env antes del build, o pasá cada una con
--dart-define=NOMBRE=valor.
En app/scripts/ hay un script por tarea, en PowerShell (.ps1) y en shell
(.sh). Se pueden ejecutar desde cualquier carpeta, por ejemplo desde la raíz
del repo, y todos muestran los mismos logs: qué hacen, el comando exacto,
el resultado y el tiempo total.
| Tarea | PowerShell | Shell |
|---|---|---|
Compilar un APK debug en app/dist/ |
.\app\scripts\build_apk.ps1 (-Install lo instala con adb) |
./app/scripts/build_apk.sh (INSTALL=1) |
| Ejecutar los tests | .\app\scripts\test.ps1 [args de flutter test] |
./app/scripts/test.sh [args de flutter test] |
| Ejecutar la app en Chrome (puerto 5005) | .\app\scripts\run.ps1 (-Port, -Device) |
./app/scripts/run.sh (PORT, DEVICE) |
La compilación y la ejecución necesitan app/.env (ver Configuración).
Crashlytics necesita el google-services.json de la app Android registrada en
Firebase (io.luma.app). No se commitea (está en app/android/.gitignore) y
sin él el build de Android falla:
- Local: descargalo desde la consola de Firebase (Configuración del
proyecto → tu app Android) y guardalo en
app/android/app/google-services.json. - CI: guardalo codificado en base64 como secret
GOOGLE_SERVICES_JSON_BASE64(base64 -w0 google-services.jsonen Linux,base64 -i google-services.jsonen macOS). El workflow de distribución lo restaura antes de compilar.