Resmatch: The Truth-First Resume Tailoring Agent

Inspiration

The modern job market is broken. Candidates resort to "spray and pray" tactics, applying to hundreds of jobs with generic resumes, while recruiters use rigid ATS (Applicant Tracking Systems) that reject qualified candidates for missing keywords. The rise of GenAI has only made it worse—candidates use LLMs to generate hallucinated, "perfect" resumes that fall apart in interviews.

We wanted to build something different. Not a resume generator, but a resume tailor. We were inspired by the idea of "Atomic Units of Experience"—verifiable, immutable facts about your career (a specific project, a metric, a skill). What if we could deconstruct a user's master resume into these atomic units and then chemically reassemble them to perfectly match a Job Description (JD), without inventing new facts?

That's Resmatch.

What it does

Resmatch is an autonomous agent that manages your "Master Resume."

  • Ingestion: You upload your existing resumes (PDF). Resmatch uses Google Gemini to parse them into "Atomic Units" (bullets, education, skills) and stores them in MongoDB Atlas.
  • Analysis: When you find a job you like, you paste the URL. Resmatch parses the JD to extract requirements, tech stack, and "nice-to-haves."
  • Tailoring: The agent scores your Atomic Units against the JD using Gemini. It selects the most relevant evidence, reorders them for impact, and generates a tailored resume.
  • Verification: Because we treat resume points as immutable "units," Resmatch guarantees zero hallucinations. It only uses correctly attributed experience you actually have.

How we built it

Resmatch is built on a "Ship It" philosophy, leveraging modern engineering practices from day one.

  • Backend: We built a robust FastAPI service in Python. We used Pydantic for strict data validation (no loose dictionaries!) and Mypy for strict type checking to catch bugs early.
  • Database: MongoDB Atlas was the obvious choice for its flexibility. We store Atomic Units as documents, allowing us to query by semantic tags and similarity.
  • AI Engine: Google Gemini (1.5 Flash & 2.0 Flash) is the brain. We use it for:
    • OCR & Text Extraction (turning PDFs into JSON).
    • Semantic Reasoning (scoring a bullet point against a JD).
    • We implemented robust rate limiting and exponential backoff to handle API quotas gracefully.
  • DevOps & Deployment:
    • The backend is containerized (Docker) and deployed on DigitalOcean App Platform for effortless scaling.
    • The frontend is a Next.js app deployed on Vercel.
    • We heavily utilized GitHub Actions for CI/CD. Every PR runs our test suite (40+ tests), lints code (Ruff/ESLint), and checks types. Merges to main auto-deploy to DigitalOcean.

Challenges we ran into

  • The "Hallucination" Trap: Early on, LLMs wanted to "rewrite" resumes to make them sound better, often inventing details. We had to architect the system to strictly separate content (Atomic Units) from presentation (Rendering), enforcing a "read-only" constraint on the core facts.
  • CORS & Deployment: Connecting a Vercel frontend to a DigitalOcean backend brought the usual CORS headaches. We learned to robustly handle environment variables and origin configurations to ensure secure cross-origin communication.
  • Rate Limits: Gemini's free tier is generous but strict. We hit 429 RESOURCE_EXHAUSTED frequently. We solved this by implementing a custom rate limiter with exponential backoff and request queuing.
  • Type Safety in Python: Enforcing strict Mypy checks on a fast-moving hackathon codebase was painful but worth it. It saved us from countless "AttributeError: NoneType" bugs at runtime.

Accomplishments that we're proud of

  • True CI/CD: We didn't just code; we engineered. We have a fully automated pipeline with formatting, linting, testing, and deployment. We maintained a "green build" policy throughout the hackathon.
  • Atomic Architecture: The concept of "Atomic Units" works! We can successfully remix a single master resume into infinite variations without losing truth.
  • Design for Social Impact: By helping candidates focus on their actual skills rather than keyword stuffing, we hope to level the playing field and mitigate bias in hiring.

What we learned

  • Structured Output is King: Prompting LLMs for JSON is powerful, but validating that JSON with Pydantic is critical for building reliable apps.
  • DevOps Pays Off: Setting up CI/CD in the first few hours felt like a distraction, but it saved us hours of debugging "it works on my machine" issues later.

What's next for Resmatch

  • Audio Summaries (ElevenLabs): We plan to use ElevenLabs to generate natural-sounding audio summaries of tailored resumes. This will make the tool more accessible to visually impaired users and offer a unique "elevator pitch" format for recruiters.
  • Verifiable History (Solana): We plan to hash each Atomic Unit and store it on the Solana blockchain. This would create a permanent, tamper-proof record of a candidate's career—a "Verified Resume" that recruiters can trust instantly.
  • Data Lake (Snowflake): As we aggregate more job market data, we want to use Snowflake to analyze trends: "What skills are spiking in demand this week?"
  • RenderCV Integration: Currently we output structured JSON. Next, we will integrate RenderCV to generate beautifully Typeset (LaTeX) PDFs automatically.

Built With

  • Languages: Python, TypeScript
  • Frameworks: FastAPI, Next.js, Tailwind CSS
  • AI: Google Gemini API (1.5/2.0 Flash)
  • Database: MongoDB Atlas
  • Cloud: DigitalOcean App Platform, Vercel
  • DevOps: GitHub Actions, Docker, Ruff, Mypy

Try it out

Track-Specific Details

Education, Accessibility & Social Impact

Resmatch democratizes the job search. Career coaching and professional resume writing are expensive services ($200+). Resmatch provides that same high-quality, tailored advice for free (or cheap), helping students, career switchers, and underprivileged candidates compete fairly. Future Accessibility Plans: We are designing an integration with ElevenLabs to allow users to "listen" to their resume summaries, making the tool significantly more accessible to those with visual impairments.

"Ship It" — Best Use of GitHub

We treated this hackathon like a real engineering sprint.

  • Repository: Public restailor repo.
  • Project Management: We used GitHub Issues to track everything from bugs (#18 Duplicate upload error) to features (#10 User Auth).
  • Collaboration: We worked on feature branches (gemini-experimentation, parsing, CI/CD) and used Pull Requests (e.g., PR #34) with code reviews.
  • CI/CD: We set up GitHub Actions (ci.yml, cd.yml) to automatically lint, test, and deploy our code. We even used Dependabot to keep dependencies secure.
  • Quality: We enforced identifying security issues using Gitleaks and ensured code quality with Ruff and Mypy.

Best Use of DigitalOcean

Our backend is fully hosted on DigitalOcean App Platform. We connected it directly to our GitHub repo for automated deployments. We used App Platform's environment variable management for secrets and verified the health of our app using the built-in monitoring tools.

Best Use of MongoDB Atlas

We used MongoDB Atlas to store the complex, hierarchical data of "Atomic Units." A SQL schema would have been too rigid for the varied shapes of resume data (projects vs. education vs. skills). Mongo's flexibility allowed us to iterate on our data model instantly without running painful migrations.

Best Use of Gemini API

Gemini is the engine of Resmatch. We use gemini-1.5-flash for high-speed text extraction and gemini-2.0-flash for complex reasoning tasks like scoring resume bullets against job descriptions. We implemented advanced error handling and rate limiting to work within the API's constraints while delivering a reliable user experience.

Built With

Share this project:

Updates