Offline AI Resume Screening System powered by Ollama + Qwen3:8B
QWENTUS is a fully local AI-powered Resume Screening System that automatically parses resumes, extracts public profile links, analyzes candidate information using a locally hosted Large Language Model (Qwen3:8B via Ollama), generates recruiter-ready Excel reports, and sorts resumes into decision folders — all without sending resume data to the cloud.
- Offline AI Resume Screening
- Local LLM using Ollama + Qwen3:8B
- PDF Text Extraction (PyMuPDF)
- OCR Fallback for Scanned/Image PDFs
- Hyperlink Detection
- Visible URLs
- Embedded PDF Hyperlinks
- GitHub Analysis
- LinkedIn Analysis
- Portfolio Analysis
- Resume Evaluation
- Automatic Resume Sorting
- Recruiter Excel Report
- Watch Mode
- Rich CLI
- Retry Logic
- Graceful Failure Handling
- Timing Metrics
- Production Logging
Incoming Resume
│
▼
Parse PDF
│
▼
OCR (If Needed)
│
▼
Extract Hyperlinks
│
▼
GitHub
LinkedIn
Portfolio
│
▼
Candidate Profile
│
▼
Prompt Builder
│
▼
Ollama
(Qwen3:8B)
│
▼
JSON Evaluation
│
▼
Excel Report
│
▼
Move Resume
Add screenshots here.
Example:
- Startup Banner
- Resume Processing
- Excel Report
- Watch Mode
- Completion Summary
git clone <repository-url>
cd QWENTUSpython -m venv .venv.venv\Scripts\activatepip install -r requirements.txtDownload Ollama
ollama pull qwen3:8bollama listSingle Run
python main.pyWatch Mode
python main.py --watchDebug
python main.py --debug-one path/to/resume.pdfRun Tests
python -m unittest discover -s tests -v| Category | Technology |
|---|---|
| Language | Python 3 |
| Local LLM | Ollama |
| Model | Qwen3:8B |
| PDF Parsing | PyMuPDF |
| OCR | EasyOCR |
| OCR Backend | PyTorch |
| HTTP | Requests |
| HTML Parsing | BeautifulSoup4 |
| Excel | OpenPyXL |
| File Watching | Watchdog |
| CLI | Rich |
| ASCII Banner | PyFiglet |
| Windows Colors | Colorama |
| Validation | Pydantic |
| JSON | orjson |
| Testing | unittest |
QWENTUS/
├── agents/
├── core/
├── exporters/
├── llm/
├── logs/
├── models/
├── parsers/
├── scrapers/
├── tests/
├── ui/
├── utils/
├── workspace/
│ ├── Incoming/
│ ├── Processing/
│ ├── Shortlisted/
│ ├── Maybe/
│ ├── Rejected/
│ ├── Failed/
│ └── Reports/
├── config.py
├── implementation.md
├── report.md
├── testingReports.md
├── main.py
└── requirements.txt
flowchart TD
A[Incoming PDFs]
--> B[PDF Parser]
B --> C[OCR]
B --> D[Hyperlink Extraction]
D --> E[GitHub]
D --> F[LinkedIn]
D --> G[Portfolio]
C --> H[Candidate Builder]
E --> H
F --> H
G --> H
H --> I[Prompt Builder]
I --> J[Ollama]
J --> K[Qwen3:8B]
K --> L[JSON Validation]
L --> M[Excel Report]
L --> N[Folder Sorting]
sequenceDiagram
actor Recruiter
participant Workspace
participant PDFParser
participant OCR
participant LinkExtractor
participant GitHubScraper
participant LinkedInScraper
participant PortfolioScraper
participant CandidateBuilder
participant Ollama
participant ExcelExporter
Recruiter->>Workspace: Drop Resume.pdf
Workspace->>PDFParser: Parse PDF
alt No selectable text
PDFParser->>OCR: Run OCR
OCR-->>PDFParser: Extracted text
end
PDFParser->>LinkExtractor: Extract hyperlinks
LinkExtractor->>GitHubScraper: Fetch GitHub profile
GitHubScraper-->>LinkExtractor: GitHub summary
LinkExtractor->>LinkedInScraper: Fetch LinkedIn profile
LinkedInScraper-->>LinkExtractor: LinkedIn summary
LinkExtractor->>PortfolioScraper: Fetch Portfolio
PortfolioScraper-->>LinkExtractor: Portfolio summary
LinkExtractor->>CandidateBuilder: Build candidate profile
CandidateBuilder->>Ollama: Generate evaluation prompt
Ollama-->>CandidateBuilder: JSON evaluation
CandidateBuilder->>ExcelExporter: Write candidate scores
ExcelExporter-->>Workspace: Generate Excel report
CandidateBuilder->>Workspace: Move PDF to Shortlisted / Maybe / Rejected / Failed
Incoming Resume
│
▼
PDF Parsing
│
▼
OCR (Optional)
│
▼
Hyperlink Extraction
│
▼
GitHub / LinkedIn / Portfolio
│
▼
Candidate Builder
│
▼
Prompt Builder
│
▼
Ollama
│
▼
Qwen3:8B
│
▼
JSON Validation
│
▼
Excel Generation
│
▼
Resume Sorting
QWENTUS generates a recruiter-friendly Excel workbook.
| Name | GitHub Score | Skills Score | Achievements Score | Projects Score | Experience Score | Overall Score | Decision |
|---|
- All Candidates
- Shortlisted
- Maybe
- Rejected
- Summary
Configuration is centralized in
config.py
Examples:
- OCR Engine
- LLM Timeout
- Retry Count
- DNS Servers
- Folder Paths
- Threshold Scores
Run Once
python main.pyWatch Mode
python main.py --watchDebug
python main.py --debug-one resume.pdfTests
python -m unittest discover -s tests -vCurrent Optimizations
- OCR only when required
- Embedded hyperlink extraction
- Prompt size optimization
- Retry logic
- Network health checks
- Graceful failure recovery
- Production logging
- Local inference
- Automatic Excel generation
| Issue | Solution |
|---|---|
| Ollama not running | ollama serve |
| Model missing | ollama pull qwen3:8b |
| OCR not working | Verify EasyOCR installation |
| Excel locked | Close workbook and rerun |
| GitHub unavailable | Pipeline continues normally |
| LinkedIn unavailable | Pipeline continues normally |
| Portfolio unavailable | Pipeline continues normally |
| LLM timeout | Restart Ollama or reduce prompt size |
-
Fork the repository
-
Create a feature branch
git checkout -b feature/my-feature- Commit changes
git commit -m "feat: add new feature"- Push
git push origin feature/my-feature- Open a Pull Request
Apache-2.0 License
Special thanks to the open-source community.
- Ollama
- Qwen Team
- PyMuPDF
- EasyOCR
- PyTorch
- BeautifulSoup4
- Requests
- OpenPyXL
- Watchdog
- Rich
- PyFiglet
- Pydantic
- orjson