← All work

OPEN SOURCE / DEVELOPER TOOLS

Jobsearch.
A sieve, not a robot.

A local-first job-search assistant that reads postings, checks each against your CV and preferences, and produces a shortlist that tells you why — with the exact quoted requirement behind every verdict. Nothing is sent, applied to, or submitted. Ever.

OPEN SOURCE / MITPYTHON 3.10+ / SQLITEv1.0.0 / PYPI
PRODUCT

Local-first job sieve

MY ROLE

Problem framing, design, implementation, review

THE QUESTION

How can a job search be honest about what it doesn't know?

Conceptual flow, not a live execution trace.

01 / THE PROBLEM

Job search is 90% reading and rejecting.

Alert emails carry a title, a company, a location, and a link — never a description. Most tools either scrape aggressively (and get blocked) or hallucinate a verdict from the title alone. Neither is honest.

I wanted a sieve that refuses to guess: a posting it cannot read is needs_research, not a pass or a rejection.

02 / MY CONTRIBUTION

Design the gate, then test it.

I shaped the problem, the matching rules, the data model, and the release decisions. AI tools performed much of the implementation and review. My role centered on the requirements, the system behavior, the evaluation, and the decisions that should remain human-controlled.

03 / THE ARCHITECTURE

A small local tool, not a hosted platform.

Python 3.10+, SQLite, PyYAML. No LLM in the verdict path — the gate is deterministic rules, each citing the quoted requirement it evaluated. Four account-free sources feed one ledger. Descriptions are fetched politely (one at a time, stops on 429, retries with backoff). Nothing is sent or applied.

There is no auto-apply, no mail transport in the decision path, and no browser automation. Those are intentional boundaries, not missing features.

04 / HOW IT WORKS

Prepare evidence before a decision.

01 / Ingest

Alert emails and source feeds become ledger rows. Idempotent: re-running adds zero rows.

02 / Enrich

Fetch each posting page once. A page that cannot be read stays incomplete.

03 / Gate

Each posting is evaluated against your profile: stack, location/auth, years, pay. Verdict: strong match, potential match, needs research, or not suitable.

04 / Decide

You approve, reject, research, or save — bound to one job. Decided jobs never re-appear.

For installation and reproducible commands, use the maintained Jobsearch source repository or pip install jobsearch-pipeline.

05 / EVIDENCE

Measured checks, bounded claims.

574 tests, all deterministic (no bare assert, runs under python -O). A leak scan, an export gate, a history audit, and a GitHub Actions workflow with Trusted Publishing to PyPI. The PyPI page and v1.0.0 release notes record what was measured and the remaining limitations.

Browse the code and documentation ↗

06 / LIMITATIONS & NEXT

Honesty is a process, not a label.

The four sources are tech-leaning; non-tech roles are underrepresented. The gate's strongest signal ("technology held") is software-specific. Compensation is quoted and flagged, never converted at an invented rate. Real-network fetches are tested with injected fetchers, not live endpoints.

Jobsearch is MIT licensed and open to reviewed contributions. Its public issues document unresolved problems.