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.
Unified job search
Connected to executor.
product manager
All Australia
Search
Mid–Senior Posted within a week
LinkedIn: 48 Seek: 31
Showing 79 results — 48 LinkedIn · 31 Seek
LinkedIn Senior Product Manager, Platform 2d ago Save
Northwind Logistics  ·  Sydney, NSW
$180,000 – $200,000 + super
Seek Product Manager — Payments 2d ago Save
Meridian Bank  ·  Melbourne, VIC
$165,000 package
Seek Senior Product Manager, Growth 3d ago Save
Loop Health  ·  Sydney, NSW (hybrid)
LinkedIn Principal Product Manager 4d ago Save
Fairwater Group  ·  Brisbane, QLD
$210,000
One search, both sites, one list. The badge is the only place the source survives — past that, a job is just a job. Roles shown are illustrative.

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

The split isn’t about tidiness. Each line in the drawing below is a decision about where the fragile bit is allowed to live, and what should still work when it breaks.

Web app
Brain
Where I do the searching. It never touches a job board itself, which means I can rewrite it on a whim without going anywhere near the part that breaks.
savea judgement, recorded
Cloudflare Worker + D1
Store
Not a bookmark folder. Every save is a labelled example — this one was worth keeping — and the pile of them is what a version that curates for me would have to learn from.
asked oncethe whole reason any of this exists
answered as it arrivesthe slower site never holds up the faster one
Chrome extension
Executor
The only part that has to live in a browser — so everything fragile is penned into one place. One request at a time, at a human pace: not a throughput decision, a decision about staying welcome.
LinkedIn
Takes what any visitor is already shown — nothing to get around, so nothing to keep getting around.
Seek
Reads what the page already carries, rather than the page it draws. Data doesn’t move as often as layouts do.
A second way in, held in reserve. It has never once been needed. It exists because the day a route closes shouldn’t also be the day the tool stops working.
The failure worth designing for is silence. Every source answers for itself, so a break arrives as “Seek: error” — never as “no jobs today”.
Read it as three decisions rather than three boxes: keep the fragile part in one place, keep everything else replaceable, and keep what I chose to save.

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.