Applymatic is a Python job application automation tool that scrapes job listings and automatically submits applications on your behalf. Built with Playwright and Streamlit, it currently supports LinkedIn Easy Apply — handling multi-page forms, caching answers, and matching your profile to form fields so you never type the same answer twice. If you've been looking for a Playwright LinkedIn scraper or a reliable way to automate job applications at scale, Applymatic is built for that, with more platforms on the way. It runs cross-platform across Windows, Mac, and Linux.
- Scrapes job listings — currently supports LinkedIn; searches by keyword, location, distance, date posted, and Easy Apply filter
- Auto-fills and submits Easy Apply forms — handles text inputs, dropdowns, radio buttons, location autocomplete, and multi-page applications
- Caches your answers — saves responses to
questions.jsonso repeated questions are answered automatically - Matches your profile — maps
profile.jsonfields (name, phone, salary, work authorization, years of experience by technology) directly to form fields - Three operating modes:
- Scrape only — find and save jobs to CSV without applying
- Scrape and apply — search then immediately apply in one run
- Apply from CSV — apply to a saved list of jobs at any time
Applymatic supports two browser connection modes to reduce the chance of platforms flagging your activity:
- Connect to existing browser (recommended) — attach to an already logged-in Chrome or Edge instance via Chrome DevTools Protocol (CDP). LinkedIn sees your normal browser profile, cookies, and session history.
- Launch new Chromium instance — Playwright launches a fresh browser with a realistic user agent. Sessions are saved to
session.jsonafter first login so subsequent runs skip the login step.
Requirements: Python 3.8+ installed on your machine.
1. Clone the repo:
git clone https://github.com/yourusername/applymatic.git
cd applymatic2. Create and activate a virtual environment:
Windows:
python -m venv venv
venv\Scripts\activateMac / Linux:
python3 -m venv venv
source venv/bin/activate3. Install dependencies:
pip install -r requirements.txt4. Install the Chromium browser:
playwright install chromium5. Run the app:
streamlit run app.pyOpen your browser at http://localhost:8501
On first run, Applymatic automatically creates a profile.json file in the project folder. Open it and fill in your details — this is what gets mapped to application form fields:
{
"first_name": "Jane",
"last_name": "Doe",
"email": "jane@example.com",
"phone": "5551234567",
"phone_country_code": "1",
"location": "New York, NY",
"linkedin": "https://linkedin.com/in/janedoe",
"desired_salary": "100000",
"work_authorization": "Yes",
"requires_sponsorship": "No",
"notice_period": "2 weeks",
"gender": "Prefer not to say",
"veteran_status": "No",
"disability_status": "No",
"years_experience_default": "2",
"years_experience_technologies": {
"python": "3",
"javascript": "2"
},
"default_answer": "No"
}LinkedIn uses a numeric Geo ID to identify locations. To find yours:
- Go to linkedin.com/jobs
- Type your city in the Location bar and select it
- Copy the number after
geoId=in the URL
Example:
https://www.linkedin.com/jobs/search/?geoId=90000070
→ Geo ID for New York City is 90000070
Paste this into the Geo ID field in the app's Search Parameters section.
applymatic/
├── app.py # Core logic, browser management, Playwright orchestration
├── ui.py # Streamlit UI
├── applyClass.py # Batch apply logic with stall detection
├── formFiller.py # Form detection and field filling
├── loginClass.py # Login handler with session persistence
├── questionCache.py # Caches Q&A and manages profile.json
├── toolbox.py # URL builder, scraper, CSV utilities, human delay
└── requirements.txt # Python dependencies
The following files are in .gitignore and are never committed to the repo:
| File | Contents |
|---|---|
cred.json |
Login credentials |
profile.json |
Your personal info |
jobs.csv |
Scraped job listings |
questions.json |
Cached application answers |
locations.json |
Geo ID cache |
session.json |
Saved browser session |
This tool interacts with LinkedIn in ways that may violate their Terms of Service. Your account could be restricted or banned. Use at your own risk. The author is not responsible for any consequences resulting from its use.
linkedin-automation job-search playwright python streamlit easy-apply job-bot career-automation linkedin-scraper job-application-bot