Awas-Jentik


Inspiration

706,297 malaria cases in Indonesia in 2025 — up 30% in a single year. 95% concentrated in Papua. And the part that kept us up at night: several areas already certified "malaria-free" are experiencing outbreaks again.

Indonesia's surveillance system, SISMAL, only activates after a patient is diagnosed. By then, the breeding site has been active for weeks. The transmission chain has already started.

We asked: what if we could detect the risk before the first case appears? The answer was Awas-Jentik.


What it does

Community members and health workers report field conditions in under two minutes — standing water, vegetation density, sunlight exposure — with GPS captured automatically. Two AI models score the report in parallel:

Combined Risk = 0.65 × Habitat Score + 0.20 × Mobility Score + 0.15 × Case History

Admins get a 2,500-grid risk heatmap, a live change-detection panel logging every category shift, and a staleness tracker flagging areas with no update in 60+ days — because silence doesn't mean safe.


How we built it

Two tracks ran in parallel. On the ML side: a structured dataset of 2,400 observations built from scratch, zero missing values, validated end-to-end at R² = 0.927. On the product side: use cases, role boundaries, and six PRD iterations — each closing specific gaps from the last.

Stack: Next.js 16 + TypeScript (frontend), FastAPI + Python 3.12 (backend), PostgreSQL + Supabase Auth, scikit-learn for inference, deployed on Vercel and Railway.


Challenges we ran into

Hardest technical decision: Combining Habitat and Mobility into one model hurt performance — the correlation between them is only 0.006. Separating them improved end-to-end R² from ~0.85 to 0.927.

Hardest design decision: We simplified from three roles (citizen, kader, admin) to two (user, admin). A community health worker and a citizen have more in common than we assumed — merging them made auth cleaner and role boundaries clearer.

Hardest constraint: 30 hours. The Immunity Gap Score is designed but partially implemented. CV is deliberately deferred to Phase 2. Known gaps, not forgotten features.


Accomplishments that we're proud of

Every claim in this submission is backed by a number. Habitat model: R² = 0.924, MAE = 3.72. Mobility model: R² = 0.639, MAE = 10.98. Combined pipeline: R² = 0.927, MAE = 2.86. Category match: 84.8% (5-class habitat), 88.8% (4-class heatmap).

The formula weights — 0.65/0.20/0.15 — are fixed and documented, not black-boxed. We skipped CV not because we couldn't build it, but because community larva detection sensitivity is only ~12.6%. Building on that signal would mean building on noise.


What we learned

The hardest part of a surveillance system isn't detecting things — it's knowing when not to act.

EMA smoothing (α = max(0.1, 1/(N+1))) means a single anomalous report doesn't flip an area's category. Habitat alone doesn't cause an outbreak — it needs a non-immune person entering it. That's why the two-model architecture exists. Not as a technical flourish, but as an epidemiological necessity.

Simplicity compounds. Every feature we cut made the rest of the system clearer.


What's next for Awas-Jentik

Phase 2 (1–3 months): App usage generates real training data. Models retrained on field observations. Lightweight CV explored for water body detection — not species classification.

Phase 3 (6+ months): Full Immunity Gap Score with BPS migration matrices. Mobility data becomes a time series. Integration with puskesmas notification systems.

The core loop — report → score → smooth → detect → notify — is complete. What's next is making it real.

Built With

Share this project:

Updates