TalentSync

AI resume builder and ATS optimizer for job seekers. Tailored resumes, outreach, and interview prep from one profile.

Project overview

TalentSync is a job-seeker product: resume analysis, ATS scoring, tailored rewrites, outreach drafts, interview practice, and a career coach. Live at talentsync.tashif.codes

It is not TalentSync-HR. That repo is recruiter screening. Do not document bulk employer shortlists or an HR talent pool as this app.

The upstream README still talks about dual-sided hiring and clones harleenkaur28/AI-Resume-Parser. Ignore that. This tree is tashifkhan/TalentSync.

Repository layout#

Compose local services: db, kafka, backend (APP_ROLE=api), worker (APP_ROLE=worker), frontend. Admin and observability are Compose profiles, not the seeker app.

Building blocks#

AI pipelines#

LangChain / LangGraph behind FastAPI routes. Workers run the slow ones. Streaming chat and interview SSE stay on the API process.

Seeker tools that enqueue:

  • Resume analysis, improvement, enrichment, tailored resume, Unslop (deslopify)
  • ATS evaluation and tips
  • Cover letter, cold mail, LinkedIn
  • Interview session create / answer eval / summary
  • Hiring-assistant answers (practice copy, not an employer inbox)

Resume analysis#

PDF/text through PyMuPDF, then structured extraction, then LLM feedback. The BFF returns 202; the client waits on the job, then finalize persists the row.

ATS optimization#

Keyword overlap, compatibility score, and concrete edits against a job description. Same Kafka assessment lane as tips.

Career coach#

Primary LLM role for long answers. Small LLM role (SMALL_LLM_*, default gemini-3.1-flash-lite) for conversation titles only.

How it fits together#

Design that actually shows up in the repo:

  • One backend image, APP_ROLE selects api / worker / migrate
  • Prisma owns public; Alembic owns talentsync_backend
  • BYOK keys are encrypted on the job row, never in Kafka
  • Google OAuth on FastAPI. NextAuth is gone

ATS optimization system#

Career path prediction engine#

analysis/ still has a scikit-learn pickle (best_model.pkl, TF-IDF) from the older classifier. Live product paths go through LangChain services, not that notebook, unless you explicitly run analysis/app.py.

What this product does not do#

No employer talent marketplace. No ZIP-of-hundreds recruiter ingest as the main story. /dashboard/recruiter in this frontend is leftover navigation, not TalentSync-HR.

Dependencies#

  • Frontend: Next.js, React Query, Radix, Prisma, Razorpay
  • Backend: FastAPI, LangChain, LangGraph, Motor, PyMuPDF, FastStream
  • Auth: backend Google OAuth, httpOnly JWTs, Next rewrite /api/v1/:path*

Performance#

API stays thin: validate, meter, enqueue. Workers scale by lane in prod (worker_resume, worker_assessment, worker_comms). Enrichments can run for minutes; Kafka max.poll.interval is 30 minutes.

Troubleshooting#

ATS scores look wrong. Fix keywords and format, re-run. The job must SUCCEEDED first.

Analysis 503. Kafka disabled or no worker. Set KAFKA_ENABLED=true and start APP_ROLE=worker.

Login fails. Google redirect URI and JWT_SECRET / BACKEND_JWT_SECRET must match. This is not a NextAuth misconfig.

Compose name clash. Prod file uses talentsync_* containers so TalentSync-HR (talentsync_hr_*) can share a Docker host.