JobSniper is a small WPF desktop utility that collects and helps you manage job postings. It acts as a personal CRM for your job hunt, filtering out the noise, evaluating opportunities using AI, and keeping track of your interactions with companies.
This repository ships with an example scraper only. It does not include or distribute any pre-built .exe for security and transparency. Run the app from source so you can inspect or customize the scraper before use. The private AI scraping workflows and API keys are strictly local and not included in this repository.
- Install the .NET 9 SDK or Visual Studio with .NET 9 support.
- Open the solution
JobSniper.slnin Visual Studio and press F5 to run.- Or use the terminal:
dotnet run --project JobSniperfrom the repository root.
- Or use the terminal:
- The app window opens. Use the left menu to navigate between the Dashboard, Inbox, CRM, and Settings.
- Add URLs in "Settings & Filters". The built-in ExampleScraper will simulate scraping and populate the Inbox.
- Dashboard — overview of counts and the real-time scraper log.
- Inbox — newly discovered offers.
- Opportunities — offers you marked as interesting.
- Trash — manually or automatically trashed items.
- Archive — expired offers moved automatically after 48 hours of inactivity.
- Session Duplicates — offers detected during the current run but already known to the system.
- CRM (Companies) — personal database of companies, their aliases, your interaction history, and reputation tracking.
- AI Position Evaluation — Master-Detail view in the CRM providing lazy-loaded AI coaching and match scoring for specific roles.
- Settings & Filters — control panel for scraping, managing URLs, and handling graceful cancellation.
- 🌐 Web — open the original offer URL in your browser.
- 📝 CRM — open or create a CRM detail for the company (add notes, set reputation color).
- 👍 Opportunity — mark the offer as an opportunity.
- 👎 Trash — move the specific offer to trash.
- ⛔ Block — block the company entirely (all future offers from this company are auto-trashed).
- ♻️ Unblock — remove a company from the blacklist and restore their offers.
The solution also includes a secondary project called SniperIntel. It is a standalone, read-only desktop application designed strictly for browsing your collected data. It provides a fast, master-detail "dossier" view of your CRM notes, and logged evidence without the ability to modify the core database.
JobSniper includes a specialized CRM tab that allows you to integrate AI evaluations of job offers. The app is designed to read unstructured output from an LLM and parse a specific JSON block out of it.
If you hook up your own AI (via a private workflow), prompt the AI to include the following JSON structure anywhere in its text output. The system uses a two-tier scoring model to differentiate between a strict ATS/HR filter and your actual strategic chances:
{
"RawHrScore": 15,
"StrategicScore": 85,
"OverqualifiedRisk": 9,
"UnderqualifiedRisk": 8,
"HiddenRole": "Troubleshooter / Maintenance",
"RecommendedCvCategory": 3,
"Strategy": "DumbDown",
"StrategyReasoning": "The company needs a hands-on technician. Hide your complex C# architecture skills to avoid appearing overqualified.",
"GoNoGo": true,
"RedFlags": [
"Likely a hard filter for a specific degree in the ATS",
"Conservative corporate culture"
]
}The app operates locally and saves your data into JSON files next to the executable:
jobs.json— saved job offers and their status.urls.json— list of URLs to process.blacklist.json— explicitly blocked companies.crm_companies.json— your personal notes, aliases, and reputation data for companies.ai_evaluations.json— saved JSON data containing your AI coach scores, match metrics, and full evaluations.
The repository contains ExampleScraper.cs which simulates scraping by parsing bundled HTML samples. This avoids network access and makes the project safe and easy to explore.
To adapt the app to a real job board:
- Open
JobSniper/Scrapers/ExampleScraper.cs. - Create a new class (or modify the existing one) in the
JobSniper.Scrapersnamespace. - Implement the signature:
Task<List<JobOffer>> ScrapeUrlAsync(string startUrl, Action<string> logMessage). - Return
JobOfferobjects withTitle,Company,Url,Location,Salary. - Replace
new ExampleScraper()inMainWindow.xaml.cswith your scraper class or add logic to select a scraper byPortalNameinurls.json.
Notes:
- Respect target websites' terms of use and
robots.txt. - Add rate-limiting and error handling in production scrapers.
- Test locally with
ExampleScraperfirst, then switch to a real scraper.
- App doesn't start: Install the .NET 9 SDK or open with a Visual Studio version that supports .NET 9.
- No offers appear: Add example URLs in Settings or ensure
urls.jsoncontains entries.
MIT recommended. Add a LICENSE file with the license text if you choose it.





