Inspiration
Job hunting for remote roles is frustrating. Legitimate opportunities are often buried under low-quality reposts, misleading listings, and jobs that are barely related to a person’s experience. At the same time, most job boards rely heavily on titles instead of understanding what is actually in a resume.
I wanted to build something that reads a resume more deeply and finds remote jobs that genuinely match a person’s background, skills, and experience.
What it does
MatchCV is a resume-based remote job matching platform. Users sign in with Gmail and upload a PDF or DOCX resume. From there, MatchCV:
Extracts work experience, projects, education, and skills using Claude Haiku, then stores them in structured form. Builds a signal profile that includes experience level, likely roles, skills, domains, years of experience, and search keywords. Searches remote jobs in real time from sources such as RemoteOK, Remotive, Arbeitnow, WeWorkRemotely, and Himalayas. Evaluates jobs through multiple filtering stages including embeddings, legitimacy checks, quality scoring, and resume-to-job fit analysis. Shows only jobs that pass minimum thresholds for quality, legitimacy, and fit.
The result is a smaller set of opportunities that are more relevant instead of overwhelming users with hundreds of listings.
How I built it
Backend: FastAPI with asyncio pipelines to process scraping, filtering, and verification in the background while results stream in. LLM layer: Claude Haiku with tool-use to generate structured outputs for resume parsing, signal extraction, and fit evaluation. Embeddings: sentence-transformers/all-MiniLM-L6-v2 for inexpensive local similarity matching before expensive AI checks. Database: Supabase PostgreSQL with tables for profiles, resumes, jobs, and user interactions. Resume parsing: pymupdf for PDFs and python-docx for Word documents. Authentication: Supabase Gmail OAuth. Frontend: Vanilla HTML, CSS, and JavaScript with a carousel interface and polling for newly discovered jobs. ## Challenges I ran into Managing asynchronous events in the scraping pipeline caused jobs to silently stop moving through later stages despite healthy logs. Job sources returned inconsistent schemas, making it difficult to reliably extract company names and application links. Strict keyword filtering sometimes returned very few jobs, so I built a fallback system that gradually broadens searches. Differences between expected database schemas and live tables caused failures during inserts. AI calls needed to be used carefully to control cost, which required placing cheaper filters before expensive fit evaluations. Accomplishments that I’m proud of Building a streaming pipeline that surfaces jobs while discovery is still running instead of waiting for a full batch. Creating multiple filtering layers so users see fewer low-quality or suspicious listings. Adapting searches to each uploaded resume rather than showing generic recommendations. Designing a simple experience that restores previous jobs and continues discovery automatically. Building the frontend without frameworks while keeping the experience responsive. What I learned Structured tool-use is more reliable than parsing free-form AI responses. Asynchronous systems require clear coordination and separation between events. Ordering expensive operations later in the pipeline significantly reduces cost. Resume parsing is harder than processing job postings because resumes vary widely in format and writing style. Reliability features such as deduplication, defensive mapping, and locking mechanisms matter as much as AI components.
What’s next for MatchCV
Improve matching accuracy using user interactions and application outcomes. Expand beyond remote roles to include internships and local opportunities. Add resume feedback features to help users strengthen their applications. Improve search coverage by integrating additional trusted job sources. Refine legitimacy and quality checks to reduce misleading postings even further.
Built With
- anthropicapi
- fastapi
- himalayas
- postegressql
- python
- remoteok
- remotive
- sentence-transformers
- supabase
- weworkremotely
Log in or sign up for Devpost to join the conversation.