Automated AI-powered job-matching workflow built with n8n
DailyJobMatch automates your job search every morning by collecting fresh job postings, comparing each role against your CV using a large language model, and emailing you a ranked shortlist of the most relevant opportunities.
- 🔄 Daily automation: Scheduled trigger (e.g. 07:30) runs the entire pipeline without manual effort.
- 📝 CV-aware matching: Uses the full text of your CV, not just keywords, to evaluate fit.
- 💯 Multi-dimensional scoring: Breaks fit into background match, skills overlap, experience relevance, seniority, language requirements, and company score.
- 🧹 Cleaning & deduplication: Normalises fields, removes obvious mismatches (student roles, internships, postdocs), and deduplicates by title/company/link.
- 📊 Structured LLM output: Forces the model to return strict JSON, then parses and validates it before ranking.
- 🥇 Top-N selection: Ranks all jobs by overall score and keeps only the top matches for you to review.
- 💌 Dark-theme email report: Sends a dark-theme HTML digest with job cards, scores, keywords, fit bullets, and “View & Apply” buttons.
This is an early-stage project and still requires personalised setup.
DailyJobMatch is built on n8n, a flexible automation tool. Docker is the recommended and easiest deployment method. Here is an installation guide: https://github.com/n8n-io/n8n
DailyJobMatch relies on several external services:
Used to fetch your CV and send daily job digest emails. They require the Google credentials, and here are the official docs from n8n: https://docs.n8n.io/integrations/builtin/credentials/google/
In our workflow, Apify is used to collect fresh LinkedIn jobs within the last 24 hours. Apify provides tons of actors to scrape up-to-date web data from any website for AI apps and agents, and I chose Linkedin Jobs Scraper - PPR as it is paid by result rather than subscription. But feel free to choose the scrapper which fits your needs, and the detailed configuration steps will be on the actor's page.
DailyJobMatch uses an LLM to read your job description, read your CV, evaluate the matches and score the fit across 6 dimensions and finally generate structured JSON outputs. n8n can be integrated with almost all the conversational chatbots. Here's how you can set up with the OpenAI model: https://docs.n8n.io/integrations/builtin/credentials/openai/
After setting up Docker and credentials, import:
workflow/Daily_Job_Match.json
⚠️ Replace all my example credentials with your own.
I've written a few lines of descriptions for each node, and feel free to click and check the official docs to learn more. Here I will just walk through these key nodes, which you may need to alter or customise based on your needs:
- Config: Add Apify API key (NOT the full link, check LinkedIn node), recipient email, and number of jobs per day.
- RetrieveCV (Google Drive): Under Credentials, select your Google Drive OAuth2 credential and make sure the file / fileId is set to your CV PDF.
- LinkedIn Under URL or body, make sure it uses your Apify dataset or actor endpoint (depending on how you configured it). Under Authentication / Headers, ensure your Apify API token is set.
- Filter & Deduplicate: Update banned keywords (e.g., “student”, “temporary”).
- Score Job & Extract: customise the prompt for your agent, including the goals, input and tasks.
- Model Nodes: finish credentials setting and choose your model.
- Send a Message (Gmail): Under Credentials, choose your Gmail OAuth2 credential. Ensure the To field is either A static email or an expression pointing to Config.gmailTo.
Disable schedule → click Execute Workflow → review step-by-step execution.
For my personalised agent, the scoring node requires the LLM to:
- Read your entire CV
- Read the job description
- Evaluate fit across six dimensions
- Output strict JSON (no markdown or commentary)
- Keep the structure consistent across all jobs
{
"score": {
"overall": 0,
"background_match": 0,
"skills_overlap": 0,
"experience_relevance": 0,
"seniority": 0,
"language_requirement": 0,
"company_score": 0
},
"summary": "",
"keywords": [],
"fit_bullets": [],
"connector": ""
}| Category | Range | Description |
|---|---|---|
| background_match | 0–10 | Fit with domain (bioinformatics, pharma, biotech) |
| skills_overlap | 0–30 | Match between required skills and your technical stack |
| experience_relevance | 0–30 | Alignment with responsibilities & past projects |
| seniority | 0–10 | Entry-level preference; penalises senior roles |
| language_requirement | 0–10 | Penalises strict “Danish required” listings |
| company_score | 0–10 | Bonus for biotech/pharma/AI companies |
| overall | 0–100 | Sum of all categories |
- Author: Chunxu Han
- Email: [email protected]
- LinkedIn: https://www.linkedin.com/in/chunxu-han
Feel free to reach out with questions or feature ideas!
- JobIndex integrations
- Notion job-tracking storage
- Auto-apply system (draft cover letters)
- Weekly analytics dashboard
- AI-based CV improvement suggestions
Contributions welcome — open an issue or submit a PR!


