- TypeScript 62.3%
- HTML 37.1%
- CSS 0.6%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Retrofit completo de aislamiento multi-tenant en el data layer: - middleware reenvía x-org-id (verificado del JWT, sobrescribe valores falsificados) - src/lib/org-context.ts: currentOrgId()/currentUserId() desde next/headers - luma-docs.ts: tenantFilter (lecturas, fail-closed), scopedDoc (IDOR cerrado en accesos por id), ownerOrg (estampa orgId en escrituras) en todas las colecciones tenant; organizations/password_resets/roles siguen globales - seed-docs.ts: estampa orgId en cada entidad sembrada - rutas con Luma directo (jobs, documents, allocations) scopeadas inline; spreadsheet deriva userId de la sesión (cierra IDOR) Testabilidad y validación: - rate-limit.ts: escape RATE_LIMIT_DISABLED (apagado por defecto) para e2e - tests unitarios movidos a test/ (vitest.config actualizado) + test de aislamiento org-scope.test.ts - docs: CLAUDE.md, HANDOFF.md (cómo correr e2e con Luma release), .env.example Validado: tsc 0, lint 0, vitest 11/11, playwright e2e 73/73. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
| .claude/skills | ||
| e2e | ||
| playwright-report | ||
| public | ||
| src | ||
| test | ||
| test-results | ||
| .gitignore | ||
| AGENTS.md | ||
| CLAUDE.md | ||
| CONTRIBUTING.md | ||
| eslint.config.mjs | ||
| HANDOFF.md | ||
| LICENSE | ||
| luma_apis.yaml | ||
| next.config.ts | ||
| package-lock.json | ||
| package.json | ||
| playwright.config.ts | ||
| postcss.config.mjs | ||
| README.md | ||
| SECURITY.md | ||
| tsconfig.json | ||
| vitest.config.ts | ||
TimeOS
Gestión de proyectos, tiempos, costos y OKRs — Jira + PSA en uno, self-hostable y open-source.
TimeOS es una plataforma de operaciones de trabajo construida con Next.js 16 (App Router) y TypeScript. Unifica la gestión de proyectos, el registro de horas, los costos, la planificación de recursos y los OKRs en una sola aplicación que puedes alojar en tu propia infraestructura. Toda la persistencia se realiza a través de Luma, un backend self-hosted; no depende de ningún servicio SaaS propietario.
Características
- Proyectos y tareas — Gestión de proyectos con fases, tareas y dependencias.
- Planificación (Gantt) — Diagrama de Gantt interactivo con dependencias.
- Tablero Kanban y sprints — Tablero de tareas y gestión de sprints.
- Timesheets y aprobaciones — Registro de horas tipo hoja de cálculo y flujo de aprobación.
- OKRs — Objetivos, resultados clave (key results) e iniciativas.
- Recursos y costos — Asignación de recursos, capacidad y seguimiento de costos.
- Multi-organización — Soporte para varias organizaciones.
- Clientes, documentos y notificaciones — Gestión de clientes, documentos adjuntos y notificaciones.
- Reportes — Constructor de reportes y vistas pivote.
- Hoja de cálculo — Editor de hoja de cálculo con motor de fórmulas.
Los roles disponibles son admin, manager y member, cada uno con permisos diferenciados (ver Seguridad).
Stack
- Next.js 16 (App Router) + React 19 + TypeScript
- Tailwind CSS v4 (con variables CSS para theming claro/oscuro)
- Luma — backend self-hosted que expone SQL + almacén de documentos (no hay base de datos local ni ORM)
- jose (JWT) + bcryptjs para autenticación
- Zod para validación
- Lucide React (iconos), gantt-task-react (Gantt), Luckysheet + HyperFormula (hoja de cálculo), Recharts (gráficos)
Quickstart de autohospedaje
Requisitos previos: Node.js 18+ y un backend Luma en ejecución.
-
Clona el repositorio
git clone <url-del-repo> timeos-app cd timeos-app -
Levanta Luma localmente
TimeOS necesita un backend Luma corriendo. Inicia el binario compilado de Luma escuchando en el puerto
1234:luma servePor defecto la app espera Luma en
http://127.0.0.1:1234. -
Configura las variables de entorno
cp .env.example .env.localEdita
.env.localy completa al menosLUMA_API_KEYyJWT_SECRET. Consulta los comentarios de.env.examplepara saber qué es requerido y qué es opcional. -
Instala las dependencias
npm install -
Compila y arranca (producción) o usa el modo desarrollo:
npm run build && npm start # o, para desarrollo: npm run devLa app queda disponible en http://localhost:3000.
-
Inicializa los datos
Con la app en ejecución, crea el esquema y los datos semilla:
curl -X POST http://localhost:3000/api/initPara reiniciar y volver a sembrar los datos:
POST /api/reset.
Credenciales de prueba
Tras inicializar los datos semilla puedes acceder con:
| Rol | Contraseña | |
|---|---|---|
| Admin | ana.garcia@timeos.com |
admin123 |
| Member | carlos.lopez@timeos.com |
carlos123 |
Cambia o elimina estas credenciales antes de exponer la app en producción.
Scripts
| Script | Descripción |
|---|---|
npm run dev |
Servidor de desarrollo |
npm run build |
Compilación de producción |
npm run start |
Sirve la compilación de producción |
npm run lint |
Linter (ESLint) |
npm run test |
Tests (Vitest) |
Comprobación de tipos sin emitir: npx tsc --noEmit.
Seguridad
Consulta SECURITY.md para reportar vulnerabilidades y para la checklist de hardening en producción (JWT_SECRET fuerte, HTTPS, rotación de claves, etc.).
Contribuir
¡Las contribuciones son bienvenidas! Lee CONTRIBUTING.md para conocer el flujo de desarrollo, las convenciones de ramas/PR y el estilo de código.
Licencia
Distribuido bajo licencia MIT.