"Apply less. Land more." · Team Exitcode0 · Cursor Colombo Buildathon 2026
Kairos is a WhatsApp-first AI career agent. The conversational agent Kairo (OpenClaw + Baileys) coordinates job alerts, tailored CV generation, and cover letters. The web dashboard (Next.js + Supabase realtime) handles onboarding and tracking. Job matching and content generation use the MiniMax API; data lives in Supabase with pgvector for semantic matching when enabled.
| Path | Purpose | Typical deploy |
|---|---|---|
apps/web |
Next.js dashboard (Tailwind + shadcn/ui) | Vercel |
apps/poller |
15-minute job polling worker | Railway |
apps/cv-pipeline |
CV YAML → PDF (RenderCV) + MiniMax content | Railway |
packages/db |
Supabase migrations, types, seeds | — |
packages/minimax |
Shared MiniMax client (scorer, CV, posts) | — |
packages/matcher |
Keyword filter, scoring orchestration, pgvector hooks | — |
packages/config |
Shared env validation, constants, types | — |
agents/kairo |
OpenClaw agent + Baileys WhatsApp runtime | Railway |
The modern job market rewards speed over qualification. Many candidates discover listings hours after posting and spend hours tailoring documents—by then, strong roles are already screened.
Kairos monitors job sources on a schedule, scores listings against a candidate profile (MiniMax + optional pgvector pre-filter), and sends an instant WhatsApp alert on strong matches. The user can reply with a single digit; Kairo generates a tailored CV (PDF) and optional cover letter in-thread. The dashboard updates in realtime via Supabase.
- WhatsApp alert: e.g. "87% match — Junior Full-Stack Developer @ Wise. Posted 6 mins ago."
- User replies:
1 - ~60s:
Kavindu_Perera_Wise_2026.pdfin the thread. - Kairo asks about a cover letter; user says
Yes→ text reply. - Web dashboard shows the application logged without a manual refresh.
| Typical tools | Kairos |
|---|---|
| Email digests (slow) | WhatsApp push (minutes after post) |
| Generic templates | AI-tailored CV per job |
| Browser/app context switching | Primary flow in WhatsApp |
| No match score | 0–100 score + fit reasons |
| Manual tracking | Auto-logged dashboard |
- User: WhatsApp (Baileys on a dedicated device) + Next.js dashboard (onboarding, jobs, tracker, drafts, sources).
- Backend:
- Kairo (OpenClaw): parses WhatsApp intents, triggers CV/cover flows, orchestrates MiniMax where needed.
- Poller: cron (~15 min) — LinkedIn guest API, Greenhouse, Lever, Remotive; dedupe; matching; alerts for score ≥ threshold.
- CV pipeline:
(profile, job)→ MiniMax JSON → RenderCV (EngineeringResumes theme) → PDF.
- Data: Supabase + pgvector; embeddings optional for similarity pre-check.
- Keyword pre-filter — skills / target_roles vs title & description (cheap).
- MiniMax scoring — structured
{ score, reasons[] }; threshold default 70. - Batch scoring — multiple jobs per call to reduce round-trips.
- pgvector — cosine similarity pre-check before full scoring (when time permits).
- Cache — avoid re-scoring same
(user_id, job_id).
Baileys message → OpenClaw intent
• "1" / "yes" / "generate cv" → CV pipeline
• "2" / "details" → job from Supabase
• "3" / "skip" → skip job for user
• cover-letter context + "yes" → MiniMax cover letter
• else → Hermes / fallback conversational reply
→ Baileys send → write state to Supabase → dashboard realtime
Baileys: install only @whiskeysockets/baileys (verify package name; typosquat risk). Session dir: WA_SESSION_PATH (see .env.example). Implement reconnect for idle drops.
- MiniMax: CV content JSON (
summary,experience[],skills[],projects[]). - Merge into RenderCV YAML (theme:
EngineeringResumes). - PDF binary → Baileys document; log
cv_version_urlonapplications.
Fallback: if RenderCV fails or times out (~45s), serve a pre-rendered demo PDF.
users—phoneunique, timestamps.profiles— user skills, roles, JSON projects, optionalembedding vector(1536).jobs— source, title, company, location, url, description, posted/fetched times.applications— user/job FKs,match_score,match_reasons[],cv_version_url,cover_letter,status.sources— integrations (Notion, Slack, etc.) withconfigJSONB.
Enable: CREATE EXTENSION IF NOT EXISTS vector;
See .env.example. Minimum: MiniMax keys, Supabase URL + keys, WA_SESSION_PATH, polling URL/interval, match threshold, NEXT_PUBLIC_APP_URL, RenderCV theme.
- Vercel:
apps/web - Railway:
agents/kairo,apps/poller,apps/cv-pipeline - Supabase Cloud: database + realtime
- Tunnel (ngrok / Cloudflare): fallback if hosted workers are blocked
- Onboarding / profile — uploads, parsing status, editable profile, WhatsApp number, activate CTA.
- Job matches + tracker — live feed with score badges; application table; Supabase realtime; optional 7-day follow-up nudge.
- LinkedIn post drafts — three variants (professional, conversational, technical); copy only, no auto-post.
- Sources & integrations — cards with status (Notion + WhatsApp live where applicable; others "coming soon" but polished).
| Member | Focus |
|---|---|
| A | Next.js UI, Supabase realtime |
| B | Poller, LinkedIn guest API, schema + APIs |
| C | Kairo: OpenClaw, MiniMax wiring, Baileys flows |
| D | Deploy, RenderCV, parsers, demo data, rehearsal |
Pre-seed in Supabase before the clock. Example JSON (abbreviated):
{
"name": "Kavindu Perera",
"current_role": "Junior Full-Stack Developer",
"experience_years": 1.5,
"employer": "PayEase LK",
"skills": ["React", "Next.js", "TypeScript", "Node.js", "PostgreSQL", "Supabase", "Tailwind CSS"],
"target_roles": ["Junior Full-Stack Developer", "Frontend Developer", "Full-Stack Engineer"],
"work_preference": "Remote",
"career_goal": "Land a remote role at a product-focused international startup paying in USD.",
"demo_target_job": "Junior Full-Stack Developer @ Wise",
"expected_match_score": 87
}The PayEase → Wise fintech angle is intentional for a believable high match in demos.
| Risk | Mitigation |
|---|---|
| LinkedIn rate limits | Cache last response; fall back to Greenhouse/Remotive |
| Baileys session drop | Reconnect logic; dedicated device for demo |
| RenderCV slow/fail | Static PDF fallback |
| MiniMax latency | User-facing "tailoring…" message; timeout + retry |
| Malicious npm typos | Only @whiskeysockets/baileys |
| Bad JSON from LLM | Validate + retry |
- Hosting: Railway vs tunnel mix for workers.
- MiniMax embedding model for 1536-dim vectors (if using pgvector on profiles).
- Batch size for multi-job scoring (start ~5).
- Official judging criteria / pitch script.
Kairos — Apply less. Land more.
Agent: Kairo (OpenClaw + Baileys).
Built by Exitcode0 · Cursor Colombo Buildathon 2026