ElCorrecto is a resume-to-role analysis application. Upload a CV as a PDF, paste a job description, and receive an AI-powered comparison showing the match score, matched skills, missing skills, and suggested improvements.
The application uses a React and TypeScript frontend with Ant Design and Tailwind CSS. Its Azure Functions backend uploads the resume to Azure Blob Storage, extracts text with Azure Document Intelligence, and sends the extracted resume and job description to Azure Foundry for analysis.
api/ Azure Functions API and Azure service integrations
frontend/ React, TypeScript, Vite, Ant Design, and Tailwind UI
bruno/ Bruno collection for testing the API
flowchart LR
User[User] --> Frontend[React frontend\nAzure Static Web Apps]
Frontend -->|Axios multipart/form-data| Function[Azure Function\nAnalyzeResume]
Function -->|Store PDF| Blob[Azure Blob Storage]
Function -->|Extract text| Document[Azure Document Intelligence]
Function -->|Resume text + job description| Foundry[Azure AI Foundry\nGPT deployment]
Foundry -->|Structured JSON analysis| Function
Function -->|Analysis response| Frontend
The application is split into two deployable layers:
- Frontend: A Vite-powered React and TypeScript single-page application hosted on Azure Static Web Apps. It handles PDF selection, job-description input, loading and error states, and result presentation. The Azure Function URL is supplied through
VITE_AZURE_FUNCTION_URL. - API: A Node.js Azure Functions v4 HTTP API hosted in the
analyze-resumeFunction App. It validates the multipart request, uploads the PDF, extracts resume text, calls Azure AI Foundry, and returns typed JSON. - Storage and AI services: Blob Storage retains the uploaded PDF, Document Intelligence performs OCR and text extraction, and Azure AI Foundry evaluates the resume against the job description.
The browser communicates only with the HTTP Function endpoint. Azure credentials remain server-side in Function App environment variables; the frontend exposes only its public API URL.
- The user drops a PDF resume into the frontend.
- The user pastes the target job description.
- The frontend sends both fields as
multipart/form-datawith Axios. - The Azure Function stores the PDF in Blob Storage.
- Document Intelligence extracts the resume text.
- Azure Foundry compares the resume with the job description.
- The frontend displays the structured analysis.
Install dependencies in both workspaces:
npm install --prefix api
npm install --prefix frontendCopy the API settings template and add your Azure credentials:
cp api/local.settings.example.json api/local.settings.jsonThe frontend Function URL is configured in frontend/.env. Use frontend/.env.example as a template when setting up another environment. Never commit real secrets or local settings files.
Required Azure services:
- Azure Storage Account with a
resumesBlob container - Azure Document Intelligence resource
- Azure AI Foundry model deployment
- Azure Function App
Start the Azure Functions API from the project root:
npm startThe API runs at http://localhost:7071/api/analyze-resume.
Start the frontend in a second terminal:
npm run start:frontendOpen http://localhost:5173/ in your browser.
Build both applications:
npm run buildRun frontend checks:
npm --prefix frontend run lint
npm --prefix frontend run format:checkFormat the frontend with Prettier:
npm --prefix frontend run formatThe API expects a POST request with multipart/form-data:
resume: PDF filejobDescription: job description text
The deployed Function endpoint is:
https://analyze-resume-ebgeb5bkaubjchhu.westus3-01.azurewebsites.net/api/analyze-resume
A Bruno request is available in bruno. The API-specific setup notes are in api/README.md.