Skip to content

Ayush2029/Resume-Insight-AI

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

111 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Resume-Insight-AI

Upload a resume PDF β†’ automatically extract GitHub profile β†’ analyze every repository with AI-powered summaries

Next.js React Tailwind CSS Groq License


Table of Contents


πŸš€ Live Demo

Overview

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.


Features

  • 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 .pdf extension
  • 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

Tech Stack

Frontend

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

Backend (API Routes)

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

AI and External APIs

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

Project Directory Structure

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

Getting Started

Prerequisites

  • 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

Installation

# 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 install

Environment Variables

Copy the example file and fill in your keys:

cp .env.local.example .env.local

Then 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.local is listed in .gitignore and will never be committed to Git.


Running Locally

npm run dev

Open 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)

Deployment

Render

  1. 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
  1. Go to render.com β†’ New + β†’ Web Service
  2. 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
  1. Under Environment Variables add:
Key Value
GROQ_API_KEY gsk_your_key_here
GITHUB_TOKEN ghp_your_token_here
NODE_ENV production
PORT 10000
  1. Click Create Web Service β€” live in ~5 minutes at https://resume-insight-ai.onrender.com

Every git push to main triggers an automatic redeploy.


Keeping the App Awake

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:

  1. Sign up at cron-job.org
  2. 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
  1. Click Create

cron-job.org pings your app every 5 minutes β€” Render never sleeps.


About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors