Skip to content

Dashboards & Reports

At the end you will know how to build the two HTML pages this project produces — the hiring-trends dashboard and the resume-match report — and what is safe to share.

One self-contained HTML file: stat tiles, a target-role tracker, weekly trend, salary bands, and a paginated explorer where clicking a row opens the job description in a side panel. The ? icon opens plain-English help for three audiences (readers, data engineers, developers).

Build it from a trends parquet snapshot:

python tools/raw_load.py --export
python tools/build_trends_report.py \
    --input exports/ats_raw_trends_20260714.parquet \
    --out exports/hiring-trends-20260714.html

Or all in one step with Docker: docker run --rm ghcr.io/senthilsweb/job-scout trends.

How much job-description text to embed (--jd)

Mode What is embedded Page size Use for
target (default) JD text only for postings matching your config keywords ~6 MB personal daily use
all every JD ~20+ MB local deep-dives
none no JD text; side panel shows facts + apply link ~2 MB anything you share

JD text comes from the sibling full parquet (--jd-from, inferred automatically by replacing trends with full in the input name). If the full parquet is missing, the build falls back to none with a warning.

The public copy

A public build is rebuilt daily in CI and hosted at https://senthilsweb.github.io/ai-agents/trends/. It differs from a personal build in two enforced ways:

  • --jd none — zero job-description text (companies' content — see FAQ).
  • --no-targets — zero embedded role keywords. Visitors bring their own via the URL: …/trends/?roles=ai engineer,platform engineer renders the target tracker for exactly those keywords, computed in the browser. Without the parameter, the tracker stays hidden.

The public page is never committed to git — the docs workflow builds it from the committed parquet on every deploy (daily at 11:45 UTC).

Sharing your own build

The dashboard is a single file — host it anywhere or attach it as a web artifact. Before sharing outside personal use, rebuild with --jd none: job-description text is the hiring companies' content. The facts — titles, companies, locations, salary bands — are fine to share in any mode.

The match report

The paid pipeline's output: one HTML page ranking every analyzed posting against your resume — score bands, strengths, gaps, resume improvements, missing ATS keywords, and a cover letter per job, each in an expandable row. Jobs first analyzed today get a NEW badge.

python tools/build_match_report.py --input exports/jobmatch-20260713/all_reports.json \
    --out exports/match-report.html
python tools/daily_match.py    # fetch -> sweep -> render, one command (PAID)

Rendering is free — it reads saved results. Only the sweep itself calls the paid API; the Runbook covers that procedure and its cost guard. Full tool reference: API match pipeline.

The match report is personal — it contains your resume analysis and generated cover letters. It lands in exports/ (git-ignored) and should stay private.

How the templates work

Both pages render from Jinja2 templates in templates/ — data is injected as JSON islands, all CSS/JS is inline, and the output makes zero network requests. Styling supports light and dark themes. To change a page, edit its template and re-run the build tool; no build system involved.

Next: Runbook.