What Mob covers — what's solid, what's partial, what's missing. Use
this to set realistic expectations before starting an app, and to
spot gaps worth filling (either in mob core, in a plugin, or by
declaring out-of-scope).
The reference surface is the union of React Native core,
Expo SDK modules, and platform-native capabilities both ecosystems
have converged on as "what mobile apps need." Many missing items are
pluggable — see MOB_PLUGINS.md for the
manifest spec.
This doc is hand-maintained from inspection of lib/mob/ and
src/mob_nif.erl. If you add a capability, update the matching row.
Legend
✅
Fully present — public Elixir API, both iOS + Android (unless noted)
🟡
Partial — works but limited (single platform, narrow API, or known caveats)
❌
Missing — could be a plugin or future core addition
⛔
Out of scope — requires separate deployment target (widgets, Watch app), or fundamentally incompatible with Mob's architecture
Per-platform columns: ✓ = supported, — = not supported, n/a = not applicable on that platform.
A ✅ capability may live in core or in a first-party plugin
(0.7.0 extracted camera, photos, location, notifications, biometrics,
scanning, and Bluetooth into mob_* capability packages). The Notes
column names the supplying plugin; rows without one are core. Plugins
activate with the dep + config :mob, :plugins, [...] in mob.exs —
see the Plugins guide.
UI components (render tree)
Elements you can use inside ~MOB. The set is intentionally small
and orthogonal — composition over a fat component library.
Component
Status
iOS
Android
Notes
<Box>
✅
✓
✓
Container with align, padding, background, corner radius, border
<Column>, <Row>
✅
✓
✓
Flex layouts
<Text>
✅
✓
✓
Font, color, size, weight, align, line height, letter spacing
<Button>
✅
✓
✓
Tap handler, text, background, fill width
<Image>
✅
✓
✓
Local + remote (Coil on Android, AsyncImage on iOS)
Vertical or horizontal, scroll observation on iOS 18+
<List>
✅
✓
✓
Vertical / horizontal stack with selection
<LazyList>
✅
✓
✓
Virtualised long-list with on_end_reached pagination
<TabBar>
✅
✓
✓
Bottom tab bar (Material 3 NavigationBar on Android, SwiftUI Tab on iOS)
<WebView>
✅
✓
✓
Inline web view, JS bridge, navigation control
<CameraPreview>
✅
✓
✓
Live preview with frame stream
<Video>
🟡
✓
🟡
Android: ExoPlayer integration pending
<GpuView>
✅
✓
✓
Metal (iOS) / GLES 3.0 (Android) fragment shader surface
Custom views via <NativeView>
✅
✓
✓
Register a plugin-defined render-tree node type
Date / Time / Color pickers
❌
—
—
Plugin candidate
<SearchBar>
❌
—
—
Native search bar (UISearchBar / SearchBar). Plugin candidate
<DatePicker>
❌
—
—
Plugin candidate
<Modal> (sheet presentation)
✅
✓
✓
Mob.UI.sheet/2 — native modal sheet composing ordinary Mob nodes (iOS .sheet, Android Material 3 ModalBottomSheet). Android needs an app generated by mob_new ≥ 0.4.24. Programmatic alerts + action sheets also available via Mob.Alert
Pull-to-refresh
❌
—
—
Missing; commonly requested. Plugin candidate
Bottom sheets
✅
✓
✓
Same primitive as <Modal> above — Mob.UI.sheet/2 with :detents ([:medium, :large] subset). iOS cannot set the system dimming opacity, so :scrim is applied exactly on Android and approximated on iOS
Drawer navigation
❌
—
—
Plugin candidate; mob's nav model is stack-based today
Touch, gesture, input
Capability
Status
iOS
Android
Notes
Tap / double-tap / long-press
✅
✓
✓
on_tap, on_double_tap, on_long_press props
Swipe (l/r/u/d)
✅
✓
✓
on_swipe_left, etc.
Pan / drag gesture
🟡
🟡
🟡
Tap-based; full pan-responder system (like react-native-gesture-handler) is missing
Pinch / zoom
❌
—
—
Plugin candidate; common for image/map views
Rotation gesture
❌
—
—
Plugin candidate
Hardware keyboard events
❌
—
—
key_press/1 exists for the test harness but not as a user-facing API
Keyboard show/hide events
❌
—
—
Missing; commonly needed for keyboard-aware layouts
MobBluetooth.Le (mob_bluetooth 0.3.0) — GATT peripheral role only (advertise + notify + receive writes), iOS + Android; BLE central (scan/connect) is a future addition
MobNotify.register_push/1 (mob_notify plugin) → token to handle_info
Push delivery via APNs / FCM
✅
✓
✓
Via mob_push Hex package
Notification tap handling
🟡
🟡
🟡
Foreground + background work. Cold-start does not: the payload is stored before the NIF loads, so it is dropped and take_launch_notification/0 returns nil (#81, fix in #77)
Starting a new app: scan the ❌ rows first to see what would need to be a plugin or worked around.
Reporting a gap: if something here is wrong (mob has a capability I missed, or partial that's actually full), the doc is hand-maintained — please open a PR or flag it.
Filling a gap as a plugin: see MOB_PLUGINS.md for the manifest spec. Most ❌ rows are plugin candidates (tier 1 or tier 2 depending on whether they ship UI).
Filling a gap in core: when a capability is universal enough (every app needs it, both platforms support it cleanly) it's worth landing in core rather than as a plugin. The boundary is fuzzy; raising a discussion before doing the work is the right call.
This matrix isn't a roadmap commitment — it's a snapshot of reality.
Some ❌ rows may stay ❌ for a long time because no one's asked.
Others will land via community plugins. The intent is honest
disclosure, not a promise of feature parity with React Native.
Related docs
MOB_PLUGINS.md — plugin manifest spec for
filling missing capabilities without merging into core
RELEASE.md — release process if you're shipping a
new capability that lands in core
guides/styling.md — visual styling for the
components above (tokens, themes, dark mode)
guides/support_matrix.md — minimum
OS / ABI / SDK supported (a different "support matrix" —
platform versions rather than capabilities)