Browse by type
This is a free, open-source tool that automates job applications on LinkedIn. It runs entirely on your own computer, using your own LinkedIn account. It finds jobs relevant to you, fills in the application questions, tailors your resume to each job's details (required skills, description, about the company, etc.), and applies. Can apply to 100+ jobs in under an hour.
Click on above image to watch the demo or use this link https://youtu.be/gMbB1fWZDHw
New here, or not comfortable editing code? Use the built-in control panel. You set everything up in your web browser and run the tool with a button - no editing Python files, no terminal commands.
Double-click the launcher for your system:
start.commandstart.batstart.sh (run ./start.sh in a terminal)The first run sets things up automatically (it may take a minute). After that it's quick.
4. Your browser opens the control panel automatically (the exact address, e.g. http://127.0.0.1:5000, is shown in the launcher window). Fill in the tabs - Account, Profile, Search, Filters, Run settings - and click Save.
5. Go to the Run tab and click Start. A Chrome window opens and begins applying - keep it in the foreground. You can watch progress in the log and click Stop any time.
Everything stays on your own computer: your details are saved locally in user_config.json (never uploaded), and the control panel is reachable only from this machine. If you prefer the classic setup, the manual steps below still work exactly as before.
Click on above image to watch the tutorial for installation and configuration or use this link https://youtu.be/f9rdz74e1lM (Recommended to watch it in 2x speed)
requirements.txt).
pip install -r requirements.txtauto_manage_driver = True in config/settings.py, which downloads the matching driver for you automatically.) Otherwise, download the Chrome Driver that matches your Google Chrome version and place it where Chrome is installed. Visit https://googlechromelabs.github.io/chrome-for-testing/ to download.OR
If you are using Windows, click on windows-setup.bat available in the /setup folder, this will install the latest chromedriver automatically.
6. If you have questions or need help setting it up or to talk in general, join the github server: https://discord.gg/fFp7uUzWCY
personals.py file in /config folder and enter your details like name, phone number, address, etc. Whatever you want to fill in your applications.questions.py file in /config folder and enter your answers for application questions, configure wether you want the bot to pause before submission or pause if it can't answer unknown questions.search.py file in /config folder and enter your search preferences, job filters, configure the bot as per your needs (these settings decide which jobs to apply for or skip).secrets.py file in /config folder and enter your LinkedIn username, password to login and OpenAI API Key for generation of job tailored resumes and cover letters (This entire step is optional). If you do not provide username or password or leave them as default, it will login with saved profile in browser, if failed will ask you to login manually.settings.py file in /config folder to configure settings like keep screen awake, click interval (time to wait between actions), run in background, automatic Chrome-driver management, etc. as per your needs.default_resume_path = "all resumes/default/resume.pdf" given in /config/questions.py. If one is not provided, it will use your previous resume submitted in LinkedIn or (In Development) generate custom resume if OpenAI APT key is provided!runAiBot.py and see the magic happen.app.py - it prints the address to open (e.g. http://127.0.0.1:5000, or another port if 5000 is busy).Thank you for your efforts and being a part of the community. All contributions are appreciated no matter how small or big. Once you contribute to the code base, your work will be remembered forever.
NOTE: Only Pull request to community-version branch will be accepted. Any other requests will be declined by default, especially to main branch.
Once your code is tested, your changes will be merged to the main branch in next cycle.
#### Functions:
1. All functions or methods are named lower case and snake case
2. Must have explanation of their purpose. Write explanation surrounded in ''' Explanation ''' under the definition def function() -> None:. Example:
python
def function() -> None:
'''
This function does nothing, it's just an example for explanation placement!
'''
4. The Types (str, list, int, list[str], int | float) for the parameters and returns must be given. Example:
python
def function(param1: str, param2: list[str], param3: int) -> str:
5. Putting all that together some valid examples for function or method declarations would be as follows.
python
def function_name_in_camel_case(parameter1: driver, parameter2: str) -> list[str] | ValueError:
'''
This function is an example for code guidelines
'''
return [parameter2, parameter2.lower()]
6. The hashtag comments on top of functions are optional, which are intended for developers # Comments for developers.
``python
# Enter input text function
def text_input_by_ID(driver: WebDriver, id: str, value: str, time: float=5.0) -> None | Exception:
'''
Entersvalueinto the input field with the givenidif found, else throws NotFoundException.
-time` is the max time to wait for the element to be found.
'''
username_field = WebDriverWait(driver, time).until(EC.presence_of_element_located((By.ID, id)))
username_field.send_keys(Keys.CONTROL + "a")
username_field.send_keys(value)
```
#### Variables
1. All variables must start with lower case, must be in explainable full words. If someone reads the variable name, it should be easy to understand what the variable stores.
2. All local variables are camel case. Examples:
python
jobListingsElement = None
python
localBufferTime = 5.5
3. All global variables are snake case. Example:
total_runs = 1
4. Mentioning types are optional.
python
localBufferTime: float | int = 5.5
#### Configuration variables
1. All config variables are treated as global variables. They have some extra guidelines.
2. Must have variable setting explanation, and examples of valid values. Examples:
python
# Explanation of what this setting will do, and instructions to enter it correctly
config_variable = "value1" # <Valid values examples, and NOTES> "value1", "value2", etc. Don't forget quotes ("")
python
# Do you want to randomize the search order for search_terms?
randomize_search_order = False # True of False, Note: True or False are case-sensitive
python
# Avoid applying to jobs if their required experience is above your current_experience. (Set value as -1 if you want to apply to all ignoring their required experience...)
current_experience = 5 # Integers > -2 (Ex: -1, 0, 1, 2, 3, 4...)
```python
# Search location, this will be filled in "City, state, or zip code" search box. If left empty as "", tool will not fill it.
search_location = "United States" # Some valid examples: "", "United States", "India", "Chicago, Illinois, United States", "90001, Los Angeles, California, United States", "Bengaluru, Karnataka, India", etc.
```
/config/file./modules/validator.py and add it over there. Example:
For config variable search_location = "" found in /config/search.py, string validation is added in file /modules/validator.py under the method def validate_search().
python
def validate_search() -> None | ValueError | TypeError:
'''
Validates all variables in the `/config/search.py` file.
'''
check_string(search_location, "search_location")### Attestation
1. All contributions require proper attestion. Format for attestation:
python
##> ------ <Your full name> : <github id> OR <email> - <Type of change> ------
print("My contributions 😍") # Your code
##<
2. Examples for proper attestation:
New feature example
``python
##> ------ Sai Vignesh Golla : godsscion - Feature ------
def alert_box(title: str, message: str) -> None:
'''
Shows an alert box with the giventitleandmessage`.
'''
from pyautogui import alert
return alert(title, message)
##< ```
Bug fix example
``python
def alert_box(title: str, message: str) -> None:
'''
Shows an alert box with the giventitleandmessage`.
'''
from pyautogui import alert
##> ------ Sai Vignesh Golla : saivigneshgolla@outlook.com - Bug fix ------ return alert(message, title) ##< ```
summary, cover_letter(Summary, Cover letter); checkbox type questions (acknowledgements)$ claude mcp add Auto_job_applier_linkedIn \
-- python -m otcore.mcp_server <graph>