Pipeline

Funnel

furthest stage reached

Active processes

loading…

New jobs

loading…
function renderLog(){ if(!DATA)return; const box=q("#log-content");if(!box)return; const log=(DATA.activity_log||[]).slice().reverse(); const quality=(DATA.tailor_quality||{}); const qResults=(quality.results||[]).filter(r=>r.verdict); const kwFreq=(quality.kw_frequency||{}); const globalTop=(kwFreq.global_top30||[]); const byType=(kwFreq.by_type||{}); // ── 1: ATS Keyword Match Summary ── let atsSummary=""; if(qResults.length){ const avgB=quality.avg_kw_match_before||0; const avgA=quality.avg_kw_match_after||0; const delta=quality.avg_kw_delta||0; const deltaColor=delta>0?"#087a58":delta<0?"#9b1c1c":"var(--mist)"; const genAt=quality.generated_at?timeago(quality.generated_at):"never"; atsSummary=`

ATS Keyword Match

last analysis ${genAt}
` +`
` +`
${avgB}%
avg match
before tailoring
` +`
${avgA}%
avg match
after tailoring
` +`
${delta>=0?"+":""}${delta}%
improvement
per run avg
` +`
${qResults.length}
CVs
analyzed
` +`
`; // Per-CV table atsSummary+=``; qResults.forEach(r=>{ const kw=r.kw||{}; const kwDelta=(kw.delta||0); const deltaCol=kwDelta>0?"#087a58":kwDelta<0?"#9b1c1c":"var(--mist)"; const changeColor=r.change_pct<2?"#9b1c1c":r.change_pct<8?"#92400e":"#087a58"; const miss=(kw.high_value_missing||[]).slice(0,3); atsSummary+=``; if(miss.length){ atsSummary+=``; } }); atsSummary+=`
Company / Role Flavor Content Δ KW Before KW After Δ Verdict
${esc(r.company)}
${esc((r.title||"").slice(0,36))}
${esc(r.flavor)} ${r.change_pct||0}% ${kw.before_rate||0}% ${kw.after_rate||0}% ${kwDelta>=0?"+":""}${kwDelta}% ${r.verdict||"—"}
⚠ High-value keywords still missing: ${miss.map(k=>esc(k)).join(", ")}
` +`
` +`↗ Re-run analysis` +`Content Δ = how different the text is from master · KW = % of JD keywords found in CV` +`
`; } else { atsSummary=`

ATS Keyword Match

No analysis yet.
↗ Run analysis on GitHub
`; } // ── 2: Keyword Frequency Visualization ── let kwViz=""; if(globalTop.length){ const maxCount=globalTop[0].count||1; // Tag cloud style — word size proportional to frequency const tags=globalTop.map(k=>{ const size=Math.round(10+((k.count/maxCount)*14)); const op=0.4+((k.count/maxCount)*0.6); const boosted=_TECH_BOOST_JS.has(k.kw); const col=boosted?"var(--touch)":"var(--ink)"; return `${esc(k.kw)}`; }).join(" "); // Bar chart by type let typeRows=""; Object.entries(byType).forEach(([type,kws])=>{ if(!kws||!kws.length)return; const maxC=kws[0].count||1; typeRows+=`
${esc(type)}
`; kws.slice(0,10).forEach(k=>{ const w=Math.round((k.count/maxC)*100); typeRows+=`
${esc(k.kw)}
${k.count}
`; }); typeRows+="
"; }); kwViz=`

Keywords Across All JDs

frequency across ${qResults.length} job descriptions · green = high-value ATS terms
${tags}
${typeRows?`
Keyword frequency by role type
${typeRows}
`:""}
`; } // ── 3: Activity Log ── const typeColors={tailor_start:"#0BA678",tailor_complete:"#087a58",submit:"#3730a3", error:"#9b1c1c",discovery_run:"#51616F",funnel_refresh:"#51616F", analysis_run:"#92400e",pipeline_update:"#0BA678"}; const typeLabels={tailor_start:"Tailor started",tailor_complete:"CV tailored ✓", submit:"Submitted",error:"Error",discovery_run:"Discovery run", funnel_refresh:"Funnel refresh",analysis_run:"Analysis run", pipeline_update:"Pipeline update"}; const logRows=log.slice(0,60).map(e=>{ const color=typeColors[e.type]||"var(--mist)"; const label=typeLabels[e.type]||e.type; const kwInfo=(e.kw_match_before!=null&&e.kw_match_after!=null) ?` · ATS ${e.kw_match_before}%→${e.kw_match_after}%`:""; const meta=[e.company,e.flavor, e.error?"ERR: "+e.error.slice(0,60):null, e.jobs_found!=null?e.jobs_found+" found":null].filter(Boolean).join(" · ")+kwInfo; return `
${esc(label)}${e.company?" — "+esc(e.company):""}
${meta?`
${esc(meta)}
`:""}
${e.ts?timeago(e.ts):"—"}
`; }).join("") || '
No activity logged yet.
'; box.innerHTML=atsSummary+kwViz+`

Activity Log

recent system events
${logRows}
`; } // JS set of high-value terms for keyword cloud coloring const _TECH_BOOST_JS = new Set(["gtm","saas","b2b","crm","salesforce","hubspot","plg", "arr","mrr","churn","ats","roi","kpi","okr","sql","api","aws","gcp","azure","ai","ml", "llm","generative","product marketing","account executive","account manager", "customer success","business development","partnerships","enablement","pmm", "icp","positioning","messaging","competitive intelligence","voc","go-to-market", "pipeline","funnel","persona","demand generation","lifecycle","adoption","retention", "expansion","upsell","cross-sell","renewal","quota","enterprise","revenue","growth"]);