Skip to content

shr7q/OneStopJob

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

5 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

OneStopJob 🎯

The AI-powered career copilot that eliminates 80% of the manual work in every job application.

Next.js TypeScript Claude AI Firebase

What is OneStopJob?

OneStopJob is a full-stack AI platform that automates the most time-consuming parts of job applications. Paste your resume and a job posting URL β€” and in under 60 seconds you get a complete application package powered by Claude AI.


Features

🎯 Fit Score Engine

Analyzes your resume against the job description using Claude AI and returns a detailed match score (0–100%) with breakdown across:

  • Technical skills match
  • Experience alignment
  • Education match
  • Soft skills

Includes specific strengths, gaps to address, and a 2-sentence assessment summary.

πŸ“ Resume Optimizer

Claude rewrites your resume bullets specifically for the target role:

  • Stronger action verbs
  • Quantified impact where possible
  • ATS keyword alignment
  • Before/after diff view with reasons for each change
  • Updated fit score after optimization

πŸ’Œ Cover Letter Generator

Generates a tailored, human-sounding 3-paragraph cover letter for the specific role and company:

  • Fully editable in the browser
  • Export to PDF via print dialog
  • Export to .txt

πŸ“¬ Recruiter Outreach

Finds real email addresses at the target company using Hunter.io and generates personalized cold emails for each contact:

  • Cold intro email (max 100 words)
  • Follow-up email (max 75 words)
  • Email confidence score indicator

πŸ’¬ Application Q&A

When filling out job application forms, paste any question you encounter and get a personalized 50-100 word answer generated from your resume and GitHub profile:

  • Specific examples from real projects
  • Sounds human, not templated
  • One-click copy to paste directly into forms

πŸ™ GitHub Integration

Connect your GitHub profile to enrich Q&A answers and outreach emails with real project context:

  • Pulls top repositories
  • Extracts languages, topics, descriptions
  • Used automatically in all AI prompts

πŸ”— Job URL Scraper

Paste any job posting URL and the app automatically extracts the job title, company name, and full job description. Works with LinkedIn, Indeed, Greenhouse, Lever, Workday, and more.


Tech Stack

Layer Technology
Framework Next.js 14 (App Router)
Language TypeScript
Styling Tailwind CSS
AI Anthropic Claude Sonnet (claude-sonnet-4-5)
Database Firebase Firestore
Auth Firebase Auth
Server DB Firebase Admin SDK
Email Discovery Hunter.io API
GitHub Data GitHub REST API (no key needed)
Deployment Vercel

Project Structure

onestopjob/
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ api/
β”‚   β”‚   β”œβ”€β”€ analyze/route.ts      # Main pipeline: fit score + optimize + cover letter
β”‚   β”‚   β”œβ”€β”€ scrape/route.ts       # Job URL scraper using Claude
β”‚   β”‚   β”œβ”€β”€ github/route.ts       # GitHub profile fetcher
β”‚   β”‚   β”œβ”€β”€ outreach/route.ts     # Hunter.io + cold email generator
β”‚   β”‚   └── qa/route.ts           # Application Q&A answerer
β”‚   β”œβ”€β”€ analyze/
β”‚   β”‚   └── [contextId]/
β”‚   β”‚       └── page.tsx          # Results dashboard (5 tabs)
β”‚   β”œβ”€β”€ lib/
β”‚   β”‚   └── firebase.ts           # Firebase client init
β”‚   └── page.tsx                  # Homepage β€” main input form
β”œβ”€β”€ .env.local                    # API keys (not committed)
β”œβ”€β”€ next.config.ts
└── tsconfig.json

Getting Started

Prerequisites

  • Node.js 18+
  • npm or yarn
  • Anthropic API key
  • Firebase project
  • Hunter.io API key (free tier works)

Installation

git clone https://github.com/shr7q/OneStopJob.git
cd OneStopJob
npm install

Environment Variables

Create a .env.local file in the root directory:

# Anthropic
ANTHROPIC_API_KEY=your_anthropic_api_key

# Firebase Client (public)
NEXT_PUBLIC_FIREBASE_API_KEY=your_firebase_api_key
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=your_project.firebaseapp.com
NEXT_PUBLIC_FIREBASE_PROJECT_ID=your_project_id
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=your_project.firebasestorage.app
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=your_sender_id
NEXT_PUBLIC_FIREBASE_APP_ID=your_app_id

# Firebase Admin (server)
FIREBASE_CLIENT_EMAIL=firebase-adminsdk@your_project.iam.gserviceaccount.com
FIREBASE_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----"

# Hunter.io
HUNTER_API_KEY=your_hunter_api_key

Run Development Server

npm run dev

Open http://localhost:3000.


How It Works

Analysis Pipeline

When a user clicks Analyze, the following happens in sequence:

1. POST /api/analyze
   β”œβ”€β”€ analyzeFitScore()     β†’ Claude returns JSON with score + breakdown
   β”œβ”€β”€ optimizeResume()      β†’ Claude rewrites bullets, returns diff + new score
   β”œβ”€β”€ generateCoverLetter() β†’ Claude writes tailored cover letter
   └── Firestore.save()      β†’ Saves all results, returns contextId

2. Router.push(/analyze/[contextId])
   └── Client fetches from Firestore using contextId

AI Prompting Strategy

Each Claude call uses structured prompting with:

  • Strict JSON output constraints
  • safeParseJSON() utility that handles malformed responses
  • Fallback values if parsing fails completely
  • Token limits tuned per feature (300 for Q&A, 2048 for resume optimization)

Data Flow

Homepage β†’ /api/scrape (job URL) β†’ /api/github (optional)
        β†’ /api/analyze (main pipeline)
        β†’ Firestore (save)
        β†’ /analyze/[contextId] (results page)
        β†’ /api/outreach (on demand)
        β†’ /api/qa (on demand, per question)

API Routes

POST /api/analyze

Body: { resumeText, jobDescription, jobTitle, company, githubData }
Returns: { contextId }
Runs the full analysis pipeline and saves to Firestore.

POST /api/scrape

Body: { url }
Returns: { jobTitle, company, jobDescription }
Fetches and parses a job posting URL using Claude.

POST /api/github

Body: { githubUrl }
Returns: { username, summary, languages, topics, repoCount, repos }
Fetches public GitHub profile and repo data.

POST /api/outreach

Body: { company, jobTitle, resumeText }
Returns: { domain, contacts[] } β€” each contact includes cold + followup emails.

POST /api/qa

Body: { question, resumeText, jobDescription, jobTitle, company, githubData }
Returns: { question, answer } β€” 50-100 word personalized answer.


Firebase Setup

  1. Create a project at Firebase Console
  2. Enable Firestore in Native mode
  3. Enable Authentication with Google provider
  4. Generate a Service Account key for Admin SDK
  5. Add all keys to .env.local

Firestore collection structure:

jobContexts/
└── {contextId}/
    β”œβ”€β”€ jobTitle
    β”œβ”€β”€ company
    β”œβ”€β”€ jobDescription
    β”œβ”€β”€ resumeText
    β”œβ”€β”€ githubData
    β”œβ”€β”€ fitScore
    β”œβ”€β”€ optimizedResume
    β”œβ”€β”€ coverLetter
    β”œβ”€β”€ createdAt
    └── status

Deployment

Deploy to Vercel in one command:

npx vercel

Add all environment variables in the Vercel dashboard under Settings β†’ Environment Variables.


Built With ❀️ at GDSC Hackathon

Developer: Amaan Mohammed
University: University of Maryland β€” College Park
Program: M.S. Applied Machine Learning


License

MIT License β€” feel free to fork and build on top of this.


Roadmap

  • Application Tracker β€” Kanban board synced to Google Sheets
  • Interview Prep β€” AI-generated behavioral + technical questions
  • Chrome Extension β€” Apply from LinkedIn with one click
  • Google Calendar Integration β€” Auto-schedule follow-up reminders
  • Bulk Apply Mode β€” Apply to 10 jobs at once

About

One stop shop for all your job application needs

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors