Ever wished recruiters could just ask your resume questions instead of skimming through bullet points? That's exactly what ChatCV does.
ChatCV lets you stand out by turning your resume into a conversation. Instead of hoping recruiters notice the right details, you give them a tool to dig deeper when something catches their interest.
Job Seekers & Professionals
- Stand out from the pile of identical PDFs
- Let interested recruiters explore your background in depth
- Show off your technical skills by adpating (and enhancing) this solution for your CV
- Provide a memorable, interactive experience
- Be available to answer questions 24/7
Recruiters & Hiring Managers
- When a candidate catches your interest, dig deeper instantly
- Get specific answers instead of guessing from bullet points
- AI-powered job fit analysis for promising candidates
- Coming soon: A tool to compare multiple candidate's CVs for a certain job description
Chat with Resume: Natural conversation about any aspect of a candidate's background Smart Job Matching: Upload a job description, get detailed fit analysis Optional Security: Deploy publicly or lock it down with invite codes Built-in Safety: Keeps conversations professional and on-topic Docker Ready: Deploy anywhere in minutes
What you need:
- Docker & Docker Compose
- OpenAI API key (local Ollama support coming soon)
git clone https://github.com/FinnBehrendt/ChatCV.git
cd ChatCV
cp .env.example .env
Edit the .env
file:
# Required
OPENAI_API_KEY="your_openai_api_key_here"
# Optional extras (leave empty if you don't need them)
LANGSMITH_API_KEY="your_langsmith_key" # For advanced analytics
LANGSMITH_TRACING=false
GUARDRAILS_TOKEN="your_guardrails_token" # Extra safety (slower build)
Pro tip: The app works fine without the optional stuff. Only add them if you actually need the features.
- Swap out
data/CV_Demo.pdf
with your actual resume - Edit
data/about_me.md
with extra info not in your CV (or delete it) - Edit
config/base.yml
if you want to change file paths or naming - replace
/static/default-avatar.png
with your profile picture
docker compose up --build
Alternatively, without Docker:
# install requirements
pip install -r requirements.txt
# optionally, install guardrails - you can skip these steps!
guardrails configure # interactive! You will need a token!
guardrails hub install hub://guardrails/toxic_language
guardrails hub install hub://guardrails/reading_time
guardrails hub install hub://guardrails/profanity_free
# run the app
uvicorn main:app
Head to http://localhost:8000
and start chatting with your resume!
The Docker container runs anywhere. Deploy it to your favorite cloud platform - AWS, Azure, GCP, whatever works for you.
Coming soon: Step-by-step Azure deployment guide (because that's what I use).
Option 1: Keep it public
INVITE_CODES={}
Perfect for personal websites or internal demos.
Option 2: Lock it down
INVITE_CODES={
"RECRUITER1": {"company": "TechCorp", "recruiter": "Jane Smith", "active": true},
"DEMO2024": {"company": "Demo Access", "recruiter": "Public Demo", "active": true}
}
Give specific people access with custom invite codes.
The Stack:
- FastAPI backend for the API
- Retrieval Augmented Generation (RAG):
- ChromaDB as Database
- OpenAI API (or Ollama locally) as LLM
- LangChain connecting the dots
- Guardrails to keep things professional and save
The Flow:
- Your resume gets chopped up and embedded into a vector database
- When someone asks a question, we find the most relevant parts
- The LLM writes a natural response using that context (and chat history)
- Safety filters make sure everything stays professional
Simple, but it works really well.
Got ideas? Found bugs? Want to add features?
Just open an issue or send a PR. I'm always looking to make this better.
Before you code: Run pre-commit install
so the CI doesn't yell at you.
- LangChain for LLM magic
- ChromaDB for vector search
- Guardrails AI for keeping it safe
Like this project? Give it a ⭐ - it helps more people find it!