Sign inSign up

mohdmusheer/resumegap-ai

By mohdmusheer

•Updated 20 days ago

AI resume analyzer with skill-gap detection and recommendations.

Image
Machine learning & AI
Data science
Web servers
0

62

mohdmusheer/resumegap-ai repository overview

⁠ResumeGap AI

AI-powered resume analyzer that finds skill gaps and suggests resume improvements, resources, and projects.

Docker Image ASP.NET Core Groq AI Razorpay GitHub

āš ļø This project uses Razorpay Test Mode and does not process real payments.


⁠Live Demo

🌐 Live: LIVE_URL⁠ ←

🐳 Docker Hub: hub.docker.com/r/mohdmusheer/resumegap-ai⁠


⁠Features

FeatureTier
Match Score (0–100%)Free
Strong Skills DetectedFree
Missing Skills ListFree
ATS Keyword CoverageFree
Resume Section ChecklistFree
Job Fit ExplanationFree
3 Basic RecommendationsFree
Exact Resume Changes per SectionPremium (₹10)
Detailed Skill Gap AnalysisPremium
5 Project RecommendationsPremium
30-Day Learning RoadmapPremium
RAG Learning ResourcesPremium
Interview Preparation (15 questions)Premium

Graceful degradation: The app runs fully without Razorpay keys. When payment is clicked, it shows "Razorpay not connected" instead of crashing.


⁠Tech Stack

  • Framework: ASP.NET Core 10 MVC
  • AI Provider: Groq API — model openai/gpt-oss-20b
  • PDF Extraction: PdfPig 0.1.16
  • Payment: Razorpay .NET SDK 3.3.2 (Test Mode)
  • RAG: Keyword-based retrieval from local JSON knowledge base
  • State: ISession in-memory (no database)
  • Frontend: Bootstrap 5 + Bootstrap Icons + Vanilla JS

⁠Architecture

Browser
  │
  ā”œā”€ā”€ GET  /                      → Landing Page
  ā”œā”€ā”€ GET  /Analysis              → Upload Form
  ā”œā”€ā”€ POST /Analysis/Free         → PDF → Groq → Free Result → Session
  ā”œā”€ā”€ GET  /Analysis/Result       → Free Result + Paywall
  ā”œā”€ā”€ POST /Payment/CreateOrder   → Razorpay Orders API → orderId
  ā”œā”€ā”€ [Razorpay Checkout opens]
  ā”œā”€ā”€ POST /Payment/Verify        → HMAC-SHA256 → Premium Analysis → Session
  ā”œā”€ā”€ GET  /Analysis/Premium      → Premium Dashboard (session-gated)
  └── POST /Payment/Webhook       → Webhook Signature Validation

⁠Environment Variables

VariableRequiredDefaultDescription
GROQ__APIKEYāœ… Yes(empty)Groq API key from console.groq.com⁠
RAZORPAY__KEYID⬜ Optional(empty)Razorpay public key — rzp_test_...
RAZORPAY__SECRETKEY⬜ Optional(empty)Razorpay secret key
GROQ__MODEL⬜ Optionalopenai/gpt-oss-20bGroq model name
GROQ__BASEURL⬜ Optionalhttps://api.groq.com/openai/v1Groq API base URL
RAZORPAY__AMOUNTINPAISE⬜ Optional1000Payment amount (paise) — 1000 = ₹10
RAZORPAY__CURRENCY⬜ OptionalINRPayment currency
ASPNETCORE_ENVIRONMENT⬜ OptionalProductionDevelopment or Production

Note: ASP.NET Core uses __ (double underscore) to separate config sections in env vars.
e.g., Groq:ApiKey in JSON → GROQ__APIKEY as env var.


⁠🐳 Docker Deployment

⁠Option 1 — Pull from Docker Hub
docker pull YOUR_USERNAME/resumegap-ai:latest
⁠Option 2 — Build locally
git clone https://github.com/YOUR_USERNAME/ResumeGap-AI.git
cd "ResumeGap AI"
docker build -t resumegap-ai .

⁠Run with docker run (3 key env vars)
docker run -d \
  -p 8080:8080 \
  -e GROQ__APIKEY=gsk_your_groq_key \
  -e RAZORPAY__KEYID=rzp_test_your_key \
  -e RAZORPAY__SECRETKEY=your_secret \
  --name resumegap-ai \
  resumegap-ai:latest

Without Razorpay (app still works, payment shows "not connected"):

docker run -d \
  -p 8080:8080 \
  -e GROQ__APIKEY=gsk_your_groq_key \
  --name resumegap-ai \
  resumegap-ai:latest

All 7 environment variables (full control):

docker run -d \
  -p 8080:8080 \
  -e GROQ__APIKEY=gsk_your_groq_key \
  -e GROQ__MODEL=openai/gpt-oss-20b \
  -e GROQ__BASEURL=https://api.groq.com/openai/v1 \
  -e RAZORPAY__KEYID=rzp_test_your_key \
  -e RAZORPAY__SECRETKEY=your_secret \
  -e RAZORPAY__AMOUNTINPAISE=1000 \
  -e RAZORPAY__CURRENCY=INR \
  --name resumegap-ai \
  resumegap-ai:latest

Then open: http://localhost:8080⁠


Step 1 — Copy the env template:

cp .env.example .env

Step 2 — Edit .env with your keys:

GROQ__APIKEY=gsk_your_groq_key
RAZORPAY__KEYID=rzp_test_your_key
RAZORPAY__SECRETKEY=your_secret

Step 3 — Start:

docker compose up -d

Open: http://localhost:8080⁠

Stop:

docker compose down

⁠Build and push to Docker Hub
docker build -t YOUR_USERNAME/resumegap-ai:latest .
docker push YOUR_USERNAME/resumegap-ai:latest

⁠Running Locally (without Docker)

cd "e:\dotnet\ResumeGap AI"
dotnet run

Open: https://localhost:5001⁠ or http://localhost:5000⁠

Credentials are read from appsettings.json locally.


⁠Razorpay Test Mode

⁠Test Card
FieldValue
Card Number4111 1111 1111 1111
ExpiryAny future date
CVVAny 3 digits
OTP1234
⁠Payment Flow
1. Click "Unlock for ₹10"
2. Browser → POST /Payment/CreateOrder (amount from server, never browser)
3. Server → Razorpay Orders API → returns orderId
4. Browser opens Razorpay Checkout (only public KeyId used)
5. Complete test payment
6. Browser → POST /Payment/Verify {payment_id, order_id, signature}
7. Server: cross-checks orderId + HMAC-SHA256 verification
8. Only on success: runs premium analysis, sets session flag
9. Redirects to Premium Dashboard

⁠How Groq AI Works

  • Calls POST /chat/completions with response_format: { type: "json_object" }
  • System prompt instructs exact JSON schema — no extra text
  • Response deserialized into strongly typed C# DTOs
  • Markdown code fences automatically stripped
  • Fallback result returned on failure — never crashes

⁠How RAG Works

No vector database — lightweight keyword matching:

  1. Free analysis identifies missing skills
  2. IRagService searches Data/skills.json, Data/resources.json, Data/projects.json
  3. Skill aliases enable fuzzy matching (e.g., EF Core → Entity Framework Core)
  4. Matching resources injected server-side into Groq premium prompt
  5. AI explicitly instructed: "use these URLs, do not invent new ones"

Future: Replace with Qdrant/Chroma vector database for semantic search.


⁠Security Notes

ConcernImplementation
CSRF[AutoValidateAntiforgeryToken] global filter
Payment amountAlways from IOptions<RazorpayOptions> — never from browser
SignatureHMAC-SHA256 with CryptographicOperations.FixedTimeEquals
SecretKeyNever sent to browser — only public KeyId in JS
Resume storageMemoryStream only — never written to disk
API key loggingStructured logging — keys never appear in logs
Premium accessSession flag only set after server-side HMAC verification

⁠No Database

All state is stored in ISession (in-memory, cookie-based):

  • Free analysis result (JSON)
  • Premium analysis result (JSON)
  • Resume text (for premium reprocessing)
  • Payment verified flag
  • Razorpay order ID (for cross-check)

Sessions expire after 2 hours. Nothing persisted across server restarts.


⁠Project Structure

ResumeGap AI/
ā”œā”€ā”€ Controllers/           HomeController, AnalysisController, PaymentController
ā”œā”€ā”€ Models/                Analysis, Payment, Rag DTOs
ā”œā”€ā”€ Services/              AI, Resume, Analysis, Rag, Payment services
ā”œā”€ā”€ Options/               RazorpayOptions, GroqOptions
ā”œā”€ā”€ Data/                  skills.json, resources.json, projects.json
ā”œā”€ā”€ Views/                 Landing, Upload, Result, Premium
ā”œā”€ā”€ wwwroot/               site.css, analysis.js, payment.js
ā”œā”€ā”€ .env.example           ← copy to .env for docker-compose
ā”œā”€ā”€ docker-compose.yml
ā”œā”€ā”€ Dockerfile
└── README.md

⁠Future Improvements

  • Vector database (Qdrant) for semantic RAG
  • PostgreSQL for payment history persistence
  • User accounts + email report delivery
  • Cover letter generator
  • LinkedIn profile analyzer
  • Multi-language support

Tag summary

Content type

Image

Digest

sha256:137beadfe…

Size

100.2 MB

Last updated

20 days ago

docker pull mohdmusheer/resumegap-ai