Repository navigation
v0.5.0 β jobs.ch & jobup.ch: every Swiss industry
v0.5.0 β jobs.ch & jobup.ch: every Swiss industry, one search away
Two new boards, one new platform, still zero runtime dependencies.
New: the JobCloud platform π¨π
jobs.ch and jobup.ch β
Switzerland's two biggest job boards, every industry, ~50,000 postings β
now sit next to the six devitjobs tech boards. Eight boards, seven countries,
one tool.
They work differently, and the tool is honest about it:
- Search-driven. The inventory can't be mirrored (the API caps at 20
rows/page and 2,000 results per query), so your query runs server-side,
newest first:sdj list "pflegefachfrau" --country jobsch. Without a query
you get the newest postings only. --category itkeeps the all-industry boards in tech β mapped to each
board's own taxonomy (jobs.ch and jobup.ch run different id trees).- No salary data exists on this platform; rows render
βinstead of
pretending. - No native apply. Every posting routes to the company's own ATS, so
direct-applyandapply_to_jobanswerno_native_applywith the real
apply URL β nothing gets silently black-holed.
Board selectors
A country now holds more than one board, so selectors grew up β everything
old keeps working:
sdj list --country ch # ALL Swiss boards: swissdevjobs + jobs.ch + jobup.ch
sdj list --country jobsch # exactly one board
sdj config --countries ch,de # persist any mix of codes and board idsMCP search_jobs mirrors this (country accepts codes and board ids, plus
the new category param), and rows now carry a source field naming their
board.
For board authors
The whole contract for adding a board now lives in
docs/adding-a-board.md:
BoardPort + an anti-corruption layer, registry entry, done. Board requests:
#5.
Also
strip_htmlnow unescapes HTML entities (jobs.ch templates carry literal&)- Cached details rehydrate through their own board's ACL (was hardwired to devitjobs)
- 210 offline tests, 92% branch coverage, CI on Python 3.9 + 3.14
Full Changelog: v0.4.1...v0.5.0