Nic | Data
  • About
  • Projects
  • Research
  • Life
  • CV
  • Blog
  • Resources
  • Get in Touch
Categories
All (52)
A/B Testing (1)
AB Testing (1)
Advice (1)
Agriculture (1)
analysis (1)
Analytics Engineering (1)
Automation (1)
Beginners (9)
Best Practices (3)
Business (1)
Cancer Research (1)
Career (14)
Causal Inference (1)
code (1)
Communication (1)
Competition (1)
Courses (1)
Dashboard (1)
Dashboards (3)
Data Analysis (1)
Data Analytics (4)
Data Cleaning (2)
Data Collection (1)
Data Engineering (2)
Data Management (1)
Data Quality (2)
Data Science (2)
Data Visualization (3)
Database (1)
Design (3)
Excel (1)
Field Work (1)
Financial Diaries (1)
First Job (1)
Free Resources (1)
Git (1)
GitHub (1)
Guide (2)
Health Analytics (1)
Health Data (3)
Health Economics (1)
Health Financing (2)
Health Programs (1)
Health Research (1)
Health Systems (1)
Healthcare Innovation (1)
Impact Evaluation (4)
Interview (1)
Job Search (1)
Kaggle (2)
KEMRI (1)
Kenya (1)
Learning (2)
LinkedIn (1)
Logframe (1)
Math (1)
Mobile Technology (1)
Monitoring & Evaluation (13)
NCDs (1)
Negotiation (1)
Networking (1)
news (2)
ODK (1)
Pandas (1)
Personal Brand (1)
Portfolio (5)
Power BI (2)
Productivity (2)
Project Design (1)
Projects (3)
Public Health (2)
Python (4)
Quarto (1)
R (6)
R Programming (1)
Remote Work (2)
Reporting (1)
Reproducibility (1)
Research Methods (1)
Roadmap (2)
Salary (1)
SQL (2)
Statistics (4)
Storytelling (1)
Survey Design (2)
Tableau (3)
Tools (4)
Tutorial (7)
Visualization (3)

Writing

Research translation · Methods · Career · Field systems

Essays & Field Notes

A writing studio for public-health research, analytics practice, and the work around the work. The goal is not volume — it is clarity, usefulness, and work grounded in practice.

Read the Flagship Essay Explore Research →
Flagship Essay

When Clinics Can Diagnose but Cannot Buy Medicines

The public essay built from the BMC Public Health paper, written for readers beyond academic journals.

Research Health Financing NCD Care
Open essay →
50+ Posts across analytics, health research, career development, and monitoring systems
Editor's Picks

Recommended reading

Research

When Clinics Can Diagnose but Cannot Buy Medicines

This essay translates a forthcoming BMC Public Health paper into a sharper public argument about budgets, approvals, and why chronic care fails before treatment starts.

Flagship · 12 min read
Research

Why reproducible research matters in public health

Transparent workflows, better trust, and why method discipline is not optional.

Health Economics

Health financial diaries

How high-frequency financial data reveals what conventional surveys miss.

Technical

R for health researchers

A practical bridge between analysis, reporting, and reproducible workflows.

Browse

Explore by topic

Showing all writing

Archive

Recent essays and tutorials, sorted from newest to oldest.

 
Analyzing Agricultural Data from Public Sources
Comprehensive guide to sourcing and analyzing agriculture datasets from Kaggle and other public repositories
3 min
Agriculture
Data Analysis
Kaggle
Mar 15, 2026
 
Creating Beautiful Data Visualizations with R and Python
A comprehensive guide to modern data visualization techniques
3 min
Data Visualization
R
Python
Mar 15, 2026

When Clinics Can Diagnose but Cannot Buy Medicines
Budget lines, approval chains, and why chronic care can fail long before the prescription is written
5 min
Public Health
Health Financing
Health Systems
NCDs
Kenya
Mar 13, 2026

No Degree? No Problem. Break Into Data in 6 Months (Without Lying on Your CV)
A brutally honest roadmap for getting your first data job when you’re starting from zero
3 min
Career
Data Analytics
Data Science
Beginners
Nov 15, 2025

Build Your First Impact Dashboard in R (Even If You’ve Never Shipped a Shiny App)
A low-friction path to a working dashboard that shows real program results
1 min
Dashboards
R
Monitoring & Evaluation
Nov 14, 2025

20 Health Data Science Project Ideas That Go Beyond Kaggle
Real-world projects in NCDs, health financing, and service delivery that impress hiring managers
1 min
Health Data
Projects
Portfolio
Nov 13, 2025

Quarto for Evaluators: Turn Your Analysis into Auto-Updated Donor Reports
Stop copy-pasting tables into Word—generate clean, consistent reports on demand
1 min
Quarto
R
Reporting
Monitoring & Evaluation
Nov 12, 2025

R vs Python for Monitoring & Evaluation: Which One Should You Actually Learn First?
Honest trade-offs for evaluators who care about surveys, indicators, and impact—not fancy deep learning
1 min
R
Python
Monitoring & Evaluation
Tools
Nov 11, 2025

Data Quality for Beginners: 7 Checks Every Analyst Should Automate
Stop trusting dirty spreadsheets—learn how to catch problems before they hit your models
1 min
Data Quality
Data Cleaning
Monitoring & Evaluation
Nov 10, 2025

Logframes for Beginners: How to Stop Faking It in M&E Meetings
A no-jargon guide to understanding and using logical frameworks that donors love
1 min
Monitoring & Evaluation
Logframe
Project Design
Nov 9, 2025

10 Survey Design Mistakes That Will Destroy Your Data (And How to Avoid Them)
From leading questions to broken skip logic—fix these before you go to the field
1 min
Survey Design
Data Quality
Monitoring & Evaluation
Nov 8, 2025

Statistical Power for Evaluators: Stop Running Underpowered Studies
A plain-language guide to sample size, detectable effect, and trade-offs in impact evaluations
1 min
Statistics
Impact Evaluation
Monitoring & Evaluation
Nov 7, 2025

Land Remote Data Roles from the Global South: A No-BS Guide
How to get noticed by international teams even if you’re not in the US or Europe
2 min
Career
Remote Work
Data Analytics
Nov 6, 2025

A/B Testing for Health Programs: Can We Borrow from Tech Without Harming Patients?
A plain-language guide to experimentation in public health and development programs
1 min
A/B Testing
Impact Evaluation
Health Programs
Nov 5, 2025

Data Analyst Portfolio for Health & Development: 5 Projects That Get You Hired
Stand out with projects that speak the language of donors, NGOs, and research teams
1 min
Portfolio
Health Data
Monitoring & Evaluation
Nov 4, 2025

7 Beginner Data Engineering Projects for Analysts (With Real-World Flavor)
Practical, resume-ready projects you can build without cloud admin access
2 min
Data Engineering
Projects
Portfolio
Nov 3, 2025

R for Monitoring & Evaluation: 7 Workflows That Will Change Your Life
From cleaning survey data to automating donor reports with a single script
2 min
R
Monitoring & Evaluation
Automation
Nov 2, 2025

From Field Enumerator to Data Analyst: A Realistic Transition Plan
How to turn your field experience into a data career without starting from zero
2 min
Career
Data Analytics
Monitoring & Evaluation
Nov 1, 2025

Evaluation Dashboards That Donors Actually Use: A Practical Blueprint
Stop building pretty dashboards nobody opens—start shipping tools that drive funding decisions
2 min
Dashboards
Monitoring & Evaluation
Data Visualization
Oct 31, 2025

Health Financial Diaries: The Most Underrated Tool in Health Economics
How daily financial tracking reveals what household surveys miss about healthcare costs
2 min
Health Economics
Financial Diaries
Health Financing
Oct 30, 2025

Impact Evaluation for Beginners: RCTs vs Quasi-Experimental Designs Explained Simply
How to understand and explain impact methods without drowning in jargon
2 min
Impact Evaluation
Causal Inference
Monitoring & Evaluation
Oct 29, 2025

Data Engineering for Analysts: The Skills That Actually Matter (No CS Degree Required)
A beginner’s guide to building reliable data pipelines without becoming a full-time backend engineer
3 min
Data Engineering
Analytics Engineering
SQL
Career
Oct 28, 2025

Health Data Scientist Roadmap: From Excel to Global Health Impact in 12 Months
A practical, beginner-friendly path to become a health data scientist even if you’re outside the US & Europe
3 min
Health Data
Data Science
Career
Roadmap
Oct 27, 2025
 
Why Reproducible Research Matters in Public Health
Building Trust Through Transparency: The Critical Role of Reproducibility in Health Sciences
7 min
Public Health
Research Methods
Reproducibility
Best Practices
Oct 26, 2025
 
A Beginner’s Guide to R for Health Researchers
From Clinical Data to Statistical Insights: Your Complete Roadmap to R Programming
13 min
R Programming
Health Research
Statistics
Tutorial
Beginners
Oct 26, 2025
 
Designing Effective Mobile Data Collection Systems
From Paper Forms to Digital Excellence: A Complete Guide to Mobile Data Collection
11 min
Data Collection
Mobile Technology
ODK
Survey Design
Field Work
Oct 26, 2025
 
Data Visualization Best Practices for Health Dashboards
Design Dashboards That Inform, Engage, and Drive Action in Healthcare Settings
17 min
Data Visualization
Dashboards
Health Analytics
Design
Best Practices
Oct 26, 2025

Monitoring & Evaluation Career Roadmap: From Beginner to Senior Specialist in 18 Months
A practical, step-by-step plan to go from zero to delivering donor-ready impact evaluations
3 min
Monitoring & Evaluation
Impact Evaluation
Career
Beginners
Oct 26, 2025
 
🚀 Your Ultimate 100-Day Data Analytics Roadmap (FREE Resources Inside!)
From Zero to Job-Ready in Just 100 Days - No Prior Experience Required
5 min
Career
Roadmap
Beginners
Data Analytics
Oct 25, 2025
 
Python vs R for Data Analytics: The TRUTH Nobody Tells You (2025 Edition)
Stop Wasting Time - Here’s Which One You Actually Need to Learn First
6 min
Python
R
Tools
Beginners
Oct 24, 2025
 
Master SQL in 30 Days: The Only Tutorial You’ll Ever Need (FREE)
From ’SELECT *’ to Landing Your First Data Job - Complete Roadmap with Practice Problems
10 min
SQL
Database
Tutorial
Beginners
Oct 23, 2025
 
Data Visualization Mastery: Turn Boring Numbers into Stunning Stories (FREE Tools)
The Ultimate Guide to Creating Visuals That Actually Get You Hired
7 min
Visualization
Tableau
Power BI
Design
Oct 22, 2025
 
From Excel Novice to Data Pro: The Skills That Actually Matter in 2025
Stop Using Excel Like It’s 1995 - Modern Techniques That Will 10X Your Productivity
7 min
Excel
Productivity
Tutorial
Beginners
Oct 21, 2025
 
Build a Data Analytics Portfolio That ACTUALLY Gets You Hired (5 Projects Inside)
I Reviewed 500+ Portfolios - Here’s What Works (And What Gets You Ignored)
10 min
Portfolio
Career
Projects
Guide
Oct 20, 2025
 
Statistics for Data Analysts: The Only Concepts You Actually Need (No PhD Required)
Stop Feeling Intimidated - These 15 Concepts Cover 90% of Your Job
9 min
Statistics
Math
Tutorial
Beginners
Oct 19, 2025
 
Kaggle for Beginners: Turn FREE Competitions into Job Offers (Step-by-Step Guide)
How I Went From Zero to Top 10% in 90 Days - And How You Can Too
8 min
Kaggle
Portfolio
Competition
Beginners
Oct 18, 2025
 
Data Cleaning: The Unsexy Skill That Will Make You Invaluable (80% of the Job)
Master the Art of Turning Messy Data into Analysis-Ready Gold
10 min
Data Cleaning
Python
Pandas
Tutorial
Oct 17, 2025
 
A/B Testing for Beginners: Run Experiments That Actually Drive Business Results
The Complete Guide to Testing Ideas and Making Data-Driven Decisions
5 min
AB Testing
Statistics
Tutorial
Business
Oct 16, 2025
 
Git & GitHub for Data Analysts: Stop Losing Your Work (15-Minute Setup)
The Version Control Skills That Will Save Your Career
6 min
Git
GitHub
Tools
Tutorial
Oct 15, 2025
 
Ace Your Data Analyst Interview: 50+ Questions with Perfect Answers
Everything You Need to Land Your First (or Next) Data Analyst Role
7 min
Interview
Career
Guide
Oct 14, 2025
 
Land a Remote Data Analyst Job: Complete Guide (Top Companies + Salary Ranges)
Work From Anywhere - Here’s How to Find and Win Remote Data Roles in 2025
7 min
Remote Work
Career
Job Search
Oct 13, 2025
 
Tableau vs Power BI in 2025: Which One Should You Learn? (Honest Comparison)
I Used Both for 5+ Years - Here’s My Brutally Honest Take
5 min
Tableau
Power BI
Tools
Visualization
Oct 12, 2025
 
Data Storytelling: Turn Numbers Into Narratives That Drive Action
The Skill That Separates Good Analysts from Great Ones
2 min
Storytelling
Communication
Visualization
Oct 11, 2025
 
100% FREE Data Analytics Courses That Are Actually Worth Your Time (2025)
I Tested 50+ Free Courses - Here Are the 15 That Are Better Than Paid Options
3 min
Courses
Free Resources
Learning
Oct 10, 2025
 
Escape Tutorial Hell: Stop Watching, Start Building (Action Plan Inside)
Why You’re Stuck in Learning Mode and How to Actually Land a Job
4 min
Learning
Career
Productivity
Oct 9, 2025
 
LinkedIn for Data Analysts: Get Recruiter Messages Daily (Profile Optimization Guide)
How I Went from 0 to 50+ Recruiter Messages per Month by Optimizing My LinkedIn
6 min
LinkedIn
Career
Personal Brand
Networking
Oct 8, 2025
 
Dashboard Design: 10 Principles That Separate Amateur from Professional
Stop Making Dashboards Nobody Uses - Design for Impact
2 min
Dashboard
Design
Best Practices
Oct 7, 2025
 
Your First 90 Days as a Data Analyst: Survival Guide (From Someone Who’s Been There)
What They Don’t Tell You About Your First Data Analytics Job
5 min
Career
First Job
Advice
Oct 6, 2025
 
Data Analyst Salary Guide 2025: Real Numbers, Negotiation Tips, and Career Growth
What You Can Actually Expect to Earn (By Level, Location, and Industry)
4 min
Salary
Career
Negotiation
Oct 5, 2025

Dashboard launch ceremony with Governor Anyang’ Nyong’o and the research team

Transforming Cancer Care: Building East Africa’s First Cancer Epidemiology Dashboard
How data science and innovation are saving lives in Kisumu County
12 min
Cancer Research
Data Management
Healthcare Innovation
Tableau
KEMRI
Nov 26, 2024
 
Post With Code
1 min
news
code
analysis
Aug 23, 2024

Welcome To My Blog
1 min
news
Aug 20, 2024
No matching items
    Source Code
    ---
    title: ""
    subtitle: ""
    page-layout: full
    listing:
      contents:
        - "../posts/*/index.qmd"
      sort: "date desc"
      type: grid
      grid-columns: 3
      categories: true
      fields: [image, date, title, subtitle, categories, reading-time]
      max-items: 100
      feed: true
    ---
    
    ```{=html}
    <div class="redesign-page">
    
    <!-- ═══════════════════════════════════════════
         BLOG HERO
    ═══════════════════════════════════════════ -->
    <section class="bx-hero reveal-on-scroll">
      <div class="bx-hero-inner">
        <div class="bx-hero-copy">
          <span class="section-eyebrow">Writing</span>
          <p class="bx-overline">Research translation · Methods · Career · Field systems</p>
          <h1 class="bx-hero-heading">Essays &amp; Field Notes</h1>
          <p class="bx-hero-lead">A writing studio for public-health research, analytics practice, and the work around the work. The goal is not volume — it is clarity, usefulness, and work grounded in practice.</p>
          <div class="bx-hero-actions">
            <a href="../posts/47-facility-decision-space-chronic-care/index.html" class="btn-solid">Read the Flagship Essay</a>
            <a href="../research/publications.html" class="btn-ghost">Explore Research →</a>
          </div>
        </div>
    
        <div class="bx-hero-aside">
          <article class="bx-featured-card">
            <span class="bx-card-kicker">Flagship Essay</span>
            <h3>When Clinics Can Diagnose but Cannot Buy Medicines</h3>
            <p>The public essay built from the BMC Public Health paper, written for readers beyond academic journals.</p>
            <div class="bx-card-tags">
              <span class="bx-tag bx-tag--research">Research</span>
              <span class="bx-tag bx-tag--health">Health Financing</span>
              <span class="bx-tag bx-tag--health">NCD Care</span>
            </div>
            <a href="../posts/47-facility-decision-space-chronic-care/index.html" class="bx-card-link">Open essay →</a>
          </article>
    
          <div class="bx-metric-card">
            <span class="bx-metric-num">50+</span>
            <span class="bx-metric-label">Posts across analytics, health research, career development, and monitoring systems</span>
          </div>
        </div>
      </div>
    </section>
    
    <!-- ═══════════════════════════════════════════
         FEATURED PICKS — Magazine Layout
    ═══════════════════════════════════════════ -->
    <section class="bx-section reveal-on-scroll">
      <div class="bx-section-inner">
        <span class="section-eyebrow">Editor's Picks</span>
        <h2 class="section-h">Recommended reading</h2>
    
        <div class="bx-picks-grid">
          <a class="bx-pick-card bx-pick--primary" href="../posts/47-facility-decision-space-chronic-care/index.html">
            <div class="bx-pick-content">
              <span class="bx-tag bx-tag--research">Research</span>
              <h3>When Clinics Can Diagnose but Cannot Buy Medicines</h3>
              <p>This essay translates a forthcoming BMC Public Health paper into a sharper public argument about budgets, approvals, and why chronic care fails before treatment starts.</p>
              <span class="bx-pick-meta">Flagship · 12 min read</span>
            </div>
          </a>
    
          <a class="bx-pick-card bx-pick--secondary" href="../posts/22-reproducible-research-public-health/index.html">
            <span class="bx-tag bx-tag--research">Research</span>
            <h4>Why reproducible research matters in public health</h4>
            <p>Transparent workflows, better trust, and why method discipline is not optional.</p>
          </a>
    
          <a class="bx-pick-card bx-pick--secondary" href="../posts/30-health-financial-diaries-explainer/index.html">
            <span class="bx-tag bx-tag--health">Health Economics</span>
            <h4>Health financial diaries</h4>
            <p>How high-frequency financial data reveals what conventional surveys miss.</p>
          </a>
    
          <a class="bx-pick-card bx-pick--secondary" href="../posts/23-r-for-health-researchers/index.html">
            <span class="bx-tag bx-tag--technical">Technical</span>
            <h4>R for health researchers</h4>
            <p>A practical bridge between analysis, reporting, and reproducible workflows.</p>
          </a>
        </div>
      </div>
    </section>
    
    <!-- ═══════════════════════════════════════════
         CATEGORY EXPLORER STRIP
    ═══════════════════════════════════════════ -->
    <section class="bx-section bx-section--warm reveal-on-scroll">
      <div class="bx-section-inner">
        <span class="section-eyebrow">Browse</span>
        <h2 class="section-h">Explore by topic</h2>
    
        <div class="bx-categories-grid">
          <button class="bx-category-card active" data-filter="all" type="button">
            <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><rect x="3" y="3" width="7" height="7"/><rect x="14" y="3" width="7" height="7"/><rect x="14" y="14" width="7" height="7"/><rect x="3" y="14" width="7" height="7"/></svg>
            <span class="bx-cat-name">All Writing</span>
            <span class="bx-cat-count" id="countAll"></span>
          </button>
          <button class="bx-category-card" data-filter="research" type="button">
            <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
            <span class="bx-cat-name">Research</span>
            <span class="bx-cat-count" id="countResearch"></span>
          </button>
          <button class="bx-category-card" data-filter="technical" type="button">
            <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg>
            <span class="bx-cat-name">Technical</span>
            <span class="bx-cat-count" id="countTechnical"></span>
          </button>
          <button class="bx-category-card" data-filter="career" type="button">
            <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/></svg>
            <span class="bx-cat-name">Career</span>
            <span class="bx-cat-count" id="countCareer"></span>
          </button>
          <button class="bx-category-card" data-filter="field" type="button">
            <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2"/><rect x="9" y="3" width="6" height="4" rx="1"/></svg>
            <span class="bx-cat-name">Field Systems</span>
            <span class="bx-cat-count" id="countField"></span>
          </button>
        </div>
    
        <div class="bx-filter-status">
          <p id="bxFilterLabel">Showing <strong>all writing</strong></p>
          <p id="bxFilterCount"></p>
        </div>
      </div>
    </section>
    
    </div>
    
    <script>
    (function() {
      // Scroll reveal
      var prefersReduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
      var revealEls = document.querySelectorAll('.reveal-on-scroll');
      if (!prefersReduced) {
        var observer = new IntersectionObserver(function(entries) {
          entries.forEach(function(entry) {
            if (entry.isIntersecting) {
              entry.target.classList.add('is-visible');
              observer.unobserve(entry.target);
            }
          });
        }, { threshold: 0.06, rootMargin: '0px 0px -40px 0px' });
        revealEls.forEach(function(el) { observer.observe(el); });
      } else {
        revealEls.forEach(function(el) { el.classList.add('is-visible'); });
      }
    
      // Blog category filtering
      var filterButtons = Array.from(document.querySelectorAll('.bx-category-card'));
      var filterLabel = document.getElementById('bxFilterLabel');
      var filterCount = document.getElementById('bxFilterCount');
    
      var streamNames = {
        all: 'all writing',
        research: 'research writing',
        technical: 'technical writing',
        career: 'career writing',
        field: 'field systems writing'
      };
    
      var rules = [
        { key: 'career', words: ['career', 'portfolio', 'job search', 'interview', 'salary', 'remote work', 'linkedin', 'personal brand', 'first job', 'roadmap', 'first 90 days', 'hired', 'negotiate'] },
        { key: 'field', words: ['monitoring & evaluation', 'impact evaluation', 'survey design', 'data collection', 'field work', 'm&e', 'logframe', 'odk', 'mobile technology', 'data quality', 'health programs', 'evaluator'] },
        { key: 'research', words: ['public health', 'health financing', 'health systems', 'health research', 'research methods', 'cancer research', 'health economics', 'ncd', 'reproducibility', 'reproducible', 'maternal', 'epidemiology'] },
        { key: 'technical', words: ['r', 'python', 'sql', 'quarto', 'dashboards', 'dashboard', 'tableau', 'power bi', 'data engineering', 'data visualization', 'git', 'github', 'database', 'tools', 'automation', 'statistics', 'a/b testing', 'data cleaning'] }
      ];
    
      function detectStream(card) {
        var text = [
          ...(Array.from(card.querySelectorAll('.listing-category')).map(function(n) { return n.textContent || ''; })),
          (card.querySelector('.listing-title') ? card.querySelector('.listing-title').textContent : ''),
          (card.querySelector('.listing-subtitle') ? card.querySelector('.listing-subtitle').textContent : '')
        ].join(' ').toLowerCase();
    
        for (var i = 0; i < rules.length; i++) {
          for (var j = 0; j < rules[i].words.length; j++) {
            if (text.indexOf(rules[i].words[j]) !== -1) {
              return rules[i].key;
            }
          }
        }
        return 'technical';
      }
    
      function decorateCards() {
        var cards = Array.from(document.querySelectorAll('#listing-listing .quarto-post'));
        var counts = { all: cards.length, research: 0, technical: 0, career: 0, field: 0 };
    
        cards.forEach(function(card) {
          var stream = detectStream(card);
          card.dataset.stream = stream;
          counts[stream] = (counts[stream] || 0) + 1;
    
          // Add stream badge
          var body = card.querySelector('.body');
          if (body && !body.querySelector('.bx-stream-badge')) {
            var badge = document.createElement('span');
            badge.className = 'bx-stream-badge bx-stream-badge--' + stream;
            badge.textContent = streamNames[stream];
            body.prepend(badge);
          }
        });
    
        // Update counts
        var countAllEl = document.getElementById('countAll');
        var countResEl = document.getElementById('countResearch');
        var countTechEl = document.getElementById('countTechnical');
        var countCarEl = document.getElementById('countCareer');
        var countFieldEl = document.getElementById('countField');
        if (countAllEl) countAllEl.textContent = counts.all + ' posts';
        if (countResEl) countResEl.textContent = counts.research + ' posts';
        if (countTechEl) countTechEl.textContent = counts.technical + ' posts';
        if (countCarEl) countCarEl.textContent = counts.career + ' posts';
        if (countFieldEl) countFieldEl.textContent = counts.field + ' posts';
    
        return cards;
      }
    
      function applyFilter(stream) {
        var cards = Array.from(document.querySelectorAll('#listing-listing .quarto-post'));
        var visible = 0;
    
        cards.forEach(function(card) {
          var show = stream === 'all' || card.dataset.stream === stream;
          card.classList.toggle('blog-post-hidden', !show);
          if (show) visible++;
        });
    
        filterButtons.forEach(function(btn) {
          btn.classList.toggle('active', btn.dataset.filter === stream);
        });
    
        if (filterLabel) {
          filterLabel.innerHTML = 'Showing <strong>' + (streamNames[stream] || stream) + '</strong>';
        }
        if (filterCount) {
          filterCount.textContent = visible + ' of ' + cards.length + ' posts';
        }
      }
    
      function init() {
        var cards = decorateCards();
        if (!cards.length) return;
    
        filterButtons.forEach(function(btn) {
          btn.addEventListener('click', function() {
            applyFilter(btn.dataset.filter || 'all');
          });
        });
    
        applyFilter('all');
      }
    
      if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init, { once: true });
      } else {
        init();
      }
    })();
    </script>
    ```
    
    ## Archive
    
    Recent essays and tutorials, sorted from newest to oldest.

    © 2025 Nichodemus Amollo · Built with Quarto

    Nairobi, Kenya