by Stupidoodle
Search & apply to ~4,700 salary-transparent tech jobs across 7 countries (π¨ππ©πͺπ¬π§πΊπΈπ¨π¦π³π±π«π·) from your terminal or AI agent β zero-dependency Python CLI + MCP server + Claude Code plugin
# Add to your Claude Code skills
git clone https://github.com/Stupidoodle/swissdevjobs-cliGuides for using ai agents skills like swissdevjobs-cli.
swissdevjobs-cli is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by Stupidoodle. Search & apply to ~4,700 salary-transparent tech jobs across 7 countries (π¨ππ©πͺπ¬π§πΊπΈπ¨π¦π³π±π«π·) from your terminal or AI agent β zero-dependency Python CLI + MCP server + Claude Code plugin. It has 59 GitHub stars.
swissdevjobs-cli's catalog security scan is still queued. You can run an instant dependency and prompt-injection check now with the "Scan for vulnerabilities" button above.
Clone the repository with "git clone https://github.com/Stupidoodle/swissdevjobs-cli" and add it to your Claude Code skills directory (see the Installation section above).
swissdevjobs-cli is primarily written in Python. It is open-source under Stupidoodle on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh swissdevjobs-cli against similar tools.
No comments yet. Be the first to share your thoughts!
Unlocks once the catalog security scan passes (runs nightly).
β οΈ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
The deep catalog scan for this skill is still queued. Run an instant dependency check now instead.
Search, filter, and apply across 8 job boards in 7 countries β ~4,700 tech jobs with salary data, plus all ~50,000 Swiss postings on jobs.ch & jobup.ch β without leaving your terminal.
π¨π Switzerland Β· π©πͺ Germany Β· π¬π§ UK Β· πΊπΈπ¨π¦ US & Canada Β· π³π± Netherlands Β· π«π· France
Every posting on swissdevjobs.ch β and its five sister boards covering Germany, the UK, the US & Canada, the Netherlands, and France β is required to publish a salary range. That makes them the rare job boards where you can filter by pay before you click. Since v0.5 the tool also searches jobs.ch and jobup.ch β Switzerland's two biggest boards, every industry, ~50,000 postings. One search, eight boards, JSON-first so an LLM agent can drive it.
It also remembers what you've already applied to, across every board, so the same job never shows up twice.
$ sdj list --tech Kubernetes --remote --min-salary 90000 --sort salary
57 shown Β· 57 match filters Β· 5521 in feed Β· 3 hidden (already applied)
----------------------------------------------------------------------------------------
6a60ec82β¦ devitjobs-us p=2026-07-22 Senior Maximo Systems Developer/Integrator TEKsystems c/o Allegis Gr Ottawa USD 208'000β270'400 remote API, Ansible, Bash, ESB, GIS, IBM
6a6cc9bdβ¦ devitjobs-us p=2026-07-31 Senior Solutions Architect TEKsystems c/o Allegis Gr Calgary USD 187'200β228'800 remote AI, API, Architect, Cloud, Docker
| π Eight boards, one tool | The all-IT devitjobs family across six countries, plus jobs.ch & jobup.ch for every industry in Switzerland β one search, per-board currencies |
| π° Salary is a first-class filter | --min-salary 130000 β no more opening 40 tabs to find the range |
| π Real posting dates | The site re-stamps activeFrom when it bumps a listing. This decodes the true creation time from the MongoDB ObjectId, so a "new" job that's actually four months old can't fool you |
| π§ Remembers where you applied | Local SQLite. Applied jobs vanish from list automatically |
| π€ Agent-native | An MCP server plus --json on every command; duplicates come back as data, not errors |
| π¦ Zero dependencies | Python stdlib only. No requests, no pydantic, no supply chain |
| π― Refuses to black-hole your application | Detects postings the site can't actually deliver and tells you where to apply instead |
This talks to somebody else's website, built by a small team who chose to make salary transparency mandatory. Keep your request volume human. Don't strip the caching. Don't fire off applications to postings you haven't read β that wastes a real recruiter's afternoon and poisons the well for everyone using the board honestly.
Read swissdevjobs.ch's terms before you automate anything on top of this.
/plugin marketplace add Stupidoodle/swissdevjobs-cli
/plugin install swissdevjobs@swissdevjobs
That's it. Claude Code prompts for your name, email, and CV path, then starts
the MCP server with uvx β nothing to install first, and no shell profile is
touched. Ask it "find me senior Python roles in Zurich over 140k" and go.
Requires uv on your PATH
(brew install uv, or curl -LsSf https://astral.sh/uv/install.sh | sh).
uv tool install git+https://github.com/Stupidoodle/swissdevjobs-cli
# pipx
pipx install git+https://github.com/Stupidoodle/swissdevjobs-cli
# from a checkout, editable
git clone https://github.com/Stupidoodle/swissdevjobs-cli
cd swissdevjobs-cli
uv tool install -e . # or: pipx install -e .
# no install at all β run it once
uvx --from git+https://github.com/Stupidoodle/swissdevjobs-cli sdj list --remote
Not published to PyPI.
Installs two equivalent binaries: sdj and swissdevjobs. Python 3.9+.
Two platforms, eight boards, one tool. The devitjobs family shares one backend across six countries β identical API, identical apply flow β and the JobCloud platform (jobs.ch, jobup.ch) covers every industry in Switzerland:
| Board | Country | Scope | Currency | Salary data | Direct apply | |
|---|---|---|---|---|---|---|
| π¨π | swissdevjobs.ch | Switzerland | IT | CHF | always | β |
| π©πͺ | germantechjobs.de | Germany | IT | EUR | always | β |
| π¬π§ | devitjobs.uk | United Kingdom | IT | GBP | always | β |
| πΊπΈπ¨π¦ | devitjobs.com | US & Canada | IT | USD | always | β |
| π³π± | devitjobs.nl | Netherlands | IT | EUR | always | β |
| π«π· | devitjobs.fr | France | IT | EUR | always | β |
| π¨π | jobs.ch | Switzerland | all industries | CHF | none | π via ATS |
| π¨π | jobup.ch | Switzerland (Romandie) | all industries | CHF | none | π via ATS |
All boards are searched by default. A selector is a board id (just that one)
or a country code (every board there) β --board, with --source and
--country as accepted aliases:
sdj list --board jobsch # just jobs.ch
sdj list --board de --board uk # just Germany + UK, this once
sdj config --boards ch,de # persist: all CH boards + Germany
sdj config --boards swissdevjobs # persist: one board only
sdj config --boards all # back to everything
sdj boards (and the MCP tool list_boards) prints all of this as data β
no need to memorize which board does what:
$ sdj boards
8 boards β select with --board <id|country>, persist with `sdj config --boards`
----------------------------------------------------------------------------------------------------
swissdevjobs ch SwissDevJobs CHF enabled it Β· salary Β· unfilterable: workload
germantechjobs de GermanTechJobs EUR enabled it Β· salary Β· unfilterable: workload
devitjobs-uk uk DevITjobs UK GBP enabled it Β· salary Β· unfilterable: workload
devitjobs-us us DevITjobs US/CA USD enabled it Β· salary Β· unfilterable: workload
devitjobs-nl nl DevITjobs NL EUR enabled it Β· salary Β· unfilterable: workload
devitjobs-fr fr DevITjobs FR EUR enabled it Β· salary Β· unfilterable: workload
jobsch ch jobs.ch CHF enabled all-industries Β· no-salary Β· search-driven Β· no-native-apply Β· unfilterable: salary, remote, visa, level, tech Β· categories: it
jobup ch jobup.ch CHF enabled all-industries Β· no-salary Β· search-driven Β· no-native-apply Β· unfilterable: salary, remote, visa, level, tech Β· categories: it
jobs.ch and jobup.ch are search-driven. Their ~50k-job inventory can't be
mirrored (the API caps at 20 rows per page and 2,000 results per query), so
they answer your query server-side, newest first β pass free text for real
coverage, and --category it to stay in tech:
$ sdj list "pflegefachfrau" --board jobsch --limit 2 # any industry, server-side
2 shown Β· 100 match filters Β· 100 in feed
----------------------------------------------------------------------------------------
40b2f214β¦ jobsch p=2026-08-25 Dauernachtwache - Dipl. Pflegefachperson HF / FH Stiftung entero Niederlenz β
b5367506β¦ jobsch p=2026-08-25 Dipl. Pflegefachfrau HF/FH mit Fachverantwortung Spital MΓ€nnedorf AG MΓ€nnedorf β
$ sdj list "python" --board ch --category it # CH tech across all three boards
They publish no salary data (rendered honestly as β) and have no native
apply β every posting routes to the company's own ATS, so direct-apply
refuses with the real apply URL instead of pretending.
Native postings on every devitjobs board publish a salary range. Syndicated listings
(marked isPartner by the boards β the majority outside Switzerland) sometimes
carry no range or a single-point figure; the tool renders those honestly and
refuses to native-apply to them, handing you the real ATS URL instead β
their pages have no native apply form, so a native submission would silently
vanish. The applied-jobs ledger is shared β apply to a role on one board and
the same company+role is hidden on all of them.
Want a board outside the family? Open a board request.
Reading jobs needs no configuration at all. Applying needs to know who you are.
sdj