How JobHunt uses AI
Two jobs, both of them reading. Everything else in the app is ordinary code — and that is deliberate.
Why use AI at all
A job posting is prose written to be read by a person. The salary might be in the third paragraph, or in a table, or absent. "Remote" might mean remote, or remote-within-one-state, or hybrid three days a week described as remote. No two job boards agree on structure, and the same company posts differently on its own site than on LinkedIn.
That leaves two chores that don't automate with rules. Pulling the facts out — salary band, seniority, work arrangement, the actual requirements — and judging whether you're a fit, which means reading fourteen bullet points against your résumé and deciding which are met, which are partly met, and which are genuine gaps.
People do this by hand at maybe five postings an hour, and get worse at it as the evening goes on. That is the entire case for AI here: it is applied to the reading, and to nothing else.
What the AI does, 1: extraction
One call per captured job
The posting text goes to your chosen model, which returns structured fields: company, title, location, work arrangement, salary band, seniority, and the list of required and preferred qualifications. Those fields are what the Jobs list sorts and filters on.
The posting text is truncated before sending — long postings are capped rather than sent whole.
What the AI does, 2: fit scoring
One call per job, per résumé
The extracted requirements and your résumé text go to the model, which judges each requirement separately — met, partly met, or missing — and must quote the evidence it used from your résumé. The score is computed from those verdicts, not asked for directly.
Requirement-by-requirement is the point. A single number tells you nothing you can act on; a list of what's missing tells you whether to apply, and what to address if you do.
What is deliberately not AI
This is worth as much as the previous two sections, because it is where the app avoids both cost and nonsense.
| Automatic search filtering | A board sweep returns thousands of postings. Every requirement you set — title words, locations, work arrangement, minimum salary, posting age — is checked with plain string and number comparison before any AI call. Only survivors are ever extracted, so a large sweep stays cheap. |
| The evidence check | When the scorer quotes your résumé, JobHunt verifies the quote actually appears in it, by plain text matching. The check on the AI is not itself AI — that's the point. A quote that appears nowhere is flagged rather than trusted, including when the model has quoted the job posting back at you. |
| Duplicate detection | Content hashing across sources. The same role posted on three boards collapses without a model being asked. |
| Salary and location parsing | Deterministic normalisation of what extraction returned, with its own rules about what counts as evidence of pay. |
Prompts you take elsewhere
Separately from the two calls above, any job's Prompt AI menu builds a ready-made prompt from that job and your résumé — a tailored résumé, a cover letter, interview prep, an outreach message, a referral request — for you to paste into ChatGPT, Claude, or whatever you already use.
These are built entirely on your Mac and copied to your clipboard. No API call, no cost, and nothing is sent anywhere by JobHunt. They work identically whether or not you have a provider configured.
Your options: local or hosted
JobHunt has no AI of its own and no server. You point it at a model, and that decision is entirely yours to make.
Local — nothing leaves your Mac
Run LM Studio, Ollama, or anything else that speaks the OpenAI-compatible API on
localhost. Free, private, works offline. Slower than a hosted model, and the quality
depends on the model and your hardware — a small local model will miss requirements a hosted one
catches.
Localhost providers never prompt for consent, because no data leaves the device.
Hosted — faster and more accurate, for cents
OpenRouter, Google, OpenAI, Anthropic, or any OpenAI-compatible endpoint via the Custom option. Scoring a few hundred postings costs on the order of a couple of dollars — see which model to use for measured per-model numbers.
The first time you choose a cloud provider, JobHunt asks for explicit consent and sends nothing until you agree. A Custom provider pointed at a remote URL counts as cloud and is treated the same way.
Configuring it
Everything lives in Settings → AI:
- Provider — LM Studio, OpenRouter, Google, OpenAI, Anthropic, or Custom.
- Base URL — prefilled per provider; the field you change for a local server on a different port, or a custom endpoint.
- Model — a free-text field, not a fixed list. Fetch Models fills it from providers that expose a catalogue, and Use recommended picks a known-good default. Because it's free text, a model retired years from now is replaced by typing the new name.
- API key — stored in the macOS Keychain, never in JobHunt's own database. Not needed for a local model.
- Test Connection — a real round trip, so a wrong key or an unreachable server fails here rather than silently on your first job.
- Timeout and cost pricing — the pricing fields feed a running cost estimate for the jobs you have queued, so the bill isn't a surprise.
Pick OpenRouter, hit Use recommended, paste a key, and press Test Connection. Which AI model should I use? explains that recommendation and what else was measured against it.
What actually gets sent
With a hosted provider: the job description text for extraction, and the description plus your résumé text for fit scoring. That is your employment history going to a third party, which is exactly why the consent prompt exists.
Nothing else is transmitted. There is no JobHunt server, no analytics on your job data, and no telemetry — your database stays a file on your Mac. With a local model, none of it leaves the machine at all. See the Privacy Policy.
Extraction and fit scoring are the only two places JobHunt calls a model. If you find something that looks like a third, it's either the Test Connection button or a copy-out prompt, which never leaves your Mac.