Skip to content
Houtini.
Contact
Our Work

The world's first AI-ready job board and data platform

Any company working in the job-board business knows it: getting those first live listings onto your site is painful, and no listings means no traffic, which means no advertiser revenue. That was the problem I was solving for when we launched our motorsport jobs site, fluidjobs.com. YubHub is the platform we built to fix it, and we run it in public at yubhub.co.

19
ATS platforms scraped into one clean schema
25,000+
live jobs from 900+ employers, enriched on the edge
4 ways
one corpus served at once: web, XML, JSON, live agent tools
The YubHub jobs homepage: thousands of live jobs from hundreds of employers, with search, facets and enriched listings
The live site - our own job platform, jobs enriched on the edge and served to people, boards and agents.

What the chore really is

All the current "job backfill" services tend to be highly indiscriminate. They may claim hundreds of thousands of live listings, but if you're working in a niche like Python development or motorsport, those feeds are all but useless. The reason is that jobs live in a mess: every company posts to a different applicant-tracking system - Workday, Greenhouse, Lever, a dozen others - each with its own markup and its own idea of what a salary field looks like. A feed built to grab everything grabs it badly: duplicates, missing salaries, and a category called "Other" that swallows half the listings.

How I built it

With YubHub, you go the other way. You find an employer whose jobs you'd like to feature, and it discovers, fetches, parses and reformats them with AI before serving them as an XML jobs feed.

The spine is a pipeline of Cloudflare Workers, each one a stage that hands off to the next through a queue: discover the job URLs, scrape the pages, enrich them, then syndicate. Every stage has its own dead-letter queue, so a page that fails to parse drops into a tray to be looked at rather than taking the whole run down with it.

Discovery tries the cheap route first - reading a site's sitemap and learning its URL pattern from a single example job - and only reaches for a heavier crawl when the page is JavaScript-rendered. Scraping leans on Firecrawl with a direct-fetch fallback for the sites that block it. Then nineteen platform-specific extractors - Workday, Greenhouse, Lever, Ashby, SmartRecruiters, iCIMS, BambooHR and the rest - each know how to read their own system, tried URL-first and falling back to HTML markers.

The enrichment is where a raw page becomes data. A model running on Cloudflare's own Workers AI - Llama 4 Scout, which won a structured-output bake-off against the alternatives - reads each listing and returns a clean record: title, company, a structured salary with currency and period, required and preferred skills, category, industry, experience level, work arrangement, even a properly-formed postal address. Company logos get cached to R2 so the pages stay fast.

The first time we onboarded a big site - 721 jobs in a burst - roughly 77% of the AI enrichments came back silently truncated. No error, just half a record. The fix wasn't a bigger model, it was capping the enrichment worker to two jobs at once. At concurrency two, truncation went to zero.

Four ways from one store

Every enriched job lands in a single Cloudflare D1 database, and from that one store the same corpus goes out four different doors at once. There's the website, for a person. There's a JBoard-format XML feed, for another board to import. There's a jobs.json feed where every entry is a schema.org JobPosting, for a search engine or an AI. And the feeds are free, and sliced by facet: pull one by category, by industry, by skill, by job title or by company - roughly 660 of them, cached at the edge - as XML, JSON or an RSS alert a job-seeker can follow. All free, no login.

Built for agents, not just crawlers

Most sites are, at best, readable by an AI. YubHub is actuatable by one. It ships a WebMCP implementation - one of the first on a live recruitment site - so an agent running in the browser doesn't have to scrape the page, it gets real tools: search jobs, browse by facet, open a listing, build a shortlist. Nine of them, some registering only on the page they're relevant to, all cleaned up the moment you navigate away so an agent never holds a stale handle. Underneath sits the machine-readable surface a serious agent expects: a .well-known/mcp.json describing the tools, an OpenAPI spec, agent-skill files, an llms.txt, and a clean markdown version of every single job. The site is built on the assumption that its next big audience isn't only human.

One footgun from that build: the first version of the shortlist tool let an agent filter by salary and, on jobs where the salary was unknown, happily reported "pays over £X". A confident answer resting on a missing field. It now refuses to make that claim unless the number is there - a strict flag that fails closed. When you hand an agent a tool, its wrong answers are your wrong answers.

The deep end

A platform this size will eventually break in a way that hides, and ours did. Rankings slid for weeks with no obvious cause - new pages simply stopped getting indexed. The deploy pipeline had silently frozen nine days earlier: the site had crossed Cloudflare Pages' hard 20,000-file deployment ceiling and couldn't publish anything, while a category-page redirect loop quietly told Google to drop pages. Root-caused and cleared in a single session by moving the heavy programmatic pages to render on request - 21,000-plus build files down to about 700, and the ceiling stopped mattering. A 356-URL statistical audit afterwards came back with zero residual errors, and the site ships with a build-failure alarm now, so a silent freeze can't happen twice.

Where it stands

Live, running on its own, and a lovely thing to look at. Jobs come in hourly, get enriched on our own edge, and go out as pages, feeds and agent tools without anyone touching the routine path. It's us doing for our own product the thing we do for clients: take a messy real-world data source and turn it into something people, other people's software, and now other people's agents can all use.

Method

Cloudflare Queues pipeline - discovery → Firecrawl scrape → Workers-AI (Llama 4 Scout) enrichment - into D1, syndicated as faceted XML/JSON/RSS feeds and live WebMCP tools + .well-known manifests for agents.

If this looks familiar

If you run a job board, or your business sits on data that other people's software - and increasingly other people's agents - need to consume in a shape you don't control yet, we should speak.