Skip to content

Job Board

A two-sided board where candidates get the whole site and employers get one section and a price. Listings grouped by craft, each with a real salary range and the interview process published.

6 routes6 pages · 28 blocks45 files · 6,441 lineslucide-reactAdded 14 Sept 2026

What's included

  • app/faq/page.tsx
  • app/globals.css
  • app/jobs/[slug]/page.tsx
  • app/layout.tsx
  • app/not-found.tsx
  • app/page.tsx
  • and 10 more files
  • 6 pages it is built from, installed with it
  • Needs lucide-react

Works with

  • React
  • Next.js
  • Tailwind CSS
  • TypeScript

npx hoverlab init job-board ./my-app

Or over MCP, from your editor's agent — no account needed.

License

Free to read, copy and install, for personal and non-commercial projects. Shipping it in client work or a paid product needs Pro ($79 once). The source lands in your repo and stops being ours — no attribution, nothing to upgrade.

Was this useful?

Every screen

Every job here has a salary on it

1,340 live roles from 286 companies hiring directly. No agencies, no “competitive salary”, and no account needed to apply.

Popular
1,340
Live roles
Every one with a salary range
286
Employers
Direct only, no agencies
19 days
Median time to hire
Posted to offer accepted
0
Recruiter spam
Your profile is not sold

Four rules, applied to every listing

They are why postings get rejected and why the board is smaller than the big ones. That is the trade, and it is deliberate.

  • A salary range, or it does not go up

    Not "competitive", not "DOE", and not a range so wide it is meaningless. We reject about one posting in six on this rule alone, and we tell the employer why.

  • No agencies, ever

    Every listing is posted by the company doing the hiring. You will never apply through a middleman who cannot answer a question about the team.

  • Remote means remote, with the countries named

    "Remote" that turns out to mean one time zone and a visa you do not have wastes a fortnight. Employers list the countries they can actually employ in.

  • The process is published before you apply

    Number of stages, whether there is a take-home, how long it is, and whether it is paid. On the listing, not in an email after the first call.

Hiring? £199 for thirty days

One price, one listing, shown the same way as everybody else’s. No subscription and nothing to cancel — and we will tell you before it goes live if the range needs work.

  • Reviewed by a person within one working day
  • Expires after 30 days unless you confirm it is still open
  • Refunded in full if we reject it

How this board works

For both sides, since the rules are the product and they only work if everyone knows them.

Something wrong with a listing?

Every posting has a report link and it reaches a person, not a queue. Salary bands that look wrong are the report we act on fastest.

Report a listing
Is it really free for candidates?

Yes, and there is no account required to browse or to apply — applications go straight to the employer’s own system. We make money from employers posting, which is the only model where our incentives and yours point the same way.

Why do some listings have a wide salary band?

Usually because the role spans two levels. We allow a band up to about 35% wide and reject anything broader, because past that the number stops being information. If a band looks wrong to you, the report link on every listing reaches a person.

Will my details be sold to recruiters?

No. There is no candidate database to sell — we do not have one. Applications are passed to the employer and nothing is retained beyond a count. This is the main reason the board exists.

How do I know a listing is still open?

Every posting expires after 30 days unless the employer confirms it is live, and the date it was last confirmed is on each listing. Roughly a fifth of postings lapse this way each month, which is the point.

Can I get new roles by email?

One email a week, filtered to the crafts and countries you pick, and unsubscribing is one click from any of them. No "we miss you" emails, and the list is never rented.

I am an employer. What does it cost?

£199 for a 30-day posting, or £1,490 for ten to use over a year. No subscription, no annual contract, and no upsell to a "featured" slot — every listing is shown the same way.

Live components in your current theme — switch routes, or the phone icon to check the mobile layout. Colours are this template’s Foundry palette, which ships in app/globals.css. Desaturated indigo, nearly a slate, with a small radius. Iris occupies a neighbouring hue at twice the chroma; this one is what that colour looks like when the page is a list of other people’s jobs rather than a product.

Get it

45 files · .zip · nothing to configure · Pro

then

cd job-board
npm install
npm run dev

The archive contains the whole project — routes, blocks, theme tokens, Tailwind and PostCSS config, tsconfig and a .gitignore. One runtime dependency, and no Hoverlab dependency at all: it is your code from the moment it unzips.

For AI

The component, its props, the design tokens it expects and the command that installs it — as one prompt. Paste it into Claude, Cursor, v0 or ChatGPT and what they build around it will match the rest of the catalog instead of inventing its own system.

See the prompt

Routes

PathPageFile
/Job Boardapp/page.tsx
/jobs/[slug]Job Listingapp/jobs/[slug]/page.tsx
/postSingle Offerapp/post/page.tsx
/searchSearch Resultsapp/search/page.tsx
/faqFAQ Pageapp/faq/page.tsx
404404 Pageapp/not-found.tsx

What you get

project root(8 files)

  • GETTING-STARTED.md
  • gitignore
  • next.config.ts
  • package.json
  • postcss.config.mjs
  • README.md
  • tailwind.config.ts
  • tsconfig.json

app/(8 files)

  • faq/page.tsx
  • globals.css
  • jobs/[slug]/page.tsx
  • layout.tsx
  • not-found.tsx
  • page.tsx
  • post/page.tsx
  • search/page.tsx

components/(29 files)

  • applied-filters-bar.tsx
  • article-header.tsx
  • booking-scheduler.tsx
  • cookie-consent.tsx
  • cta-inline-card.tsx
  • cta-split-panel.tsx
  • customer-outcome-band.tsx
  • faq-categorized.tsx
  • faq-search.tsx
  • faq-two-column.tsx
  • feature-icon-grid.tsx
  • feature-rows.tsx
  • footer-minimal.tsx
  • footer-newsletter.tsx
  • hero-price-anchor.tsx
  • hero-search.tsx
  • job-listing-board.tsx
  • multi-step-form.tsx
  • navbar-simple.tsx
  • not-found-404.tsx
  • pricing-value-split.tsx
  • product-info-accordion.tsx
  • product-spec-split.tsx
  • recent-search-list.tsx
  • review-distribution-band.tsx
  • search-facet-panel.tsx
  • search-results-panel.tsx
  • stats-band.tsx
  • theme-provider.tsx

Every file is listed. The 28 files in components/ are the blocks the pages import — each one has its own page if you want to read it on its own.

Project files

Everything except the blocks. Opens on app/globals.css — the file that makes the rest look right, since every block styles itself with bg-card and text-muted-foreground rather than literal colours.

app/globals.css
@tailwind base;
@tailwind components;
@tailwind utilities;

/**
 * Design tokens — the Foundry palette.
 *
 * Desaturated indigo, nearly a slate, with a small radius. Iris occupies a neighbouring hue at twice the chroma; this one is what that colour looks like when the page is a list of other people’s jobs rather than a product.
 *
 * This file is the reason a pasted block looks right. Every block and page
 * styles itself with semantic classes — `bg-card`, `text-muted-foreground`,
 * `border-border` — rather than literal colours, so they inherit whatever
 * you define here instead of fighting it. Change a value below and every
 * section in the project moves with it. Change the hue on `--primary` and
 * `--ring` together and you have rebranded the site.
 *
 * Values are bare HSL channels, not `hsl(...)` calls. That is what lets
 * Tailwind compose them with an alpha suffix: `bg-primary/10` expands to
 * `hsl(var(--primary) / 0.1)`, which is impossible if the variable already
 * carries its own function wrapper.
 *
 * Every foreground/background pair below clears WCAG AA (4.5:1) in both
 * themes. If you retune one, check the pair rather than trusting the eye —
 * mid-lightness accents are the ones that fail.
 */

@layer base {
  :root {
    --background: 250 17% 99%;
    --foreground: 250 35% 9%;
    --card: 0 0% 100%;
    --card-foreground: 250 35% 9%;
    --popover: 0 0% 100%;
    --popover-foreground: 250 35% 9%;
    --primary: 250 35% 34%;
    --primary-foreground: 0 0% 100%;
    --secondary: 250 17% 96%;
    --secondary-foreground: 250 35% 20%;
    --muted: 250 12% 96%;
    --muted-foreground: 250 12% 42%;
    --accent: 232 35% 95%;
    --accent-foreground: 232 35% 22%;
    --destructive: 0 72% 45%;
    --destructive-foreground: 0 0% 100%;
    --border: 250 12% 90%;
    --input: 250 12% 90%;
    --ring: 250 35% 34%;

    --radius: 0.25rem;
  }

  .dark {
    --background: 250 35% 5%;
    --foreground: 250 15% 97%;
    --card: 250 32% 8%;
    --card-foreground: 250 15% 97%;
    --popover: 250 32% 8%;
    --popover-foreground: 250 15% 97%;
    --primary: 250 45% 72%;
    --primary-foreground: 250 35% 8%;
    --secondary: 250 25% 15%;
    --secondary-foreground: 250 15% 97%;
    --muted: 250 25% 15%;
    --muted-foreground: 250 12% 68%;
    --accent: 232 30% 18%;
    --accent-foreground: 232 35% 92%;
    --destructive: 0 62% 52%;
    --destructive-foreground: 0 0% 100%;
    --border: 250 22% 19%;
    --input: 250 22% 19%;
    --ring: 250 45% 72%;
  }
}

@layer base {
  * {
    @apply border-border;
  }

  body {
    @apply bg-background text-foreground antialiased;
  }

  /**
   * Global motion opt-out.
   *
   * Blocks guard their own animations with Tailwind's `motion-safe:`, but
   * third-party CSS and anything you add later will not. This is the
   * backstop: it neutralises every animation and transition on the page
   * for users who have asked the OS for reduced motion, rather than
   * relying on each author to remember.
   */
  @media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
      animation-duration: 0.01ms !important;
      animation-iteration-count: 1 !important;
      transition-duration: 0.01ms !important;
      scroll-behavior: auto !important;
    }
  }
}

More Marketing

Open the full page for this template

Marketing Site

A pricing page that answers the objection

Landing page, pricing page, 404. The smallest thing you can put in front of a product and have it look deliberate.

3 routes3 pages13 blocksVermilion
Pro
Open the full page for this template

Content Site

The article at a real measure

A publication that happens to belong to a company: blog index, article, careers and a 404. The site for when the writing is the product — or the marketing.

4 routes4 pages10 blocksInk
Pro
Open the full page for this template

Docs Site

The three-column docs frame

The three-column docs frame — sidebar, article, on-this-page rail — plus a changelog and a 404. The part of the product a search for an error message should find.

3 routes3 pages6 blocksAzure
Pro
Open the full page for this template

Help Centre

Search that answers before the ticket

The support surface, as four routes that agree with each other: searchable answers, the docs, what changed, and a status page carrying the same incident the help page announces.

5 routes5 pages13 blocksRose
Pro
Open the full page for this template

Developer Portfolio

The terminal that introduces you

An engineer’s site rather than a designer’s: a terminal hero, thirty legible lines of real code on the home page, the projects, the writing and a CV that prints.

8 routes8 pages26 blocksPhosphor
Open the full page for this template

Personal Résumé

A CV that prints properly

A minimal personal site whose home page is the CV itself — printable, indexable, and therefore the copy that actually gets maintained. Five routes, warm paper, square corners.

6 routes6 pages17 blocksLinen
Pro
Open the full page for this template

Crypto Exchange

The live price rail

A regulated exchange, front to back: a moving price rail, a public markets screen, the custody facts, the fee schedule and the risk warning as a section rather than as small print.

8 routes8 pages30 blocksVault
Pro
Open the full page for this template

Conference Site

The agenda across three tracks

An event site built around a date: the ticket price step-up above the hero, a two-day programme across three tracks, speakers, venue and a code of conduct.

7 routes7 pages25 blocksMarquee
Pro
Open the full page for this template

Restaurant

The menu, typeset as a bill of fare

A dining room’s whole site: hours and phone above the fold, the menu typeset as a bill of fare, a real reservation flow, the room and the way to find it.

7 routes7 pages24 blocksLaurel
Pro
Open the full page for this template

Estate Agency

Map and results, scrolling apart

Property search with results already in it, a listing page that puts tenure and EPC above the prose, the agents, and a valuation route for the other half of the business.

6 routes6 pages23 blocksHeath
Open the full page for this template

Open Source Project

The install command, before anything else

A project site for a library: install command above the hero, the API in twenty lines, docs, changelog, roadmap, community, and who funds it said plainly.

7 routes7 pages21 blocksCarbon
Pro
Open the full page for this template

Directory

Facets that are not categories

A faceted index with a listing page that compares each entry against its alternatives, a paid submission route, and a published removal rate.

6 routes6 pages29 blocksMulberry
Pro
Open the full page for this template

Streaming Service

The watch screen, on the marketing page

A subscription video service: catalogue rails, a real watch screen with chapters and a transcript, one plan at one price, and the account behind it.

6 routes6 pages20 blocksNocturne