Inspiration
Hiring teams waste time on unqualified applicants, while strong candidates get lost in generic forms. We wanted a faster first filter: structured resume understanding, a clear bar to reach the next stage, and a job-specific technical assessment instead of one-size-fits-all trivia.
What it does
Litmus helps recruiters move from application to signal quickly:
- Applicants upload a PDF resume; the backend extracts structured data (skills, experience, projects, etc.).
- Each application is scored against the actual job listing (skills + experience band fit).
- A pipeline screening score decides whether the candidate advances to a generated technical assessment (MCQs + a coding challenge tailored to the role).
- Candidates who pass receive an assessment link (and email when SendGrid is configured); the frontend loads the assessment from the backend by token.
How we built it
Backend: FastAPI, PostgreSQL (Alembic migrations), SQLAlchemy, S3 for resume storage. AI: Groq for resume parsing and assessment generation (structured JSON). Email: SendGrid for transactional mail with the assessment URL. Frontend: React + Vite + Tailwind, React Router; an /assessment/:token page fetches assessment content from the API.
Challenges we ran into
LLM + PDF reliability: noisy PDF text, JSON validation, and model/provider constraints; moving to the official Groq SDK and tighter validation helped. Database + migrations: occasional Alembic revision drift between environments; fixing alembic_version and running migrations cleanly was necessary. Email deliverability: SendGrid 403 issues until sender verification / API permissions were correct. Scoring semantics: separating resume–job fit, optional LinkedIn URL shape bonus, and GitHub analysis (informational vs gating) so the pipeline stays understandable.
Accomplishments that we're proud of
- An end-to-end flow from PDF → structured resume → job-aware scoring → gated assessment → shareable link.
- Assessments that are generated from the real job (stack + seniority), not generic LeetCode spam.
- A clear separation between “screening” and “assessment”, with room to grow into grading and a final combined score later.
What we learned
- Product clarity beats model cleverness: explicit scoring rules and thresholds are easier to trust than a black-box “score.”
- Infrastructure matters as much as features: migrations, secrets, and email setup are where demos quietly break.
- Structured outputs (JSON schemas + validation) are essential when LLMs are in the critical path. ## What's next for Litmus Richer candidate signals Look beyond resumes by analyzing GitHub activity (code quality, consistency, and relevant projects) and portfolios. Add optional live coding or timed tests to better measure real skills.
Scalability & reliability Make resume parsing more accurate, even with messy PDFs. Improve validation checks and make the system more reliable, especially for email delivery and secure assessment links.
Universal integrations (like platforms such as Canvas) Integrate with hiring tools and company systems so Litmus fits easily into existing workflows—just like Canvas works across universities. The goal is to make Litmus easy for any company to adopt without changing how they already hire.
Built With
- fastapi
- groq
- javascript
- postgresql
- python
- react
- s3
- sendgrid
- sqlalchemy
- tailwind
Log in or sign up for Devpost to join the conversation.