Colvarion

Log in

Create account

Theme

About Colvarion

We help people ask better questions and craft truthful, resonant narratives. Our programs blend practice with ethics rooted in Canadian standards.

Our Story

Origins

Colvarion began as a newsroom workshop series—now a full curriculum for creators, journalists, and nonprofit researchers across Canada.

Method

We combine pre-interview mapping, rapport-building, and transcript structuring into an actionable system with checklists and rubrics.

Impact

Graduates report faster turnarounds, stronger quotes, and safer conversations around sensitive topics.

Values

Adjust how much each value shapes our curriculum and see the impact statement update in real time.

Impact statement

    Team

    '; } if(f.ok){ siteFooter.innerHTML=await f.text(); } else { siteFooter.innerHTML=''; } }catch(e){ siteHeader.innerHTML='
    Colvarion

    Log in

    Create account

    Theme

    '; siteFooter.innerHTML=''; } window.dispatchEvent(new Event('layout:ready')); } const siteHeader=document.getElementById('site-header'); const siteFooter=document.getElementById('site-footer'); injectLayout(); function setRangeFill(input){ const val = ((+input.value - +input.min) / (+input.max - +input.min)) * 100; input.style.background = 'linear-gradient(90deg, rgb(99,102,241) '+val+'%, rgba(148,163,184,0.35) '+val+'%)'; input.setAttribute('aria-valuenow', input.value); } function formatTilt(r,e,c){ const pairs = [{k:'Rigor',v:r},{k:'Empathy',v:e},{k:'Clarity',v:c}].sort((a,b)=>b.v-a.v); const primary = pairs[0], secondary = pairs[1]; const span = primary.v - secondary.v; const toneMap = { 'Rigor':'evidence-led', 'Empathy':'human-centred', 'Clarity':'structure-first' }; const primaryTone = toneMap[primary.k]; const intensifier = span>=35?'decisively':span>=20?'strongly':span>=10?'noticeably':'gently'; return {primary, secondary, intensifier, primaryTone}; } function updateImpact(){ const rEl=document.getElementById('rigor'); const eEl=document.getElementById('empathy'); const cEl=document.getElementById('clarity'); const r=+rEl.value, e=+eEl.value, c=+cEl.value; document.getElementById('rigor-out').textContent=r; document.getElementById('empathy-out').textContent=e; document.getElementById('clarity-out').textContent=c; [rEl,eEl,cEl].forEach(setRangeFill); const {primary, secondary, intensifier, primaryTone} = formatTilt(r,e,c); const total = r+e+c || 1; const pr = Math.round((primary.v/total)*100); const sr = Math.round((secondary.v/total)*100); const emphasis = primary.k==='Rigor'?'rigorous frameworks':primary.k==='Empathy'?'empathetic interviewing':'clear narrative structure'; const impact = document.getElementById('impact'); impact.textContent = `Our program ${intensifier} emphasizes ${emphasis} (${primary.k} ~${pr}% with ${secondary.k.toLowerCase()} ~${sr}% support).`; const pts = document.getElementById('impact-points'); pts.innerHTML=''; const items = []; if(primary.k==='Rigor'){ items.push('Advanced source verification drills'); } if(primary.k==='Empathy'){ items.push('Trauma-informed question design'); } if(primary.k==='Clarity'){ items.push('Narrative scaffolding and edit maps'); } if(secondary.k==='Rigor'){ items.push('Rubrics for transcript scoring'); } if(secondary.k==='Empathy'){ items.push('Consent, boundaries, and care protocols'); } if(secondary.k==='Clarity'){ items.push('Structure-first scripting workshops'); } const mixNote = primaryTone==='human-centred'?'Prioritizes interviewee safety and rapport.': primaryTone==='evidence-led'?'Maximizes precision, reliability, and analytical depth.': 'Highlights coherence, pacing, and audience understanding.'; items.push(mixNote); items.forEach(t=>{ const li=document.createElement('li'); li.textContent=t; pts.appendChild(li); }); try{ localStorage.setItem('colvarion:values', JSON.stringify({r,e,c})); }catch(_){} } function loadValues(){ try{ const saved = JSON.parse(localStorage.getItem('colvarion:values')||'{}'); if(typeof saved.r==='number') document.getElementById('rigor').value = Math.min(100, Math.max(0, saved.r)); if(typeof saved.e==='number') document.getElementById('empathy').value = Math.min(100, Math.max(0, saved.e)); if(typeof saved.c==='number') document.getElementById('clarity').value = Math.min(100, Math.max(0, saved.c)); }catch(_){} } ['rigor','empathy','clarity'].forEach(id=>{ const el=document.getElementById(id); el.addEventListener('input', updateImpact); el.addEventListener('change', updateImpact); }); loadValues(); updateImpact();