Skip to content

deshanekanayaka/landed

Repository files navigation

Landed

Your waypoint to a UK sponsored role.

Landed is a free, open source platform that helps international students in the UK find visa-sponsored employment.

No login required. No paywalls. No coaching fees.


The problem it solves

The UK Home Office publishes a register of every licensed visa sponsor, over 120,000 employers. It is a public CSV file with no search, no context, and no way to tell whether a company actively sponsors or just holds a dormant licence.

Paid coaches charge £500 to £2,000 to systematise this information for job seekers. Landed makes it free.


What it does

Employer database - Every A-rated UK Skilled Worker sponsor with Certificate of Sponsorship counts. See who is actively sponsoring versus who just holds a dormant licence.

Phase-aware job search - Graduate Visa holders browse any relevant role with a hidden sponsor signal. Those hunting for sponsorship see only confirmed sponsors.

Employer profiles - One page per sponsor answering "Does [Company] sponsor visas UK?" Publicly indexed, no login required.

Salary Threshold Checker - Calculates the Skilled Worker minimum salary for any role by SOC code, with interview guidance anchored to the visa floor.


Technical overview

Stack

Layer Technology
Frontend Next.js 16, TypeScript (strict), Tailwind CSS v4, shadcn/ui
Database Supabase (PostgreSQL), Drizzle ORM
Pipeline Python 3.12, pandas, rapidfuzz, GitHub Actions
Hosting Vercel Hobby
Monitoring Sentry, Uptime Robot, Vercel Web Analytics

Architecture decisions worth noting

Employer-first data model - The database is anchored to verified employers from the Home Office register. Job listings attach to employer profiles, not the other way round. This guarantees sponsorship accuracy and produces SEO-valuable employer profile pages that competitors gate behind logins.

All external API calls happen in GitHub Actions, never at request time - The Home Office register, Companies House, Reed, jobs.ac.uk, and NHS Jobs are all called in scheduled pipelines. Results are cached in Supabase. If any external service goes down, cached data still serves. User-facing latency is always just a database query.

Three-layer pipeline validation - Before processing the Home Office CSV, the pipeline checks: (1) has the GOV.UK metadata timestamp changed since last run? (2) has the file hash changed? (3) does the file pass structural validation? If any check fails, the pipeline exits without touching the database.

Row Level Security at the database layer - Access control is enforced by Postgres RLS policies, not just application code. The anon role can read public tables. Authenticated users can only access their own rows. The pipeline uses a service role key that bypasses RLS and exists only in GitHub Actions secrets, never in client code.

GIN index for fuzzy employer search - pg_trgm with a GIN index enables "Deloitt" to match "Deloitte LLP" by breaking names into trigram chunks. GIN was chosen over GiST because searches happen continuously while pipeline writes happen once daily.

Data pipeline

GOV.UK Content API -> change detection -> Home Office CSV download
     |
Three-layer validation (timestamp, hash, structure)
     |
Upsert into employer_profiles (normalised_name dedup key)
     |
Companies House API enrichment -> canonical name, company number
     |
rapidfuzz entity resolution for unmatched names (>=85 score = match)
     |
Reed API + jobs.ac.uk RSS + NHS Jobs API -> jobs table
     |
pipeline_sync_log audit entry (success | skipped | error)

Database schema

See docs/erd.png for the full entity relationship diagram.

Key design decisions:

  • Salary figures stored in pence (integer) to avoid floating point precision errors
  • is_register_active instead of deletion so profiles persist when employers leave the register
  • listing_source constrained by CHECK constraint at the database level so invalid sources are rejected regardless of where the write originates
  • ON DELETE CASCADE on all child tables so account deletion cleans up all user data automatically, satisfying UK GDPR right to erasure

Running locally

# Clone and install
git clone https://github.com/your-username/landed.git
cd landed
npm install

# Set up environment variables
cp .env.example .env.local
# Fill in your Supabase credentials

# Run the development server
npm run dev

Visit http://localhost:3000.

Available scripts

npm run dev          # Start development server
npm run build        # Production build
npm run type-check   # TypeScript type checking
npm run lint         # ESLint
npm run format       # Prettier

Data sources

Source What it provides Access
Home Office Sponsor Register Licensed sponsors, CoS counts, visa routes Public CSV
Companies House API Canonical company names, company numbers Free, 600 req/5min
Reed Jobseeker API Private sector job listings Free, 1,000 req/day
jobs.ac.uk RSS University and academic roles Public RSS
NHS Jobs API NHS Trust roles Public API
GOV.UK Salary Thresholds Skilled Worker minimums by SOC code Public data

Legal

This platform provides general information only and does not constitute immigration advice. For advice specific to your situation, consult an IAA-registered adviser.

Home Office data and Companies House data are published under the Open Government Licence.


Contributing

Licensed under AGPL-3.0. Pull requests welcome.

If you run a modified version of Landed as a web service, the AGPL requires you to make your modified source code available under the same licence.

About

Free, open-source platform for international students to find UK visa-sponsored jobs

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors