The problem
A UK limited-company contractor should not have to wade through general boards filtering out permanent and inside-IR35 roles. The deeper problem is repetition: the same compliance pack — certificate of incorporation, VAT number, insurance, right to work, CV, day rate, references — re-sent to every agency, over and over.
What it does
An outside-IR35-only board showing day rate, work mode, contract length and the client’s attributed IR35 signal on the card, plus day-rate benchmarks, a take-home model, saved searches with alerts, and a compliance profile whose checkable parts are verified against official registers and shared in one click.
How it's built
A legal constraint encoded as architecture
Only the end client can determine IR35 status, so the platform is liable for anything it asserts. The classifier’s schema is deliberately narrower than the database enum — a scraped listing can only ever be "client intends outside", "inside" or "unknown", because the stronger states need an attestation a scrape cannot give. Unknown is the first-class default, behind a positive-allowlist query gate and a visibility backstop column.
Lexical and semantic search fused by rank
Two rankers run in parallel: Postgres full-text over a weighted tsvector behind a GIN index, and vector cosine similarity behind an HNSW index. Because their scores are not comparable, they are fused by rank using Reciprocal Rank Fusion — implemented as a pure, unit-tested function — and degrade gracefully when one side is unavailable.
LLM for navigation, deterministic parsing for data
One target is an Angular single-page app. Rather than ask a model to read the rendered page, the scraper uses an agent only to drive the UI — dismiss the cookie gate, switch job type, run the search — then attaches a response listener to capture the underlying XHR and parses that fragment deterministically with unit tests. The model handles the part that changes; the parser handles the part that must be right.
A validator that rejects generated content rather than fixing it
Every generated article is checked before it can be written: a forbidden-phrase list (including the abolished regulator, because citing it signals stale IR35 knowledge), a required disclaimer, and a requirement that it cites a primary government source actually retrieved during research. Failures are rejected, not patched.
The hard part
The product’s core value proposition is also its biggest liability, and the repo treats that as an engineering problem rather than a copy problem. It reasons from two legal pillars — only the end client can determine status, and a pure listing platform sits outside the fee-payer tax chain — down into enums, a restricted classifier schema, a default of unknown, a SQL-level allowlist, and a rejecting content validator. It also names the corollary: adding matching, vetting or payment handling would start moving the platform toward the part of the chain that carries liability.
Stack
- Next.js
- React Native
- Expo
- Browserbase Stagehand
- Anthropic
- Perplexity
- Stripe
- RevenueCat
Built, shipped and maintained by me. Try Outside IR35 Jobs, or see the rest of the work.
