Javis OS
Javis OS는 기업가를 돕는 에이전시 AI로, 업무를 지원하고 함께 성장합니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗PWA de gestión de RRHH para PyMEs argentinas. Fichaje con geolocalización, gestión de empleados, proyectos, reportes y facturación SaaS con MercadoPago.
Antes de contribuir, leé
CONTRIBUTING.md(convenciones, checklist de PR, reglas de seguridad no negociables).
Copiar .env.example a .env.local y completar:
# Supabase
NEXT_PUBLIC_SUPABASE_URL=https://<proyecto>.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=<anon-key>
SUPABASE_SERVICE_KEY=<service-role-key> # solo en servidor, bypasa RLS
# JWT — generar con: node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
JWT_SECRET=<min-32-chars>
# Firebase Admin SDK
FIREBASE_PROJECT_ID=<project-id>
FIREBASE_CLIENT_EMAIL=<client-email>
FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n"
# MercadoPago
MERCADOPAGO_ACCESS_TOKEN=<access-token>
MERCADOPAGO_WEBHOOK_SECRET=<webhook-secret> # OBLIGATORIO — sin esto el webhook retorna 500
# Resend
RESEND_API_KEY=re_<key>
[email protected]
# App
NEXT_PUBLIC_APP_URL=https://tudominio.com
CRON_SECRET=<token-aleatorio> # valida peticiones de los cron jobs de Vercel
MERCADOPAGO_WEBHOOK_SECRETes obligatorio aunque no uses pagos aún — el endpoint/api/billing/webhookfalla con 500 si está ausente (comportamiento intencional, evita bypass de validación HMAC).
Las migraciones en supabase/migrations/ no se ejecutan automáticamente — son documentación del schema esperado que se corre a mano (SQL Editor de Supabase) en orden numérico, de menor a mayor. Antes de correr una migración que toque datos existentes (no solo CREATE TABLE/ALTER TABLE), leé el comentario de cabecera del archivo — varias incluyen notas de riesgo o alcance reducido a propósito (ver 034_solicitudes_fecha_date.sql como ejemplo).
npm install
npm run dev # http://localhost:3000
Acceder a http://localhost:3000/<slug-empresa> donde slug es el campo slug de la tabla empresa.
npm test # unitarios + HTTP de rutas críticas + componentes RTL
npm run test:e2e # smoke test E2E con Playwright (login → fichar → historial)
npm run lint # ESLint (eslint-config-next + unused-imports + no-restricted-imports)
Los unitarios y de integración HTTP usan el runner nativo de Node.js (node:test), sin jest ni vitest. Los componentes usan @testing-library/react sobre jsdom. El E2E usa Playwright contra el dev server local con las rutas de API mockeadas (no requiere Supabase real). Ver CONTRIBUTING.md para el detalle de qué correr antes de un PR.
.env.example.Definidos en vercel.json:
| Ruta | Schedule (UTC) | Propósito |
|---|---|---|
/api/cron/auto-fichaje | 0 3 * * * | Cierra fichadas abiertas y limpia sesiones expiradas |
/api/cron/limpiar-tokens | 0 5 * * 0 | Purga push tokens, login_attempts, rate_limits y sesiones expiradas (domingo) |
/api/cron/trial-reminder | 0 12 * * * | Email recordatorio antes de fin de trial |
/api/cron/vencer-trials | 0 4 * * * | Pasa a Free los trials vencidos (RPC batch, ver 036_vencer_trials_batch.sql) |
/api/cron/push-ausencias | 0 15 * * 1-5 | Push a gerencia por empleados sin fichar entrada (días hábiles) |
Todos los cron jobs validan el header Authorization: Bearer $CRON_SECRET.
Cada empresa tiene un slug único. El flujo de acceso:
/:slug → page.js (AuthProvider) → HomeContent → useAuth()
empresa_id se inyecta desde el JWT en cada API route — nunca se confía en el body del cliente./api/data con SUPABASE_SERVICE_KEY y filtro empresa_id.| Plan | Empleados | Precio ARS/mes |
|---|---|---|
| Free | 5 | $0 |
| Starter | 15 | $15.000 |
| Pro | 50 | $35.000 |
| Enterprise | ilimitado | a convenir |
Las restricciones se aplican con planPermite(), planTieneModulo() y planLimite() de app/lib/plans.js.
proxy.ts, única fuente de verdad): HSTS, CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policyaudit_log para cambios sensiblesapp/lib/rateLimit.js) en login, registro y superadmin authVer CONTRIBUTING.md para los atajos de seguridad que están explícitamente prohibidos en este repo.