Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .env.EXAMPLE
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
APIFY_API_KEY=apify_api_
SPREADSHEET_ID=
OPENAI_API_KEY=sk-proj-
USE_GPT=true
USE_DEEPSEEK=
DEEPSEEK_API_KEY=
DEBUG_MODE=true
14 changes: 14 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,15 @@
# Ignore directories
/node_modules
.env
.local.env
apify_inputs/*
apify_outputs/*
google_service_account_credentials.json
candidate_summary.txt
dist/
batch_files
processed_jobs/

# But include example files
!apify_inputs/*.example.json
!apify_outputs/*.example.json
7 changes: 0 additions & 7 deletions .local.env

This file was deleted.

1,888 changes: 0 additions & 1,888 deletions 2025-01-27-jobs.json

This file was deleted.

72 changes: 61 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
# JobMatchAI

JobMatchAI is a Node.js application that automates job matching and evaluation processes using AI services (Deepseek & ChatGPT), and Google Sheets integration.
JobMatchAI is a Typescript application that can input a LinkedIn/ZipRecruiter/Indeed URL, read the jobs from that webpage, then remove irrelevant and unqualified jobs using ChatGPT. This saves your effort as a job seeker by only applying to the relevant jobs.

![Workflow Overview](./JobMatchAI-v1.png "Automated Job Search Workflow")

Output:

![Output](./screenshot.png "Output")

Tutorial: https://www.youtube.com/watch?v=eRQZALTfbp4

## Prerequisites

- Node.js (v16 or higher)
Expand All @@ -17,19 +23,35 @@ JobMatchAI is a Node.js application that automates job matching and evaluation p
1. Clone the repository:

```bash
git clone https://github.com/EricTechPro/JobMatchAI
cd jobmatchai
git clone git@github.com:USERNAME_HERE/JobMatchAI.git
cd JobMatchAI
```

2. Install dependencies:
1. Install dependencies:

```bash
npm install
```

3. Set up environment variables:
Create a `.env` file in the root directory and add the following:

1. Make a copy of this Google Spreadsheet and delete all the rows https://docs.google.com/spreadsheets/d/1x1e6GtfTl7LYh65MhVQtKApvwfsIdhXpFGPmXd57C8c/edit?gid=1330056534#gid=1330056534 In case the link is dead, the the columns in the spreadsheet are:
- Job Title
- Company
- Location
- Job URL
- Pay
- Full-time/Contract
- Source
- Candidate Meets Job Requirements
- Job Meets Candidate Requirements
- Previous Columns Multiplied
- Date Generated
- Reasons for score

1. Edit the sharing settings of the Google Sheet to allow the service account to read and write to the sheet. Or just allow everyone with the link to read and write to the sheet.

1. Set up environment variables:
Rename the `.env.example` file to `.env` and add your API keys:

Note: The Deepseek part of the program is not finished. Start with OpenAI.
```env
APIFY_API_KEY=[apify api key]
SPREADSHEET_ID=[google sheet spreadsheet id]
Expand All @@ -39,15 +61,41 @@ JobMatchAI is a Node.js application that automates job matching and evaluation p
USE_DEEPSEEK=[true or false]
DEBUG_MODE=[true or false]
```

1. Sign up for Apify and start the Basic subscription.
1. Modify the Apify Job Scraper API Inputs
- For LinkedIn, go to https://console.apify.com/actors/hKByXkMQaC5Qt9UMN/input, fill in the form, then click "JSON" at the top of the page, and copy it into the local file "apify_inputs/hKByXkMQaC5Qt9UMN_production_assistant_US.json"
- For ZipRecruiter, go to https://console.apify.com/actors/vQO5g45mnm8jwognj/input, fill in the form, then click "JSON" at the top of the page, and copy it into the local file "apify_inputs/vQO5g45mnm8jwognj_video_producer_SF.json"
- For Indeed, go to https://console.apify.com/actors/qA8rz8tR61HdkfTBL/input, fill in the form, then click "JSON" at the top of the page, and copy it into the local file "apify_inputs/qA8rz8tR61HdkfTBL_videographer_SF.json"
- You can add add more json files in the apify_inputs directory. You can add multiple json files to run multiple Apify jobs in parallel. The file names have to start with the actor ID (e.g. hKByXkMQaC5Qt9UMN)
1. Rename "candidate_summary.example.txt" to "candidate_summary.txt" and add your resume and job preferences.

4. Modify the Apify LinkedIn Job Scraper API Input from https://console.apify.com/actors/BHzefUZlZRKWxkTck/input and update "apify_input.json"
```
Work Experience:
Education:
Hobbies:

Job Preferences:
- Preferred Locations: Bay Area + 100 miles, Los Angeles area + 100 miles, San Diego area + 100 miles, New York area + 100 miles. Second choice is US west coast.
- Not a student so ignore internships unless it says something like "school enrollment not required"
- Not a manager so ignore supervisor/director positions
- Languages: English
```

1. Go to Google Cloud Console and create a service account and download the google_service_account_credentials.json file and put it in this directory.

## Usage

Start the application:
Compile the Typescript:

```
npx tsc --watch
```

In another terminal, start the application:

```bash
node index.js
node dist/index.js
```

## Dependencies
Expand All @@ -56,7 +104,9 @@ node index.js
- [dotenv](https://www.npmjs.com/package/dotenv)
- [googleapis](https://www.npmjs.com/package/googleapis)
- [openai](https://www.npmjs.com/package/openai)
- [typescript](https://www.npmjs.com/package/typescript)

## Contributing

Contributions are welcome! Please fork this repository and submit a pull request for review.

Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"count": 3000,
"scrapeCompany": true,
"urls": [
"https://www.linkedin.com/jobs/search/?currentJobId=4143836913&distance=25&geoId=103644278&keywords=production%20assistant&origin=JOBS_HOME_KEYWORD_HISTORY&refresh=true"
]
}
17 changes: 17 additions & 0 deletions apify_inputs/qA8rz8tR61HdkfTBL_videographer_SF.example.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"findContacts": false,
"findContacts.position": [
"founder",
"director"
],
"outputSchema": "raw",
"proxy": {
"useApifyProxy": true,
"apifyProxyGroups": [
"RESIDENTIAL"
]
},
"scrapeJobs.scrapeCompany": false,
"scrapeJobs.searchUrl": "https://www.indeed.com/jobs?q=videographer&l=San+Francisco%2C+CA&salaryType=%2440%2C000&radius=100&from=searchOnDesktopSerp&vjk=6599572f21e3d7fe",
"useBrowser": true
}
19 changes: 19 additions & 0 deletions apify_inputs/vQO5g45mnm8jwognj_video_producer_SF.example.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"maxItems": 10000,
"proxy": {
"useApifyProxy": true,
"apifyProxyGroups": [
"RESIDENTIAL"
],
"apifyProxyCountry": "US"
},
"startUrls": [
{
"url": "https://www.ziprecruiter.com/jobs-search?search=video+producer&location=San+Francisco%2C+CA&refine_by_location_type=&radius=100&days=&refine_by_employment=employment_type%3Aall&refine_by_salary=&refine_by_salary_ceil=&lvk=1p_YcDhr94gP-VCH3TwzAw.--NiG1IjqhR",
"method": "GET"
}
],
"maxConcurrency": 10,
"minConcurrency": 1,
"maxRequestRetries": 30
}
Loading