Career mode and ATS import
Turn SwiftJobs into one company's career site, and import jobs from Greenhouse, Lever or Ashby.
Career mode
SwiftJobs runs as a job board by default. In career mode it becomes one company’s career site:
- The home page becomes a careers page with the company’s open roles grouped by team.
- The navigation shows About instead of Companies.
- The company directory and the paid posting flow are turned off. Their URLs send visitors to the company profile and the job list.
- Only that company’s jobs are listed.
Turn it on in src/config/site.ts:
const DEFAULT_MODE: SiteMode = 'career';
const DEFAULT_CAREER_COMPANY = 'kova-health'; // an id in companies.json
Or set it at build time, which is handy for a second deployment from the same repository:
SWIFTJOBS_MODE=career SWIFTJOBS_CAREER_COMPANY=kova-health npm run build
Import jobs from your ATS
Instead of writing markdown files, SwiftJobs can import jobs at build time from the public job board API of your applicant tracking system. No API key is needed.
| Provider | Board token example |
|---|---|
| Greenhouse | boards.greenhouse.io/acme |
| Lever | jobs.lever.co/acme |
| Ashby | jobs.ashbyhq.com/acme |
Configure it in src/config/site.ts:
const DEFAULT_ATS: AtsConfig | null = {
provider: 'greenhouse',
board: 'acme',
company: 'acme', // a company id in companies.json
country: 'US', // used when a posting does not say
};
Or at build time:
SWIFTJOBS_ATS=greenhouse:acme SWIFTJOBS_CAREER_COMPANY=acme npm run build
What gets imported
- Title, location, description (cleaned HTML), posting date and application link.
- Pay: Greenhouse pay transparency ranges, Lever
salaryRange, and Ashby salary compensation. Greenhouse does not say whether a range is yearly; SwiftJobs treats it as yearly, which matches how pay transparency ranges are published. - Field, level, job type and workplace are inferred from the department, team and title. Check the result once and adjust the rules in
src/lib/ats/normalize.tsif your titles are unusual.
Postings without a pay range are skipped, and the build log tells you how many. Postings in a currency that is not in CURRENCIES are skipped too, with a message naming the currency.
Imported jobs link to your ATS for applications, so candidates apply where your recruiters already work.
Keeping jobs fresh
The import runs on every build. Schedule a daily rebuild with your host’s build hook (Netlify and Vercel both support this) or a scheduled GitHub Action.
If the ATS cannot be reached, the build fails rather than publishing an empty job board.
The Greenhouse and Ashby mappings were checked against live public boards. Lever’s pay field follows Lever’s API documentation; we could not find a public Lever board that publishes pay to test against.