Inspiration
Job searching is broken in a very specific way: everyone tells you to "tailor your resume" and "practice for interviews," but almost nobody tells you how — and the tools that do exist are either generic (a resume template) or expensive (a real career coach, often $100+/hour). Meanwhile, most resumes today are filtered by an ATS before a human ever reads them, and most candidates have no idea what that system is actually looking for.
CareerCoach AI started from a simple question: what if the keyword-matching an ATS does, the feedback a mock interviewer gives, and the coaching a career counselor provides could all run on the same AI models that are now good enough to do it well — and be free to try, with no login wall before you can even see if it's useful?
What it does
CareerCoach AI is an end-to-end AI job-search companion with three core tools plus a dashboard that ties them together:
- Resume Tailoring — upload a resume and a job description, get a match score, missing/extra
keywords, content and formatting suggestions, a readability score, and an industry-specific
keyword library (tech, finance, healthcare, marketing, sales) that catches domain terms generic
NLP misses. You can download a tailored
.docxreconstruction and see an inline diff of exactly what's being suggested. - Mock Interviews — practice with role-specific and difficulty-tiered (junior/mid/senior) question banks, record a spoken answer, and get instant feedback on pacing, filler words, clarity, and content relevance. A "full session" mode groups multiple questions into one combined report, adaptive follow-up questions dig deeper into what you just said, and you can generate a shareable read-only link to send an attempt to a mentor.
- Interview Prep Chatbot — a LLaMA-3-powered (via Groq) assistant for interview questions, with a "paste a job posting" mode that tailors every answer to that specific role, a reverse mode where the chatbot interviews you, and voice input via the Web Speech API.
Wrapping all three: a gamified dashboard (streaks, achievements, an activity heatmap, an opt-in anonymized leaderboard), a full AI Career Tools hub (salary negotiation scripts, LinkedIn optimization, ATS compatibility checking, cover letters, and more), and complete account controls (GDPR-style data export, account deletion, session management, notification preferences).
How we built it
Backend: Django + Django REST Framework, JWT auth via simplejwt, SQLite for storage,
drf-spectacular for OpenAPI docs. AI is powered by Groq (LLaMA 3) for all natural-language
generation, with optional Azure Cognitive Services (Language, Vision, Speech) and a BERT-based
analyzer as pluggable, non-required enhancements.
Frontend: React 19 + TypeScript, Material-UI, React Router, Context API for auth/notification/ theme state, Axios with a JWT-refresh interceptor.
Deployment: Vercel (frontend) and Render (backend, free tier), with GitHub Actions running the full test suite and a dependency audit on every push.
The single most important design decision was that every AI integration has a graceful fallback. If no Groq key is configured, the chatbot falls back to a curated library of interview- prep answers. If Azure isn't configured, resume analysis falls back to keyword/embedding logic. This means the entire app can be cloned, installed, and clicked through end-to-end with zero API keys — which mattered a lot for both development speed and for anyone evaluating the project without wanting to hand over credentials first.
Challenges we ran into
- Free-tier cold starts. Render's free backend tier sleeps after inactivity and can take 30–60 seconds to wake up. The first version of our login flow treated any failed request the same way — including a network-level failure from a sleeping backend — which produced a confusing generic "Authentication failed" with no explanation. We rebuilt it to distinguish "the server said no" from "the server didn't answer yet," and added staged retries (8s, then 20s) with a visible "waking up" status instead of a dead end.
- A subtle auth bug that looked like a mystery. Our JWT refresh interceptor logged the user out on any refresh failure — including a plain network timeout, not just an actually-invalid refresh token. During a cold start, that meant a perfectly valid session could get silently wiped while stale page content stayed on screen, with no indication anything had happened. Fixed by only treating an actual server response as proof the session is invalid.
- An error-object display bug. Our custom DRF exception handler wraps framework-raised errors
(401/403/404/429) in a structured
{message, status_code}object for API consumers, alongside the standarddetailstring. Several frontend spots read that field expecting a plain string, and quietly rendered[object Object]to the user — or, in one case, would have crashed the page outright the next time someone got rate-limited. Fixed with one shared error-parsing utility used everywhere the pattern existed. - A Rules-of-Hooks violation that only broke production. Two dashboard components called
useMemoafter an early loading-statereturn, which is invalid — but happened to never misbehave in development. It silently failed the production build outright (npm run buildexited non-zero) because Create React App's ESLint config treats that rule as an error. Caught it during a full build verification pass, not by symptom. - Keeping demo mode honest. Deciding how far to go with a "tailored resume download" without silently rewriting someone's actual resume content wrong. We landed on reconstructing the original content untouched, with a clearly labeled suggestions section appended — rather than an AI rewriting the resume itself and risking a wrong or hallucinated edit.
Accomplishments we're proud of
- A fully functional, free-to-clone demo where nothing is gated behind requiring your own API keys — every AI feature works out of the box in fallback mode, and immediately gets better with real credentials.
- A gamification system built on real per-account activity data (not local storage), so streaks and achievements follow you across devices and never leak between users sharing a browser.
- Genuine end-to-end verification discipline: every feature in this project was tested against a live backend, not just unit-tested in isolation, including deliberately reproducing race conditions (killing the backend mid-request) to confirm error-handling actually works under real failure conditions.
What we learned
How much of "AI app" polish is actually about the boring parts — retry logic, error message
formatting, graceful degradation when a paid service isn't configured — rather than the AI calls
themselves. Also a lot about JWT refresh token edge cases, DRF's exception handling pipeline, and
just how differently a React app can behave in a production build versus npm start.
What's next
OAuth login (Google/LinkedIn), two-factor authentication, migrating from SQLite to Postgres for production durability, an async task queue for longer-running AI operations, and a public status page — all currently blocked only on provisioning the infrastructure behind them, not on code.
Built With
- axios
- azure-cognitive-services
- bert
- django
- django-rest-framework
- github-actions
- groq
- gunicorn
- huggingface-transformers
- jwt
- llama-3
- material-ui
- openapi
- python
- pytorch
- react
- react-router
- render
- scikit-learn
- sqlite
- typescript
- vercel
Log in or sign up for Devpost to join the conversation.