Skip to content

Repository files navigation

Job Apply Assistant

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.

Features

  • 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.

Quick start on Windows

Easiest method

  1. Install Python 3 if it is not already installed.
  2. Double-click start_job_apply_bot.cmd.
  3. The app opens at http://127.0.0.1:8000.
  4. Double-click stop_job_apply_bot.cmd when 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.

Run from a terminal

python -m pip install -r requirements.txt
python server.py

Then open http://127.0.0.1:8000 in a browser. Press Ctrl+C in the terminal to stop the server.

Requirements

  • Python 3.10 or newer recommended
  • A modern web browser
  • Internet access for live job searches
  • pypdf>=5.0 for 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.

Job sources and RapidAPI setup

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:

  1. Create or sign in to a RapidAPI account.
  2. Find JSearch and subscribe to an available plan.
  3. Open Set RapidAPI key on the app's home screen.
  4. Paste the value of your X-RapidAPI-Key and 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.py

The 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.

Typical workflow

  1. Choose an industry and optionally enter a role, company, and country.
  2. Adjust Student Mode filters and search.
  3. Add your skills or upload a readable resume to enable match scores.
  4. Select jobs, or leave everything unselected to target all visible jobs.
  5. Select Prepare & Open to queue the jobs and open up to 15 employer pages.
  6. Review each employer form, attach your resume, answer required questions, and submit it yourself.
  7. Update each item in the tracker and add notes or a follow-up date.
  8. 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.

Optional Chrome autofill helper

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.

  1. Start the Job Apply Assistant.
  2. Double-click install_chrome_extension.cmd.
  3. In chrome://extensions, enable Developer mode.
  4. Select Load unpacked and choose the extension folder.
  5. Open an employer application page, select the extension, and choose Fill this page.
  6. 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.

Privacy and security

  • 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.

Project structure

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

Run the tests

python -m unittest discover -s tests -v

The tests use temporary directories and do not read or overwrite your real profile, resume, applications, key, or cache.

Troubleshooting

The app does not open

  • Confirm that Python 3 is installed and available as py or python.
  • Run python server.py in a terminal to see the startup error.
  • If port 8000 is already used by another program, stop that program before launching this app.

No Singapore or engineering jobs appear

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.

A search shows old results

Identical searches are cached for six hours. Use Refresh jobs to bypass the cache or Clear cache to remove all cached searches.

PDF matching is unavailable

Install the dependencies from requirements.txt, then upload the PDF again. You can also enter skills manually or use a DOCX/TXT resume.

Employer pages do not all open

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.

Publishing this project on GitHub

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:

  1. Open your target repository and choose Add file → Upload files.
  2. Open the prepared Job Apply Bot - GitHub Upload folder.
  3. Press Ctrl+A inside that folder and drag the selected contents onto the GitHub upload page.
  4. Confirm that README.md, .gitignore, server.py, static, extension, and tests are present, while data is absent.
  5. 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.

Responsible use

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.

About

Local, privacy-first job search and application tracker. Aggregates JSearch and free job boards, ranks roles against your resume, and opens real employer pages — it never auto-submits. Singapore-first ranking with mechatronics role expansion.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages