尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Tablero de finanzas para una pareja: presupuesto, movimientos reales, deudas, metas e histórico mensual, sincronizado en vivo entre los dos. • Frontend: React 18 + TypeScript + Vite, sin librerías de UI ni de gráficos. • Backend: Supabase (Postgres + Auth + Realtime). No hay servidor propio que mantener. • Hosting: cualquier host estático. Las instrucciones de abajo son para Vercel.檢視完整 README ↗
Tablero de finanzas para una pareja: presupuesto, movimientos reales, deudas, metas e histórico mensual, sincronizado en vivo entre los dos.
us-east-1).supabase/migrations/0001_esquema.sql — tablas, políticas RLS y tiempo real.supabase/migrations/0002_funciones.sql — sembrado de ejemplo, cierre de mes
y aprendizaje de reglas.Project URLanon public keyLa clave
anones pública por diseño y no da acceso a nada por sí sola: quien protege los datos son las políticas RLS de la migración 0001. Nunca uses aquí laservice_rolekey.
En Authentication → URL Configuration:
Site URL: http://localhost:5173 mientras desarrollas, y la URL de Vercel
cuando despliegues.Redirect URLs: agrega ambas.En Authentication → Providers → Email, deja Enable Email provider encendido y Confirm email apagado (el enlace mágico ya confirma).
El correo de cortesía de Supabase sirve para empezar, pero está limitado a unos pocos envíos por hora. Si les queda corto, conecten un SMTP propio en Project Settings → Auth → SMTP Settings (Resend y Brevo tienen capa gratuita).
npm install
cp .env.example .env # y pega la URL y la clave anónima
npm run dev
Abre http://localhost:5173, escribe tu correo y entra con el enlace que llega.
La primera vez se crea el hogar y se siembra con un presupuesto de ejemplo que
puedes borrar fila por fila.
Otros comandos:
npm run build # verifica tipos y compila a dist/
npm run typecheck # solo la verificación de tipos
npm run preview # sirve dist/ localmente
En Ajustes → Quiénes entran, escribe su correo y autoriza el acceso. Ella entra a la misma dirección, pide su enlace mágico con ese correo, y cae directo en el hogar de los dos. Desde ese momento los cambios de uno aparecen en la pantalla del otro sin recargar.
El acceso es total y simétrico: quien entra ve y edita todo. No hay cuentas separadas ni información oculta entre los dos.
vercel.json ya trae el rewrite que hace falta
para que las rutas del navegador no den 404.VITE_SUPABASE_URLVITE_SUPABASE_ANON_KEYSite URL y como
Redirect URL, o el enlace mágico devolverá a localhost.Cada git push vuelve a desplegar.
Los proyectos del plan gratuito se pausan tras una semana sin actividad. No se pierde nada, pero hay que entrar al panel y reactivarlos a mano — y un tablero de finanzas se abre cada tanto, no a diario.
El repositorio trae .github/workflows/mantener-despierto.yml, que hace una
consulta mínima cada tres días y mantiene el reloj de inactividad en cero. Para
activarlo, agrega dos secretos en Settings → Secrets and variables → Actions:
| Secreto | Valor |
|---|---|
SUPABASE_URL | https://xxxxxxxx.supabase.co |
SUPABASE_ANON_KEY | la clave anónima del proyecto |
Son los mismos dos valores del .env. Con la CLI de GitHub:
gh secret set SUPABASE_URL
gh secret set SUPABASE_ANON_KEY
Puedes probarlo sin esperar tres días: pestaña Actions → Mantener Supabase despierto → Run workflow.
Dos advertencias sobre los cron de GitHub Actions, para que no te tomen por sorpresa:
src/
├── components/ UI transversal
│ ├── ui/ piezas genéricas (Kpi, CampoMoneda, Etiqueta…)
│ ├── charts/ gráficos en SVG, sin librerías
│ ├── layout/ marco de la aplicación
│ └── ProtectedRoute guarda de rutas autenticadas
├── contexts/ SesionContext (auth) · HogarContext (datos + realtime)
├── hooks/ useFinanzas · useMoneda
├── lib/ cálculo puro: formato, finanzas, amortización
├── models/ tipos de dominio, espejo del esquema SQL
├── Pages/[Modulo]/ una carpeta por sección, con components/ propio
├── services/ Supabase, hogar, colecciones, lectura de CSV
└── styles/ tokens.css (sistema de diseño) + global.css
Tres decisiones que vale la pena conocer antes de tocar el código:
El cálculo está separado de la pantalla. Todo el motor financiero vive en
lib/calculos.ts y lib/deudas.ts como funciones puras: mismos datos, mismo
resultado, sin tocar el DOM ni la red. Se pueden probar sin montar React.
Un solo canal de tiempo real. HogarContext abre un canal de Supabase y
escucha las siete tablas filtradas por hogar_id. Las escrituras pintan primero
en pantalla y después confirman contra el servidor, así que la interfaz nunca
espera al servidor para responder.
El color nace en tokens.css. Ningún componente escribe un hex. La paleta
está verificada para daltonismo (separación CVD ΔE ≥ 8 entre colores vecinos) y
contraste (≥ 3:1 contra el fondo), en tema claro y oscuro por separado. Si vas a
cambiar colores, cámbialos ahí y vuelve a verificar.
Todas las tablas tienen Row Level Security activo y la misma regla: solo ve y
escribe quien es miembro del hogar, comprobado con la función es_miembro().
Sin sesión válida no se lee ni una fila, aunque alguien tenga la URL y la clave
anónima.
La función es SECURITY DEFINER a propósito: sin eso, la política de la tabla
miembros se consultaría a sí misma y Postgres entraría en recursión infinita.
Ideas que el esquema ya soporta y que no están construidas todavía:
deudas guarda dia_pago; falta una Edge
Function programada que avise antes del corte.lib/calculos.ts y lib/deudas.ts son funciones puras: son el
lugar natural para empezar con Vitest.