Plataforma inteligente de búsqueda y gestión documental con IA
DocMind centraliza, clasifica y comparte documentación corporativa de forma ágil. Combina extracción de texto (Apache Tika), análisis con LLM (Ollama / OpenAI), búsqueda híbrida (léxica + semántica + fuzzy) y un sistema granular de roles y permisos, todo envuelto en una interfaz moderna con animaciones fluidas.
- Requisitos previos
- Ejecución rápida (desarrollo local)
- Ejecución con Docker Compose
- Variables de entorno
- Arquitectura del proyecto
- Backend — API REST
- Modelo de datos
- Roles y permisos
- Control de acceso a documentos
- IA y búsqueda
- Frontend — Funcionalidades
- Stack tecnológico
- Convenciones del proyecto
- Licencia
| Herramienta | Versión mínima | Notas |
|---|---|---|
| Java | 21 | El wrapper mvnw se encarga de Maven |
| Node.js | 18 | Se recomienda 22 LTS |
| npm | 9+ | Incluido con Node |
| Ollama (opcional) | — | Solo si se quiere IA local: ollama pull qwen2.5:3b && ollama pull nomic-embed-text |
| Docker + Docker Compose (opcional) | — | Solo para ejecución contenerizada |
cd docMind/backend
./mvnw spring-boot:runPor defecto arranca con H2 embebido (sin dependencias externas). La base de datos se crea en backend/data/docmind.mv.db.
Al primer inicio se genera un usuario administrador global:
- Email:
admin@docmind.local- Contraseña:
admin123También se insertan 15 documentos de ejemplo con texto, categorías y metadatos.
cd docMind/frontend
npm install
npm run devAbre http://localhost:5173 en el navegador.
# Instalar Ollama: https://ollama.com
ollama pull qwen2.5:3b # Modelo de chat
ollama pull nomic-embed-text # Modelo de embeddings
ollama serve # Puerto 11434Sin Ollama, la subida de documentos funciona pero sin resumen/tags IA ni búsqueda semántica.
cd docMind
docker compose up -d| Servicio | Imagen | Puerto | Descripción |
|---|---|---|---|
backend |
maven:3.9.9-eclipse-temurin-21 |
8081 |
Spring Boot API |
frontend |
node:22-alpine |
5173 |
Vite dev server |
postgres |
postgres:15 |
5455 → 5432 |
Base de datos PostgreSQL |
pgadmin |
dpage/pgadmin4 |
5055 → 80 |
Interfaz de administración de BD |
pgAdmin: http://localhost:5055 — admin@admin.com / admin
| Variable | Valor por defecto | Descripción |
|---|---|---|
DOCMIND_DB_URL |
jdbc:h2:file:./data/docmind;... |
URL JDBC de la base de datos |
DOCMIND_DB_USER |
sa |
Usuario de BD |
DOCMIND_DB_PASSWORD |
(vacío) | Contraseña de BD |
DOCMIND_DB_DRIVER |
org.h2.Driver |
Driver JDBC |
DOCMIND_JPA_DIALECT |
org.hibernate.dialect.H2Dialect |
Dialecto de Hibernate |
DOCMIND_DB_POOL_SIZE |
10 |
Pool máximo de conexiones HikariCP |
DOCMIND_DB_SSL_MODE |
disable |
Modo SSL para PostgreSQL |
DOCMIND_FLYWAY_ENABLED |
false |
Activar migraciones Flyway |
DOCMIND_AUTH_MODE |
local |
Modo de autenticación: local o supabase |
DOCMIND_JWT_SECRET |
docmind-super-secret-key-... |
Clave secreta para firmar JWT |
DOCMIND_JWT_EXPIRATION_MS |
86400000 (24 h) |
Tiempo de expiración del token JWT |
DOCMIND_SUPABASE_URL |
(vacío) | URL del proyecto Supabase |
DOCMIND_SUPABASE_ANON_KEY |
(vacío) | Anon key de Supabase |
DOCMIND_SUPABASE_SERVICE_ROLE_KEY |
(vacío) | Service role key de Supabase |
DOCMIND_SUPABASE_VECTOR_ENABLED |
true |
Búsqueda vectorial con pgvector |
DOCMIND_SUPABASE_VECTOR_TOP_K |
50 |
Resultados máximos de búsqueda vectorial |
DOCMIND_SUPABASE_VECTOR_MIN_SIMILARITY |
0.20 |
Similitud coseno mínima |
Configuración IA:
| Variable | Valor por defecto | Descripción |
|---|---|---|
llm.provider |
ollama |
Proveedor LLM: ollama u openai |
docmind.ollama.base-url |
http://localhost:11434 |
URL de Ollama |
docmind.ollama.chat-model |
qwen2.5:3b |
Modelo de chat |
docmind.ollama.embedding-model |
nomic-embed-text |
Modelo de embeddings |
llm.api.model |
gpt-4o-mini |
Modelo OpenAI (si se usa) |
Admin global:
| Variable | Valor por defecto |
|---|---|
docmind.admin.email |
admin@docmind.local |
docmind.admin.username |
admin |
docmind.admin.password |
admin123 |
| Variable | Valor por defecto | Descripción |
|---|---|---|
VITE_API_BASE_URL |
http://localhost:8081 |
URL base del backend |
VITE_GLOBAL_ADMIN_LOGIN |
admin@docmind.local |
Login rápido de admin (UI) |
docMind/
├── compose.yaml # Docker Compose
├── backend/ # Spring Boot (Java 21)
│ ├── pom.xml
│ ├── mvnw / mvnw.cmd
│ ├── uploads/ # Archivos subidos (disco)
│ ├── data/ # Base H2 embebida
│ └── src/main/java/com/hackUdc2026/docMind/
│ ├── config/
│ │ ├── SecurityConfig.java # Spring Security, CORS, filtro JWT
│ │ ├── GlobalAdminConfig.java # Seed del admin global al arrancar
│ │ ├── DocumentSeedConfig.java # Seed de 15 documentos de ejemplo
│ │ ├── UserRoleConstraintConfig.java # Sincroniza CHECK constraints de roles
│ │ ├── ManagedTagConstraintConfig.java
│ │ └── security/
│ │ ├── JwtAuthenticationFilter.java # Extrae JWT → SecurityContext
│ │ └── AuthenticatedUser.java # Principal: (id, username, role)
│ ├── controller/
│ │ ├── UserController.java # Auth + gestión de usuarios
│ │ ├── DocumentController.java # CRUD docs, upload, share, IA, download
│ │ ├── FolderController.java # CRUD carpetas, mover documentos
│ │ └── ManagedTagController.java # CRUD etiquetas gestionadas
│ ├── service/
│ │ ├── UserService.java # Auth, roles, perfil, operaciones admin
│ │ ├── DocumentService.java # Upload, búsqueda híbrida, acceso, sharing
│ │ ├── FolderService.java # Operaciones de carpetas
│ │ ├── ManagedTagService.java # Etiquetas con scope global/departamento
│ │ ├── JwtService.java # Generación y validación JWT (JJWT)
│ │ ├── LLMService.java # Integración Ollama y OpenAI
│ │ ├── DocumentAnalysisService.java # Análisis IA, consultas, categorías
│ │ ├── DocumentPostProcessingService.java # Enriquecimiento asíncrono tras upload
│ │ ├── DocumentFileProcessor.java # Extracción de texto (TXT, PDF)
│ │ ├── SemanticSearchService.java # Búsqueda por embeddings
│ │ └── SupabaseAuthService.java # Integración Supabase Auth
│ ├── repository/ # Spring Data JPA Repositories
│ └── model/
│ ├── entities/ # Entidades JPA + enums
│ ├── dto/ # Objetos de transferencia
│ └── exceptions/ # Excepciones de dominio
└── frontend/ # React + TypeScript + Vite
├── package.json
├── vite.config.ts
├── tailwind.config.js
├── index.html
└── src/
├── App.tsx # Componente raíz (flujo auth, vistas)
├── main.tsx # Punto de entrada
├── index.css # Estilos globales, liquid-glass tokens
├── components/
│ ├── SplashScreen.tsx # Pantalla de carga animada
│ ├── AuthPage.tsx # Login/Register a pantalla completa
│ ├── Header.tsx # Barra superior con menú de usuario
│ ├── Sidebar.tsx # Navegación lateral con categorías
│ ├── SearchBar.tsx # Barra de búsqueda
│ ├── DocumentList.tsx # Lista paginada de documentos
│ ├── DocumentCard.tsx # Tarjeta individual de documento
│ ├── DocumentDetail.tsx # Vista detallada con preview
│ ├── UploadModal.tsx # Modal de subida de archivos
│ ├── SettingsModal.tsx # Configuración de la app
│ ├── AccountModal.tsx # Edición de perfil de usuario
│ ├── PdfIframeViewer.tsx # Visor de PDF en iframe
│ ├── UiErrorBoundary.tsx # Error boundary de UI
│ └── ui/ # Componentes shadcn/ui (Radix)
├── lib/
│ ├── utils.ts # Utilidades (cn, etc.)
│ ├── animations.ts # Tokens de animación GSAP
│ └── api/
│ ├── http.ts # Cliente HTTP base + gestión JWT
│ ├── auth.ts # Login, register, perfil, tipos
│ ├── documents.ts # CRUD docs, shares, tags, búsqueda
│ ├── folders.ts # CRUD carpetas
│ ├── users.ts # Gestión admin de usuarios
│ └── rolePermissions.ts # Gestión admin de permisos
├── types/
│ └── document.ts # Tipos de documento, categorías
├── data/
│ ├── localSeed.ts # Datos locales (localStorage)
│ └── mockDocuments.ts # Documentos mock
└── hooks/
└── use-mobile.ts # Detección de pantalla móvil
Todos los endpoints (salvo login y register) requieren cabecera Authorization: Bearer <JWT>.
| Método | Ruta | Descripción | Auth |
|---|---|---|---|
POST |
/api/users/register |
Registrar nuevo usuario → devuelve JWT + perfil | ❌ Pública |
POST |
/api/users/login |
Login (usuario, email o username) → JWT + perfil | ❌ Pública |
GET |
/api/users/me |
Obtener perfil del usuario autenticado | ✅ |
PUT |
/api/users/me |
Actualizar perfil (nombre, email, teléfono, foto, contraseña) | ✅ |
GET |
/api/users |
Listar todos los usuarios | ✅ Admin |
PUT |
/api/users/{id}/role |
Asignar rol a un usuario (no puede asignar ADMIN) | ✅ Admin |
PUT |
/api/users/{id}/org |
Actualizar departamento y tipo de persona | ✅ Admin |
GET |
/api/users/role-permissions |
Listar configuración de permisos por rol | ✅ Admin |
PUT |
/api/users/role-permissions/{role} |
Actualizar permisos de un rol | ✅ Admin |
| Método | Ruta | Descripción | Auth |
|---|---|---|---|
GET |
/api/documents |
Lista paginada de documentos accesibles (page, size) |
✅ |
GET |
/api/documents/search?q=... |
Búsqueda híbrida (léxica + semántica + fuzzy) | ✅ |
GET |
/api/documents/category/{cat} |
Documentos por categoría | ✅ |
POST |
/api/documents/upload |
Subir documento (multipart: file, title, author, category) |
✅ |
PUT |
/api/documents/{id} |
Actualizar campos del documento | ✅ |
DELETE |
/api/documents/{id} |
Eliminar documento (propietario o admin) | ✅ |
GET |
/api/documents/{id}/content |
Obtener contenido del archivo (inline) | ✅ |
GET |
/api/documents/{id}/download |
Descargar archivo (attachment) | ✅ |
POST |
/api/documents/{id}/analyze |
Lanzar análisis IA del documento | ✅ |
POST |
/api/documents/{id}/query |
Preguntar a la IA sobre un documento | ✅ |
POST |
/api/documents/{id}/share |
Compartir documento (por username o email) | ✅ |
GET |
/api/documents/pending-shares |
Ver invitaciones de compartición pendientes | ✅ |
POST |
/api/documents/shares/{shareId}/accept |
Aceptar invitación | ✅ |
POST |
/api/documents/shares/{shareId}/reject |
Rechazar invitación | ✅ |
GET |
/api/documents/{id}/access |
Ver quién tiene acceso al documento | ✅ |
GET |
/api/documents/deletions |
Log de auditoría de eliminaciones | ✅ |
PUT |
/api/documents/{id}/managed-tags |
Asignar etiquetas gestionadas a un documento | ✅ |
| Método | Ruta | Descripción | Auth |
|---|---|---|---|
GET |
/api/folders |
Listar carpetas del usuario | ✅ |
POST |
/api/folders |
Crear carpeta (nombre, color) | ✅ |
PATCH |
/api/folders/{id} |
Renombrar carpeta | ✅ |
DELETE |
/api/folders/{id} |
Eliminar carpeta | ✅ |
POST |
/api/folders/{id}/move |
Mover documentos a una carpeta | ✅ |
POST |
/api/folders/unassign |
Quitar documentos de todas las carpetas | ✅ |
| Método | Ruta | Descripción | Auth |
|---|---|---|---|
GET |
/api/managed-tags |
Listar etiquetas visibles (globales + departamento del usuario) | ✅ |
POST |
/api/managed-tags |
Crear etiqueta (nombre, color, global/departamento) | ✅ Admin/Manager |
DELETE |
/api/managed-tags/{id} |
Eliminar etiqueta (se quita de todos los documentos) | ✅ Admin/Manager |
| Campo | Tipo | Descripción |
|---|---|---|
id |
Long (PK) | ID autoincremental |
username |
String | Nombre de usuario |
email |
String | Email único |
password |
String | BCrypt (o {SUPABASE_AUTH}) |
phone |
String | Teléfono (opcional) |
photo |
String | URL de foto (opcional) |
role |
UserRole enum |
Rol asignado |
department |
Department enum |
Departamento |
personType |
PersonType enum |
Tipo de persona |
| Campo | Tipo | Descripción |
|---|---|---|
id |
Long (PK) | ID autoincremental |
title |
String | Título del documento |
fileName |
String | Nombre original del archivo |
filePath |
String | Ruta en disco |
fileType |
String | Tipo MIME |
extractedText |
TEXT | Texto extraído (Apache Tika) |
author |
String | Autor |
category |
String | Categoría (inferida por IA o manual) |
summary |
TEXT | Resumen generado por LLM |
tags |
String | Tags generados por LLM (CSV) |
metadata |
TEXT | Metadatos extraídos por Tika |
managedTags |
TEXT | Etiquetas gestionadas (CSV de IDs) |
uploadedAt |
LocalDateTime | Fecha de subida |
visibilityRole |
UserRole |
Visibilidad por rol |
uploadedByUserId |
Long | FK al usuario que subió |
sharedWithUserIds |
TEXT | CSV de IDs de usuarios (legacy) |
sharedWithEmails |
TEXT | CSV de emails (legacy) |
| Campo | Tipo | Descripción |
|---|---|---|
id |
Long (PK) | ID autoincremental |
document |
Document (FK) | Documento compartido |
ownerUserId |
Long | ID del propietario |
targetUserId |
Long | ID del destinatario |
targetUserIdResolved |
Long | ID resuelto (nullable) |
targetIdentifier |
String | Username o email del destinatario |
status |
ShareStatus enum |
PENDING, ACCEPTED, REJECTED |
createdAt |
LocalDateTime | Fecha de creación |
respondedAt |
LocalDateTime | Fecha de respuesta |
| Campo | Tipo | Descripción |
|---|---|---|
id |
Long (PK) | ID autoincremental |
name |
String | Nombre de la carpeta |
color |
String | Color hex |
documents |
Set<Document> | Relación ManyToMany |
| Campo | Tipo | Descripción |
|---|---|---|
id |
Long (PK) | ID autoincremental |
name |
String (max 60) | Nombre de la etiqueta |
colorHex |
String (7) | Color hex (default: #8B5CF6) |
department |
Department |
Departamento (null = global) |
isGlobal |
boolean | Si es visible para todos |
createdByUserId |
Long | ID del creador |
createdAt |
LocalDateTime | Fecha de creación |
| Campo | Tipo | Descripción |
|---|---|---|
id |
Long (PK) | ID autoincremental |
role |
UserRole (unique) |
Rol |
permissions |
Set<String> | Permisos asignados |
| Enum | Valores |
|---|---|
| UserRole | ADMIN, HR_ADMIN, FINANCE_MANAGER, DELIVERY_DIRECTOR, PROJECT_MANAGER, TECH_LEAD, SENIOR_CONSULTANT, CONSULTANT, QA, DEVOPS, SALES_ACCOUNT, CLIENT_VIEWER, INTERN, EXTERNAL_COLLABORATOR, MANAGER, EDITOR, VIEWER |
| Department | ENGINEERING, PRODUCT, SALES, MARKETING, FINANCE, HR, LEGAL, OPERATIONS, EXTERNAL |
| PersonType | INTERNAL_STAFF, MANAGER, EXECUTIVE, CONTRACTOR, INTERN, PARTNER |
| ShareStatus | PENDING, ACCEPTED, REJECTED |
READ · WRITE · EXECUTE · DELETE · SHARE · MANAGE_USERS · MANAGE_ROLES · AUDIT
| Rol | Permisos |
|---|---|
| ADMIN | READ, WRITE, EXECUTE, DELETE, MANAGE_USERS, MANAGE_ROLES, AUDIT |
| HR_ADMIN | READ, WRITE |
| FINANCE_MANAGER | READ, WRITE, EXECUTE |
| DELIVERY_DIRECTOR | READ, WRITE, EXECUTE, DELETE |
| PROJECT_MANAGER | READ, WRITE, EXECUTE |
| TECH_LEAD | READ, WRITE, EXECUTE |
| SENIOR_CONSULTANT | READ, WRITE |
| CONSULTANT | READ, WRITE |
| QA | READ, EXECUTE |
| DEVOPS | READ, WRITE, EXECUTE |
| SALES_ACCOUNT | READ, WRITE |
| CLIENT_VIEWER | READ |
| INTERN | READ |
| EXTERNAL_COLLABORATOR | READ |
| MANAGER (legacy) | READ, WRITE, EXECUTE |
| EDITOR (legacy) | READ, WRITE |
| VIEWER (legacy) | READ |
Los permisos son editables en tiempo real por el administrador global desde el panel de admin. Los cambios se persisten en la tabla
role_permission_configs.
El rol se infiere a partir del departamento y tipo de persona seleccionados:
| Condición | Rol asignado |
|---|---|
personType = EXECUTIVE o MANAGER |
DELIVERY_DIRECTOR |
personType = INTERN |
INTERN |
personType = CONTRACTOR / PARTNER + dept EXTERNAL |
EXTERNAL_COLLABORATOR |
dept = HR |
HR_ADMIN |
dept = FINANCE |
FINANCE_MANAGER |
dept = ENGINEERING o PRODUCT |
CONSULTANT |
| Default | VIEWER |
Se genera automáticamente al arrancar. Es el único usuario con rol ADMIN — este rol no puede asignarse a otros usuarios desde la API.
Un usuario puede acceder a un documento si cumple al menos una de estas condiciones:
- Es el administrador global (rol
ADMIN) - Es el propietario del documento (
uploadedByUserId) - Tiene un DocumentShare aceptado (por
targetUserIdotargetIdentifier) - Aparece en los campos legacy
sharedWithUserIdsosharedWithEmails - Su rol coincide con el
visibilityRoledel documento - El documento no tiene
visibilityRoledefinido (compatibilidad)
Propietario comparte → Se crea DocumentShare (PENDING)
→ Destinatario ve la invitación en "Pendientes"
→ Acepta (ACCEPTED → obtiene acceso)
→ Rechaza (REJECTED → sin acceso)
- Extracción de texto: Apache Tika procesa el archivo (PDF, Office, CSV, TXT…) y extrae texto + metadatos
- Análisis LLM: El texto se envía al modelo de lenguaje que genera:
- Resumen del contenido
- Tags relevantes
- Metadatos estructurados
- Inferencia de categoría (sistema multicapa):
- Categoría especificada por el usuario → Análisis del contenido por palabras clave empresariales → Fallback por tipo de archivo
Contratos · Facturas · Presupuestos · Informes · Fichas Técnicas · Documentación Legal · RRHH · Marketing · Proyectos · Otros
La búsqueda combina múltiples estrategias y devuelve un ranking fusionado:
| Estrategia | Descripción |
|---|---|
| Léxica | Scoring ponderado por campos: título, resumen, tags, contenido, categoría, metadatos, autor, nombre de archivo |
| Semántica | Embeddings generados con Ollama (nomic-embed-text) o Supabase pgvector; similitud coseno |
| Fuzzy | Distancia de Levenshtein para tolerancia a errores tipográficos |
| Sinónimos | Expansión automática de términos de búsqueda con sinónimos contextuales |
Endpoint POST /api/documents/{id}/query — permite hacer preguntas en lenguaje natural sobre un documento específico. El LLM responde usando el contenido extraído como contexto.
| Proveedor | Modelo por defecto | Configuración |
|---|---|---|
| Ollama (local) | qwen2.5:3b (chat), nomic-embed-text (embeddings) |
llm.provider=ollama |
| OpenAI | gpt-4o-mini |
llm.provider=openai + API key |
Pantalla de inicio animada con GSAP:
- Logo con animación de entrada (scale + rotateY + bounce)
- Nombre de la aplicación con blur-to-focus
- Barra de carga progresiva
- Fade-out con blur al completarse
Layout dividido: panel izquierdo con branding + panel derecho con formulario.
- Login: por nombre de usuario o email + contraseña
- Register: nombre, email, departamento, tipo de persona, contraseña
- Tabs animados con indicador pill deslizante (GSAP)
- Formulario con stagger de campos (Framer Motion)
- Acceso rápido de administrador global
- Sesión persistida con JWT en
localStorage; revalidación automática al recargar
- Sidebar: navegación por secciones (Buscar, Recientes, Favoritos, Subidos, Admin) y categorías (Contratos, Facturas, Informes, Presupuestos, Fichas Técnicas, Documentación Legal)
- Header: menú de usuario con perfil, configuración y cerrar sesión
- Barra de búsqueda: búsqueda en tiempo real con filtros avanzados
- Subida: drag-and-drop o selector de archivos; análisis IA automático tras la subida
- Lista paginada: vista en grid/lista con paginación server-side
- Tarjeta de documento: muestra título, categoría, tipo, tags, autor, fecha, preview
- Vista detallada: preview del archivo (PDF inline, texto), metadatos, resumen IA, tags, historial de acceso
- Edición: renombrar, cambiar categoría, editar autor
- Eliminación: solo propietario o admin
- Descarga: descarga directa del archivo original
- Crear, renombrar y eliminar carpetas
- Drag-and-drop de documentos a carpetas
- Mover/desasignar documentos entre carpetas
- Compartir por username o email
- Panel de invitaciones pendientes
- Aceptar/Rechazar invitaciones
- Visor de lista de acceso por documento
- Crear etiquetas con nombre y color personalizado
- Etiquetas globales (visibles para todos) o por departamento
- Asignar/desasignar etiquetas a documentos
- Filtrar documentos por etiqueta
| Filtro | Opciones |
|---|---|
| Categoría | Las 6 categorías principales + Otros |
| Tipo de archivo | PDF, TXT, CSV, etc. |
| Rango de fecha | Hoy, Semana, Mes, Año, Todas |
| Autor | Selector dinámico |
| Etiqueta gestionada | Selector dinámico |
| Solo favoritos | Toggle |
| Solo con archivo físico | Toggle |
| Solo con tags | Toggle |
| Ordenación | Más recientes, Más antiguos, A-Z, Z-A |
- Gestión de usuarios: listar todos, asignar roles, cambiar departamento/tipo
- Editor de permisos por rol: ver y modificar permisos de cada rol en tiempo real
- Gestión de etiquetas: crear/eliminar etiquetas globales o de departamento
- Estilo liquid-glass: fondos translúcidos con backdrop-blur y bordes sutiles
- Paleta inspirada en Notion:
#37352f(texto),#0A4B66(acento),#2eaadc(enlace) - Animaciones con GSAP (entradas de sidebar, header, selección) y Framer Motion (transiciones de formulario, aparición de contenido)
- Responsive: sidebar colapsable, layout adaptativo para móvil
- Soporte para
prefers-reduced-motion
| Tecnología | Versión | Uso |
|---|---|---|
| Java | 21 | Lenguaje principal |
| Spring Boot | 4.0.3 | Framework web |
| Spring Security | — | Autenticación JWT, CORS |
| Spring Data JPA | — | ORM (Hibernate) |
| H2 Database | — | BD embebida para desarrollo |
| PostgreSQL | 15 | BD en producción |
| Flyway | — | Migraciones de esquema |
| Apache Tika | 2.9.1 | Extracción de texto y metadatos |
| JJWT | 0.12.6 | Generación/validación de JWT |
| Lombok | — | Reducción de boilerplate |
| Tecnología | Versión | Uso |
|---|---|---|
| React | 19.x | Librería UI |
| TypeScript | 5.9.x | Tipado estático |
| Vite | 7.x | Bundler y dev server |
| Tailwind CSS | 4.x | Estilos utility-first |
| Radix UI | — | Componentes headless (19 paquetes) |
| shadcn/ui | — | Componentes estilizados sobre Radix |
| GSAP | 3.14 | Animaciones avanzadas |
| Framer Motion | 12.x | Animaciones declarativas |
| Lucide React | — | Iconos SVG |
| Fuse.js | 7.x | Búsqueda fuzzy client-side |
| Recharts | — | Gráficos y visualizaciones |
| React Hook Form + Zod | — | Formularios con validación |
| date-fns | 4.x | Utilidades de fecha |
| Sonner | — | Notificaciones toast |
| cmdk | — | Paleta de comandos |
- Git Flow: ramas derivadas desde
main(feat-*,fix-*, etc.) - Conventional Commits:
feat:,fix:,refactor:,docs:, etc. - Arquitectura MVC: backend con separación controller → service → repository
- DTOs: comunicación frontend-backend mediante objetos de transferencia, nunca entidades directas
Se soporta PostgreSQL en Supabase con pgvector para búsqueda semántica sin cambiar controladores ni repositorios JPA.
Guía completa: backend/SUPABASE_MIGRATION.md
Este proyecto está liberado bajo la licencia MIT.
Escogemos MIT porque, al ser un proyecto nacido en un Hackathon, buscamos que sea Software Libre permisivo: cualquier individuo u organización puede tomar el trabajo, modificarlo para sus necesidades operativas (como conectar su propia RAG de IA) y usarlo libremente en entornos empresariales sin restricciones severas.