🗺 Utkrushta System Map

Zoom level 0 — every component and sub-component of the platform. Green = participates in the selected flow. Pick a flow below to zoom into its live player.

Recruiter App — Next.js :3000 · npm · NextAuth v5

Browser UIposition wizard · dashboard Next server/api/* routes · auth + billing gates

Candidate App — Next.js :3001 · pnpm · custom JWT

Browser UItest experience Next server/api/* · flask-proxy

Flask — :4000 · recruiter APIs

Auth middlewareJWT pre-gate · route classes Routes /v2positions · billing · comms… Servicespositions_service · billing APSchedulerin-process jobs

FastAPI — :9000 · candidate APIs

Auth (shadow)candidate JWT Routers /v2sessions · tasks · E2B Thread poolAI pipelines

Shared layer — PYTHONPATH into both

DAO layershared/daos · typed models AI utilsJD parse · screening questions Metaemail · SMS · WhatsApp helpers

Other services

Notifications :5000outbox · realtime Task BuilderLLM pipeline worker TUS :1080video uploads

Data

SupabasePostgreSQL S3JD files · videos · resumes Redisrate-limit · cache

Jobs & External

Airflownormalization · expiry DAGs Discordteam alerts WhatsApp / MSG91candidate comms Dodo / GitHub / E2B

Flows — click one to open its player

🧭 Create a position — manual · template · JD ▶ OPEN PLAYER 📨 Invite a candidate NEXT 📝 Candidate takes assessment NEXT 🤖 Task builder generation NEXT

Each flow gets its own player. The green components above are the ones this flow touches.

Create a position — complete flow (manual · template · JD)

The full journey from code: 4 wizard steps (Title → Skills → Details → Review) with per-step draft saves, all three creation modes (manual / template / JD-upload with 3-stage AI parse), then publish: Next gates (NextAuth + billing) → Flask gates (JWT + payload + source-code) → DAO/Supabase → async tails. Hover a node with 🔍 for its detail card.

step 0 / 0
step decision gate failure exit async / fire-and-forget visited — grey lines: possible paths · green: taken · red: failed