AI resume analyzer with skill-gap detection and recommendations.
62
AI-powered resume analyzer that finds skill gaps and suggests resume improvements, resources, and projects.
ā ļø This project uses Razorpay Test Mode and does not process real payments.
š Live: LIVE_URLā ā
š³ Docker Hub: hub.docker.com/r/mohdmusheer/resumegap-aiā
| Feature | Tier |
|---|---|
| Match Score (0ā100%) | Free |
| Strong Skills Detected | Free |
| Missing Skills List | Free |
| ATS Keyword Coverage | Free |
| Resume Section Checklist | Free |
| Job Fit Explanation | Free |
| 3 Basic Recommendations | Free |
| Exact Resume Changes per Section | Premium (ā¹10) |
| Detailed Skill Gap Analysis | Premium |
| 5 Project Recommendations | Premium |
| 30-Day Learning Roadmap | Premium |
| RAG Learning Resources | Premium |
| 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.
openai/gpt-oss-20bISession in-memory (no database)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
| Variable | Required | Default | Description |
|---|---|---|---|
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 | ⬠Optional | openai/gpt-oss-20b | Groq model name |
GROQ__BASEURL | ⬠Optional | https://api.groq.com/openai/v1 | Groq API base URL |
RAZORPAY__AMOUNTINPAISE | ⬠Optional | 1000 | Payment amount (paise) ā 1000 = ā¹10 |
RAZORPAY__CURRENCY | ⬠Optional | INR | Payment currency |
ASPNETCORE_ENVIRONMENT | ⬠Optional | Production | Development or Production |
Note: ASP.NET Core uses
__(double underscore) to separate config sections in env vars.
e.g.,Groq:ApiKeyin JSON āGROQ__APIKEYas env var.
docker pull YOUR_USERNAME/resumegap-ai:latest
git clone https://github.com/YOUR_USERNAME/ResumeGap-AI.git
cd "ResumeGap AI"
docker build -t resumegap-ai .
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
docker build -t YOUR_USERNAME/resumegap-ai:latest .
docker push YOUR_USERNAME/resumegap-ai:latest
cd "e:\dotnet\ResumeGap AI"
dotnet run
Open: https://localhost:5001ā or http://localhost:5000ā
Credentials are read from appsettings.json locally.
| Field | Value |
|---|---|
| Card Number | 4111 1111 1111 1111 |
| Expiry | Any future date |
| CVV | Any 3 digits |
| OTP | 1234 |
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
POST /chat/completions with response_format: { type: "json_object" }No vector database ā lightweight keyword matching:
IRagService searches Data/skills.json, Data/resources.json, Data/projects.jsonEF Core ā Entity Framework Core)Future: Replace with Qdrant/Chroma vector database for semantic search.
| Concern | Implementation |
|---|---|
| CSRF | [AutoValidateAntiforgeryToken] global filter |
| Payment amount | Always from IOptions<RazorpayOptions> ā never from browser |
| Signature | HMAC-SHA256 with CryptographicOperations.FixedTimeEquals |
| SecretKey | Never sent to browser ā only public KeyId in JS |
| Resume storage | MemoryStream only ā never written to disk |
| API key logging | Structured logging ā keys never appear in logs |
| Premium access | Session flag only set after server-side HMAC verification |
All state is stored in ISession (in-memory, cookie-based):
Sessions expire after 2 hours. Nothing persisted across server restarts.
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
Content type
Image
Digest
sha256:137beadfeā¦
Size
100.2 MB
Last updated
20 days ago
docker pull mohdmusheer/resumegap-ai