Open-source project
wodsuz/EasyApplyJobsBot avatar
wodsuz/EasyApplyJobsBot

EasyApplyJobsBot: a Selenium bot that submits LinkedIn Easy Apply applications from a config file

A python bot to automatically apply all Linkedin,Glassdoor, etc Easy Apply jobs based on your preferences. Auto login, auto fill additional questions, apply automatically!

820 stars224 forksPythonNOASSERTION

At a glance

What is it?
EasyApplyJobsBot is a Python and Selenium script that logs into LinkedIn, runs your saved search filters and clicks through Easy Apply forms automatically. It is a free, self-hosted tool with a paid successor product, and its fit depends on whether you accept the platform risk that comes with automating a LinkedIn account.
Who is it for?
Adopt EasyApplyJobsBot only if you are comfortable running an unattended script against your own LinkedIn session and can read config.py and additionalQuestions.yaml before the first run. Skip it if you need a supported product with documentation, if you cannot accept the risk of account restrictions, or if you expect the repository to be the commercial version; the README points to www.apllie.com for that.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository last received commits 121 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

What EasyApplyJobsBot automates, and for whom

The repetitive part of a job search on LinkedIn is not finding postings, it is filling the same Easy Apply form dozens of times: phone number, years of experience, work authorization, salary expectation, then a set of custom questions the employer added. EasyApplyJobsBot targets exactly that loop. The README describes it as "A python bot to apply all Linkedin Easy Apply jobs based on your preferences", and the repository topics list LinkedIn, Glassdoor, Indeed, ZipRecruiter and AngelCo among the boards it is meant to cover. The primary audience is a single job seeker running the script on their own machine with their own account, not a recruiting team or an agency submitting at volume. The README also states that this repository is the free version and that a pro version lives at www.apllie.com, so anyone evaluating it should read it as a free tier of a commercial product rather than a community project with a roadmap. That framing matters: the README spends more space on the rebrand to Apllie, donation links and paid installation support than on how the bot decides which jobs to apply to.

How the Selenium loop and the YAML question file fit together

The architecture is visible from the repository layout. linkedin.py is the entry point, and the Dockerfile ends with CMD ["python3", "linkedin.py"], so the container runs that script directly. Supporting modules are constants.py and utils.py, configuration lives in config.py, and the answers to application questions live in additionalQuestions.yaml. The dependency list is short and tells you the mechanism: selenium, webdriver_manager, selenium-stealth and pyyaml. There is no API client and no headless HTTP scraping layer, so the bot drives a real browser through WebDriver, which is why the Docker image installs google-chrome-stable and a long list of X11 and GTK libraries. selenium-stealth is included to reduce the fingerprint signals that automated browsers emit. The data flow implied by docker-compose.yml is: credentials and search preferences come from config.py, the bot logs in and reuses a session stored under /app/cookies, it walks the Easy Apply flow, answers what it can from additionalQuestions.yaml, and writes results into /app/data. The README describes the unanswered-question cycle explicitly: export unanswered questions to a txt file, enter answers there, and next time the bot will use these values. That two-pass design is the most interesting part of the project, because it treats the question set as something you curate over time rather than something the bot guesses. The README also mentions a pro feature that answers unanswered questions with AI, which confirms that in this free version the fallback is manual.

Installing EasyApplyJobsBot with Docker and running a first search

The README calls the Docker path the recommended installation and says it handles all dependencies automatically. The prerequisites it lists are Docker and Docker Compose. Start by cloning the repository and entering the directory:

bash
git clone https://github.com/wodsuz/EasyApplyJobsBot
cd EasyApplyJobsBot

The next step in the README is to edit config.py and enter your LinkedIn credentials on lines 7 and 8. The compose file mounts that file into the container, so you do not need to rebuild the image after changing it:

yaml
volumes:
  - ./data:/app/data
  - ./cookies:/app/cookies
  - ./config.py:/app/config.py
  - ./additionalQuestions.yaml:/app/additionalQuestions.yaml

Those four mounts are the whole state of the bot. /app/data holds application results, /app/cookies holds the login session, and the two files are your inputs. The Dockerfile itself creates the directories the container expects:

dockerfile
RUN mkdir -p /app/data /app/cookies

The Dockerfile sets DISPLAY=:99 and the compose file repeats it, and the compose file carries a commented HEADLESS=true line for running without a visible browser. The README notes two ways to use the bot, one with your password and one without credentials stored. The bot writes its results into /app/data, and any question it could not answer is what you then fill into additionalQuestions.yaml for the next run.

The account and maintenance risks you are taking on

This is automation of a logged-in LinkedIn session, and the README does not document any rate limiting, application cap, or delay schedule that would keep the bot inside normal human usage patterns. The documentation is silent on what happens when LinkedIn presents a CAPTCHA, an email verification challenge, or a changed Easy Apply form layout. Nothing in the README describes rollback, deduplication, or a dry-run mode, so there is no documented way to preview which jobs the bot would apply to before it submits. Given that the bot can submit applications in your name, the absence of a documented dry run is the single most important gap. The README also warns that there are forked or similar-looking versions of the bot distributing scam and phishing donation links, and tells users to check the logo on each crypto payment page and to confirm they are on www.apllie.com. That warning is about the wider ecosystem around the project, but it is a real operational risk: a fork of a credential-handling script is a natural place to hide a credential stealer. The licence field on the repository is NOASSERTION, meaning GitHub could not classify it, and the README grants fork and modification rights only with credit and without changing the donation links. Anyone planning to modify and redistribute it needs to read the LICENSE file directly rather than assume an OSI licence.

Where EasyApplyJobsBot is the wrong tool

If your applications go through employer portals rather than LinkedIn Easy Apply, this bot does not help. The README lists Greenhouse and GlobalLogic among the supported sites, but the mechanism is still a browser driving a form, so any application that requires a cover letter, a portfolio upload, or a multi-page employer questionnaire will stall on the questions it cannot answer. The other case is volume. A user who wants to apply to a handful of carefully chosen roles each week gets little from a bot whose value is repetition; the setup cost of reading config.py, curating additionalQuestions.yaml and watching the first runs exceeds the manual effort. The third case is anyone who needs support or a stable interface. The README routes documentation, modifications and business enquiries to help@apllie.com, and sells one-hour installation calls and written documentation per platform. That is a commercial support model attached to a free script, not a project with public issue triage described in the README. Finally, the last push to the repository was on 2026-05-18, roughly four months before this writing, so the code has not been touched recently enough to assume it tracks current LinkedIn markup.

EasyApplyJobsBot compared with writing your own Selenium script

The realistic alternative is not another bot, it is a short Selenium script you write yourself. The difference is where the complexity sits. EasyApplyJobsBot ships a config.py, an additionalQuestions.yaml schema, a Dockerfile with Chrome and all its X11 dependencies, a compose file with four volume mounts, and a two-pass question workflow. A personal script would skip the YAML layer and hardcode your answers, skip the container and run against your local Chrome, and skip the cookie volume because you would log in interactively each time. What you lose by going custom is the question-export cycle and the multi-board coverage the README claims. What you gain is that you can read every line that touches your credentials, add a dry-run that logs the job titles before clicking submit, and stop worrying about whether a fork you cloned is the real one. For a one-off job search, the custom script is the smaller commitment. EasyApplyJobsBot makes sense when you are running the same search across several boards over weeks and want the answer file to accumulate instead of being rewritten.

Maintenance, upgrades and licence status

The repository is not archived, and the last push was on 2026-05-18. There are no releases retrieved, so there is no versioned upgrade path: you track the main branch or you pin a commit yourself. Dependencies are unpinned floors in requirements.txt (selenium>=4.0.0, webdriver_manager>=3.8.0, selenium-stealth>=1.0.0, pyyaml>=5.1), which means a fresh docker compose build can pull newer Selenium or webdriver_manager versions than the code was written against. The Dockerfile pins the base image to python:3.11-slim and installs google-chrome-stable from Google's repository without a version pin, so the browser can change under a fixed codebase. For upgrade cost, the practical answer is that you rebuild and re-run the first search manually whenever you pull, because the README documents no test suite or smoke command. On licensing, the repository field says NOASSERTION and the README states the free version may be forked and modified with credit and without changing the donation links. That is a source-available arrangement described in prose, not a standard licence identifier, so treat redistribution and commercial use as questions for the LICENSE file and, if it matters to your organisation, for a lawyer. Nothing here should be read as legal advice.

Editorial conclusion

Adopt EasyApplyJobsBot only if you are comfortable running an unattended script against your own LinkedIn session and can read config.py and additionalQuestions.yaml before the first run. Skip it if you need a supported product with documentation, if you cannot accept the risk of account restrictions, or if you expect the repository to be the commercial version; the README points to www.apllie.com for that. Verify first that the Dockerfile builds on your machine, that the data and cookies volume mounts are writable, and that the questions the bot cannot answer land in the export file before you let it run a full search.

Frequently asked questions

Does EasyApplyJobsBot store my LinkedIn password?

The README says there are two options, one with a password and one that stores no credentials. The Dockerfile and docker-compose.yml show a cookies volume at /app/cookies, which is where the login session is persisted between runs.

How do I install EasyApplyJobsBot?

The README recommends the Docker path, which needs Docker and Docker Compose. You clone the repository, edit config.py with your credentials on lines 7 and 8, and run the compose setup described in the README.

What do I do about questions EasyApplyJobsBot cannot answer?

The README describes exporting unanswered questions to a txt file, entering the answers there, and the bot using those values on the next run. The answers are kept in additionalQuestions.yaml, which docker-compose.yml mounts into the container.

Which job boards does EasyApplyJobsBot support?

The README lists LinkedIn, Glassdoor, AngelCo, Greenhouse, Monster, GLobalLogic and Djinni, and the repository topics add Indeed and ZipRecruiter. The primary flow described is LinkedIn Easy Apply.

Is EasyApplyJobsBot the same as Apllie?

The README states the project rebranded and that automated-bots.com is now Apllie.com, with this repository described as the free version and the pro version at www.apllie.com. Support and modification requests are routed to help@apllie.com.

Official sources

  1. Issues
  2. Project website
  3. README
  4. wodsuz/EasyApplyJobsBot on GitHub
Community notes

Community notes