docs: update README sources table and drop retired sciCORE watcher references

This commit is contained in:
2026-09-18 11:50:39 +02:00
parent 288b8bdcd1
commit 3875f13713
+13 -15
View File
@@ -1,13 +1,14 @@
# linkme # linkme
A personal job-hunting pipeline for the Swiss market. It scrapes LinkedIn (plus a handful of Swiss boards), filters out everything that doesn't fit the profile in `cv/polo.md`, appends what survives to a CSV, and pushes the good ones to Telegram twice a day. A personal job-hunting pipeline for the Swiss market. It scrapes LinkedIn (plus a handful of Swiss boards), filters out everything that doesn't fit the profile in `cv/polo.md`, appends what survives to a CSV, and pushes the good ones to Telegram throughout the day.
Two things run on their own once installed: One thing runs on its own once installed:
| automation | when | what it does | | automation | when | what it does |
|---|---|---| |---|---|---|
| **daily digest** | 08:00 + 18:00 | fetch every search, push new profile-matching jobs to Telegram | | **daily digest** | 09:00 / 12:00 / 15:00 / 17:00 / 20:00 | fetch every search + source, push new profile-matching jobs to Telegram |
| **sciCORE watch** | 08:47 | alert if sciCORE's open-positions page lists a *software* role |
sciCORE used to have its own separate 08:47 watcher; it's now just another source swept inside `bun fetch`/`bun daily` (see Sources below).
## Quick start ## Quick start
@@ -40,13 +41,13 @@ Then `bun daily --dry-run` prints the digest instead of sending it, and `bun dai
``` ```
config.ts # keyword families, search areas, the sweep() generator config.ts # keyword families, search areas, the sweep() generator
fetch.ts # LinkedIn scraper, HTML parser, all title/content filters fetch.ts # LinkedIn scraper, HTML parser, all title/content filters
fetch-other.ts # the eight non-LinkedIn sources (see Sources below) fetch-other.ts # the ten non-LinkedIn sources (see Sources below)
index.ts # orchestrator: run searches → dedupe → content-check → CSV index.ts # orchestrator: run searches → dedupe → content-check → CSV
recheck.ts # raw-mode fetch: lists what the filters dropped recheck.ts # raw-mode fetch: lists what the filters dropped
daily.ts # digest: fetch, match against the profile, send to Telegram daily.ts # digest: fetch, match against the profile, send to Telegram
profile.ts # title-level scoring — decides what's worth a notification profile.ts # title-level scoring — decides what's worth a notification
telegram.ts # Telegram delivery + --setup chat-ID discovery telegram.ts # Telegram delivery + --setup chat-ID discovery
scripts/ # one-off searches (*-temp.ts) and scicore-watch.sh scripts/ # one-off searches (*-temp.ts); scicore-watch.sh kept for history, retired
cv/polo.md # the profile everything is ranked against cv/polo.md # the profile everything is ranked against
results/jobs.csv # output, one row per job results/jobs.csv # output, one row per job
results/sent.txt # links already pushed — never sent twice results/sent.txt # links already pushed — never sent twice
@@ -67,6 +68,8 @@ LinkedIn is swept by `config.ts`'s search families. Everything else lives in `fe
| **datacareer.ch** | Basel | 8 jobs on one page, no pagination | | **datacareer.ch** | Basel | 8 jobs on one page, no pagination |
| **stellen-basel.ch** | Basel region | WordPress REST API | | **stellen-basel.ch** | Basel region | WordPress REST API |
| **Basel intl orgs** | Basel | BIS (via the UNjobs mirror), Swiss TPH, Basel Institute on Governance | | **Basel intl orgs** | Basel | BIS (via the UNjobs mirror), Swiss TPH, Basel Institute on Governance |
| **scicore.unibas.ch** | Basel | sciCORE's open-positions announcement list; used to be its own separate 08:47 watcher, now just another source |
| **swisscom.com** | Switzerland | Swisscom's own Workday career site, pulled via its public CXS JSON API; small board and mostly German-language, so few survive the filters |
Two of these were dead until recently and are worth knowing about: Two of these were dead until recently and are worth knowing about:
@@ -165,21 +168,16 @@ bun run scripts/luzern-temp.ts
## Scheduling ## Scheduling
Both automations are launchd agents, not cron — this machine has no cron at all. The digest runs as a launchd agent, not cron — this machine has no cron at all.
```bash ```bash
launchctl list | grep -E 'linkme|scicore' # are they loaded? launchctl list | grep linkme # is it loaded?
launchctl unload ~/Library/LaunchAgents/com.rafapolo.linkme-daily.plist # stop the digest launchctl unload ~/Library/LaunchAgents/com.rafapolo.linkme-daily.plist # stop it
launchctl unload ~/Library/LaunchAgents/ch.polo.scicore-watch.plist # stop the watcher
``` ```
If the Mac is asleep at the scheduled time, launchd runs the job once it wakes rather than skipping the day. If the Mac is asleep at the scheduled time, launchd runs the job once it wakes rather than skipping the day.
Logs: `results/daily.log` for the digest, `results/.scicore-watch/watch.log` for the watcher. The watcher logs every run — `no change`, `change ignored`, or the diff it sent — so silence on your phone can always be told apart from a broken script. Test its alert path without waiting for the real page to change: Logs: `results/daily.log`.
```bash
SCICORE_URL="file://$PWD/fixture.html" bash scripts/scicore-watch.sh
```
## recheck ## recheck