No description
  • TypeScript 62.3%
  • HTML 37.1%
  • CSS 0.6%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Jairodaniel-17 90152f3e4f feat(multi-tenancy): scopear todas las colecciones por orgId + testabilidad
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>
2026-06-20 21:54:47 -05:00
.claude/skills mejora de la UX/UI 2026-05-16 21:55:16 -05:00
e2e mejora de la UX/UI 2026-05-16 21:55:16 -05:00
playwright-report mejora de la UX/UI 2026-05-16 21:55:16 -05:00
public Initial commit from Create Next App 2026-02-18 14:49:44 -05:00
src feat(multi-tenancy): scopear todas las colecciones por orgId + testabilidad 2026-06-20 21:54:47 -05:00
test feat(multi-tenancy): scopear todas las colecciones por orgId + testabilidad 2026-06-20 21:54:47 -05:00
test-results mejora de la UX/UI 2026-05-16 21:55:16 -05:00
.gitignore feat: OKRs, tablero Jira, escala, seguridad y UX 2026-06-19 20:40:50 -05:00
AGENTS.md mejora de la UX/UI 2026-05-16 21:55:16 -05:00
CLAUDE.md feat(multi-tenancy): scopear todas las colecciones por orgId + testabilidad 2026-06-20 21:54:47 -05:00
CONTRIBUTING.md feat: open-source ready, hardening de seguridad y almacenamiento S3 (blobs) 2026-06-19 23:58:12 -05:00
eslint.config.mjs Initial commit from Create Next App 2026-02-18 14:49:44 -05:00
HANDOFF.md feat(multi-tenancy): scopear todas las colecciones por orgId + testabilidad 2026-06-20 21:54:47 -05:00
LICENSE feat: open-source ready, hardening de seguridad y almacenamiento S3 (blobs) 2026-06-19 23:58:12 -05:00
luma_apis.yaml mejora de la UX/UI 2026-05-16 21:55:16 -05:00
next.config.ts feat: open-source ready, hardening de seguridad y almacenamiento S3 (blobs) 2026-06-19 23:58:12 -05:00
package-lock.json feat: multi-tenancy (orgs), auto-refresh, tests unitarios 2026-06-19 21:39:19 -05:00
package.json feat: multi-tenancy (orgs), auto-refresh, tests unitarios 2026-06-19 21:39:19 -05:00
playwright.config.ts mejora de la UX/UI 2026-05-16 21:55:16 -05:00
postcss.config.mjs Initial commit from Create Next App 2026-02-18 14:49:44 -05:00
README.md feat: open-source ready, hardening de seguridad y almacenamiento S3 (blobs) 2026-06-19 23:58:12 -05:00
SECURITY.md feat: open-source ready, hardening de seguridad y almacenamiento S3 (blobs) 2026-06-19 23:58:12 -05:00
tsconfig.json Initial commit from Create Next App 2026-02-18 14:49:44 -05:00
vitest.config.ts feat(multi-tenancy): scopear todas las colecciones por orgId + testabilidad 2026-06-20 21:54:47 -05:00

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.

  1. Clona el repositorio

    git clone <url-del-repo> timeos-app
    cd timeos-app
    
  2. Levanta Luma localmente

    TimeOS necesita un backend Luma corriendo. Inicia el binario compilado de Luma escuchando en el puerto 1234:

    luma serve
    

    Por defecto la app espera Luma en http://127.0.0.1:1234.

  3. Configura las variables de entorno

    cp .env.example .env.local
    

    Edita .env.local y completa al menos LUMA_API_KEY y JWT_SECRET. Consulta los comentarios de .env.example para saber qué es requerido y qué es opcional.

  4. Instala las dependencias

    npm install
    
  5. Compila y arranca (producción) o usa el modo desarrollo:

    npm run build && npm start
    # o, para desarrollo:
    npm run dev
    

    La app queda disponible en http://localhost:3000.

  6. Inicializa los datos

    Con la app en ejecución, crea el esquema y los datos semilla:

    curl -X POST http://localhost:3000/api/init
    

    Para reiniciar y volver a sembrar los datos: POST /api/reset.

Credenciales de prueba

Tras inicializar los datos semilla puedes acceder con:

Rol Email 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.