JobSeek Expat 🌍
JobSeek Expat is a powerful, open-source CLI tool designed to help expats and international job seekers find English-speaking jobs in non-English speaking countries (like Germany, France, Netherlands, etc.).
It scrapes major job boards, filters out local-language requirements, and presents you with a clean, curated list of opportunities.
🚀 Features
- Multi-Platform Scraping: Search LinkedIn, Indeed, and Glassdoor simultaneously.
- Smart Filtering:
- English Only: Automatically detects job description language.
- No "Local Language" Required: Filters out jobs requiring C1/Fluent local language skills (customizable).
- Experience Level: Filter by Seniority (Entry, Mid-Senior, etc. - Best on LinkedIn).
- Flexible Locations: Search multiple cities or "Remote" in your target country.
- Advanced Search:
- Multiple Keywords: Search for "Developer, Designer" in one go.
- Exclusion Lists: Hates specific terms?
--exclude "intern, thesis".
- Output Options:
- Beautiful CLI Tables: Clickable links, color-coded output.
- JSON: Machine-readable format for automation.
📦 Installation
From PyPI (Recommended)
pip install jobseek-expat
From Source
git clone https://github.com/electricalgorithm/jobseek-expat.git
cd jobseek-expat
pip install .
🛠️ Usage
Once installed, the jobseek-expat command (and its short alias je) is available globally.
Generic syntax:
jobseek-expat "KEYWORD" --country "COUNTRY_NAME" [OPTIONS]
# or simply:
je "KEYWORD" --country "COUNTRY_NAME" [OPTIONS]
Examples
1. The Classic Expat Search (Berlin) Find "Software Engineer" jobs in Germany (Berlin) that likely don't require German.
jobseek-expat "Software Engineer" --location "Berlin"
2. Multi-City & Remote Search Search for "Product Manager" in Amsterdam and Remote within the Netherlands.
jobseek-expat "Product Manager" \
--country "Netherlands" \
--location "Amsterdam, Remote" \
--local-language "Dutch"
Note: We specify --local-language "Dutch" so it filters out "Dutch required" jobs.
3. The "Broad Net" Strategy Search for Developer OR Data Scientist roles in France, specifically Paris, excluding internships.
jobseek-expat "Developer, Data Scientist" \
--country "France" \
--location "Paris" \
--local-language "French" \
--exclude "intern, stage, internship" \
--results-wanted 50
Command Line Options
| Option | Alias | Description | Default |
|---|---|---|---|
KEYWORD |
Job title(s) or keywords (comma-separated). Required. | ||
--country |
Target Country (e.g. Germany, France). | Germany |
|
--location |
Specific City/Region (comma-separated). Use "Remote" for country-wide remote. | Whole Country | |
--local-language |
Language to filter out if required (e.g. German, Dutch). | German |
|
--hours-old |
Max age of job postings in hours. | 24 |
|
--results-wanted |
Jobs to fetch per keyword/location. | 20 |
|
--exclude |
Keywords to exclude (title/description). | None |
|
--site |
Sites: linkedin, indeed, glassdoor. |
All 3 | |
--output |
-o |
Format: table or json. |
table |
--verbose |
-v |
Show scraper debug logs. | False |
🤝 Contributing
We welcome contributions! Whether it's adding a new filter, improving the language detection, or supporting more job boards.
- Fork the Project
- Create your Feature Branch
- Commit your Changes
- Push to the Branch
- Open a Pull Request
📄 License
Distributed under the MIT License. See LICENSE for more information.
Built with ❤️ for the global expat community.
Metadata
Release files for jobseek-expat 1.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| jobseek_expat-1.2.0.tar.gz | 62.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| jobseek_expat-1.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 74.3 kB
Release files / jobseek_expat-1.2.0.tar.gz
| Download URL | jobseek_expat-1.2.0.tar.gz |
|---|---|
| Size | 62.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f2bdf9e8702b0c4e4baa6af5574a6cccc0f4021ab1483ff5899f913e8eb423e4
|
|
BLAKE2b-256 checksum How to use checksums |
6f819947d5a906598e149376a1edfb9d96092a5536371c5c8620b77734d88dae
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jan 12, 2026.
Transparency logRelease files / jobseek_expat-1.2.0-py3-none-any.whl
| Download URL | jobseek_expat-1.2.0-py3-none-any.whl |
|---|---|
| Size | 12.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ff5b84cb80f1ffbbd7ee01e9a8715cf9a495073a442653f543ea2ec28e490428
|
|
BLAKE2b-256 checksum How to use checksums |
5e289302073145ef8e87a38f80a7184584cba6f7e86418e8eb100ee0af560f85
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jan 12, 2026.
Transparency log