1. Executive summary
Profile Optimization Tool is an AI product that helps job seekers tailor their resume and LinkedIn profile to a specific role before they apply.
Users paste materials and a target job description. The system returns a visual match report: alignment score, keyword gaps, section checklist, and a prioritized action plan. No account required. Data is processed in-session only.
2
Tabs (Resume + LinkedIn)
<60s
Typical analysis
0
User data stored
Give every job seeker recruiter-grade profile feedback in under 60 seconds - grounded in their actual materials and the job they're targeting.
2. Problem statement
| Pain | Reality |
|---|---|
| One resume, many jobs | Same document reused; role-specific keywords missed |
| LinkedIn ≠ resume | Public profile is static; each application needs different emphasis |
| No feedback loop | Job boards don't explain why you weren't shortlisted |
| ATS opacity | Systems filter on structure and keywords before a human reads |
| Time cost | Tailoring per role takes 30-60 min; most people skip it |
Who feels this most
- Active job seekers applying to 5-20 roles/month
- Career switchers reframing experience for a new domain
- Senior candidates signaling scope and outcomes in the first scan
3. Vision & design principles
- Role-specific, not generic - Every suggestion ties to the pasted JD
- Scan-first UX - Score → gaps → quick wins → action plan
- Session-only privacy - No storage of resumes or profiles
- Evidence over hallucination - LLM guardrails forbid inventing facts
- Shippable prompts - CMS-editable without frontend redeploy
- Modular under one roof - One product; separate pipelines per input type
4. Product requirements (PRD)
Scope
| In scope (v1) | Out of scope (v1) |
|---|---|
| Resume ↔ JD match; LinkedIn ↔ JD alignment; visual reports; print; admin CMS; usage analytics | Auto-apply; PDF upload; user accounts; saved history; paid tiers; LinkedIn OAuth |
Key user stories
| ID | Story |
|---|---|
| R1 | Paste resume + JD → see match % before applying |
| R2 | Get keyword gaps and quantified bullet rewrites |
| L1 | Link LinkedIn + target jobs → alignment scan |
| L2 | Section audit: headline, about, experience, photo, banner |
| H1 | Switch Resume | LinkedIn in one hub |
| A1 | Admin edits prompts and loading tips in CMS |
Success metrics
| Metric | Target |
|---|---|
| Analyze completion rate | > 85% |
| Time to report (p50) | < 60 seconds |
| Tab engagement | Resume vs LinkedIn mix |
5. User experience & flows
Report structure (shared visual language)
| Section | Resume | |
|---|---|---|
| Hero score | Match % + per-JD chips | Alignment % + per-JD chips |
| Summary | Top gaps + quick wins | + cross-role themes |
| Keywords | Skill matrix table | Skill matrix table |
| Sections | Experience + ATS checklist | Basics + experience + skills |
| Actions | Prioritized recommendations | + role conflicts |
| Export | Print → Save as PDF | Print → Save as PDF |
6. High-level design (HLD)
Architecture pattern: Product monolith (one URL, one brand) + modular implementation (separate analyze pipelines, CMS configs, Cloud Functions).
| Layer | Technology |
|---|---|
| Frontend | Next.js 16, static export, Tailwind |
| Hosting | Firebase Hosting |
| API | Firebase Cloud Functions v2 (us-central1) |
| LLM | Gemini 3.1 Flash Lite (configurable via CMS) |
| CMS | Firestore site_content + *_config/active |
| Admin auth | Firebase Auth (email allowlist) |
7. Low-level design (LLD)
Scoring formula (deterministic)
alignment_score = round( 0.45 × keyword_overlap_score + 0.35 × checklist_pass_rate + 0.20 × section_audit_score ) Fit band: ≥75% → strong | 45-74% → moderate | <45% → needs_work
API endpoints
| Function | Method | Purpose |
|---|---|---|
| resumeOptimizerAnalyze | POST (SSE) | Resume + JD → Match report |
| roleAlignAnalyze | POST (SSE) | Profile + JD(s) → Alignment report |
| roleAlignFetchProfile | POST | LinkedIn URL → profile via Proxycurl |
| recordToolUsage | POST | Analytics events → Firestore |
Firestore CMS model
| Path | Purpose |
|---|---|
| site_content/profile_optimization_hub | Hub hero, tab labels |
| site_content/resume_optimizer_ui | Resume copy, loading tips |
| site_content/role_align_ui | LinkedIn copy, loading tips |
| resume_optimizer_config/active | Resume prompts, models, limits |
| role_align_config/active | LinkedIn prompts, models, limits |
| tool_usage_daily/{YYYY-MM-DD} | Usage counters |
LLM guardrails
- Never invent employers, titles, skills, or JD requirements
- If uncertain, omit the recommendation
- Output valid JSON only
- On parse failure: retry at temperature 0, then deterministic fallback
8. Outputs & reports
Each recommendation includes section, action (add/rewrite/emphasize/keep), impact, effort, issue, suggestion, JD evidence, and optional current snippet. Capped at 12 items, ranked by impact then effort.
9. Impact & outcomes
| Before | After |
|---|---|
| Guess if resume "fits" | See match % grounded in keywords + structure |
| Generic advice blogs | Role-specific fixes with JD evidence |
| 30+ min manual tailoring | < 60s first pass; edit from action plan |
| Resume and LinkedIn tuned separately | One hub for both assets |
Portfolio signals demonstrated
- 0→1 AI product thinking - problem, scoped MVP, shippable UX
- Full-stack delivery - UI, serverless API, CMS, analytics
- Responsible AI - guardrails, fallbacks, session-only privacy
- Operable AI - prompts editable without redeploy
- Systems design - modular services under unified product surface
10. Privacy, trust & safety
| Commitment | Implementation |
|---|---|
| No account required | Anonymous session |
| No storage of content | Analyze in memory only |
| Rate limiting | 10 analyses/hour/IP |
| Honest AI | Disclaimer on every report |
| Admin-only analytics | Firestore rules restrict reads |
11. Limitations & roadmap
| Item | Status |
|---|---|
| Resume scan E2E | check_circleLive |
| LinkedIn analyze (manual profile) | check_circleLive |
| LinkedIn auto-fetch (Proxycurl) | warningInfra pending |
| Usage analytics function | warningDeploy pending |
| PDF resume upload | v2 |
| Eval harness for prompts | v2 |