Setting Up Your Search
Tune where Seekter looks for jobs: search queries, title filters, LinkedIn job alerts by email, the companies whose career sites it watches, and which job boards to visit.
/seekter-init writes your job search for you from your answers: the search queries, the title filters and the LinkedIn job alerts to create. The job boards and the companies to watch it doesn't ask you to name: it shows the ones that fit your country and field, and you keep what you want. This page is for when you want to see what it wrote, or change it.
Everything about you lives in profile/profile.md. Every switch and number the search runs on lives in profile/settings.json. Both are git-ignored, and both are plain files you can edit by hand at any time.
The Settings File
profile/settings.json starts as a copy of templates/settings.json, where every key is documented next to its default. A key you leave out falls back to the template, so a half-finished setup still runs.
To see what's still on a default and whether anything required is missing:
node scripts/seekter.mjs settings --check
It prints one problem: line for each thing that needs fixing. A run checks the same thing first and stops on a real problem, so you never find out halfway through.
Guardrails are never settings. Nothing in this file can make Seekter solve a CAPTCHA, create an account or fill LinkedIn Easy Apply.
Where the Jobs Come From
Every run goes through the same four steps, in this order:
| Step | Source | What you set |
|---|---|---|
| 0 | Your links, pasted in chat or in profile/links.txt | Nothing. Bring them and they go first. |
| 1 | API sweeps: freehire, Jobicy, your employer watchlist and the monthly Hacker News "Who is hiring?" thread | freehire and employers |
| 2 | LinkedIn: your job-alert emails | linkedin.searches and the alerts themselves |
| 3 | Other boards, each at its own cadence | boards |
Finding postings is cheap and filling forms is the work, so a run sweeps every source before it fills a single form.
Queries and Regions
The freehire block is the main API sweep:
queries: your target titles, unquoted. Quotes cut what a search finds; Seekter searches wide and filters afterwards.categories: freehire's own categories. A discipline is usually spread over several, so list each one.regionsandhome_country: which remote scopes count for you.window_days: how far back a sweep looks.
To see which categories your field falls into and how many postings each holds:
curl -A seekter 'https://freehire.me/api/v1/jobs/facets?q=product+designer'
languages lists the languages you work in. A posting that requires any other one is skipped, even when it's fully remote.
Title Filters
Two regular expressions decide which titles are worth opening:
title_keep: the title families you're after.title_drop: wrong seniority, wrong discipline, and the other industries that use your job title.
That last part matters more than it sounds. Most job titles are shared with an unrelated industry that posts more often. A product designer's drop list ends up with words like graphic, industrial, interior and fashion. Start with what /seekter-init writes, and add false positives as runs turn them up.
LinkedIn Job Alerts
By default Seekter never opens LinkedIn. It reads the job-alert emails LinkedIn sends you, then finds each posting on the employer's own application form.
Seekter can't create alerts; you set them up on LinkedIn. Each row of linkedin.searches is one alert to create, delivered by Email to the inbox Seekter reads. /seekter-init lists them for you at the end.
- Narrow beats broad. A digest mail shows only about six postings and links to the rest on LinkedIn. Several narrow alerts lose almost nothing to that cap; one broad alert loses most of its matches.
- Keywords unquoted. Quotes cut recall.
- LinkedIn doesn't merge title variants. Each variant your field uses needs its own alert.
- The Remote filter hides hybrid and on-site roles. Where you could also work on-site, add a second alert without it.
Reading LinkedIn itself is a separate opt-in with its own risk. Guardrails explains the two modes.
The Employer Watchlist
Some companies are worth watching directly. Seekter reads their public job board on every run, so a posting is seen before any aggregator copies it. Setup fills this list from the shared catalog on the Companies page; Company Career Sites explains how it picks them and how to add your own. They are stored under employers:
"employers": [
{ "name": "Acme", "ats": "greenhouse", "slug": "acme" },
{ "name": "Globex", "ats": "ashby", "slug": "globex" }
]
ats is one of greenhouse, ashby, lever, workable, smartrecruiters, recruitee, personio, teamtailor, peopleforce, pinpoint or workday. The slug is the board's own id, the part of its address after the system's domain (jobs.ashbyhq.com/<slug>). Check the list with:
node scripts/employer_sweep.mjs
Read the first sweep after adding a row. Recruitee, Personio and Workday report a slug that doesn't exist, but SmartRecruiters answers an unknown company with an empty list, so a typo there looks like a company with no openings. Pick companies that hire remotely where you live, or that sponsor visas where you'd move.
Job Boards
boards lists the other job boards for your field and how often each is worth a visit (daily, weekly). Setup shows the ones that fit your country and field; Job Sites has the whole list. reference/sources/ has one file per board that has been measured, with what its filters really do.
Before adding a board, read reference/sources/dead-and-low-value.md. Most of the obvious candidates are already in it: paywalls, search boxes that ignore the search term, and boards that have closed.
One Application per Company
same_company_days (30 by default) holds a company once you've applied there. Some application systems let an employer auto-reject further applications to a department inside a window, and the candidate is never told. A second role at the same company can be a silent loss.
A company with a live interview or an offer stays held whatever the date. A link you bring yourself overrides the hold, and the report says so.
same_company_exempt lists companies the hold never applies to: employers large enough that one team's hiring says nothing about another's, such as Amazon or Google. It is empty until you add one. A posting there is still checked against your earlier applications, so the same role posted again is caught.