Unified Search

One search box across LinkedIn and Seek — your own browser does the fetching, so no API required.

One search across multiple job boards

For the roles I’m after, I have to watch both LinkedIn and Seek. The overlap is only partial — plenty of listings show up on one and never the other — so skipping either isn’t an option, and every search gets run twice.

Unified Search runs it once.
Screenshot
Unified results — LinkedIn and Seek in a single list
One search in the app, results from both sources merged into a single unified set.

The hard half

Search is the valuable part, which is exactly why it’s defended. Listings are the product for both platforms — there’s no API, and collecting them in bulk is what they actively design against. Scraping a single job page you’re already looking at is a different proposition, and that’s the half I built first: Job Tracker.

Owning it taught me the real cost. Markup changes without warning, and when it does the thing fails silently — no error, just nothing. Working out how to survive that was more interesting than the tracker itself, and it made the harder problem worth another look.

The way in was to stop fighting the defences. The browser is already authenticated as me, and both sites send their results as structured data before the page is drawn. So: make the requests a person would make, in that session, at a pace a person could produce — and read the data that’s already there.

Three parts

Architecture diagram
Executor → Brain → Store, with the Seek fallback branch
How the pieces fit: the extension fetches, the web app searches and streams, the Worker stores.
Executor
Chrome extension

Lives in the browser because that’s where the session is. Paced fetch loops, per-source dedup, descriptions on demand.

Brain
Web app

Search console, streams unified results. Holds no credentials and does no fetching, so it can be hosted anywhere.

Store
Cloudflare Worker + D1

Saved jobs, notes, pipeline stages.

Where it’s up to

The thing I set out to validate works: one search in the app runs across both LinkedIn and Seek and comes back as a single unified set of results.

It’s built on the assumption that both sites will change without warning, so when something breaks it tells me which platform, rather than just quietly returning nothing.

Ideas I want to explore next

  • Self-healing.

    Right now it tells me it’s broken and I go and fix it. The more interesting version works out what changed and repairs itself.

  • A brain that knows what I’m looking for.

    It currently returns what I asked for. It should learn which roles I open, save, and apply to, then run in the background — collecting and curating rather than waiting to be asked.