live · visaproof.azamatos.com

Visaproof

Developer jobs in Europe, with the visa answer first, and the evidence for every answer.

role
Everything, alone: the idea, the pipeline, the evaluation, the design and the site
stack
Nuxt · Vue · Postgres · Claude · Node
links
visaproof.azamatos.com (opens in a new tab)Source on GitHub (opens in a new tab)
visaproof.azamatos.com
Visaproof search: developer jobs in Europe grouped by visa answer, with filters for visa, relocation, language and country
A Visaproof job page on a phone: a role that sponsors visas, with its moving and language answers
open software roles in Europe, read from companies’ own boards
14,988
companies hiring engineers, in 42 countries
2,476
job boards found on 8 board types, almost all through Common Crawl
16,098
new roles in the last 24 hours
251

Live from the site’s own data, for the EU, EEA, UK and Switzerland; checked 27 Oct.

01 · the problem

A developer who needs a visa opens fifty postings and searches each one for “visa”. Most never say.

Only 22% of open roles mention visas, relocation, permits or the right to work at all. About 2.4 in 100 clearly offer sponsorship, and 4.7 in 100 refuse it. So for most roles the answer can’t come from the posting: it has to come from the law and the sponsor registers.

  • 2.4% offer visa sponsorship, 366 roles
  • 4.7% refuse it
  • 15% mention visas or relocation, no clear answer
  • 78% say nothing
One square = 1% of open roles

02 · how it works

Read every company’s own job board, keep the engineering roles in Europe, and check each one against the law.

  1. sources

    Company job boards

    Ashby, Greenhouse, Lever, SmartRecruiters, Personio, Recruitee, Workable, Workday. One request per board where the API allows.

  2. every 6 hours

    Pipeline

    Keeps software roles in the EU, EEA, UK and Switzerland; marks each new, changed or closed.

  3. postgres

    Roles and evidence

    Every fact stored with its quote or register entry, and when it was checked.

  4. live

    Website

    Search with the visa answer first, job, company and country pages, the method and its accuracy.

  • weekly

    Discovery

    Common Crawl’s index finds new company boards.

  • daily

    Sponsor registers

    The Dutch IND (13,016 sponsors) and the UK register (122,355).

  • nightly

    Language model

    Reads postings that mention visas and returns facts with exact quotes.

03 · the answer

Yes or no isn’t honest. The visa answer has five levels, and each shows where it came from.

  1. Sponsors visaThe posting says it sponsors visas for this role.evidence: the sentence
  2. May sponsorThe posting hedges: “for certain roles”, “case by case”.evidence: the sentence
  3. Can sponsorThe posting doesn’t refuse, and the law lets this employer hire on a visa: a registered sponsor, or a salary above the Blue Card line.evidence: the register entry or the salary rule
  4. Visa unknownThe posting says nothing, and no register or salary check applies.evidence: a short note on the country’s rules
  5. Won’t sponsorThe posting refuses: “visa sponsorship is not available”.evidence: the sentence
A job page: the visa, moving, language and pay answers, then the quote from the posting and the sponsor-register check behind them
The job page: every answer with its quote, its source and when it was checked.

04 · measured

Keyword rules were wrong on 67% of the postings they marked “offers”. So they never show an answer; a language model does, checked against 200 postings labelled by hand.

“offers visa sponsorship”, on the labelled set

Keyword rules

precision
33%
recall
90%

Language model (Claude)

precision
100%
recall
100%

Precision: of the roles marked “offers”, how many really offer. Recall: of the roles that really offer, how many were found. The rules now only pick which postings the model reads: the 22% that mention visas or relocation. Every quote it returns must be an exact substring of the posting, or it’s dropped.

05 · what the first sweep broke

The first full sweep, on 22 October 2026, read every board Common Crawl knew.

  • 255 boards counted twice

    Case-insensitive slugs and boards served on two domains held 1,050 duplicate roles. One migration merged them.

  • Every EU-hosted Greenhouse board failed

    All 403 of them: the EU API host doesn’t exist. The main API serves them.

  • Rate limits from Workable and Recruitee

    Each Recruitee company has its own subdomain, so requests now queue per site, not per host.

  • 850 roles “changed” on every run

    Workable lists a job once per location under one id. Now it’s one posting with all its locations.

✓ after the fixes, 8 of 2,915 boards failed in the next run, all on the boards’ side

06 · built with

website

  • Nuxt 4
  • Vue 3.5
  • TypeScript
  • Tailwind CSS 4
  • Reka UI

Pages render on the server, and the filters are a plain form, so the search lives in the URL. Own components, with Reka UI for the hard widgets like the phone filter drawer.

server and data

  • Nitro server routes
  • Postgres 18
  • postgres.js
  • plain SQL migrations
  • LRU cache

The site reads Postgres as a read-only user on the same server; answers are cached for 5 minutes, because the data changes every 6 hours at most.

pipeline and AI

  • Node 22
  • Claude
  • DuckDB
  • Common Crawl
  • IND and UK registers

Node runs the TypeScript directly, with no build step. Claude reads the postings that mention visas and must quote them exactly.

running it

  • Docker Compose
  • Caddy
  • Cloudflare
  • systemd timers
  • Telegram alerts

On my own server: a missed run starts at boot, and a broken run sends a message.

quality

  • Vitest
  • Playwright
  • axe
  • ESLint strict
  • GitHub Actions

Precision has to stay at 95% or more on “offers” before a prompt or model change ships.

07 · git log

  1. pipeline, done:reads the boards every 6 hours, alerts in Telegram
  2. evidence, done:labelled set, scorer, extractor, sponsor registers
  3. design, done:six screens on phone and desktop, with every state
  4. website, done:built straight from the design
  5. launch, done:open to search engines, 27 Oct

rules it keeps

  • Only official public feeds: company job-board APIs, Common Crawl’s index, government registers.
  • Doesn’t republish postings: short quotes and facts, then a link to apply on the original.
  • “Unknown” is a valid answer. Sponsorship is never guessed from a company’s size, reputation or another posting.

↑ ↓ move · ↵ run · esc close⌘K anywhere on the site