Agree on the partnership before you commit to it
Find out what you and your business partner are actually agreeing to. Each of you answers on your own, you see where your expectations differ, and you build a shared brief to take to your lawyer.
Preregistro desde el teléfono, pases QR y control de acceso en tiempo real para empresas.
Translation pending
BusinessTypeScript · PLpgSQLGitHub @de1bedOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full 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