Every metric below was measured on a Pixel 9 Pro XL (Tensor G4, 16 GB RAM, Android 15) during the reference demo runs. Confidence intervals shown where applicable. No microbenchmarks — only end-to-end user-facing latencies.
v_ddi_emergency view after app launch. Subsequent queries: <5 ms (warm cache).Gemma 4 E4B (3.4 GB) loaded once at app launch, then resident in RAM for the session.
| Operation | Median | P95 | Notes |
|---|---|---|---|
| Cold model load (from APK first run) | ~12 s | ~15 s | Includes file copy from /data/data to LiteRT cache + mmap |
| Warm model load (subsequent app launches) | ~3 s | ~4 s | mmap is already cached by Linux page cache |
| Single @Tool invocation (Gemma 4 → Kotlin → return) | ~80 ms | ~150 ms | resolveDrug / resolveAllergy / checkDdi · synchronous |
| First token latency (Gemma 4 streaming response) | ~250 ms | ~400 ms | From user query to first character displayed |
| Token throughput (streaming) | ~24 tok/s | — | Sustained on Tensor G4 with Gemma 4 E4B + INT4 quantization |
| Image input (768×768 RGB → Gemma 4 vision encoder) | ~450 ms | ~700 ms | USM-style encoder · independent of subsequent text generation |
| Audio input (5s WAV 16 kHz mono → encoder) | ~380 ms | ~550 ms | After RIFF/WAVE wrapping. Gallery ChatMessage.kt:187 reference |
SQLite FTS5 + indexed B-tree lookups. All queries run on the 3.36 GB knowledge_full.db (58 tables · 88 indexes · 4 FTS5 virtual tables).
COUNT(*) latencies measured on Mac (M-series SSD) by the open-source jemma_kb_audit.py tool. The Pixel 9 numbers below are application-level (Compose UI + LiteRT bridge included) and represent typical user-perceived latencies.
| Query | Cold | Warm | Notes |
|---|---|---|---|
| Drug name → ATC (RxNorm or brand name input) | ~8 ms | <1 ms | Indexed lookup on drug_displays_localized |
| ATC pair → DDI (the core safety check) | ~15 ms | ~3 ms | Composite index on (atc_a, atc_b) |
| One drug vs full profile (cross-check all allergies + meds) | ~45 ms | ~5 ms | The killer @Tool: checkOneDrugAgainstFocusProfile |
| SNOMED → ja-JP display (translation lookup) | ~2 ms | <1 ms | Indexed on (code, lang) in ips_valuesets_translations |
| FTS5 fuzzy search (partial drug name, any language) | ~25 ms | ~8 ms | Top-5 ranked results · used in conversational allergy intake |
| Walk ATC ancestors (5-level hierarchy traversal) | ~3 ms | <1 ms | Recursive CTE on atc_hierarchy |
| UMLS concept resolution (~1.4M filtered rows) | ~12 ms | ~2 ms | Indexed on cui column |
v_ddi_emergency view: it minimizes cold-path JOIN cost.
Profile compression ratios measured across the 3 demo personas + 4 synthetic profiles.
| Profile | Raw JSON | Pruned | Wire (deflate-raw) | Single-frame QR? |
|---|---|---|---|---|
| Haru (3 meds, 1 allergy, 1 condition) | 1009 B | 777 B | 500 B | ✅ Yes · LowEC |
| Kurodo (2 meds, 3 allergies, 1 condition) | ~1100 B | ~870 B | ~550 B | ✅ Yes · LowEC |
| Synthetic min · (1 allergy only) | ~340 B | ~220 B | ~180 B | ✅ Yes · HighEC OK |
| Synthetic mid · (5 meds, 4 allergies, 2 conditions) | ~1800 B | ~1450 B | ~880 B | ✅ Yes · LowEC |
| Synthetic large · (12 meds, 8 allergies, 5 conditions) | ~3700 B | ~3000 B | ~1850 B | ✅ Yes · LowEC only |
| Synthetic max · (full 18-pillar IPS, dozens of items) | ~9 KB | ~7.2 KB | ~4.4 KB | ⚠️ Use 3-frame splitter |
Compression ratio: ~50% (raw → wire) for typical profiles. The Pocket Pass PDF also embeds the multilingual text channel as a fallback layer, making it readable by any QR scanner including non-JemmaPass-aware ones.
Measured between two Pixel 9 Pro XL devices, 5 m apart, indoor, no walls. Outdoor / mixed-device performance varies.
| Event | Median | Notes |
|---|---|---|
| SOS broadcast start → discovered by peer | ~2.5 s | BLE advertising window + Nearby discovery negotiation |
| First V chunk received → full profile assembled | ~6 s | 5 chunks × CHUNK_ROTATION_MS=1.5s, sequential pickup |
| Discovery → profile rendered in JA | ~8 s | Includes localized display lookup + UI recomposition |
| Rescuer beacon broadcast frequency | every 1.5 s | One S chunk per CHUNK_ROTATION_MS |
| F (fingerprint) chunk broadcast frequency | every 10 s | Cache-skip optimization · ~7% airtime cost vs V chunks |
| Multi-hop relay (VR chunks, TTL=2) | +~6 s/hop | Each relay phone re-broadcasts on its own rotation cycle |
| Event broadcast (E chunk · status change) | ~3 s | Higher priority than V/S — broadcast in next available slot |
| Resource | Size / Usage | Notes |
|---|---|---|
| APK size (release, debug-signed) | ~120 MB | Native libs + ML Kit + Compose + Hilt + 18-language resource bundle |
| Gemma 4 E4B model (LiteRT-LM format) | 3.4 GB | Downloaded on first boot from jemmapass.net/models/ |
| Gemma 4 E2B model (fallback for lower-RAM devices) | 2.4 GB | Auto-selected on devices with <8 GB RAM |
knowledge_full.db |
3.36 GB | 3,360,727,040 bytes · SQLite · 58 tables · 88 indexes · 4 FTS5 |
| Total first-boot disk footprint | ~7 GB | APK + E4B model + KB |
| Idle RAM (app foreground, model loaded) | ~3.8 GB | Gemma 4 E4B mmap-resident · Compose UI + Hilt overhead |
| Peak RAM (during multimodal inference) | ~5.2 GB | Image + audio encoders briefly resident · drops after inference |
| Battery drain (active SOS broadcast, screen on) | ~12 %/hr | BLE + Wi-Fi Direct + GPS · screen is the dominant cost |
| Battery drain (idle, app backgrounded) | <0.5 %/hr | No services running unless SOS or Rescuer mode active |
Tested device shortlist + theoretical compatibility based on minimum requirements (Android 12+, 6 GB+ RAM, ARM64).
| Device | Status | Model variant | Notes |
|---|---|---|---|
| Pixel 9 Pro XL (Tensor G4, 16 GB) | ✅ Verified | Gemma 4 E4B | Reference device · all demos recorded on this |
| Pixel 9 (Tensor G4, 12 GB) | ✅ Verified | Gemma 4 E4B | Identical performance to Pro XL within 5% |
| Pixel 8 Pro (Tensor G3, 12 GB) | ✅ Verified | Gemma 4 E4B | ~15% slower inference vs G4 · still <200ms red alert |
| Samsung Galaxy S24 (Snapdragon 8 Gen 3, 12 GB) | ✅ Verified | Gemma 4 E4B | Cross-vendor Nearby: 88% chunk capture rate (vs 99% same-vendor) |
| Samsung Galaxy A55 (Exynos 1480, 8 GB) | ✅ Verified | Gemma 4 E2B | Auto-fallback to E2B due to RAM. Inference ~40% slower than E4B |
| Pixel 7 (Tensor G2, 8 GB) | ✅ Verified | Gemma 4 E2B | E4B technically fits but swap thrashing degrades UX |
| Generic Android 12 · 6 GB RAM · ARM64 | ⚠️ Theoretical | Gemma 4 E2B | Should work · UI animations may stutter on weaker GPU |
| Android 11 or earlier | ❌ Not supported | — | minSdk = 31 enforces Android 12+ · Nearby Connections API limitations |
| x86 / x86_64 Android emulator | ❌ Not supported | — | LiteRT-LM ships ARM64-only native libs in v0.11.0 |
The FAQ anticipates the most common skeptical questions — including the ones we couldn't fit into a writeup.