How yashdew/assessor works
1. Overall shape
- Assessor is a two-tier resume analysis app: a Next.js frontend for recruiter/candidate interaction and a Flask backend for resume parsing/extraction.
- The system is largely stateless: files are uploaded, parsed, and returned as structured JSON rather than being persisted in a database.
2. Frontend boundary
- The frontend/ directory is the user interface layer.
- It owns upload forms, search, tabs, accordion views, modals, loaders, and applicant/job presentation components.
- utils/contexts.js and utils/store.js indicate centralized client-side state management for the UI.
3. Frontend data flow
- Users interact with components like FileUpload, FormUpload, JobDescription, and SearchBar.
- The UI then either calls backend endpoints or uses local dummy data to populate applicant/job views.
- Filtering and ranking behavior is pushed into browser-side helpers such as filterApplicants.js and filterJobs.js.
4. Backend parsing service
- The api/ directory is the analysis engine, built around Flask.
- run.py is the server entry point, and Procfile suggests the service is designed for PaaS deployment.
- The public API surface is centered on a resume upload endpoint described in the README as POST /api/v1/postResume.
5. Resume extraction subsystem
- api/resume/extraction/resumeextraction.py and utils.py contain the core parsing logic.
- This layer converts uploaded PDF resumes into structured fields such as personal details, skills, education, experience, projects, achievements, links, and hobbies.
- The README’s example response shows the backend returns one normalized JSON object per resume.
6. Text/ML dependency boundary
- requirements.txt and nltk.txt show the backend depends on Python NLP tooling, especially Pyresparser and NLTK.
- Architecturally, this means parsing is not just file upload handling; it includes text extraction, entity detection, and resume field inference.
7. Error and fallback handling
- api/resume/error/error.py provides a dedicated error path for failed parsing or invalid input.
- api/resume/dummy/dummyapi.py indicates a mock or placeholder backend response path, likely used during development or demo mode when real parsing is unavailable.
8. Mock/demo support in the frontend
- frontend/utils/dummyAPI.js and the Next.js pages/api/ routes (applicants.js, jobs.js, hello.js) suggest the frontend can operate with local mock data.
- This creates a second data source besides the Flask API, useful for UI development and demos without the parser running.
9. UI composition and display model
- Applicant.jsx, Accordion.jsx, Tabs.jsx, Modal.js, Loader.jsx, and Links.jsx are presentation components for showing parsed resume content and supporting recruiter workflows.
- The UI is structured to display a list of applicants/jobs and then drill into detailed extracted resume sections.
10. Sample data and test assets
- The Sample Resume/ folder contains real PDF examples and a text sample, which are likely used to validate extraction behavior.
- These files are part of the repo’s test/demo content, not runtime state.
11. Primary integration point
- The key contract between frontend and backend is the resume JSON schema returned by the Flask API.
- Everything downstream in the UI depends on that schema: applicant cards, skill matching, search/filtering, and detailed resume views.
12. What is not present
- There is no visible database layer, authentication system, or external message queue.
- That keeps the architecture simple: upload/request in, parsed JSON out, UI rendering and filtering on top.
Main entry points: index.js UI shell · routes.py API routes · FileUpload.jsx Upload forms · resumeextraction.py Extractor
Components 17
Frontend
Next.js UI for uploads, search, applicant/job browsing, and client-side state.
- UI shell · Next.js app entry and page composition.
frontend/pages/index.js - State layer · Shared UI context and store for browser-side app state.
frontend/utils/store.js - Upload forms · Resume and form upload components.
frontend/components/FileUpload.jsx - Search tools · Search and filtering controls for applicants and jobs.
frontend/components/SearchBar.jsx - Applicant views · Applicant cards and detailed resume section rendering.
frontend/components/Applicant.jsx - Job views · Job description and job listing display components.
frontend/components/JobDescription.js - Detail panels · Accordion, tabs, modal, loader, and links used to drill into parsed content.
frontend/components/Accordion.jsx - Mock data · Frontend fallback data and local API shims for development and demos.
frontend/utils/dummyAPI.js - API routes · Local Next.js API endpoints for demo data and health checks.
frontend/pages/api/applicants.js - Filters · Browser-side applicant and job filtering logic.
frontend/utils/filterApplicants.js
Backend
Flask resume parsing service and its extraction/error paths.
- Server entry · Flask application startup and deployment entry point.
api/run.py - API routes · Public resume upload endpoint and request dispatch.
api/resume/routes.py - Extractor · Core resume parsing and field extraction pipeline.
api/resume/extraction/resumeextraction.py - Parse utils · Supporting text extraction and normalization utilities.
api/resume/extraction/utils.py - Error path · Dedicated handling for invalid or failed parsing requests.
api/resume/error/error.py - Dummy API · Mock backend response path for development or demo mode.
api/resume/dummy/dummyapi.py
Samples
Demo resumes and sample text used for validation and showcasing extraction.
- Sample resumes · Example resumes and text used as demo inputs and extraction references.
Sample Resume/Sameer Kolpekwar Resume-1.pdf
Connections 21
- UI shell → Upload forms: renders · Main page composes upload workflow.
- UI shell → Search tools: renders · Main page exposes search and filtering controls.
- UI shell → Applicant views: renders · Main page shows applicant cards and detail views.
- UI shell → Job views: renders · Main page shows job listings and descriptions.
- UI shell → Detail panels: uses · Shared disclosure and display widgets support the UI.
- State layer → UI shell: feeds · Centralized browser state drives page composition.
- Search tools → Filters: applies · Search controls invoke filtering helpers.
- Applicant views → State layer: reads · Applicant views consume shared UI state.
- Job views → State layer: reads · Job views consume shared UI state.
- Upload forms → API routes: submits · Local upload flows can use Next.js API endpoints.
- Upload forms → API routes: submits · Primary upload flow sends resumes to Flask.
- Mock data → API routes: backs · Mock layer supports local API route data.
- API routes → UI shell: serves · Frontend API routes provide demo data to the UI.
- Server entry → API routes: starts · Flask entry point mounts the resume API.
- API routes → Extractor: invokes · Upload endpoint delegates parsing to the extraction pipeline.
- Extractor → Parse utils: uses · Parser relies on NLP and normalization helpers.
- API routes → Error path: fails to · Invalid inputs and parse failures follow the error path.
- API routes → Dummy API: can fallback · Development or demo mode may return mock responses.
- Extractor → Sample resumes: validated by · Sample PDFs provide representative input for extraction behavior.
- API routes → Applicant views: returns JSON · Backend resume schema feeds applicant rendering.
- API routes → Filters: returns JSON · Structured resume data supports client-side filtering and ranking.