Work

Python-Scraping-Pipeline und Browser-Extension für intelligente Job-Suche

Job Finder — Automated Vacancy Scraper

Vollautomatisches Python-Tool, das täglich Stellen von 6 Quellen scrapet, sie nach 6 Komponenten bewertet und Top-20 in Google Sheets exportiert — gestartet um 09:00 via GitHub Actions.

Manuelles Job-Hunting ist Chaos: täglich 5–6 verschiedene Plattformen, Hunderte irrelevante Stellen, manuelles Filtern nach Stack, Typ, Level. Dieses Tool automatisiert den gesamten Prozess und liefert einmal täglich die besten Treffer mit Bewertungen direkt in eine Google Tabelle.

Highlights

  • Sammelt Stellen von 6 Quellen (RemoteOK, WeWorkRemotely, HackerNews, Adzuna, StepStone, XING) parallel im async-Modus; Stack-Extraktion aus Freitext mit FlashText (200+ Terme, O(n)).
  • 6-Komponenten-Scoring pro Stelle: Stack-Match, TF-IDF-Profil-Ähnlichkeit, Remote-Typ, Stoppwörter, Vertragstyp, Entry-Threshold — SHA256-Deduplizierung mit Run-to-Run-State-Tracking.
  • Exportiert Top-20 täglich in Google Sheets mit Farbkodierung und Score-Aufschlüsselung; automatischer Start um 09:00 Uhr via GitHub Actions CI.
  • 130 Tests, >80% Coverage; Python 3.11+, async/await, Pydantic v2, httpx, feedparser, BeautifulSoup4, scikit-learn (TF-IDF), gspread.

Impact

  • 6 job sources scraped in parallel async mode daily
  • 130 tests, >80% coverage on scoring and aggregation pipeline
  • Top-20 delivered to Google Sheets with color-coded scores
  • Zero manual filtering — full pipeline from source to export

Tech-Stack

Python 3.11asyncioPydantic v2httpxBeautifulSoup4feedparserscikit-learnFlashTextgspreadGitHub Actions

LinkedIn Job Assistant — Browser Extension

Chromium-Extension (Manifest V3), die Stellenkarten auf LinkedIn direkt im Browser mit Farbcodes und Scores annotiert — ohne Scraping, ohne Server-Anfragen an LinkedIn.

LinkedIn Jobs ist die größte Plattform, aber ohne smarte Filterung für den eigenen Profil-Stack. Jede Karte manuell öffnen, Beschreibung lesen, entscheiden — das übernimmt die Extension direkt im LinkedIn-Interface, ohne deren Server zu berühren.

Highlights

  • Liest den DOM der bereits geladenen LinkedIn-Seite (kein Scraping, keine Klicks) — LinkedIn kann diese Aktivität nicht erkennen; Chromium/Edge, Manifest V3, MutationObserver.
  • Fügt farbige Badges direkt auf Stellenkarten ein: 🟢 87 | C#, .NET — Score sichtbar ohne Öffnen der Karte; vollständiger Score-Breakdown in geöffneter Stelle mit erkanntem Stack und Red Flags.
  • Zwei Scoring-Modi: leichtes Batch-Scoring für Karten-Listing (4 Komponenten), vollständiges Scoring für geöffnete Stelle (alle 6 Komponenten via ScoreAggregator).
  • Lokaler FastAPI-Server auf localhost:8765 — der einzige Netzwerkaufruf geht zum eigenen Rechner; verwendet vollständig den Scoring-Engine aus Job Finder (dieselben Scorer, Extraktoren, profile.yaml). Jest-Tests für JS, pytest für Server.

Impact

  • Zero LinkedIn server requests — DOM-only approach undetectable
  • Real-time badge scoring on all visible job cards in listing
  • Shared scoring engine with Job Finder — single profile.yaml, zero duplication
  • Full scoring breakdown per vacancy: 6 components, matched stack, red flags

Tech-Stack

JavaScriptManifest V3MutationObserverFastAPIuvicornPythonJestpytest