An autonomous Career Intelligence & Job Application Agent that helps users apply to relevant jobs in a truthful, ATS-friendly, and professional manner.
Nova Act and Nova Lite are the key technologies powering this project:
- Nova Lite: AI text processing engine for job analysis, matching, and resume tailoring (Phases 1-3)
- Nova Act: Browser automation engine for automated job application submission (Phase 4)
Nova JobReady is a secure, local job-automation system that operates in four sequential phases:
- Job Capture & Structured Storage (Nova Lite) - Extract and store job posting data
- Match Evaluation & Decision (Nova Lite) - Compute job-candidate match scores
- Resume Tailoring (Nova Lite) - Create ATS-optimized resume versions (only if decision = "APPLY")
- Application Automation (Nova Act) - Automate job applications using browser automation
- Automatic Job Scraping: Extracts job content from Indeed, LinkedIn, Glassdoor, and other job boards
- Structured Data Extraction: Automatically extracts:
- Job title, company name, location
- Required and preferred skills
- Job responsibilities
- Seniority level
- Salary range (if available)
- ATS keywords
- Manual Input Support: Paste job text directly if URL scraping fails
- Job ID Generation: Unique identifiers for each captured job
- Intelligent Matching: Weighted scoring system evaluating:
- Required skills match (40% weight)
- Responsibilities alignment (30% weight)
- Preferred skills (10% weight)
- Seniority fit (10% weight)
- Keyword density (10% weight)
- Automated Decision Making:
- ≥ 75% →
APPLY(Strong match) - 50-74% →
MANUAL_REVIEW(Moderate match) - < 50% →
SKIP(Low match)
- ≥ 75% →
- Detailed Reasoning: 3-7 sentence explanation of match decision
- Score Breakdown: Individual scores for each evaluation category
- ATS-Optimized Resumes: Creates job-specific resume versions
- Truthful Content: Never invents, exaggerates, or adds skills/experience
- Keyword Integration: Naturally incorporates job-specific keywords
- Experience Reordering: Moves most relevant experience higher
- Professional Summary: Rewritten to mirror job title + top keywords
- Tailored Components: Summary and experience highlights for each job
- Browser Automation: Navigates to application pages
- Form Filling: Intelligently fills all form fields
- File Uploads: Handles resume file uploads
- Field Handling: Manages dropdowns, checkboxes, optional fields
- Form Validation: Validates form completeness before submission
- Status Tracking: Updates application status automatically
- Resume Management: Upload, view, and manage multiple resumes
- Active Resume Selection: Set one resume as active for applications
- Candidate Profile: Manage professional profile information
- Application Tracking: Track all job applications with status
- Match History: View all match evaluations and decisions
- Dashboard Analytics: View statistics and insights
- User Management: Admin panel for user management
- Pagination: Efficient pagination for all list views
- Backend: Django 6.0, Django REST Framework
- Frontend: React (Vite)
- Database: MySQL (configurable to SQLite for development)
- AI Services:
- Nova Lite (AWS Bedrock) - Text generation and analysis
- Nova Act (AWS Bedrock) - Browser automation and form handling
- Web Scraping: BeautifulSoup4, Requests
- Authentication: Token-based authentication
-
Phase 1 - Job Capture:
- Look for structured job data extraction
- Check for extracted skills, responsibilities, seniority level
- Verify job posting analysis in database
- API Endpoint:
POST /api/job-postings/capture/ - Service Method:
NovaLiteService.analyze_job_posting()
-
Phase 2 - Match Evaluation:
- Check for match scores (0-100)
- Look for decision:
APPLY,MANUAL_REVIEW, orSKIP - Review detailed reasoning and score breakdown
- API Endpoint:
POST /api/job-postings/{uuid}/evaluate/ - Service Method:
NovaLiteService.evaluate_match() - Database Model:
MatchEvaluation
-
Phase 3 - Resume Tailoring:
- Check for tailored resume summary
- Review updated experience highlights
- Verify job-specific keyword integration
- API Endpoint:
POST /api/job-postings/{uuid}/tailor-resume/ - Service Method:
NovaLiteService.tailor_resume() - Database Model:
ResumeVersion
- Phase 4 - Application Automation:
- Check application status:
AppliedorApplication Failed - Verify
application_dateis set - Review
application_urlfor submission confirmation - API Endpoint:
POST /api/job-postings/{uuid}/apply/ - Service Method:
NovaActService.automate_application() - Database Model:
JobApplication
- Check application status:
# File: api/job_services.py
from api.job_services import NovaLiteService
nova_service = NovaLiteService()
# Phase 1
job_data = nova_service.analyze_job_posting(job_text, job_url)
# Phase 2
evaluation = nova_service.evaluate_match(job_data, candidate_data, resume_data)
# Phase 3
tailored = nova_service.tailor_resume(job_data, resume_data)# File: api/job_services.py
from api.job_services import NovaActService
nova_act = NovaActService()
# Phase 4
result = nova_act.automate_application(job_url, candidate_data, resume_file_path)- JobPosting: Created in Phase 1, contains structured job data
- MatchEvaluation: Created in Phase 2, contains scores and decision
- ResumeVersion: Created in Phase 3, contains tailored content
- JobApplication: Updated in Phase 4, contains application status and date
"Initializing Nova Lite Bedrock client in region: us-east-1"
"Nova Lite Bedrock client initialized successfully"
"Using Nova Lite to analyze job posting"
"Using Nova Lite to evaluate match"
"Using Nova Lite to tailor resume"
"Initializing Nova Act Bedrock client in region: us-east-1"
"Nova Act Bedrock client initialized successfully"
"Using Nova Act to automate application"
"Application submitted successfully via Nova Act"
- Phase 1: "Capture Job Posting" button → Shows structured job data
- Phase 2: "Evaluate Match" button → Shows match score and decision
- Phase 3: "Tailor Resume" button → Shows tailored resume content
- Phase 4: "Apply to Job" button → Shows application status
- Application status badge:
Applied(green) orApplication Failed(red) - Application date displayed in job applications list
- Python 3.10+
- Node.js 18+
- MySQL 8.0+ (or SQLite for development)
- AWS Account with Bedrock access (for production)
- Create virtual environment:
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate- Install dependencies:
pip install -r requirements.txt- Configure environment:
cp .env.sample .env
# Edit .env with your database and AWS credentials- Run migrations:
python manage.py migrate- Create superuser:
python manage.py createsuperuser- Start development server:
python manage.py runserver- Install dependencies:
cd frontend
npm install- Start development server:
npm run devRun the test command to verify AWS credentials:
python manage.py test_aws_credentialsGET /api/job-postings/- List all job postingsPOST /api/job-postings/capture/- Capture new job posting (Phase 1 - Nova Lite)GET /api/job-postings/{uuid}/- Get job posting detailsPOST /api/job-postings/{uuid}/evaluate/- Evaluate match (Phase 2 - Nova Lite)POST /api/job-postings/{uuid}/tailor-resume/- Tailor resume (Phase 3 - Nova Lite)POST /api/job-postings/{uuid}/apply/- Apply to job (Phase 4 - Nova Act)
GET /api/match-evaluations/- List all match evaluationsGET /api/match-evaluations/{uuid}/- Get match evaluation details
GET /api/job-applications/- List all job applicationsGET /api/job-applications/{uuid}/- Get job application details
GET /api/resumes/- List all resumesPOST /api/resumes/- Upload new resumeGET /api/resumes/{uuid}/- Get resume detailsPATCH /api/resumes/{uuid}/- Update resume (e.g., set active)
GET /api/candidate-profiles/- Get candidate profilePOST /api/candidate-profiles/- Create candidate profilePATCH /api/candidate-profiles/{uuid}/- Update candidate profile
See LICENSE file for details.