A local, privacy-first web app for finding real jobs, ranking them against your skills, opening employer application pages, and tracking your progress.
The app is designed especially for students and early-career applicants. It includes Singapore-first ranking and related-role searches for mechatronics, robotics, automation, controls, PLC, embedded systems, and other engineering roles.
Important: this project does not blindly submit applications. It queues selected jobs and opens the real employer pages for you to review. Resume upload, answers, consent, and final submission remain under your control.
- Search by industry, role, company, country, career level, date, job type, and work arrangement.
- Use JSearch through RapidAPI for broader job coverage, including listings surfaced from major job platforms.
- Fall back to free, no-key sources: Remotive, Jobicy, and Arbeitnow.
- Expand mechatronics searches to related engineering roles in one request.
- Prioritize Singapore, student-friendly roles, match quality, and recency.
- Upload PDF, DOCX, or TXT resumes and calculate deterministic skill matches.
- Save profile details, application notes, follow-up dates, and status changes.
- Export the application tracker as CSV.
- Cache identical searches in SQLite for six hours to reduce API usage.
- Display observed RapidAPI usage and remaining requests when the API provides rate-limit headers.
- Optionally fill common contact fields with the included Chrome extension.
- Install Python 3 if it is not already installed.
- Double-click
start_job_apply_bot.cmd. - The app opens at
http://127.0.0.1:8000. - Double-click
stop_job_apply_bot.cmdwhen you want to stop it.
The launcher automatically looks for pyw, pythonw, py, or python, so it
does not depend on a specific username or Python installation folder.
python -m pip install -r requirements.txt
python server.pyThen open http://127.0.0.1:8000 in a browser. Press Ctrl+C in the terminal to
stop the server.
- Python 3.10 or newer recommended
- A modern web browser
- Internet access for live job searches
pypdf>=5.0for PDF resume text extraction
The server and web app otherwise use Python's standard library and plain HTML/CSS/JavaScript. DOCX and TXT resume extraction do not require extra packages.
The app works without an API key, but the free fallback boards are mostly remote and software focused. For better country-specific and engineering results:
- Create or sign in to a RapidAPI account.
- Find JSearch and subscribe to an available plan.
- Open Set RapidAPI key on the app's home screen.
- Paste the value of your
X-RapidAPI-Keyand select Save.
On Windows, a key saved through the interface is encrypted with Windows DPAPI
for the current user. The key is stored under the ignored data/ directory and
is never returned by the configuration API.
You can instead provide the key only for the current terminal session:
$env:RAPIDAPI_KEY = "your-key-here"
python server.pyThe environment variable takes priority over the saved configuration. On
non-Windows systems, using RAPIDAPI_KEY is recommended because DPAPI is a
Windows-only feature.
API plans and quotas can change. A normal full search requests up to three pages in one JSearch HTTP call. Cached searches use zero additional requests; select Refresh jobs only when fresh results are needed.
- Choose an industry and optionally enter a role, company, and country.
- Adjust Student Mode filters and search.
- Add your skills or upload a readable resume to enable match scores.
- Select jobs, or leave everything unselected to target all visible jobs.
- Select Prepare & Open to queue the jobs and open up to 15 employer pages.
- Review each employer form, attach your resume, answer required questions, and submit it yourself.
- Update each item in the tracker and add notes or a follow-up date.
- Export the tracker to CSV whenever you need a backup.
Browser popup settings can limit how many application pages open at once. Jobs that do not open remain queued in the tracker.
The extension fills recognized empty contact fields from the local profile. It skips passwords, checkboxes, radio buttons, hidden fields, file inputs, and submit buttons. It never clicks Submit.
- Start the Job Apply Assistant.
- Double-click
install_chrome_extension.cmd. - In
chrome://extensions, enable Developer mode. - Select Load unpacked and choose the
extensionfolder. - Open an employer application page, select the extension, and choose Fill this page.
- Review every filled value before continuing.
Some forms use custom components or cross-origin frames, so no autofill tool can reliably fill every site. Resume files must always be selected manually.
- The server binds only to
127.0.0.1; it is not exposed to the local network. - Profile details, resumes, applications, API configuration, and cached jobs
stay under
data/on your computer. data/,.env, virtual environments, caches, and generated files are excluded by.gitignore.- Search terms are sent to the selected job providers so they can return jobs.
- Employer pages receive information only when you enter it or deliberately run the optional autofill helper on that page.
- The app does not upload a resume to an employer, answer screening questions, agree to terms, or submit an application for you.
Before publishing a fork, verify that data/ and .env are not selected for
upload. If a real credential was ever committed, remove it from Git history and
rotate it at the provider; deleting only the latest copy is not enough.
To erase local app data, stop the server and delete the data folder. It will
be recreated automatically the next time the app starts.
job_apply_bot/
├── server.py # Local HTTP server, APIs, storage, and job sources
├── requirements.txt # PDF extraction dependency
├── start_job_apply_bot.cmd # Portable Windows launcher
├── stop_job_apply_bot.cmd # Stops this project's server process
├── install_chrome_extension.cmd # Opens Chrome extension setup
├── static/
│ ├── index.html # Web interface
│ ├── styles.css # Responsive styling
│ └── app.js # Search, matching, tracker, and profile UI
├── extension/
│ ├── manifest.json # Chrome Manifest V3 configuration
│ ├── popup.html
│ ├── popup.css
│ └── popup.js # User-triggered safe text-field autofill
├── tests/
│ └── test_server.py # Storage, filtering, matching, and workflow tests
└── data/ # Private runtime data; created locally and ignored
python -m unittest discover -s tests -vThe tests use temporary directories and do not read or overwrite your real profile, resume, applications, key, or cache.
- Confirm that Python 3 is installed and available as
pyorpython. - Run
python server.pyin a terminal to see the startup error. - If port 8000 is already used by another program, stop that program before launching this app.
The free fallback sources contain mostly remote/software roles. Configure a valid RapidAPI key with an active JSearch subscription, broaden the role, clear the company filter, and try again.
Identical searches are cached for six hours. Use Refresh jobs to bypass the cache or Clear cache to remove all cached searches.
Install the dependencies from requirements.txt, then upload the PDF again.
You can also enter skills manually or use a DOCX/TXT resume.
Allow popups for 127.0.0.1, or open the remaining queued jobs individually
from the tracker. The app intentionally caps each batch at 15 tabs.
The clean upload folder prepared with this project contains only the source, documentation, tests, and launchers. It intentionally excludes private runtime data and generated caches.
For GitHub's web uploader:
- Open your target repository and choose Add file → Upload files.
- Open the prepared
Job Apply Bot - GitHub Uploadfolder. - Press
Ctrl+Ainside that folder and drag the selected contents onto the GitHub upload page. - Confirm that
README.md,.gitignore,server.py,static,extension, andtestsare present, whiledatais absent. - Enter a commit message and select Commit changes.
Do not upload the outer folder as a ZIP if you want GitHub to display the source files directly; drag the folder's contents instead.
Use job-provider data and employer sites in accordance with their terms, robots policies, and rate limits. Avoid duplicate or low-quality submissions. Always verify that a role is genuine and that the application destination is trusted before sharing personal information.