Agree on the partnership before you commit to it
파트너와 실제 합의 내용을 확인하고 각자 답변을 비교해 차이를 파악한 뒤 변호사에게 전달할 공동 요약을 작성합니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Plataforma web multiempresa de control de visitantes, diseñada primero para el teléfono. El anfitrión comparte un enlace; el visitante se registra solo desde su móvil, recibe un pase QR y el guardia valida su entrada en un toque, arrancando el conteo de tiempo dentro.
Cuatro experiencias sobre una sola base de datos: administración, anfitrión, guardia y visitante.
npm install
npm run dev
Abre http://localhost:3000 y elige un perfil: Administración, Anfitrión o Guardia.
Sin credenciales de Supabase la plataforma arranca en modo vitrina: el recorrido completo funciona con datos locales del navegador, compartidos entre pestañas. Sirve para evaluar la experiencia, no como sustituto de producción.
Rutas útiles en vitrina:
| Portal | Ruta |
|---|---|
| Administración | /app/dashboard |
| Anfitrión | /app/host |
| Guardia | /guard/scan |
| Visitante (preregistro) | /visit/nexa-demo-invitation-2026 |
| Pase de ejemplo | /pass/nexa-demo-pass-2026 |
| Recorrido explicado | /demo/visitor |
No hay que tocar código. En cuanto existan credenciales, la plataforma exige autenticación real, aplica RLS y guarda documentos en almacenamiento privado.
copy .env.example .env.local # macOS/Linux: cp .env.example .env.local
npx supabase start # requiere Docker Desktop
npx supabase db reset # aplica migraciones + seed demostrativo
Copia NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY y SUPABASE_SERVICE_ROLE_KEY de npx supabase status a .env.local, reinicia npm run dev y entra a /signup.
El paso que se olvida: no hay contraseñas. Se entra con un código de seis dígitos que manda Supabase Auth, no la aplicación. Hace falta SMTP propio en el panel de Supabase y pegar la plantilla del código en «Magic Link» y «Confirm signup»; sin eso nadie entra. En local,
npx supabase startya usa la plantilla del repositorio y los correos se leen en Inbucket (http://localhost:54324). Está explicado en docs/INTEGRACIONES.md.
npx supabase link --project-ref <ref>.npx supabase db push./auth/callback).CRON_SECRET; vercel.json llama a diario a /api/cron/purge-documents.El bucket visitor-documents es privado. Las rutas empiezan con organization_id, la lectura depende de RLS y la vista se entrega siempre con URL firmada de 60 segundos, dejando registro en la bitácora.
/signup crea la cuenta y /onboarding la organización. En una sola transacción quedan creados: organización, membresía de administración, aviso de privacidad y primera ubicación. A partir de ahí se invita al equipo desde Equipo.
Aforo en vivo con cronómetro por persona, flujo semanal, próximas visitas, actividad, reportes con filtros y CSV, equipo (alta, cambio de rol, suspensión), ubicaciones y configuración de privacidad.
Un botón para invitar, aviso cuando su visitante llega, compartir el enlace por el diálogo nativo del sistema (WhatsApp, correo, lo que tenga el teléfono) y visibilidad únicamente de sus propias visitas, garantizada por RLS.
Escáner a pantalla completa con marco guía, validación por código manual como respaldo, ficha del visitante con requisitos de acceso y notas, autorización explícita fuera de ventana, rechazo con motivo obligatorio, alta manual sin pase y bitácora del turno. Vibración corta al leer y confirmar.
Sin cuenta ni aplicación. Cinco pasos, captura con cámara en vivo, lectura de texto local, corrección de cualquier campo, consentimiento con el aviso real de la organización y su plazo de retención, y pase QR descargable.
organization_id y RLS en todas las tablas operativas; roles aplicados en SQL y en la interfaz.public.token_hash), nunca en texto plano.record_access_decision bloquea la fila, revalida el estado y escribe evento y auditoría en la misma transacción.resolve_qr_token valida la organización dentro de la función, no solo en la API.El visitante fotografía las dos caras de su credencial. El reverso es el que se lee: las credenciales para votar recientes traen ahí una banda MRZ (norma ICAO 9303, formato TD1) con dígitos de control, así que la lectura se puede verificar en lugar de confiar en ella. Cuando los cuatro cuadran, la interfaz muestra «Lectura verificada» y extrae nombre, fecha de nacimiento, vigencia y CURP.
Todo ocurre en el teléfono del visitante: la imagen no se envía a ningún servicio de terceros para analizarla. Los archivos del motor se sirven desde el propio dominio (npm run setup:ocr), no desde un CDN, para poder mantener la CSP estricta.
npm run setup:ocr # una vez; `npm run build` ya lo ejecuta
NEXT_PUBLIC_OCR_PROVIDER=tesseract
Sin esa variable se usa un proveedor reproducible que devuelve una banda de ejemplo bien formada, útil para demostraciones y pruebas.
Con honestidad: el OCR extrae texto, no valida que la credencial sea auténtica ni hace reconocimiento facial. Si el documento no tiene banda MRZ —credenciales antiguas, gafetes— el visitante escribe sus datos y el flujo sigue igual. Todo campo es editable y la interfaz avisa cuando la lectura no quedó comprobada. Para verificación de autenticidad o prueba de vida hace falta un servicio especializado; ver integraciones.
Los pasos de cada una están en docs/INTEGRACIONES.md.
npm run lint
npm run typecheck
npm test
npm run test:e2e # npx playwright install chromium (una vez)
npm run build
npm run check encadena lint, TypeScript, unitarias y build.
Las 55 unitarias cubren las reglas de acceso (ventanas configurables, duplicados, rechazo con motivo, expiración), el lector de MRZ —validado contra el ejemplo canónico de la norma ICAO 9303, incluidos los dígitos de control—, el hashing verificado contra el mismo valor que produce PostgreSQL, el enmascarado, el CSV, las redirecciones y el cálculo de estancia. Los 14 E2E recorren anfitrión → visitante → guardia → administración y verifican el aislamiento entre portales, en escritorio y en móvil.
proxy.ts) y React 19.src/lib/domain.ts) para servidor y cliente: la interfaz es idéntica en vitrina y en producción.src/lib/clock.ts) alimenta todos los cronómetros en vivo.Consulta decisiones, integraciones, limitaciones y checklist de producción.
¿Vas a conectar la base de datos?
docs/HANDOFF-SUPABASE.mdes el guion paso a paso: migraciones, verificaciones con el SQL exacto y su resultado esperado, y los criterios para dar el trabajo por bueno.
| Anfitrión | Guardia | Pase |
|---|---|---|
src/app/ rutas y API
src/components/ interfaz de los cuatro portales
src/components/ui.tsx primitivas de diseño
src/lib/ocr/ lector de MRZ y proveedores de reconocimiento
src/lib/ dominio, seguridad y adaptadores
src/lib/server/ Supabase, sesión, correo, WhatsApp y carteras
scripts/setup-ocr.mjs prepara el motor de OCR local
src/proxy.ts refresco de sesión y guardas optimistas
supabase/migrations/ esquema, funciones y RLS
tests/e2e/ recorridos Playwright
docs/ decisiones, limitaciones y checklist