Upload a resume PDF β automatically extract GitHub profile β analyze every repository with AI-powered summaries
Resume-Insight-AI is a full-stack Next.js web application that bridges the gap between a candidate's resume and their actual code. It accepts a PDF resume as input, automatically finds the GitHub profile URL embedded in it β whether as a clickable hyperlink or plain text β fetches the complete GitHub profile along with all public repositories, and presents the data in a clean responsive interface with the option to generate an AI-powered project summary for any repository.
The AI summarization is powered by Groq's free tier API running the Llama 3.3 70B model β no credit card required, no paid subscription needed.
- PDF Resume Parsing β Extracts GitHub links from both hyperlink annotations and plain visible text in the PDF
- Magic-bytes validation β Rejects non-PDF files even if renamed with a
.pdfextension - File size limit β Enforces a 5 MB cap on uploads server-side and client-side
- Automatic GitHub Profile Detection β Identifies the first GitHub profile URL and fetches complete user data
- Repository Listing β Displays all public repositories sorted by your commit count, with name, description, language, and last commit date
- Deep AI Project Summaries β One-click AI summary for each repository using Groq (Llama 3.3 70B)
- Uses README.md as the primary source when present and substantial (>120 chars)
- Falls back to deep source-file analysis β reads up to 10 key files (manifest, entry points, source) when no README exists
- Two purpose-built system prompts tuned for README analysis vs code analysis
- Generates a fresh summary every time you click β no caching
- Shows source badge (README vs Source code) on every summary
- 3-Step Progress Indicator β Visual feedback during PDF upload, link extraction, and profile fetching
- Skeleton Loading States β Shimmer placeholders while data loads
- Toast Notifications β Centered non-intrusive popup when no GitHub links are found in the PDF
- Fully Responsive β Works on 320px mobile through wide desktop with fluid typography and adaptive layouts
- Security hardened β Input sanitisation, request timeouts, strict MIME validation, HTTP security headers
| Technology | Version | Purpose |
|---|---|---|
| Next.js | 15 | React framework, file-based routing, API routes |
| React | 18 | UI library |
| Framer Motion | 11 | Animations and page transitions |
| Tailwind CSS | 3 | Utility-first styling |
| React Icons | 5 | Icon library (Feather icons) |
| Fira Code | β | Monospace font for step indicators and code |
| DM Sans | β | Body font for all UI text |
| Technology | Version | Purpose |
|---|---|---|
| pdfjs-dist | 5 | PDF parsing β annotation and text extraction |
| formidable | 3 | Multipart file upload handling with size limits |
| marked | 13 | Markdown to HTML conversion |
| isomorphic-dompurify | 2 | HTML sanitization to prevent XSS |
| Service | Purpose | Cost |
|---|---|---|
| Groq API (Llama 3.3 70B) | Repository summarization | Free β 30 req/min, 1000 req/day |
| GitHub REST API v3 | Profile and repository data | Free β 5000 req/hr with token |
resume-insight-ai/
β
βββ .env.local β your secret keys (never committed)
βββ .env.local.example β template for .env.local
βββ .gitignore
βββ next.config.js β security headers, webpack config
βββ tailwind.config.js
βββ postcss.config.js
βββ package.json
β
βββ pages/
β βββ _app.js β fonts, viewport meta, global styles
β βββ index.js β main analyzer page
β βββ api/
β βββ extract.js β POST: PDF β GitHub links
β βββ github-profile.js β POST: username β profile + repos
β βββ summarize.js β POST: repo β AI summary
β
βββ lib/
β βββ pdf/
β β βββ extractLinks.js β pdfjs annotation + text extraction
β β βββ parseUrl.js β browser-safe GitHub URL parser
β βββ github/
β β βββ client.js β GitHub REST API client (sanitised, timeout)
β β βββ profile.js β builds full profile payload (batched)
β βββ ai/
β βββ summarize.js β Groq summarization (README + deep file analysis)
β
βββ components/
β βββ layout/
β β βββ PageShell.jsx β responsive page wrapper
β βββ ui/
β β βββ Spinner.jsx
β β βββ ErrorBanner.jsx β inline errors + centered toast
β β βββ SkeletonBlock.jsx
β β βββ Tag.jsx
β β βββ StatPill.jsx
β βββ resume/
β β βββ DropZone.jsx β drag-and-drop + touch-friendly upload
β β βββ StepIndicator.jsx β 3-step animated progress
β βββ profile/
β β βββ ProfileHeader.jsx β responsive avatar, bio, stat pills
β β βββ ProfileSkeleton.jsx
β βββ repo/
β βββ RepoCard.jsx β individual repo card
β βββ RepoList.jsx β repo grid with skeleton loading
β βββ AISummarizeButton.jsx β Groq summary button with all error states
β
βββ hooks/
β βββ useResumeAnalyzer.js β state machine: idleβextractβfetchβready
β
βββ styles/
βββ globals.css β design tokens, responsive CSS variables
- Node.js v18 or higher β nodejs.org
- npm v9 or higher (included with Node.js)
- A GitHub account (for the personal access token)
- A Groq account (for the AI summarization key)
node -v # must be v18.0.0 or higher
npm -v # must be 9.0.0 or higher# Clone the repository
git clone https://github.com/your-username/resume-insight-ai.git
# Navigate into the project folder
cd resume-insight-ai
# Install all dependencies
npm installCopy the example file and fill in your keys:
cp .env.local.example .env.localThen open .env.local and add:
# GROQ API KEY (required β for AI Project Summary feature)
# Get your free key at: https://console.groq.com
# Steps: Sign up β API Keys β Create API Key (starts with gsk_)
GROQ_API_KEY=gsk_your_groq_api_key_here
# GITHUB TOKEN (optional but strongly recommended)
# Without token: 60 requests/hour. With token: 5000 requests/hour.
# Get it at: https://github.com/settings/tokens
# Steps: Generate new token (classic) β no scopes needed β copy (starts with ghp_)
GITHUB_TOKEN=ghp_your_github_token_here
.env.localis listed in.gitignoreand will never be committed to Git.
npm run devOpen http://localhost:3000 in your browser.
| Command | Description |
|---|---|
npm run dev |
Start development server with hot reload |
npm run build |
Build optimized production bundle |
npm run start |
Start production server (run build first) |
- Push your code to GitHub:
git init
git add .
git commit -m "initial commit"
git remote add origin https://github.com/YOUR_USERNAME/resume-insight-ai.git
git branch -M main
git push -u origin main- Go to render.com β New + β Web Service
- Connect your GitHub repository and configure:
| Field | Value |
|---|---|
| Name | resume-insight-ai |
| Region | Singapore (closest to India) |
| Branch | main |
| Runtime | Node |
| Build Command | npm install && npm run build |
| Start Command | npm run start |
| Instance Type | Free |
- Under Environment Variables add:
| Key | Value |
|---|---|
GROQ_API_KEY |
gsk_your_key_here |
GITHUB_TOKEN |
ghp_your_token_here |
NODE_ENV |
production |
PORT |
10000 |
- Click Create Web Service β live in ~5 minutes at
https://resume-insight-ai.onrender.com
Every
git pushtomaintriggers an automatic redeploy.
Render's free tier sleeps after 15 minutes of inactivity (first load after idle takes 30β60 seconds). Use cron-job.org to keep it awake for free:
- Sign up at cron-job.org
- Click Create cronjob with these settings:
| Field | Value |
|---|---|
| Title | Resume Insight AI |
| URL | https://resume-insight-ai.onrender.com |
| Execution schedule | Every 5 minutes (*/5 * * * *) |
| Notify on failure | β On |
| Notify on success after failure | β On |
- Click Create
cron-job.org pings your app every 5 minutes β Render never sleeps.