1
Decisiones de arquitectura
Frontend
React + Vite — mismo entorno que usaste en el dashboard anterior. Claude Code lo maneja perfectamente.
React 18 + Vite 5Backend + Auth
Supabase: base de datos PostgreSQL, autenticación email/password, storage para los CSV. Todo gratuito.
Supabase Free TierHosting
Vercel: deploy automático desde GitHub, HTTPS incluido, dominio gratuito bajo vercel.app.
Vercel Hobby (gratis)UI + Gráficos
Tailwind CSS para estilos. Recharts para visualizaciones (mismo que ya usás). Lucide para iconos.
Tailwind + Recharts
¿Por qué no GitHub Pages? GitHub Pages es estático puro — no puede manejar autenticación ni guardar datos. Vercel sí, y también es 100% gratuito con deploy automático cada vez que hacés push.
2
Stack tecnológico completo
| Capa | Tecnología | Para qué sirve | Costo |
|---|---|---|---|
| UI Framework | React 18 + Vite |
Interfaz del dashboard y panel admin
Familiar para Claude Code, ecosistema enorme
|
Gratis |
| Estilos | Tailwind CSS v3 |
Diseño responsivo, paleta institucional OPSV
Claude Code genera Tailwind excelente
|
Gratis |
| Gráficos | Recharts |
Todos los gráficos del dashboard actual
Mismo que el dashboard anterior → migración directa
|
Gratis |
| Base de datos | Supabase PostgreSQL |
Config del dashboard, textos editables, roles, metadatos de CSV
500MB gratis, más que suficiente para configuración
|
Gratis |
| Autenticación | Supabase Auth |
Login email/contraseña con roles (superadmin, admin, editor)
Email confirmado + recupero de contraseña incluidos
|
Gratis |
| Storage CSV | Supabase Storage |
Almacenamiento de los 3 archivos CSV mensuales
1GB gratis, historial de versiones posible
|
Gratis |
| Hosting | Vercel |
Publicación del sitio, deploy automático desde GitHub
Cada push = nueva versión publicada en segundos
|
Gratis |
| Repositorio | GitHub |
Control de versiones, integración con Vercel
Todo el código centralizado, historial completo
|
Gratis |
3
Diagrama de arquitectura
4
Roles de usuario y permisos
| Rol | Ver dashboard | Subir CSV | Editar textos/resumen | Config gráficos | Gestionar usuarios | Acceso |
|---|---|---|---|---|---|---|
| Superadmin | ✓ | ✓ | ✓ | ✓ | ✓ Crear/borrar admins | Login requerido |
| Admin | ✓ | ✓ | ✓ | ✓ | ✗ | Login requerido |
| Editor | ✓ | ✗ | ✓ Solo textos | ✗ | ✗ | Login requerido |
| Público | ✓ Solo lectura | ✗ | ✗ | ✗ | ✗ | Sin login · acceso libre |
5
Esquema de base de datos (Supabase)
user_roles
- iduuid PK
- user_iduuid FK auth
- roleenum
- created_attimestamp
datasets
- iduuid PK
- typetext
- yearinteger
- monthinteger
- storage_pathtext
- uploaded_byuuid FK
- created_attimestamp
dashboard_config
- iduuid PK
- keytext unique
- valuejsonb
- updated_byuuid FK
- updated_attimestamp
resumen_content
- iduuid PK
- yearinteger
- monthinteger
- titletext
- bodytext (md)
- publishedboolean
- created_byuuid FK
chart_config
- iduuid PK
- chart_keytext unique
- titletext
- chart_typeenum
- color_palettejsonb
- visibleboolean
- updated_attimestamp
Row Level Security (RLS) — Supabase protege cada tabla con políticas: el público solo puede leer, los admins pueden escribir. Esto se configura una vez con SQL y funciona automáticamente.
6
Estructura del proyecto
opsv-dashboard/
├── src/
│ ├── components/ # Componentes reutilizables
│ │ ├── charts/ # BarChart, LineChart, etc.
│ │ ├── ui/ # Button, Card, Modal, Input
│ │ └── layout/ # Navbar, Sidebar, Footer
│ │
│ ├── pages/ # Páginas / rutas
│ │ ├── Dashboard.jsx # / → público
│ │ ├── Login.jsx # /login
│ │ └── admin/
│ │ ├── AdminPanel.jsx # /admin → panel principal
│ │ ├── UploadCSV.jsx # /admin/upload
│ │ ├── EditResumen.jsx # /admin/resumen
│ │ ├── EditCharts.jsx # /admin/charts
│ │ └── ManageUsers.jsx # /admin/users (superadmin)
│ │
│ ├── hooks/ # Custom hooks
│ │ ├── useAuth.js # Estado de sesión Supabase
│ │ ├── useCSVData.js # Carga y parseo de CSV
│ │ └── useDashConfig.js # Config editable desde DB
│ │
│ ├── lib/
│ │ └── supabase.js # Cliente Supabase (1 línea)
│ │
│ ├── utils/
│ │ └── parseCSV.js # Lógica de procesamiento CSV
│ │
│ └── App.jsx # Rutas + Auth provider
│
├── .env.local # VITE_SUPABASE_URL + ANON_KEY (no subir a GitHub)
├── .env.example # Template sin valores reales (sí subir)
├── vercel.json # Configuración de Vercel (SPA redirect)
├── tailwind.config.js # Paleta institucional OPSV #252C61
└── vite.config.js
7
Fases de desarrollo
Fase
1
2–3 sem
Fundación del proyecto
- Crear proyecto en Supabase (auth + storage + DB)
- Scaffold React + Vite con Tailwind y paleta OPSV
- Sistema de autenticación: login, logout, sesión persistente
- Ruta protegida
/admincon auth guard - Conectar Vercel ↔ GitHub (deploy automático)
Sitio online vacío con login funcional y deploy automático
Fase
2
3–4 sem
Dashboard público
- Upload manual de los 3 CSV desde panel admin
- Parser CSV en el cliente (Papa Parse)
- Migrar todos los gráficos actuales (Recharts)
- Filtros por año y mes funcionales
- Sección Resumen con contenido desde DB
- Diseño responsivo institucional
Dashboard público funcional idéntico al actual, pero con datos dinámicos
Fase
3
3–4 sem
Panel administrador
- Subida de CSV mensuales (3 archivos a la vez)
- Editor de texto enriquecido para sección Resumen
- Editor de títulos y configuración de gráficos
- Selector de tipo de gráfico (barra/línea/área) por visualización
- Selector de colores con paleta institucional
- Vista previa antes de publicar
Panel admin completo con edición en tiempo real y previsualización
Fase
4
2–3 sem
Escalabilidad y pulido
- Gestión de múltiples usuarios con roles (admin, editor)
- Historial de versiones de CSV por mes/año
- Exportación PDF desde el panel admin
- Notificaciones de carga exitosa / errores
- Pruebas finales y documentación básica
Sistema production-ready con multi-usuario y gestión de versiones
Estimación realista para una persona con Claude Code: Fases 1 + 2 son las más importantes y deberían estar listas en ~6 semanas trabajando 2–3 horas/día. Las fases 3 y 4 pueden ir en paralelo con el uso real del sistema.