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 .docx reconstruction 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 standard detail string. 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 useMemo after an early loading-state return, which is invalid — but happened to never misbehave in development. It silently failed the production build outright (npm run build exited 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

Share this project:

Updates

Submission history