GenericJam / mob
git clone https://github.com/GenericJam/mob.git
0.9.24 · 3d ago
—
+~1
stars, 24h · #13,789
+~5
stars, 7 days · #17,324
+~20
stars, 30 days · #22,041
297
★ total · +2% this week
28
forks · 22 open issues
Star history (as recorded here)
LanguageElixir
LicenseMIT
Created2026-04-08 (6mo ago)
Last pushtoday
Watchers14
OwnerUser
Seen on GitHub Trending
- 2026-10-21 — #9 monthly in elixir · +29 ★
- 2026-10-20 — #9 monthly in elixir · +28 ★
Links
- GitHub: github.com/GenericJam/mob
- Releases · Issues · Hacker News mentions
README excerpt
# Mob
BEAM-on-device mobile framework for Elixir. OTP runs inside your iOS and Android apps — embedded directly in the app bundle, no server required. Screens are GenServers; the UI is rendered by Compose and SwiftUI via a thin NIF.
> **Status:** Early development. Confirmed on the iOS simulator, the Android emulator, and real iOS and Android devices.
## What it is
[code]
You write Elixir. The native layer handles rendering. The BEAM node runs on the device — connect your dev machine to the running app over Erlang distribution, inspect state, and hot-push new bytecode without a restart.
## Installation
Add to `mix.exs`:
[code]
The `mob_new` package (separate) provides project generation, deployment tooling, and will import `mob_dev` which is a live dashboard. Install it as a Mix archive:
[code]
## A screen
[code]
A tap on the button delivers `{:tap, :increment}` to `handle_info/2` — the tag
comes from the `on_tap: {self(), :increment}` tuple in `render/1`, and `self()`
is this screen's own process.
## App entry point
[code]
## Navigation
[code]
## Theming
[code]
Core ships `Mob.Theme.Light`, `Mob.Theme.Dark`, and `Mob.Theme.Adaptive`
(follows the system light/dark setting). The preset themes —
`MobThemes.Obsidian`, `MobThemes.ObsidianGlass`, `MobThemes.Citrus`,
`MobThemes.Birch`, `MobThemes.Material3` — live in the
`mob_themes` style package:
[code]
See the Theming guide for details.
## Device APIs
Device APIs report back as messages: call the function, handle the result in
`handle_info/2`. (To run your own slow work, such as an HTTP call, without
blocking the screen, use `Mob.Socket.start_async/3` and `handle_async/3`; see
Screen Lifecycle.)
[code]
Some capabilities ship as first-party plugins rather than in core — see the
First-Party Packages catalog for the full set. Activating
one is two lines:
[code]
Plugins come in two kinds: **BEAM-only** (Elixir code: screens, lifecycle and
router hooks, workers; deployed and hot-pushed like your own code) and
**native** (NIFs, native components, permissions; need
`mix mob.deploy --native`). Apps generated by `mix mob.new` already trust the
first-party plugins' signing key; for any other plugin, run
`mix mob.plugin.trust ` once. To write your own, see
Writing a Plugin.
**In core:** `Mob.Clipboard`, `Mob.Share`, `Mob.Files`, `Mob.Audio`,
`Mob.Motion`, `Mob.Permissions`.
**As first-party plugins:** `mob_camera`, `mob_location`, `mob_notify`,
`mob_photos`, `mob_biometric`, `mob_scanner` (also needs `mob_camera`),
`mob_bluetooth`, `mob_nfc`, `mob_video`, `mob_midi`, `mob_touch`,
`mob_screencast`, `mob_audio_capture` (device-audio probe, Android),
`mob_sms`, `mob_wake` (OS-triggered handlers), `mob_background`
(keep-alive), `mob_speech` (speech-to-text), `mob_whisper` (offline
speech-to-text engine), `mob_sensors` (every phone sensor: barometer,
proximity, light, steps, ...), `mob_vision` (on-device OCR),
`mob_nx_eigen` (CPU Nx backend), `mob_scene3d` (Filament 3D scenes),
`mob_deliver` (si