cd /news/artificial-intelligence/puskesmasai-finishing-an-offline-ai-… Β· home β€Ί topics β€Ί artificial-intelligence β€Ί article
[ARTICLE Β· art-24700] src=dev.to pub= topic=artificial-intelligence verified=true sentiment=↑ positive

PuskesmasAI: Finishing an Offline AI Triage App for Rural Indonesia

A developer has completed PuskesmasAI, an offline-first Progressive Web App that uses AI-powered medical triage to assist community health workers in rural Indonesia. The app runs entirely on-device with no internet connection required after initial setup, using a quantized Gemma 4 E4B model to analyze patient symptoms and return structured triage results (GREEN/YELLOW/ORANGE/RED) with recommended actions and referral notes. The project addresses Indonesia's severe doctor shortageβ€”1 doctor per 5,000 people versus the WHO's recommended 1:600β€”by equipping non-medical volunteers in remote 3T regions with AI decision support that stores all patient data locally and syncs only when connectivity returns.

read4 min publishedJun 12, 2026

This is a submission for the GitHub Finish-Up-A-Thon Challenge

PuskesmasAI is an offline-first Progressive Web App (PWA) that brings AI-powered medical triage to community health workers (kader) in rural Indonesia β€” no internet connection required after the first setup.

Indonesia has 1 doctor per 5,000 people, far below the WHO's recommended 1:600 ratio. In remote 3T regions (Tertinggal, Terdepan, Terluar β€” Underdeveloped, Frontier, and Outermost), over 45% of community health posts lack adequate medical staff. The kader β€” non-medical volunteers who are often the only frontline health resource for millions β€” must make triage decisions without doctors nearby, without structured guidance, and frequently without internet.

PuskesmasAI solves this. A kader inputs patient symptoms via a simple form in Bahasa Indonesia, and the app returns a structured AI triage result: GREEN / YELLOW / ORANGE / RED β€” with recommended actions, possible conditions, red flags, and an auto-generated referral note. Patient records are stored locally in IndexedDB and sync to the Puskesmas dashboard when connectivity returns.

Built with Next.js 14 (PWA) + Tailwind CSS on the frontend, Python Flask on the backend, and Gemma 4 E4B (GGUF quantized via Ollama) as the on-device AI model (~2.5GB, zero cloud dependency). Zero patient data ever leaves the community β€” privacy by design.

This project means a lot to me personally. I'm based in Makassar, South Sulawesi β€” and the health disparity between urban and rural Indonesia is something I witness firsthand. PuskesmasAI is my attempt to put AI where it's needed most.

πŸ”— Repository: https://github.com/jefribulomakassar/gemma4_good_hackathon

⚠️

Local-first by design.PuskesmasAI runs entirely on-device β€” the Next.js frontend (port 3000) and Python Flask backend (port 5000) are started separately on a local machine, with Gemma 4 E4B served via Ollama. There is no hosted demo because the whole point is offline operation: no cloud, no data leaving the device.

To run locally:

cd backend && pip install -r requirements.txt
ollama run gemma4:e4b
python app.py  # runs on :5000

cd frontend && npm install
npm run dev  # runs on :3000

Demo scenario:

Phone in airplane mode β†’ open PuskesmasAI β†’ fill triage: 32-year-old female, symptoms: "fever for 3 days, red spots on skin, nausea" β†’ tap Analyze β†’ result: 🟠 ORANGE with action list and referral note β†’ turn WiFi on β†’ patient record auto-syncs to dashboard.

This project originally started as my submission for the Kaggle Γ— Google DeepMind Gemma 4 Good Hackathon (Health & Sciences track, deadline: May 18, 2026). I had the full concept, the README, the architecture diagram, and the backend security layers ready β€” but I ran out of time before finishing the core data files and frontend components that would make the app actually work.

Before (what existed at the original deadline):

TriageResult.tsx

, OfflineBanner.tsx

, VoiceInput.tsx

componentsmedical_kb.json

β€” the AI had no medical knowledge basesymptom_map.json

β€” no symptom-to-condition mappingdrug_reference.json

β€” no drug dosage reference for kadersSymptomForm.tsx

β€” the main input form was missingdb.ts

/ sync.ts

β€” offline storage and sync not implementedAfter (what was added during the Finish-Up-A-Thon):

backend/data/medical_kb.json

β€” offline medical knowledge base covering the 10 most prevalent diseases in rural Indonesia (Dengue/DBD, Typhoid, Malaria, ARI/ISPA, Diarrhea, Hypertension, Tuberculosis, Malnutrition, Cholera, Pre-eclampsia) with symptoms, red flags, triage levels, and actions β€” all in Bahasa Indonesiabackend/data/symptom_map.json

β€” 32 symptom groups with Indonesian colloquial keywords, probability weights, and automatic triage escalation rulesbackend/data/drug_reference.json

β€” 10 essential Puskesmas drugs with pediatric dosing per kg body weight, contraindications, and kader-safe drug classification based on Indonesia's National Formulary (frontend/src/components/SymptomForm.tsx

β€” mobile-first patient intake form with symptom shortcut buttons, automatic pregnancy detection, temperature indicator, and form validationfrontend/src/lib/db.ts

β€” IndexedDB wrapper using Dexie.js for offline patient record storagefrontend/src/lib/sync.ts

β€” auto-sync module that uploads pending records to Turso cloud when connectivity returnsThe transformation: from a well-documented skeleton to a genuinely functional offline AI triage tool.

GitHub Copilot was central to finishing this project β€” especially for the data-heavy and boilerplate-heavy files that would have taken hours to write manually.

** symptom_map.json and drug_reference.json** were generated entirely using GitHub Copilot in the github.dev editor β€” no local setup needed. I simply pressed

.

on the repository page to open github.dev, then used Ctrl+I

to invoke inline prompts. I provided the full file path, the data structure requirements, and domain-specific context (Indonesian rural health context, Formularium Nasional constraints). The results were accurate, well-structured, and included details I hadn't explicitly specified β€” like colloquial Bahasa Indonesia symptom terms ("step"

for kejang/seizure, "ngos-ngosan"

for rapid breathing) and the appropriate kader-safe drug classification tiers.** db.ts and sync.ts** were scaffolded by Copilot with idiomatic TypeScript and Dexie.js patterns that matched the existing codebase β€” including the

synced

boolean field for tracking upload status and the navigator.onLine

check in the sync logic. What would have been an hour of boilerplate became a focused 10-minute review and refinement session.What I learned: Copilot works best when you give it full context β€” the exact file path in the repo, the purpose of the file, the related files it should be aware of, and the domain-specific constraints. A well-crafted prompt saved me hours on each file.

"The best AI is not the most complex one. It's the one that works for the people who need it most β€” even when the internet doesn't."

── more in #artificial-intelligence 4 stories Β· sorted by recency
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain β€” perfect for shipping the agent you just read about.

$git push zahid main
β†’ Live at https://your-agent.zahid.host βœ“
Get free account β†’ Pricing
from €0/mo Β· no card required
LIVE [news/puskesmasai-finishin…] indexed:0 read:4min 2026-06-12 Β· β€”