Documentation
Everything you need to know about using PROTEUS — from signing in to understanding your analysis results.
PROTEUS is an AI-powered resume analyzer that compares your resume against a job description and returns actionable insights. It uses a five-agent pipeline with a dedicated model for every step across Groq and Google Gemini to deliver consistent, JD-aware results.
Unlike generic resume scanners, PROTEUS processes everything through a single pipeline with shared JD context. Each agent sees the same parsed job description, so your score, gap analysis, rewrites, and cover letter all reference the same requirements — no contradictions.
Visit proteus-phi.vercel.app and sign in with any of these methods:
On the Analyze page, you can provide a JD in three ways:
Provide your resume in one of two ways:
Click "Run Proteus pipeline". The analysis typically takes 30–120 seconds depending on the complexity of your inputs. You'll see real-time progress as each agent completes.
After the pipeline completes, you'll see these sections in order:
A percentage showing overall alignment. Breakdown by category (technical skills, experience, education, etc.) is shown in a chart. Scores above 75% are strong matches; 50–75% is moderate; below 50% indicates significant gaps.
Each requirement from the JD is classified as matched (you have it), partial (you have something related), or missing (not found in your resume). The similarity score shows how close your resume is to each requirement.
For weak bullets, PROTEUS suggests rewrites that incorporate JD keywords and quantify impact. Each suggestion includes the original text, the rewrite, a rationale, and an impact score showing how much it improves your match. Click Accept on the rewrites you want to keep, then export a tailored resume built from your original text with those rewrites applied.
A tailored cover letter written from the same parsed context as your analysis, always in a professional tone. Use the copy button to copy it, or download it as a PDF or Word document.
Go to the History page to see all your previous analyses. Click any run to view the full results again. You can search runs by JD text or source.
On the History detail page, use the Copy button to copy your cover letter, or Download to export it as a PDF or Word file. The filename follows the format FirstName_RoleName.pdf.
Accepted rewrites export as a tailored resume in Plain text, Word, or PDF. The file is named Firstname_Lastname_Resume and uses an ATS-safe layout: single column, uniform margins, system fonts, standard section names, and text-based output with no tables, columns, or images.
PROTEUS is a full-stack Next.js application deployed on Vercel. Here's how the pieces fit together:
| Layer | Technology | Role |
|---|---|---|
| Frontend | Next.js 16 + React + Tailwind CSS v4 | App router, streaming UI, dark theme |
| Auth | NextAuth.js v5 | Email+password, magic link, Google, GitHub OAuth |
| Database | Turso (libSQL) | Per-user data isolation, run history, session storage |
| AI Pipeline | Groq + Gemini | Five-agent pipeline — JD parsing through cover letter generation |
| Document Export | react-pdf, unpdf, docx | Analysis reports, cover letters, and tailored resume exports (PDF, DOCX, TXT) |
| Deployment | Vercel | Serverless functions, edge middleware, auto-deploy from GitHub |
| CI/CD | GitHub Actions | Lint, typecheck, Playwright E2E tests, model health checks |
PROTEUS uses two AI providers:
PROTEUS runs a five-agent pipeline. The JD is parsed first, and its output is shared with all downstream agents. Each step uses a dedicated model with fallback support.
| Step | Agent | Provider | What it does |
|---|---|---|---|
| 01 | JD Parser | Groq | Extracts role title, requirements, seniority level, and key skills from the job description |
| 02 | Resume Parser | Groq | Extracts skills, experience, education, and achievements from your resume |
| 03 | Gap Analyzer | Gemini | Embeds JD requirements and resume evidence with Gemini embeddings, then scores the semantic match (exact word matches still short-circuit) |
| 04 | Rewriter | Groq | Drafts JD-aware rewrites for weak resume bullets to better match requirements |
| 05 | Cover Letter | Gemini | Writes a tailored cover letter using the same JD context and resume data |
Before the JD reaches the parser, a pre-filter strips job board noise — "Apply Now" buttons, tracking pixels, navigation elements, and boilerplate legal text. This improves parser accuracy and reduces token usage. If the filter removes more than 70% of text (safety check), it passes the original through.
If the primary model for a step is unavailable or returns invalid JSON, PROTEUS automatically retries with the same model (up to 3 times with increasing temperature), then falls back to alternative models configured in models.json.
PROTEUS gives every pipeline step its own model across Groq and Google Gemini, with cross-provider fallback.
| Role | Model | Provider | Purpose |
|---|---|---|---|
| JD Parser | Loading... | Groq | Parse job descriptions into structured requirements |
| Resume Parser | Loading... | Groq | Extract structured data from resume text |
| Gap Analyzer | Loading... | Gemini | Score semantic match via Gemini embeddings + exact word matching |
| Rewriter | Loading... | Groq | Rewrite resume bullets to match JD requirements |
| Cover Letter | Loading... | Gemini | Generate tailored cover letters |
A health check script runs every 3 hours via GitHub Actions. It tests each role's model with that role's own provider and test prompt — Groq models via the Groq API, Gemini models via the Gemini API, and the embedding model via a live embedding request. If a model fails, the bot swaps it only within that role's own candidate pool in models.json, so one outage can't push every step onto the same model. Pinned roles are not auto-swapped. The health check results are committed to the repository.
Go to the Models page and click "Check Health"to run a live connectivity test against each pipeline step. You'll see latency and any error details.
Groq provides ultra-fast LLM inference on custom LPU (Language Processing Unit) silicon. PROTEUS uses Groq for the JD parser, resume parser, and rewrite suggester, each pinned to its own dedicated model.
Google Gemini handles two pipeline steps directly: it powers the cover letter generator (Gemini 2.5 Flash) and the gap analyzer's semantic matching (gemini-embedding-001). It also serves as a cross-provider fallback when Groq models are unavailable.
PROTEUS enforces daily usage limits to keep costs manageable and ensure fair access for all users.
| Limit | Count | Resets |
|---|---|---|
| Analyses per day | 10 | Midnight UTC |
You'll see a clear error message telling you how many analyses you've used and when the limit resets. The Analyze button will be disabled until the next day.
The pipeline has a 300-second limit. If your inputs are very long, try trimming them. Resume should be under 10,000 characters; JD under 18,000 characters.
This usually means the AI models returned invalid JSON. PROTEUS will automatically retry (up to 3 times) and fall back to alternative models. If it still fails, try simplifying your input text.
PROTEUS uses unpdf for PDF parsing. Some PDFs are image-based (scans) and contain no extractable text. If you have a scanned PDF, use an OCR tool first to convert it to text.
The score measures requirement coverage, not formatting quality. A low score usually means your resume doesn't contain the keywords the JD is looking for. Check the gap analysis section for specific missing requirements.
The cover letter is generated from the same parsed context as your analysis. If the JD parser extracted the wrong role title or requirements, the cover letter will reflect that. Ensure your JD text is complete and accurate.
Go to the Models page and click "Check Health". If a model is down, PROTEUS will automatically use fallback models. You can also check the GitHub Actions health check results in the repository.
PROTEUS exposes a REST API for programmatic access. All endpoints require authentication.
| Endpoint | Method | Description |
|---|---|---|
| /api/analyze | POST | Run the full pipeline (FormData: jd_text, resume_text, cover_letter_tone) |
| /api/analyze/stream | POST | Run pipeline with NDJSON streaming events (same params) |
| /api/history | GET | List your past analysis runs (?limit, ?offset) |
| /api/history/:id | GET | Get a single run's full results |
| /api/history/:id | DELETE | Delete a run |
| /api/models | GET | List configured models and their roles |
| /api/health | GET | Basic health check (returns ok) |
| /api/health/models | GET | Model connectivity test for all pipeline steps |
| /api/usage | GET | Your daily usage stats (used, limit, resetsAt) |
/api/analyze/stream endpoint returns newline-delimited JSON (NDJSON) for real-time streaming.Each LLM step makes an API call to its configured Groq or Gemini model. Gap analysis uses Gemini embeddings and falls back to local exact matching if the embedding API is unavailable. Complex resumes or JDs with many requirements take longer. Typical runs are 30–120 seconds. If it exceeds 300 seconds, it times out automatically.
The score reflects how many JD requirements your resume covers, using semantic embeddings plus exact and word-level matching. A low score means the JD keywords and requirements aren't well represented in your resume. Use the rewrite suggestions and gap analysis to improve.
No. PROTEUS requires authentication to track your usage and save your analysis history. You can sign in with email, Google, or GitHub.
Yes. Your resume and JD text are only used for the analysis. Results are stored in your account and only visible to you. We never share your data with third parties.
JDs: paste text, URLs (LinkedIn, Greenhouse, Lever, etc.), or .txt/.pdf/.docx files. Resumes: paste text or .pdf, .docx, or .txt files. PDFs are parsed with unpdf for reliable text extraction.
If you try to sign in with a different method than the one you used before, you'll see a friendly message suggesting which provider to use. For example, if you signed up with Google, use Google again — not GitHub.
You can delete individual analysis runs from the History page. For account deletion, contact support.