Kampung Kaki · Wireframe

A live, role-aware map of Singapore for everyday people, trained responders, and operations staff. One map, three views, one shared truth.

CODE_EXP 2026 Citizen · Responder · Ops Real OneMap SG basemap Live NEA / OneMap / LTA data

Citizens get a clean, trustworthy view of what is happening near them and a one-tap SOS. Trained responders see the same map with active calls, missions to join, and an AI copilot that ranks the best mission for them. Operations staff get the full picture — incoming reports, live distress calls, the responder roster, and tools to declare incidents and broadcast to the public. Everything published to a citizen has been verified; nothing on the map is invented.

What each role sees

CitizenVerified alerts near them. Report or send SOS in seconds.
ResponderActive SOS, ops-formed cases, joinable missions ranked by fit.
OpsTriage, dispatch, declare, broadcast — with full audit trail.
Shared truthOne map; what one role does shows up for the others instantly.

1 · Auth

Demo accounts gate the shell. Real sign-in is stubbed in this section.

auth-login

Sign in

Sign in

Single entry for citizens, responders, and operations staff. Picks the workspace each role gets when they enter.

  • Three roles share one app — the next screen reshapes around who you are.

2 · Citizen

Map → briefing → alerts → report → SOS. AI Kaki is an on-demand side branch from home.

cz-home

Citizen home

Citizen home

Live Singapore map showing only published, trustworthy alerts plus public-data overlays (air quality, rainfall, hospitals, AEDs).

  • OneMap SG basemap (CORS-open tiles); NEA PSI + rainfall overlays refresh every 60 s; OneMap hospitals + AEDs prefetched server-side.
  • No noise: unverified citizen reports stay off the public map.
cz-band

Live ops band (in-app)

Live ops band (in-app)

Persistent band under the top chrome showing the four live data trackers the rest of the shell depends on, plus a one-tap entry to AI Kaki. Same data feeds the map overlays and the AI context.

  • Chips: PSI (NEA · 60s) · Rain stations (NEA · 60s) · OneMap themes (5m cache) · LTA traffic (5m cache).
  • Provider state badge is the same SourceHealth the ops Source Health workspace shows — one truth.
  • Right edge: "Ask AI Kaki" jumps straight into the citizen_assistant prompt.
cz-brief

Briefing

Briefing

A short, scrollable summary of what is happening near you right now and what ops has officially confirmed.

  • Rule-based, not AI: counts verified events + role-relevant notifications via a single deterministic selector (selectBriefingCounts in src/state/selectors.ts).
  • The badge in the top bar shows the same number — one truth, two surfaces.
cz-alerts

Nearby alerts

Nearby alerts

Active incidents and community events within walking / commuting distance, sorted by proximity.

  • Rule-based: filters verified events + volunteer events within 5 km of the device GPS, sorted by haversine distance.
  • Falls back to Singapore centroid (labelled) when GPS is off — no fake locations.
cz-report

File a report

File a report

Guided four-step report flow: pick a category, drop a pin, describe what you saw, review and submit.

  • Goes to ops triage — citizens do not page responders directly except via SOS.
  • Voice or photo capture both supported; transcript is read back before sending.
cz-sos

SOS · pick category

SOS · pick category

One screen, one tap: medical, fire, trapped, threat, hazard, or other. Sent simultaneously to ops and any suitable responders nearby.

  • Location banner makes the citizen aware whether the pin is exact (GPS) or approximate.
cz-sos-live

SOS live tracking

SOS live tracking

After sending: a live status pill on the map and a step-by-step pipeline showing who is coming, when, and how to close the call safely.

  • ETA is real — distance between responder and citizen ÷ a 35 km/h surface-mix estimate, recomputed each state change.
  • Closure needs two acknowledgements (citizen safe + responder complete) — no silent resolves.
cz-ai

AI Kaki

AI
AI Kaki

A plain-language safety assistant the citizen can ask for guidance ("what should I do near the haze?", "where is the nearest AED?").

  • Grounded in live public data; says "unavailable" rather than invent a number.

3 · Responder

Home → mission board → join → copilot. Groups, events, log are side surfaces.

rp-home

Responder home

Responder home

Same map, fuller picture — adds active SOS pings, fellow responders, and case-room rooms in the side panel.

  • Volunteers and professionals share one shell; visibility differs by role, not by app.
rp-band

Live ops band (in-app)

Live ops band (in-app)

Same persistent band, same chips — but the AI entry on the right goes to Mission Copilot for the responder.

  • Lets a responder eyeball provider health (PSI, rainfall, OneMap, LTA) without leaving the map.
  • Right edge: "Ask Mission Copilot" jumps into the responder_mission prompt with the live position in context.
rp-mboard

Mission board

Mission board

Single board with the responder's current job, queued assignments, and joinable work — all in one place.

  • Designed to answer "what should I do next" in under three seconds.
rp-join

Joinable missions

Joinable missions

Open SOS calls and ops-formed case rooms within reach, ranked by fit (skills, distance, availability).

  • Same fit score the Mission Copilot uses, just without the natural-language wrapper — rule-based, not AI.
  • Official-only operations show as "monitor only" so volunteers do not interfere with SCDF/SPF.
rp-copilot

Mission copilot

AI
Mission copilot

A responder-side AI that picks the best two missions for you right now and explains why.

  • Pre-ranks options with a deterministic fit score (capability × distance × ready-status × severity) before asking the model — saves tokens and keeps reasoning auditable.
  • Volunteer kit de-prioritises suppression-heavy fires; restricted ops cases never surface as joinable.
rp-groups

Groups & rooms

Groups & rooms

Org units (SCDF East), capability cadres (AED Responders, Fire Auxiliary), and the live case rooms you belong to.

  • One tap to join or leave any group; case rooms come and go as ops opens them.
rp-events

Volunteer events

Volunteer events

Non-emergency community work — drills, cleanups, food distribution, elderly care — that citizens or ops have posted.

  • Same app, different rhythm: keeps volunteers engaged between live incidents.
rp-log

Activity log

Activity log

A timestamped record of what happened on the responder's missions — for handover, debrief, and after-action.

  • Same record ops sees; nothing hidden between roles.

4 · Ops

Triage (reports → distress → cases → roster) → dispatch → declare/broadcast → audit (sources → log). Command copilot sits between dispatch and declare.

ops-home

Ops home

Ops home

The full map: every report, SOS, case, and responder position. Drawing toolbox on the right for declaring zones.

  • Only ops gets a polygon / lasso. Citizens and responders cannot draw their own areas.
ops-reports

Report queue

Report queue

Incoming citizen reports awaiting triage. Verify to publish them; dismiss to close the loop with the reporter.

  • No public map item exists until ops has signed off — keeps misinformation out.
ops-distress

Distress oversight

Distress oversight

All live SOS calls. Single click jumps to dispatch for that specific call.

  • SOS bypass the verification queue — they go to ops and responders at once.
ops-cases

Case overview

Case overview

Every active case room with severity, lifecycle state, member count, and captain.

  • Lifecycle: forming → staging → active → consolidating → resolved.
ops-roster

Responder roster

Responder roster

The available workforce — who is on duty, who is busy, who is en route. Manual retasking happens here.

  • Professionals and volunteers share one roster, tagged by org.
ops-dispatch

Dispatch

Dispatch

Picks the nearest available responder for the selected SOS or case. One tap to assign.

  • Rule-based ranking — Euclidean distance × 111 km/deg to the call's coordinates. No AI in this loop; assignments must be auditable.
  • Assigning also patches the responder to en_route and the SOS to ack in the same transaction.
ops-copilot

Command copilot

AI
Command copilot

An ops-side AI that watches the whole picture and suggests the next move — who to send where, what to broadcast.

  • Context packet ships the live report queue + active SOS (each with nearest ready responder + real ETA) + cases + source health + PSI to the model.
  • Suggestions cite the data they came from; ETAs are derived (m:ss), never invented.
ops-declare

Declare incident

Declare incident

Manual incident declaration when ops wants to get ahead of citizens: severity, kind, optional polygon area.

  • Severity ≥ 4 raises an urgent push to citizens, responders, and ops together.
ops-broadcast

Broadcast

Broadcast

Compose a short, geo-bounded public message: title, body, audience scope (citizens only, or citizens + responders).

  • Reach is reported as polygon area, not a fake device count.
ops-sources

Source health

Source health

Status board for every external data provider Kampung Kaki depends on (NEA, OneMap, LTA, MOH, etc.).

  • States: fresh · stale · down · shell_only · not_configured · unavailable. The Host AI server reads this same array — if a tool is down, the AI is told so and answers "unavailable".
ops-log

Activity log

Activity log

Append-only system of record. Every verify, dismiss, dispatch, declare, broadcast is captured for audit.

  • Visibility is per-role: citizens see citizen-relevant lines; ops sees everything.

D · God Mode · demo dock (not in production)

Presenter-only tooling, off by default, lives outside the real user journey. Seeds scenarios, flips source states, swaps roles — so a pitch can drive the citizen / responder / ops flows without waiting for live data.

god-csot

CSOT inspector

CSOT inspector

Live counts per data cluster (citizen intake, incidents, operations, network, intel). Lets a presenter prove the map and the records match.

  • Read-only view of the in-memory store; same data the real screens read from.
god-seed

Seed scenarios

Seed scenarios

Two preset demos (minor + major) plus "send SOS as me" so the pitch can show a real flow in seconds. Reset wipes the seeded state.

  • Seeds are tagged actor=godmode in the audit log so the demo never looks like real data.
god-sources

Source state cycler

Source state cycler

Click any data source to cycle its state (fresh → stale → down → not_configured). Demonstrates how the UI degrades honestly when a provider goes dark.

  • Same source list ops sees. Useful for the "what happens when NEA goes down?" pitch beat.
god-matrix

AI dispatch matrix

AI dispatch matrix

Lists every role × workspace → system-prompt pairing the Host AI supports, so the team can audit which screens talk to the model and how.

  • Five active modes: citizen_alert · citizen_assistant · responder_case · responder_mission · ops_command.
god-seeded

CSOT after seed

CSOT after seed

The CSOT inspector right after a major seed — counts move, source health stays honest. The proof that "shared truth" is one store, not five.

  • Pitch beat: open this side-by-side with the citizen, responder, and ops home tabs and seed something new.