terminalhire
local-first · verified via GitHub · you choose what's shared

Jobs that find you — based on what you're building.

Sign in with GitHub for an instant verified profile and rich matches from day one. Or stay fully local — no account required. Your profile never leaves your device unless you explicitly share a lead.

Sign in with GitHub — instant verified profile

scope: read:user · public repos only · never private repos

~/projects/my-applive

Instant rich profile

Your top languages, repo topics, and PR activity become normalized skill tags automatically — no manual profile setup.

Verified identity

GitHub-verified login strengthens lead quality and anti-fraud signals. Recruiters see a confirmed dev identity, not an anonymous upload.

Great matches day one

Without GitHub you start with an empty profile. With it, you get seniority inference, tag population, and top-language signals — immediately.

mechanism

Three steps. Nothing sent you didn't approve.

The broad pool lives on the server. Matching lives on your machine. Data sharing requires your explicit per-opportunity yes.

01recommended

Sign in with GitHub (recommended)

Connect your public GitHub profile — we read only your public repos and languages (scope: read:user, never private repos). Instant verified profile: skill tags, seniority signal, top languages. Great matches on the first run. Skippable — see step 03.

02zero dev-side egress

Match runs on your machine

Run terminalhire jobs. The CLI downloads a compact job index from our server — public data from Greenhouse, Ashby, Himalayas, WWR, and HN. Matching runs entirely on your hardware against your local profile. Our server never sees your stack, your tags, or your identity.

03consent per opportunity

Apply direct or share a named lead

Most roles open the employer's public URL — no data sent, ever. For Coastal-repped roles, terminalhire shows: "Share with Coastal Recruiting LLC? yes/no". Your decision, per opportunity. Prefer no account? Run terminalhire jobs locally without signing in — you just start with an empty profile instead of a pre-populated one.

learning

It gets sharper the more you code.

No résumé to maintain. Your profile is a living reflection of what you actually build — it learns from the projects you're in, on your machine, and never leaves it unless you say so.

Reads the project, not your code

Each session, terminalhire reads the shape of where you are — dependencies, frameworks, languages, file types — and maps it through a closed skill vocabulary. Raw code, file paths, and project names are never used.

Weighted by what you build now

Every tag tracks frequency and recency. What you ship this month outranks what you touched a year ago (30-day half-life), so your matches follow your real, current focus — not a stale résumé.

Deepens locally, every session

Signals accumulate in your encrypted local profile across every project you open. Employer repositories are excluded by default. Nothing is uploaded unless you explicitly opt in.

// ~/.terminalhire/profile.enc — deepens every session, never uploaded
oauth → count 9 · seen today // actively building auth
react → count 7 · seen yesterday // strong recent signal
kubernetes → count 3 · seen 6 weeks ago // fading in relevance
privacy

Your code stays yours. Structurally.

Privacy isn't a policy checkbox. It's enforced by the architecture — matching is local, GitHub scope is read-only public, consent is named and per-opportunity, and the only thing that crosses the wire to a buyer is a narrow approved payload you explicitly created.

Public GitHub only — never private repos

We request only the "read:user" OAuth scope. We read your public repos, languages, and topics. Private repositories, org membership, and commit history are structurally inaccessible. This is enforced at the OAuth app registration level — we cannot request what we did not register.

We never see your code

Matching runs in a local subprocess. The index is public job data. Your profile is encrypted at rest and never uploaded. Source code structurally cannot reach our servers.

Broad pool, matched locally

Greenhouse, Ashby, Himalayas, WWR, HN Algolia — all aggregated server-side into a compact index. The client downloads that index and matches against your local profile. Zero matching egress.

Named-entity consent, not categories

We never ask "share with recruiters?". Every lead action names the specific buyer: "Share with Coastal Recruiting LLC?". You approve that named entity, per opportunity, explicitly.

// the only payload that ever crosses the wire to a buyer
type LeadPayload = {
opportunityId: string // the specific role
buyerLegalName: 'Coastal Recruiting LLC' // named, not a category
approvedFields: { skillTags, seniorityBand, contactEmail }
consentText: string // verbatim prompt shown to dev at approval
// ✗ no source code, no file paths, no employer names, no profile dump
}
audience

Built for engineers who don't job hunt.

the skeptic

Default mode shares nothing. The index is public data. Matching is local. Zero trust required to get value. Skip GitHub entirely if you prefer.

the passive candidate

You're not job hunting — but if the right role appeared in your terminal based on what you actually built this week, you'd look.

the open source builder

Your stack is your signal. Sign in with GitHub and your repos become your profile — languages, topics, PR activity all normalized to closed-vocab skill tags.

the privacy-conscious senior

You want to be found on your terms. Public GitHub only. No private repos. No recruiter spam, no profile on job boards — just a broad pool matched locally, with you controlling every lead.

Your next role is already in your terminal.

Sign in with GitHub for an instant verified profile, or install the CLI and stay fully local. Your choice.