{% extends "base.html" %} {% block title %}Settings — Job Cannon{% endblock %} {% block content %}

Settings

Configure job search preferences, sources, and scoring. Changes persist to config.yaml.

{# F1 — inbox-wiring system check tile #} {% include "settings/_inbox_status_tile.html" %}

Gmail

{% set gmail_senders = config.get('sources', {}).get('gmail', {}).get('senders', {}) %}
{% set sender_fields = [ ('linkedin_alerts', 'LinkedIn Alerts'), ('linkedin_jobs', 'LinkedIn Jobs'), ('glassdoor', 'Glassdoor'), ('indeed', 'Indeed'), ('ziprecruiter', 'ZipRecruiter') ] %} {% for key, label in sender_fields %}
{% endfor %}

{% set imap_cfg = config.get('sources', {}).get('imap', {}) %}

Gmail (IMAP)

Read job-alert emails over IMAP with a Google App Password — the secondary route in addition to (or instead of) the Gmail API. See onboarding for how to generate one at myaccount.google.com/apppasswords.


Job Portals (free)

Niche job-board discovery. When enabled, Job Cannon polls RemoteOK, Remotive, and Himalayas automatically (no key). The portals below each ship as optional — two are keyless (Jobicy, Y Combinator) and three require a free signup (USAJobs, Adzuna, Jooble) in exchange for a generous free tier.

Caps DataForSEO/CSE site: queries

Leave empty to use your target titles.

Keyless portals (no signup)

USAJobs — US federal jobs (free with email registration)

Get a key →

Adzuna — global aggregator (free dev tier, ~250 calls/day per country)

Get a key →

ISO: us, gb, au, ca, de, fr, in, sg…

Jooble — global aggregator (free with email registration)

Get a key →

Advanced: paid SERP providers (optional)

Most users won't need these — Job Cannon ships with free alternatives (RemoteOK, Remotive, Himalayas, USAJobs, Adzuna, Jooble, Jobicy, Y Combinator's Work at a Startup, Google Programmable Search). Add a key only if you want faster speed-to-discovery, or to backfill job descriptions for postings missing detail.

SerpAPI (Google Jobs)

{% for q in config.get('sources', {}).get('serpapi', {}).get('queries', []) %}
{% endfor %}

Thordata (Google Jobs SERP)

{% for q in config.get('sources', {}).get('thordata', {}).get('queries', []) %}
{% endfor %}

DataForSEO (Google Jobs SERP)

Cheapest of the SERP options (~$0.87/month at default settings). Credentials are base64(login:password) — copy from DataForSEO API access.

Results per query (each 10 = 1 billing unit)

{% for q in config.get('sources', {}).get('dataforseo', {}).get('queries', []) %}
{% endfor %}

Google Programmable Search (CSE)

Free 100 queries/day; $5 per 1000 thereafter. Job Cannon caps usage at 95/day and runs CSE-backed portal search once daily. Setup: (1) create a search engine at programmablesearchengine.google.com ("Search the entire web"); (2) copy the Search engine ID into "Search Engine ID" below; (3) enable the Custom Search API in Google Cloud Console and create an API key (paste into "API Key" below). Activates only when DataForSEO is not enabled (DataForSEO has no daily cap, so it's preferred).

{% set weights = config.get('scoring', {}).get('weights', {}) %} {% set weight_total = (weights.get('title_match', 0) + weights.get('seniority_alignment', 0) + weights.get('location_fit', 0) + weights.get('salary_range', 0) + weights.get('industry_relevance', 0) + weights.get('company_signals', 0) + weights.get('recency', 0)) %}
Scoring Weights Sum: {{ "%.2f"|format(weight_total) }}{% if (weight_total - 1.0)|abs >= 0.001 %} ⚠ must equal 1.0{% endif %}
{% set weight_fields = [ ('title_match', 'Title Match'), ('seniority_alignment', 'Seniority Alignment'), ('location_fit', 'Location Fit'), ('salary_range', 'Salary Range'), ('industry_relevance', 'Industry Relevance'), ('company_signals', 'Company Signals'), ('recency', 'Recency'), ] %} {% for key, label in weight_fields %}
{% endfor %}
Jobs below this score are hidden

Control API spending. Mid/High-tier calls are paused when daily spend reaches the cap. Low-tier is always allowed.

Default: ${{ DEFAULT_DAILY_BUDGET_USD|int }}/day

Jobs with a candidate_score below this (from initial ingestion) are skipped for full AI scoring.

ATS scanning queries 12 public ATS APIs for new job postings at tracked companies: Lever, Greenhouse, Ashby, Workday, SmartRecruiters, Recruitee, Breezy, JazzHR, Pinpoint, Personio, BambooHR, and Teamtailor. No AI API calls are used during discovery — only keyword matching against your target titles.

{% set ats_cfg = config.get('ats', {}) %}

Comma-separated: mon,tue,wed,thu,fri,sat,sun

Hour to run scan (default: 7 AM)

Current schedule: Scans run on {{ ats_cfg.get('scan_days', 'mon,wed') | upper }} at {{ ats_cfg.get('scan_hour', 7) }}:00. Slug probing runs 30 minutes after the scan to pick up newly-added companies.
Read-only — change via config.yaml directly

Changes are written to config.yaml and take effect immediately.

{% endblock %}