A comprehensive AI-powered Blazor application with browser extensions that automatically extract job listings from multiple job sites, analyze them with AI, and help you land your dream job faster.
JobTracker now includes a complete AI-powered job search assistant! Leverage OpenAI GPT or Anthropic Claude to:
- 📊 Auto-analyze job descriptions - Extract key requirements, responsibilities, and skills
- 📝 Generate cover letters - Personalized suggestions based on your profile
- 🎯 Identify skill gaps - See what you have vs what's needed (with match %)
- 💼 Prep for interviews - Get likely technical and behavioral questions
- 💰 Negotiate salaries - Market rates, strategies, and scripts
- 📄 Optimize resumes - ATS keywords and tailored summaries
- 🔮 Predict success - AI estimates your application success probability
- 🔍 Find similar jobs - Discover related opportunities automatically
Choose your AI provider: OpenAI (GPT-3.5, GPT-4) or Anthropic Claude (3.5 Sonnet, Opus, etc.)
| Site | Extension Folder | Console Prefix | Status |
|---|---|---|---|
BrowserExtensions/LinkedInExtension/ |
LJE |
Full support | |
| Indeed | BrowserExtensions/IndeedExtension/ |
IND |
Full support |
| S1Jobs | BrowserExtensions/S1JobsExtension/ |
S1J |
Full support |
| Welcome to the Jungle | BrowserExtensions/WTTJExtension/ |
WTTJ |
Full support |
| EnergyJobSearch | BrowserExtensions/EnergyJobSearchExtension/ |
EJS |
Full support |
| Any site (Universal) | BrowserExtensions/GenericExtension/ |
GEN |
Fallback support |
Tip: Use the site-specific extensions (LinkedIn, Indeed, etc.) for the best experience on those sites — they have tailored extraction, auto-fetch, and crawl features. The Universal Extractor is a fallback for any other job site (Glassdoor, Monster, ZipRecruiter, etc.). If both are installed on the same site, the site-specific extension takes priority automatically.
- Dual Provider Support - Choose between OpenAI or Anthropic Claude
- Job Analysis - AI extracts summary, responsibilities, required skills, qualifications, and nice-to-have skills
- Cover Letter Generation - Personalized opening, selling points, and closing based on your profile
- Skill Gap Analysis - Visual comparison of your skills vs job requirements with match percentage
- Similar Jobs - AI-powered recommendations based on skills, company, job type, and more
- Interview Preparation - Generate 5 technical questions, 5 behavioral questions, and questions to ask them
- Salary Negotiation - Market rate estimates, negotiation strategies, value points, and scripts
- Resume Optimization - ATS keywords, skills to highlight, and tailored professional summary
- Success Prediction - AI predicts application success probability with strength/risk factors
- One-Click Analysis - "Analyze with AI" button on every job card
- Persistent Results - All AI insights saved to job records for instant access
- Model Selection - Choose from GPT-3.5 Turbo, GPT-4, GPT-4o, Claude 3.5 Sonnet, Claude 3 Opus, etc.
- Cost Optimization - Switch models based on your budget and quality needs
- Multi-site Support - Extract jobs from LinkedIn, Indeed, S1Jobs, Welcome to the Jungle, EnergyJobSearch, and any site via the Universal Extractor
- Automatic Extraction - Jobs are extracted automatically as you browse
- Description Capture - Full job descriptions are captured when you view individual jobs
- In-Page Description Fetch - Automatically clicks through job cards on list/collection pages to capture all descriptions
- Auto-Fetch Descriptions - Automatically navigate through jobs to capture missing descriptions
- Duplicate Detection - Prevents duplicate entries based on URL normalization
- Source Tracking - Each job is tagged with its source site
- Dashboard - View all jobs with statistics (total, interested, applied, etc.)
- Tabbed Interface - Browse, Possible, Applied, Pipeline (Kanban), Archived, and Unsuitable tabs
- Pinned Jobs - Pin important jobs to the top of any tab
- Filtering - Filter by search, location, job type, remote, salary, interest, source, skills, and date
- Search Highlighting - Search terms highlighted in job title, company, location, and description preview
- Notes & Cover Letter Search - Search finds matches in job titles, descriptions, companies, notes, and cover letters
- Title-Only Search - Search specifically in job titles
- Salary Range Filter - Parse salary strings into min/max values and filter by target salary
- Skill Filter - Filter by skill with autocomplete from existing job skills
- Saved Filter Presets - Save and load named filter configurations
- Group By - Group job cards by company, title, location, job type, date posted/added, source, or salary band with collapsible accordion sections and expand/collapse all controls
- Persisted View State - Filter, sort, group, and tab settings are automatically saved and restored between sessions
- Bulk Actions - Mark all filtered jobs as Possible or Unsuitable with count feedback
- Change Tracking - Track job listing changes over time with visual indicators:
- "Updated" Badge - Orange badge appears when job details change (description, salary, location, etc.)
- Change Timeline - View detailed change history with "View Changes" button
- Auto-Tracking - Changes are automatically detected when descriptions are fetched or updated
- Change Impact Levels - Major (title, company, salary), Moderate (location, description), and Minor changes
- First Description Tracking - Tracks when a job description is first added after initial import
- Interest Status - Mark jobs as Interested, Not Interested, or Not Rated
- Suitability Status - Mark jobs as Possible, Unsuitable, or Not Checked
- ML-Based Job Scoring - Automatic 0-100 scoring based on your preferences and past behavior (similar to JobSync)
- Skills match weighting
- Salary range matching
- Remote preference
- Location preferences
- Keyword matching (must-have and avoid)
- Company preferences
- Learning from your past application patterns
- Configurable weights for each factor
- Visual score badges on job cards (color-coded by score)
- Progress indicator during recalculation
- Skips unsuitable jobs during recalculation
- Score-Based Rules - Create rules using ML scores (e.g., "Auto-mark jobs with score ≥80 as Interested")
- Applied Tracking - Track which jobs you've applied to
- Application Stages - Track progress: Applied → No Reply → Pending → Tech Test → Interview → Offer (or Ghosted/Rejected)
- Stage History - View timeline of stage changes for each application
- Pipeline Kanban Board - Drag-and-drop kanban board view of all applied jobs grouped by stage
- Stale Application Alerts - Visual badges on pipeline cards when applications have had no stage change beyond a configurable threshold
- Follow-up Reminders - Set per-job follow-up dates with due indicators and a count badge on the Pipeline tab
- Cover Letter Templates - Reusable templates with
{Company},{Title},{Location}placeholders that auto-fill when applied to a job - Auto-Archive - Automatically archive rejected/ghosted jobs after a configurable number of days
- Auto-Delete - Automatically delete old jobs after configurable days:
- Delete unsuitable jobs after X days (default: 90)
- Delete rejected jobs after X days (default: 60)
- Delete ghosted jobs after X days (default: 60)
- Set to 0 to disable auto-deletion for that type
- Conversion Funnel - Visual funnel showing progression from Applied through to Offer/Rejected
- Pipeline Health - Average days to reply, average days to interview, stale count, follow-ups due
- Success & Ghosted Rates - Percentage breakdowns of application outcomes
- Weekly Activity Charts - Jobs added and applications submitted over the last 12 weeks
- Auto-classification Rules - Automatically set interest, suitability, and remote status based on configurable rules
- Rule Management - Create and manage rules from the Rules page (
/rules) - Score-Based Rules - Use ML suitability scores in rules with numeric comparisons (>, >=, <, <=, =)
- Example: Auto-mark jobs with score ≥80 as "Interested"
- Example: Auto-reject jobs with score <30 as "Unsuitable"
- Combine score conditions with other criteria (AND/OR logic)
- Compound Conditions - Create complex rules with multiple conditions
- Priority System - Rules execute in priority order (higher priority first)
- Rule Statistics - Track how many times each rule has triggered
- Automatic Scoring - Jobs are automatically scored 0-100 based on your preferences and behavior
- Multi-Factor Analysis:
- Skills Match (25 points) - Matches against your preferred skills
- Salary Match (20 points) - Scores based on your desired salary range
- Remote Preference (15 points) - Preference for remote vs on-site
- Location Match (10 points) - Matches against preferred locations
- Keyword Matching (15 points) - Must-have and avoid keywords
- Company Preferences (10 points) - Preferred and avoided companies
- Behavioral Learning (15 points) - Learns from jobs you marked as interesting or applied to
- Configurable Weights - Adjust the importance of each factor (0-1 scale)
- Visual Score Badges - Color-coded badges on job cards:
- 🟢 Green (80-100): Excellent match
- 🔵 Blue (60-79): Good match
- 🟡 Yellow (40-59): Fair match
- ⚫ Grey (20-39): Poor match
- 🔴 Red (0-19): Very poor match
- Smart Recalculation - Recalculate all scores with live progress indicator
- Automatically skips unsuitable jobs
- Shows progress bar and percentage
- Runs in background without blocking UI
- Min Score Filter - Hide jobs below a certain score threshold
- Integration with Rules - Use scores in automation rules for smart job triage
- Server-side Crawling - Crawl job sites directly from the server without browser extensions
- Supported Crawl Sites - LinkedIn, S1Jobs, Welcome to the Jungle, and EnergyJobSearch
- Scheduled Crawling - Automatic crawling via Hangfire (SQL Server mode) or LocalBackgroundService
- Ghosted Detection - Automatically marks old applications with no reply as Ghosted (configurable threshold)
- No Reply Detection - Automatically marks applied jobs as No Reply after configurable days
- Availability Checks - Background checks for job listing availability
- Auto-Archive Job - Background job to archive rejected/ghosted jobs after configurable days
- Job Cleanup Job - Automatically deletes old unsuitable, rejected, and ghosted jobs based on configurable thresholds
- Email Notification Job - Daily digest email for follow-ups due and stale applications
- IMAP Retry Logic - Email fetch with exponential backoff (3 attempts with 2s, 4s delays)
- Data Corruption Protection - Automatic backup of corrupted JSON data files before returning defaults
- API Input Validation - Length limits on URLs (2000), locations (500), salaries (500), and descriptions (100K)
- Configurable Thresholds - No Reply, Ghosted, Stale, and Auto-Delete days are all configurable per-user in Settings
- User Accounts - Login with cookie-based authentication and API key support
- Two-Factor Authentication - Optional 2FA setup and verification
- Password Recovery - Forgot password and reset password flows
- Dark Mode - Toggle dark/light theme with one click; persists across sessions via localStorage
- Keyword Highlighting - Configurable keyword highlighting in job descriptions
- Search Highlighting - Matching search terms highlighted in yellow across job cards
- ARIA Labels - Proper accessibility labels on all filter controls, tabs, and interactive elements for screen reader support
- Email Notifications - Daily digest emails for follow-ups due and stale applications
- Per-User SMTP Configuration - Each user configures their own SMTP settings in Settings page
- No Configuration File Needed - SMTP settings are managed entirely through the UI (no appsettings.json required)
- Password Reset Emails - Uses recipient's SMTP settings for password reset notifications
- WhatsApp Sharing - Share job details directly to WhatsApp
- CSV Export - Export applied jobs to CSV from the Jobs page
- History Export - Export full or filtered history to CSV
- Direct Links - Open original job postings with one click
- Custom crawl URL list (
/crawl-pages) - Add additional search/listing URLs to be crawled alongside your main site URLs. - Per-page delay - Set how many seconds to wait after each crawl page (default: 90s) to be polite to job sites.
- Optional
{n}substitution - Define a start/end/increment range to expand a single URL template into multiple pages.- Example:
...&page={n}with Start=1, End=5, Increment=1.
- Example:
- Run in Browser - Opens each enabled crawl page in a new tab and automatically closes it after its delay (requires allowing popups for
https://localhost:7046). - Reorder pages - Use up/down arrows to control crawl order.
Pre-built self-contained executables are available in the Portable/ folder. No .NET SDK or runtime install is needed.
| Files | Platform |
|---|---|
Portable/JobTracker-x86.zip.001, .002 |
Windows 32-bit |
Portable/JobTracker-x64.zip.001, .002 |
Windows 64-bit |
The archives are split into 80MB parts for easier distribution. You need 7-Zip to extract them.
- Download all
.zip.001,.zip.002, etc. parts for your platform into the same folder - Right-click the
.zip.001file and choose 7-Zip > Extract Here (or run7z x JobTracker-x86.zip.001) - Edit
appsettings.jsonif needed (defaults work out of the box) - Run
JobTracker.exe - Open
https://localhost:7046in your browser - Accept the self-signed certificate warning on first visit
The app creates a Data/ folder alongside the executable for storing jobs, settings, and history. To update, just replace the files (keep your Data/ folder and appsettings.json).
Note: These zips are rebuilt automatically on every Release build. If you're building from source, run
dotnet build -c Releaseand the split zips appear inPortable/.
- .NET 10 SDK or later (only needed if building from source)
- Google Chrome or Microsoft Edge browser
- Accounts on job sites you want to use
# Navigate to the project directory
cd JobTracker
# Restore dependencies
dotnet restore
# Run the application
dotnet runThe app will start at https://localhost:7046.
Each job site has its own extension. Install the ones you need:
- Open Chrome/Edge and navigate to
chrome://extensions/oredge://extensions/ - Enable Developer mode (toggle in the top-right corner)
- Click Load unpacked
- Select the extension folder:
BrowserExtensions/LinkedInExtension/- LinkedInBrowserExtensions/IndeedExtension/- IndeedBrowserExtensions/S1JobsExtension/- S1JobsBrowserExtensions/WTTJExtension/- Welcome to the JungleBrowserExtensions/EnergyJobSearchExtension/- EnergyJobSearchBrowserExtensions/GenericExtension/- Universal Extractor (any job site)
- Repeat for each extension you want to install
Universal Extractor: Opt-in per site — on each new domain a small prompt asks you to activate. Once activated, it uses three extraction strategies: schema.org JSON-LD metadata, DOM job link detection, and heuristic fallback. It automatically defers to site-specific extensions when both are installed.
- Start the Blazor app - Make sure it's running (
dotnet run) - Navigate to a job site - Go to LinkedIn Jobs, Indeed, S1Jobs, WTTJ, EnergyJobSearch, or any job site (with the Universal Extractor)
- Browse jobs - The extension automatically extracts job listings as you scroll
- View job details - Click on individual jobs to capture full descriptions
- Check the indicator - A colored pill in the bottom-right shows extraction status
Each extension can automatically navigate through jobs to capture missing descriptions:
-
Via Console - Open DevTools (F12) and type:
// LinkedIn LJE.autoFetch(3) // 3 second delay between jobs // Indeed IND.autoFetch(3) // S1Jobs S1J.autoFetch(3) // WTTJ WTTJ.autoFetch(3) // EnergyJobSearch EJS.autoFetch(3)
Note: The Universal Extractor (
GEN) does not support auto-fetch as it has no site-specific card selectors. Use the Extract button in the popup orGEN.extract()in the console instead. -
Via Extension Popup - Click the extension icon and press "Auto-Fetch Descriptions"
-
Stop Auto-Fetch - Click the Stop button in the UI or run:
LJE.stopAutoFetch() // or IND, S1J, WTTJ, EJS
Each extension exposes commands in the browser console:
| Command | Description |
|---|---|
XXX.extract() |
Manually trigger job extraction |
XXX.debug() |
Show debug info and page structure |
XXX.test() |
Test connection to the Blazor app |
XXX.status() |
Show extraction statistics |
XXX.getDesc() |
Get current job's description |
XXX.updateDesc() |
Send current description to server |
XXX.fetchMissing() |
Check for jobs needing descriptions |
XXX.autoFetch(n) |
Start auto-fetch with n second delay |
XXX.stopAutoFetch() |
Stop auto-fetching |
XXX.autoFetchStatus() |
Check auto-fetch progress |
XXX.help() |
Show all available commands |
Replace XXX with: LJE (LinkedIn), IND (Indeed), S1J (S1Jobs), WTTJ (Welcome to the Jungle), EJS (EnergyJobSearch), or GEN (Universal Extractor)
Universal Extractor (
GEN) commands:GEN.extract(),GEN.debug(),GEN.test(),GEN.status(), andGEN.help()are available. Auto-fetch commands are not supported by the Universal Extractor.
Navigate to https://localhost:7046 to access the dashboard.
| Page | Path | Description |
|---|---|---|
| Jobs Dashboard | / or /jobs |
Main job listing and management with AI analysis |
| Add Job | /jobs/add |
Manually add a job |
| Dashboard | /dashboard |
Application stats, conversion funnel, and weekly activity |
| Rules | /rules |
Manage auto-classification rules (including ML score-based rules) |
| Settings | /settings |
Configure user profile, 2FA, browser extension API key, job site URLs, AI Assistant, ML scoring preferences, highlight keywords, pipeline thresholds, auto-archive/delete settings, SMTP/email settings, and cover letter templates |
| History | /history |
View audit log of changes with CSV export |
| Background Jobs | /background-jobs |
Monitor background crawl jobs (LocalMode only) |
| Extension Install | /extension-install |
Extension installation guide |
| About | /about |
Application information |
- Browse - New jobs that haven't been categorized
- Possible - Jobs marked as potentially suitable
- Applied - Jobs you've applied to (list view)
- Pipeline - Kanban board of applied jobs grouped by stage (drag-and-drop)
- Archived - Jobs that have been archived (manually or auto-archived)
- Unsuitable - Jobs that don't match your criteria
- Click the card header to open the job on the original site
- Use thumbs up/down buttons to set interest
- Use Possible/Unsuitable buttons to categorize
- Click "Applied" to track applications
- Use the stage dropdown to update application progress
- Pin/unpin jobs to keep them at the top of any tab
- Archive/unarchive jobs
- Click WhatsApp icon to share
- Click "View Full Description" for details
- Click "Fetch Details" to refresh job information from the job page (description, salary/location if available; some sites may limit what can be fetched server-side)
"Fetch Details" also re-applies your rules after updating the job so auto-classification stays consistent.
JobTracker includes a built-in contact manager so you can track recruiters, hiring managers, and your interactions.
- Contacts page (
/contacts): browse/search all contacts and view interaction history. - Per-job Contacts tab: each job has a Contacts tab in the job details modal where you can add/edit/remove contacts and log interactions (Email/Phone/LinkedIn/etc.).
Contacts can be associated with jobs in two ways:
- Manual entry (always works): open a job → Contacts tab → Add Contact.
- Automatic capture (via browser extensions where supported): extensions can send recruiter/contact data along with description updates.
When an extension updates a job via PUT /api/jobs/description, it may include a Contacts array. The server will merge/dedupe contacts by name and link them to the matching job.
| Filter | Description |
|---|---|
| Search | Search in title, description, company, notes, and cover letter |
| Title Only | Search only in job titles |
| Location | Filter by job location |
| Job Type | Full-time, Part-time, Contract, etc. |
| Remote | Remote only or On-site only |
| Source | LinkedIn, Indeed, S1Jobs, WTTJ, EnergyJobSearch, or other (via Universal Extractor) |
| Interest | Interested, Not Interested, or Not Rated |
| Salary Info | Has salary or No salary listed |
| Salary Contains | Search within salary text (e.g., "100K") |
| Salary Target | Filter jobs whose parsed salary range covers the target value |
| Skill | Filter by skill with autocomplete |
| Stage | Filter applied jobs by application stage |
| Date Range | Filter by date posted |
| Sort By | Sort by date added, date posted, title, company, or salary |
| Group By | Group by company, title, location, job type, date posted/added, source, or salary band |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/jobs |
Get all jobs |
| POST | /api/jobs |
Add a new job (with duplicate detection) |
| GET | /api/jobs/count |
Get total job count |
| GET | /api/jobs/stats |
Get job statistics |
| GET | /api/jobs/exists?url=... |
Check if job URL exists |
| PUT | /api/jobs/{id}/interest |
Update interest status |
| PUT | /api/jobs/description |
Update job description by URL |
| GET | /api/jobs/needing-descriptions |
Get jobs missing descriptions |
| POST | /api/jobs/cleanup |
Clean up job titles |
| POST | /api/jobs/remove-duplicates |
Remove duplicate jobs |
| POST | /api/jobs/fix-sources |
Fix unknown sources from URLs |
| DELETE | /api/jobs/{id} |
Delete a job |
| DELETE | /api/jobs/clear |
Delete all jobs |
The app supports two storage backends, controlled by the StorageProvider setting in appsettings.json.
Jobs, history, and settings are stored as JSON files in the Data/ directory:
Data/jobs.json- Job listingsData/history.json- Audit/history logData/settings.json- App settings and rules
No configuration needed - this is the default when StorageProvider is "Json" or not set.
To switch to SQL Server, update appsettings.json:
{
"StorageProvider": "SqlServer",
"ConnectionStrings": {
"JobSearchDb": "Server=myserver;Database=JobSearch;User Id=myuser;Password=mypassword;TrustServerCertificate=True"
}
}On first startup with SQL Server:
- The database and tables are created automatically
- If the JSON data files exist and the database is empty, all data is imported automatically
- No manual migration steps are needed
To switch back to JSON, set "StorageProvider": "Json". The JSON files are never modified while running in SQL Server mode, so they remain as they were.
| Table | Contents |
|---|---|
Users |
User accounts and authentication |
JobListings |
All tracked jobs (with parsed salary, follow-up dates) |
HistoryEntries |
Audit log of changes |
JobRules |
Auto-classification rules |
AppSettings |
Per-user config (site URLs, rule settings, pipeline thresholds, dark mode, email, auto-archive, cover letter templates) |
JobTracker/
├── Components/
│ ├── Pages/
│ │ ├── Jobs.razor # Main job dashboard (browse, filter, kanban pipeline)
│ │ ├── AddJob.razor # Manual job entry
│ │ ├── Dashboard.razor # Application stats and conversion funnel
│ │ ├── Rules.razor # Auto-classification rules
│ │ ├── Settings.razor # App settings
│ │ ├── History.razor # Change audit log with CSV export
│ │ ├── BackgroundJobs.razor # Background job monitoring
│ │ └── ExtensionInstall.razor # Extension setup guide
│ └── Layout/
│ └── NavMenu.razor # Navigation menu
├── Models/
│ ├── JobListing.cs # Job data model (with salary parsing, follow-up dates)
│ ├── AppSettings.cs # Settings, site URLs, pipeline thresholds, filter presets, cover letter templates
│ ├── JobHistory.cs # History entry model
│ └── JobRule.cs # Rule model
├── Services/
│ ├── JobListingService.cs # Job storage, filtering, pipeline stats
│ ├── SalaryParser.cs # Salary string parser (min/max extraction)
│ ├── JobScoringService.cs # ML-based job scoring engine (0-100 scoring)
│ ├── AIJobAssistantService.cs # 🤖 AI-powered job analysis (OpenAI & Claude)
│ ├── JobCrawlService.cs # Server-side site crawling
│ ├── JobCrawlJob.cs # Scheduled crawl job
│ ├── GhostedCheckJob.cs # Auto-ghosted detection (configurable threshold)
│ ├── NoReplyCheckJob.cs # Auto no-reply detection (configurable threshold)
│ ├── AvailabilityCheckJob.cs # Job availability checks
│ ├── AutoArchiveJob.cs # Auto-archive rejected/ghosted jobs
│ ├── JobCleanupJob.cs # Auto-delete old unsuitable/rejected/ghosted jobs
│ ├── EmailNotificationJob.cs # Daily digest email notifications
│ ├── EmailCheckJob.cs # IMAP email check with retry logic
│ ├── EmailReplyMatcher.cs # Match emails to jobs and detect application stages
│ ├── EmailService.cs # SMTP email sending
│ └── LocalBackgroundService.cs # Background task runner
├── Data/
│ └── jobs.json # Persistent job storage (JSON mode)
├── BrowserExtensions/
│ ├── LinkedInExtension/
│ │ ├── manifest.json
│ │ ├── content.js
│ │ ├── popup.html
│ │ └── popup.js
│ ├── IndeedExtension/
│ │ ├── manifest.json
│ │ ├── content.js
│ │ ├── popup.html
│ │ └── popup.js
│ ├── S1JobsExtension/
│ │ ├── manifest.json
│ │ ├── content.js
│ │ ├── popup.html
│ │ └── popup.js
│ ├── WTTJExtension/
│ │ ├── manifest.json
│ │ ├── content.js
│ │ ├── popup.html
│ │ └── popup.js
│ ├── EnergyJobSearchExtension/
│ │ ├── manifest.json
│ │ ├── content.js
│ │ ├── popup.html
│ │ └── popup.js
│ └── GenericExtension/
│ ├── manifest.json
│ ├── content.js
│ ├── background.js
│ ├── popup.html
│ └── popup.js
└── Program.cs # App configuration and API endpoints
Option A: OpenAI
- Visit OpenAI API Keys
- Create a new API key (starts with
sk-) - Cost: ~$0.01-0.05 per job analysis depending on model
Option B: Anthropic Claude
- Visit Anthropic Console
- Create a new API key (starts with
sk-ant-) - Cost: ~$0.008-0.08 per job analysis depending on model
- Navigate to Settings → AI Job Assistant section
- Enable AI Assistant (check the box)
- Select AI Provider: OpenAI or Claude
- Enter your API Key
- Choose Model:
- OpenAI: GPT-3.5 Turbo (fast/cheap), GPT-4 (accurate), GPT-4o (latest)
- Claude: Claude 3 Haiku (fast/cheap), Claude 3.5 Sonnet (recommended), Claude 3 Opus (most capable)
- Configure Your Profile:
- Your Skills - Comma-separated (e.g., "C#, .NET, Azure, React, TypeScript")
- Experience Summary - Brief description of your experience
- Enable AI Features:
- ✅ Auto-analyze new jobs
- ✅ Auto-generate cover letter suggestions
- ✅ Show skill gap analysis
- ✅ Show similar job recommendations
- Save AI Settings
On Job Cards:
- Click 🤖 Analyze with AI button to analyze any job
- Results appear in a beautiful modal with tabbed sections
- All insights are automatically saved to the job
AI Analysis Modal:
- 📊 Summary - 2-3 sentence job overview
- ✅ Responsibilities - Key duties extracted
- ⚙️ Required Skills - Color-coded (green = you have it)
- 🎓 Qualifications - Education and experience needs
- ⭐ Nice-to-Have Skills - Optional bonus skills
- 📈 Skill Match - Percentage with progress bar
Advanced Features (from modal):
- 📋 Interview Prep - Get likely interview questions
- 💰 Salary Tips - Negotiation strategies and scripts
- 📄 Resume Tips - ATS keywords and optimization
- 📊 Success Prediction - AI-powered success probability
- 🔍 Similar Jobs - Find related opportunities
- ✉️ Cover Letter - Personalized writing suggestions
| Feature | OpenAI | Claude |
|---|---|---|
| Best For | Code, structured output | Analysis, writing, reasoning |
| Context Window | 8K-128K tokens | 200K tokens |
| Pricing | Moderate | Competitive |
| Recommended Model | GPT-3.5 Turbo or GPT-4o | Claude 3.5 Sonnet |
| Cost per Analysis | $0.01-0.05 | $0.008-0.08 |
Tip: Start with GPT-3.5 Turbo or Claude 3.5 Sonnet for best balance of quality and cost!
Extract structured information from any job posting:
✅ Summary: "Senior .NET Developer role focusing on cloud architecture..."
✅ Responsibilities: ["Design scalable APIs", "Lead technical reviews"...]
✅ Required Skills: ["C#", ".NET Core", "Azure", "SQL Server"...]
✅ Qualifications: ["Bachelor's in CS", "5+ years .NET experience"...]
✅ Nice-to-Have: ["Docker", "Kubernetes", "React"...]
Visual comparison with percentage match:
Match: 85% ✅
Skills You Have (7):
✅ C# ✅ .NET ✅ Azure ✅ SQL Server ✅ REST APIs ✅ Git ✅ Agile
Missing Required Skills (2):
❌ Kubernetes ❌ Terraform
Bonus Skills You Have (2):
⭐ Docker ⭐ React
AI generates personalized suggestions:
Opening: "As a passionate .NET architect with 8 years of cloud experience..."
Selling Points:
• Extensive Azure expertise aligns with your cloud-first approach
• Proven track record leading teams of 5+ developers
• Strong background in microservices and container orchestration
Closing: "I'm excited to bring my technical leadership to [Company]..."
Get likely questions before the interview:
Technical Questions:
1. How would you design a microservices architecture on Azure?
2. Explain your approach to optimizing database queries in SQL Server
3. Describe a complex technical challenge you solved recently
Behavioral Questions:
1. Tell me about a time you had to mentor junior developers
2. How do you handle conflicting priorities in agile sprints?
Questions to Ask Them:
1. What's the team's approach to DevOps and CI/CD?
2. How does the company support professional development?
Market data and professional scripts:
Market Rate: £60,000-£75,000 for Senior .NET Developer in London
Strategies:
• Research shows market rate 15% above initial offer
• Emphasize your Azure certifications and leadership experience
• Focus on total compensation including benefits
Opening Statement:
"I'm very excited about this opportunity. Based on my research and
the value I bring, I was hoping we could discuss £70,000..."
ATS keywords and tailored content:
Keywords to Include:
"microservices", "Azure DevOps", "CI/CD", "Agile", "Scrum Master"
Skills to Highlight:
1. Azure Architecture (Solution Architect certified)
2. .NET Core 6/7 (8+ years)
3. Team Leadership (Led teams of 5+)
Tailored Summary:
"Senior .NET Developer with 8 years of cloud-native development,
specializing in Azure microservices and team leadership..."
AI-powered probability estimate:
Success Probability: 78% 📈
Strength Factors:
✅ Strong Azure experience matches requirements
✅ Leadership background aligns with senior role
✅ Technical skills cover 85% of requirements
Risk Factors:
⚠️ No Kubernetes experience (required skill)
⚠️ Company prefers finance sector background
Recommendation: Apply Now ✅
Tip: Highlight transferable skills to address Kubernetes gap
AI finds related opportunities:
Similar Jobs Found: 5
1. Cloud Solutions Architect @ TechCorp (92% match)
Why: 8 shared skills, similar role, remote
2. Senior .NET Developer @ DataSys (87% match)
Why: Same stack, both emphasize Azure, London-based
3. Technical Lead @ CloudFirst (82% match)
Why: Leadership focus, cloud-native, remote
- Navigate to Settings - Go to
/settingsor click Settings in the sidebar - Scroll to "Job Scoring / ML Preferences" section
- Enable ML-based Job Scoring - Check the checkbox
- Configure Scoring Weights (0 = disabled, 1 = full weight):
- Skills Match Weight
- Salary Match Weight
- Remote Preference Weight
- Location Weight
- Keywords Weight
- Company Preference Weight
- Learning from Behavior Weight
- Set Your Preferences:
- Preferred Skills - Comma-separated (e.g., "C#, .NET, Azure, React")
- Salary Range - Minimum and maximum desired salary
- Remote Preference - Check if you prefer remote jobs
- Preferred Locations - Comma-separated locations
- Must-Have Keywords - Keywords that should be in job descriptions
- Avoid Keywords - Keywords that indicate jobs you want to skip
- Preferred Companies - Companies you'd like to work for
- Avoid Companies - Companies to skip
- Minimum Score to Show - Hide jobs below this threshold (0 = show all)
- Save Scoring Preferences
- Recalculate All Scores - Click to score all existing jobs (with live progress)
- View Scores - Go to Jobs page to see score badges on each job
Create automation rules using ML scores:
- Go to Rules page
- Click Add New Rule
- Select Field:
Suitability Score - Select Operator:
>=,>,<=,<, or= - Enter Value: Score threshold (0-100)
- Set Action: Set Interest, Suitability, or IsRemote
- Example Rules:
- Score >= 80 → Set Interest = Interested
- Score < 30 → Set Suitability = Unsuitable
- Score >= 70 AND Location Contains "Remote" → Set Interest = Interested
- Navigate to Settings → Email / SMTP section
- Configure SMTP Settings:
- SMTP Host (e.g., smtp.gmail.com)
- Port (e.g., 587)
- Username and Password
- From Email and From Name
- Enable Email Notifications (optional)
- Configure Notification Preferences:
- Enable daily email digest
- Follow-ups due notifications
- Stale applications notifications
Note: Each user manages their own SMTP settings. There is no shared SMTP configuration.
- Navigate to Settings → Auto-Archive & Auto-Delete section
- Configure Delete Thresholds:
- Delete Unsuitable - Days to keep unsuitable jobs (0 = don't delete)
- Delete Rejected - Days to keep rejected applications (0 = don't delete)
- Delete Ghosted - Days to keep ghosted applications (0 = don't delete)
- Save Settings
- Background job will automatically delete old jobs based on these thresholds
- Make sure you're on a job listing page
- Open DevTools (F12) → Console tab
- Look for
[LJE],[IND],[S1J],[WTTJ],[EJS], or[GEN]messages - Run the
debug()command to see page structure - Try the
extract()command to manually trigger
- Verify the Blazor app is running (
dotnet run) - Visit
https://localhost:7046directly to accept any certificate warnings - Check the extension popup shows "Connected"
- Check the Blazor app console for
[API]messages - Verify the job was added (check for "Added:" in extension console)
- Jobs might be filtered - try clearing all filters
- Click on individual jobs to capture their descriptions
- Use auto-fetch to automatically capture descriptions:
LJE.autoFetch(3) // Replace LJE with appropriate prefix
Run the fix-sources endpoint to infer sources from URLs:
curl -X POST https://localhost:7046/api/jobs/fix-sourcesThe Universal Extractor uses an opt-in model — it only runs on sites you explicitly activate. On each new domain, a small prompt appears in the bottom-right corner asking "Activate Job Tracker for this site?". Click Activate to enable extraction for that domain permanently. You can also manage activated sites from the extension popup.
Run the cleanup endpoint:
curl -X POST https://localhost:7046/api/jobs/cleanupWhen tracking applications, jobs progress through these stages:
| Stage | Description |
|---|---|
| Applied | Initial application submitted |
| No Reply | No response received yet |
| Pending | Awaiting decision |
| Ghosted | No response after extended time |
| Rejected | Application was rejected |
| Tech Test | Technical assessment stage |
| Interview | Interview stage |
| Offer | Received job offer |
Click the stage badge on a job card to cycle through stages, or use the dropdown to select a specific stage.
- .NET 10 - Latest .NET framework
- Blazor Server - Interactive server-side rendering
- C# 14 - Modern C# language features
- SQL Server - Optional enterprise database support
- Hangfire - Background job processing (SQL Server mode)
- Entity Framework Core - ORM for SQL Server
- OpenAI GPT - GPT-3.5 Turbo, GPT-4, GPT-4o support
- Anthropic Claude - Claude 3 Haiku, Sonnet, Opus support
- Custom ML Scoring - Multi-factor job scoring algorithm
- JSON Deserialization - Structured AI response parsing
- Blazor Components - Reusable UI components
- Bootstrap 5 - Responsive design system
- Bootstrap Icons - Icon library
- Dark Mode - Theme switching with localStorage
- Drag & Drop - Kanban board (SortableJS integration)
- Chrome Extension API - Manifest V3
- JavaScript - Content scripts and background workers
- DOM Manipulation - Job extraction from various sites
- Cross-Origin Messaging - Extension to app communication
- JSON Files - Default lightweight storage
- SQL Server - Enterprise-grade option
- Entity Framework Migrations - Schema management
- Dual Backend Architecture - Seamless switching
- Cookie Authentication - Session management
- API Key Support - Extension authentication
- TOTP 2FA - Time-based one-time passwords
- Password Hashing - Secure credential storage
- SMTP Email - Password reset and notifications
- LocalBackgroundService - JSON mode background tasks
- Hangfire - SQL Server mode job scheduling
- Recurring Jobs - Crawling, email, cleanup
- CRON Scheduling - Flexible job timing
- 9 AI Features - Comprehensive job search assistance
- 2 AI Providers - OpenAI and Anthropic Claude
- 8 Model Options - From fast/cheap to most capable
- 6 Job Sites - LinkedIn, Indeed, S1Jobs, WTTJ, EnergyJobSearch + Universal Extractor
- 7 Application Stages - Full pipeline tracking
- ML Scoring - 7-factor intelligent job matching
- Kanban Pipeline - Visual drag-and-drop board
- Background Jobs - 7 automated tasks
- Dual Storage - JSON or SQL Server
- Browser Extensions - 5 dedicated extractors + 1 universal fallback
- 184 Unit Tests - EmailReplyMatcher, JsonStorageBackend, SalaryParser, JobScoring, JobRules, CompanyNormalization, JobTypeDetection
✅ AI-Powered - Leverage GPT-4 or Claude to work smarter
✅ Comprehensive - Track every aspect of your job search
✅ Intelligent - ML scoring learns from your preferences
✅ Automated - Rules engine and background jobs do the work
✅ Visual - Kanban boards, charts, and color-coded indicators
✅ Flexible - Choose your AI provider, storage, and workflows
✅ Private - Your data stays on your server
✅ Extensible - Open architecture for customization
This project is for personal use to track job applications.
Feel free to submit issues and enhancement requests!