Javis OS
Javis OS is an Agentic AI that assists entrepreneurs in business tasks, helping them grow their work.
AI translation
Agente IA de atención al cliente por WhatsApp
Translation pending
BusinessTypeScript · PLpgSQLGitHub @3dcreationsbyjosephOnlineOwner 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
Loading the full README. The saved excerpt is shown below.
Plataforma que actúa como agente IA de atención al cliente vía WhatsApp para clínicas dentales (y otros negocios con agendamiento de citas). Incluye webhook + dashboard web. Stack: Next.js 16.2.6, TypeScript strict, TailwindCSS v4, Supabase (Postgres + Auth + RLS), Vercel AI SDK 6 con Anthropic Claude Sonnet 4.6, WhatsApp Cloud API v25.0, Google Calendar API. Ver PROMPT.md para el brief completo del proyecto y CLAUDE.md para las reglas persistentes que el agente de código debe respetar.Read the full README ↗
Plataforma que actúa como agente IA de atención al cliente vía WhatsApp para clínicas dentales (y otros negocios con agendamiento de citas). Incluye webhook + dashboard web.
Stack: Next.js 16.2.6, TypeScript strict, TailwindCSS v4, Supabase (Postgres + Auth + RLS), Vercel AI SDK 6 con Anthropic Claude Sonnet 4.6, WhatsApp Cloud API v25.0, Google Calendar API.
Ver PROMPT.md para el brief completo del proyecto y CLAUDE.md para las reglas persistentes que el agente de código debe respetar.
.nvmrc)npm i -g supabase)pnpm install
cp .env.example .env.local
Luego rellena .env.local. Para generar la ENCRYPTION_KEY (AES-256-GCM):
pnpm gen:key
Copia el output a ENCRYPTION_KEY= en .env.local.
NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY y SUPABASE_SERVICE_ROLE_KEY al .env.local.supabase link --project-ref <tu-project-ref>
supabase db push
Esto crea todas las tablas con RLS + índices + triggers, incluyendo el trigger que autocrea organization + profile + agent_config al hacer signup.
Habilita Realtime en el dashboard de Supabase → Database → Replication → habilita las tablas messages y conversations (ya las agrega la migración al publication, pero verifica).
(Opcional) Regenera los tipos de TypeScript:
pnpm gen:types
Crea tu API key en console.anthropic.com/settings/keys y colócala en ANTHROPIC_API_KEY.
http://localhost:3000/api/auth/google/callback (y el de producción).GOOGLE_CLIENT_ID y GOOGLE_CLIENT_SECRET a .env.local.whatsapp_business_messaging y whatsapp_business_management.https://TU-DOMINIO.vercel.app/api/webhooks/whatsapp (necesita HTTPS público — usa ngrok para desarrollo).{slug-de-tu-organizacion}:{secreto-random}. El slug se genera automáticamente al hacer signup (lo ves en /integraciones).messages.ℹ️ mTLS (importante para autohosted): desde el 31 de marzo de 2026 Meta firma llamadas a webhooks con una nueva CA interna. Vercel gestiona su trust store. Si en algún momento migras a servidor propio (Docker, EC2), asegúrate de confiar en la Meta Internal CA o el TLS handshake fallará.
pnpm dev
Abre http://localhost:3000. Crea tu cuenta en /signup, ve a /integraciones y guarda las credenciales de WhatsApp; después haz click en Conectar con Google.
after() ejecuta el agente en background:
get_available_slots, book_appointment, save_contact_info, request_human_handoff)./conversaciones/[id] (Supabase Realtime)..env.local en Vercel Project Settings → Environment Variables.NEXT_PUBLIC_APP_URL y GOOGLE_OAUTH_REDIRECT_URI con tu dominio de Vercel.runtime = 'nodejs' (fluid compute).[Cliente WhatsApp] ──> [Meta Cloud API] ──webhook──> [Next.js /api/webhooks/whatsapp]
│
├─ Verifica X-Hub-Signature-256 (HMAC-SHA256)
├─ Resuelve org por phone_number_id
├─ Persiste mensaje (idempotente por wa_message_id)
├─ Responde 200 inmediatamente
└─ after() ejecuta el agente:
├─ AI SDK 6 + Claude Sonnet 4.6
├─ Tools: slots, book, save, handoff
└─ Google Calendar (FreeBusy + insert event)
[Dueño] ──> [Dashboard Next.js] ──> [Supabase Auth + RLS + Realtime]
├─ /dashboard KPIs
├─ /citas calendario
├─ /conversaciones chat con Realtime + toggle bot
├─ /personalizacion prompt, tono, servicios, horarios
└─ /integraciones credenciales de WhatsApp + Google
Aislamiento multi-tenant: cada tabla tiene organization_id y RLS activo. Las políticas filtran usando el profiles.organization_id del usuario autenticado. El webhook usa service_role_key (bypass RLS) pero filtra manualmente por el organization_id derivado del phone_number_id.
app/
(marketing)/page.tsx Landing
(auth)/ login, signup, callback
(app)/ Dashboard, citas, conversaciones, personalización, integraciones
api/
webhooks/whatsapp/route.ts Webhook Cloud API (GET verify + POST con HMAC)
auth/google/ OAuth 2.0 flow
lib/
constants.ts GRAPH_API_VERSION, ANTHROPIC_MODEL, etc.
crypto.ts AES-256-GCM (tokens en BD)
database.types.ts Tipos de Supabase (regenera con pnpm gen:types)
supabase/ server / browser / admin / middleware
whatsapp/ send + verificación de firma
google/ OAuth + Calendar client
agent/
run-agent.ts Loop AI SDK 6 con stopWhen: stepCountIs(8)
system-prompt.ts Ensamble del system prompt
tools/ 4 tools del agente
supabase/migrations/ SQL: schema + RLS + trigger de signup
scripts/gen-encryption-key.mjs Genera ENCRYPTION_KEY base64
| Comando | Qué hace |
|---|---|
pnpm dev | Dev server en :3000 |
pnpm build | Build de producción |
pnpm typecheck | tsc --noEmit |
pnpm lint | ESLint |
pnpm gen:key | Genera clave AES-256-GCM |
pnpm gen:types | Regenera lib/database.types.ts desde Supabase |
encrypt()/decrypt() usan AES-256-GCM con clave en env. Guardan base64(iv || authTag || ciphertext).messages.wa_message_id es UNIQUE — Meta puede reenviar el mismo evento.conversations.bot_active = false, el webhook procesa/guarda el mensaje pero no invoca al agente./personalizacion; refresh automático de tokens de Google (parcialmente resuelto por el listener tokens en lib/google/calendar.ts).