When Clinics Can Diagnose but Cannot Buy Medicines
The public essay built from the BMC Public Health paper, written for readers beyond academic journals.
Open essay →Research translation · Field systems · Methods
A short public set of writing grounded in health systems research and programme data work. Clarity over volume. No career listicles.
The public essay built from the BMC Public Health paper, written for readers beyond academic journals.
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 readHigh-frequency household finance data — context for the systems case study.
MethodsWhy domain knowledge still shapes useful targeting and ML systems.
DeliveryResearch data management through to a county-facing surveillance product.
Showing all writing
Recent essays and tutorials, sorted from newest to oldest.
---
title: ""
subtitle: ""
page-layout: full
listing:
contents:
- "../posts/47-facility-decision-space-chronic-care/index.qmd"
- "../posts/kisumu-cancer-dashboard/index.qmd"
- "../posts/30-health-financial-diaries-explainer/index.qmd"
- "../posts/48-from-field-to-model/index.qmd"
- "../posts/49-reproducible-ml-research-data-manager/index.qmd"
- "../posts/50-ai-low-resource-settings/index.qmd"
- "../posts/51-statistical-thinking-ai-engineering/index.qmd"
- "../posts/52-dashboards-to-decisions/index.qmd"
- "../posts/24-mobile-data-collection/index.qmd"
- "../posts/22-reproducible-research-public-health/index.qmd"
- "../posts/39-survey-design-mistakes/index.qmd"
- "../posts/38-statistical-power-for-evaluators/index.qmd"
sort: "date desc"
type: grid
grid-columns: 3
categories: true
fields: [image, date, title, subtitle, categories, reading-time]
max-items: 20
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 · Field systems · Methods</p>
<h1 class="bx-hero-heading">Essays & Field Notes</h1>
<p class="bx-hero-lead">A short public set of writing grounded in health systems research and programme data work. Clarity over volume. No career listicles.</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">12</span>
<span class="bx-metric-label">Curated public notes — research, field systems, and methods</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/30-health-financial-diaries-explainer/index.html">
<span class="bx-tag bx-tag--health">Field systems</span>
<h4>Health financial diaries</h4>
<p>High-frequency household finance data — context for the systems case study.</p>
</a>
<a class="bx-pick-card bx-pick--secondary" href="../posts/48-from-field-to-model/index.html">
<span class="bx-tag bx-tag--technical">Methods</span>
<h4>From field to model</h4>
<p>Why domain knowledge still shapes useful targeting and ML systems.</p>
</a>
<a class="bx-pick-card bx-pick--secondary" href="../posts/kisumu-cancer-dashboard/index.html">
<span class="bx-tag bx-tag--research">Delivery</span>
<h4>Kisumu cancer dashboard</h4>
<p>Research data management through to a county-facing surveillance product.</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.