A self-hosted AI pipeline that automatically discovers, scores, and tailors job applications — built with n8n, Claude API, PostgreSQL, and Docker.
Every 2 hours, the system automatically:
- Discovers jobs from RSS feeds (Jobicy, HN Who's Hiring)
- Extracts structured data from each job description using Claude AI
- Scores each job 0–100 against your resume and profile
- Filters to only jobs scoring ≥ 70 (configurable threshold)
- Tailors ATS-optimized resume bullets for the top 2 jobs
- Writes a personalized cover letter for the top 1 job
- Stores everything in PostgreSQL
- Sends a daily digest by email and Telegram at 8AM
The system never auto-submits applications — you review and apply manually.
+----------------------------------------------------------+
| LOCAL DOCKER ENVIRONMENT |
| |
| +-------------+ +--------------+ +-------------+ |
| | job-n8n | | job-postgres | |job-gotenberg| |
| | port: 5678 |<->| port: 5432 | | port: 3001 | |
| | Workflows | | Job storage | | PDF service | |
| +------+------+ +--------------+ +-------------+ |
| | |
+---------+------------------------------------------------+
| External API calls
v
+----------------------------------------------------------+
| Claude API | RSS Feeds | Gmail SMTP | Telegram |
+----------------------------------------------------------+
| Layer | Technology | Purpose |
|---|---|---|
| Orchestration | n8n (self-hosted) | Visual workflows, scheduling, node connections |
| AI / LLM | Claude Haiku 4.5 | Job extraction, scoring, resume tailoring, cover letters |
| Database | PostgreSQL 15 | Persistent storage for jobs, scores, materials |
| Containers | Docker + Compose | Isolated local services, one-command startup |
| Gmail SMTP | Daily digest via App Password | |
| Messaging | Telegram Bot | Real-time alerts and daily summaries |
| Job Sources | RSS Feeds | Jobicy, HN Who's Hiring (public feeds, no scraping) |
RSS Feeds → Compute Hashes (dedup) → Claude: Extract JD → Claude: Score Fit
→ Filter ≥70 → Top 2: Tailor Resume → Top 1: Cover Letter → PostgreSQL
Gmail IMAP → Extract URLs from alerts → Same analysis pipeline as WF01
Query PostgreSQL → Format HTML Email → Send via Gmail SMTP + Telegram Bot
| Task | Items/run | Cost/call | Run total |
|---|---|---|---|
| Claude Extract JD | ~55 | $0.00004 | $0.0022 |
| Claude Match Score | ~55 | $0.00004 | $0.0022 |
| Claude Tailor Resume | top 2 | $0.0002 | $0.0004 |
| Claude Cover Letter | top 1 | $0.0003 | $0.0003 |
| Total per run | ~$0.005 |
~$1.80/month for 12 runs/day. Infrastructure: $0 (local Docker).
- Docker Desktop installed
- Anthropic API key (console.anthropic.com)
- Gmail App Password (myaccount.google.com → Security → App Passwords)
- Telegram Bot token (optional — @BotFather)
git clone https://github.com/YOUR_USERNAME/job-automation
cd job-automation
# Copy env template and fill in your values
cp .env.example .env
nano .env # or open in any editor
# Add your resume
cp resumes/base-resume.txt resumes/my-resume.txt
# Edit with your actual details
# Start everything
chmod +x start.sh stop.sh db.sh update.sh
./start.shhttp://localhost:5678
Log in → Import the 3 workflow JSON files from workflows/ folder → Activate all 3.
- PostgreSQL: host=
postgres, db=jobautomation, user=jobuser - SMTP: Gmail with App Password, port 587
- IMAP: Gmail with App Password, port 993
- Telegram: Bot token from @BotFather
# Check new unreviewed jobs
./db.sh new
# Top jobs by score
./db.sh top
# Get cover letter for a job
./db.sh cover <job_id>
# Get tailored resume for a job
./db.sh resume <job_id>
# Mark job as applied
./db.sh apply <job_id>
# Open DB shell
./db.sh shell
# Update n8n to latest
./update.sh| Column | Description |
|---|---|
job_id |
URL hash — prevents duplicates |
match_score |
Claude's 0–100 fit score |
recommendation |
apply / maybe-apply / skip |
tailored_resume_text |
ATS-optimized resume for this job |
cover_letter |
Personalized cover letter |
missing_skills |
Skills gap identified by Claude |
strong_matches |
Your strengths for this role |
visa_note |
remote-friendly / EU-based / requires-sponsorship |
This system never auto-submits applications. It only:
- ✅ Discovers relevant jobs
- ✅ Scores fit against your profile
- ✅ Prepares tailored materials
- ✅ Notifies you daily
You decide which jobs to apply to and click Apply yourself.
job-automation/
├── docker-compose.yml # All services defined here
├── .env.example # Template (copy to .env)
├── init.sql # PostgreSQL schema
├── start.sh # Start all containers
├── stop.sh # Stop all containers
├── update.sh # Update n8n to latest
├── db.sh # Database management CLI
├── resumes/
│ └── base-resume.txt # Your resume template
└── workflows/
├── 01-job-discovery.json
├── 02-email-alert-processor.json
└── 03-daily-digest.json
Deepak Kushwaha — Data Scientist & ML Engineer
MSc Data Science, University of Naples Federico II
🏆 1st Place, Google Challenge Campania 2026 (STEM Category)
MIT — feel free to adapt for your own job search.