A production‑ready system to discover jobs, generate ATS‑optimized resumes and cover letters, and export documents to Word/PowerPoint/Excel. Includes secure LinkedIn OAuth (optional), multi‑source job aggregation, Gemini‑powered generation, and advanced agent capabilities (parallelism, temporal tracking, observability, context engineering).
- Two UIs: Streamlit (
app.py) and Gradio/HF (hf_app.py) - LinkedIn OAuth 2.0 (optional; CSRF‑safe state validation)
- Job aggregation: Adzuna (5k/month) plus resilient fallbacks
- ATS‑optimized drafting: resumes + cover letters (Gemini)
- Office exports:
- Word resumes and cover letters (5 templates)
- PowerPoint CV (4 templates)
- Excel application tracker (5 analytical sheets)
- Advanced agents: parallel execution, temporal memory, observability/tracing, and context engineering/flywheel
- LangExtract integration: structured extraction with Gemini key; robust regex fallback in constrained environments
Create a UTF‑8 .env (values optional if you want mock mode):
# Behavior
MOCK_MODE=true
PORT=7860
# LinkedIn OAuth (optional)
LINKEDIN_CLIENT_ID=
LINKEDIN_CLIENT_SECRET=
LINKEDIN_REDIRECT_URI=http://localhost:8501
# LLM / Research
LLM_PROVIDER=gemini
GEMINI_API_KEY=YOUR_KEY
TAVILY_API_KEY=
# Job APIs
ADZUNA_APP_ID=
ADZUNA_APP_KEY=
# Office MCP (optional)
POWERPOINT_MCP_URL=http://localhost:3000
WORD_MCP_URL=http://localhost:3001
EXCEL_MCP_URL=http://localhost:3002
# LangExtract uses GEMINI key by default
LANGEXTRACT_API_KEY=- Windows PowerShell
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt- Linux/macOS
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt- Streamlit (PATH‑safe)
python -m streamlit run app.py --server.port 8501- Gradio / Hugging Face (avoid port conflicts)
$env:PORT=7861; python hf_app.pyPORT=7861 python hf_app.pyThe HF app binds on 0.0.0.0:$PORT.
- Create a LinkedIn Developer App, then add redirect URLs:
http://localhost:8501
http://localhost:8501/callback
- Products: enable “Sign In with LinkedIn using OpenID Connect”.
- Update
.envand setMOCK_MODE=false. - In the UI, use the “LinkedIn Authentication” section to kick off the flow.
Notes:
- LinkedIn Jobs API is enterprise‑only. The system uses Adzuna + other sources for job data.
- Adzuna: global coverage, 5,000 free jobs/month
- Resilient aggregator and optional JobSpy MCP for broader search
- Custom jobs: add your own postings in the UI
- Corporate SSL environments: Adzuna calls auto‑retries with
verify=Falsefallback
- Parallel processing: 3–5× faster multi‑job drafting
- Temporal tracking: time‑stamped history and pattern analysis
- Observability: tracing, metrics, timeline visualization
- Context engineering: flywheel learning, L1/L2/L3 memory, scalable context
Toggle these in the HF app under “🚀 Advanced AI Features”.
- Uses the same
GEMINI_API_KEY(auto‑applied toLANGEXTRACT_API_KEYwhen empty) - Official
langextract.extract(...)requires examples; the UI also exposes a robust regex‑based fallback (services/langextract_service.py) so features work even when cloud extraction is constrained - In HF app (“🔍 Enhanced Job Analysis”), you can:
- Analyze job postings (structured fields + skills)
- Optimize resume for ATS (score + missing keywords)
- Bulk analyze multiple jobs
- Word (
services/word_cv.py): resumes + cover letters (5 templates;python‑docxfallback) - PowerPoint (
services/powerpoint_cv.py): visual CV (4 templates;python‑pptxfallback) - Excel (
services/excel_tracker.py): tracker with 5 analytical sheets (openpyxlfallback) - MCP servers supported when available; local libraries are used otherwise
In HF app, after generation, expand:
- “📊 Export to PowerPoint CV”
- “📝 Export to Word Documents”
- “📈 Export Excel Tracker”
- PowerShell ampersand: don’t append
&. Run the command directly. - Streamlit not found: use
python -m streamlit run app.py(PATH‑safe). - Port already in use: set a free port, e.g.
PORT=7861. - Corporate SSL issues: Adzuna auto‑retries with
verify=False. - Kill HF app bound on a port (PowerShell):
Get-Process python | Where-Object { $_.CommandLine -like "*hf_app.py*" } | Stop-Process -Forceagents/ # Orchestrator and agent logic (incl. advanced features)
models/ # Pydantic schemas
services/ # LinkedIn client, job aggregator, Office, LangExtract svc
utils/ # Text, security, caching, langextract wrappers
memory/ # File‑based persistence (atomic writes)
app.py # Streamlit UI
hf_app.py # Gradio / HF UI (standalone‑capable)
requirements.txt # Dependencies
README.md # This consolidated guide
- Run test suites in
tests/ - Useful scripts:
test_*files in project root (integration checks)
- OAuth state validation, input/path/url sanitization
- Sensitive data via environment variables; avoid committing secrets
- Atomic writes in memory store
- Streamlit:
python -m streamlit run app.py --server.port 8501 - Gradio/HF:
PORT=7861 python hf_app.py
Your system is fully documented here in one place and ready for local or HF deployment.