GenericJam
Mob 0.9.26 has been released.
Added
Mob.Keyboard.dismiss/1— take the on-screen keyboard down from the
BEAM. A screen had no way to dismiss the keyboard from its own handler —
a Save button, a tap on blank space, a committed value — short of removing
the field from the tree. The built-in exits are the return key (which the
decimal and number keyboards don’t have, soon_submitnever fires for
them), another field taking focus, and the iOS keyboard-toolbar “Done”.
Newdismiss_keyboard/0NIF. iOS resigns the first responder in any
visible window and returns once the main thread has done it (IO_BOUND,
2 s bound), so avalue:assigned in the same handler reaches the field.
Android callsMobBridge.dismissKeyboard()from the matching mob_new
template (GenericJam/mob_new#113), which hides the soft keyboard and clears
focus in the focused field’s own window, a sheet’s included. On a bridge
without it the NIF returns{:error, :not_loaded}anddismiss/1is a
no-op.
dismiss/1returns the socket and is a no-op on the host. Guide:
guides/device_capabilities.md→ Keyboard. Decision:
decisions/2026-09-24-keyboard-dismiss-is-a-device-api.md.
Changed
- Zig pin is 0.17.0. Replaces
0.17.0-dev.269+ebff43698. That nightly
existed because 0.15.x could not link on the macOS 26 SDK; 0.17.0 is the
stable that has the fix (build_system_migration.md).mix mob.doctor
still requires an exactzig versionmatch. Companion to mob_dev and
mob_new, which move with it.
Fixed
- Android Zig sources compile on Zig 0.17.0, and still on the old
nightly.std.fmt.bufPrintZwas removed in 0.17.0, and its replacement
std.mem.printSentinelis missing in0.17.0-dev.269, so the post-mortem
marker paths inmob_nif.zigformat through a localprintZon
std.fmt.bufPrint, which both have. An app that updates mob but keeps
mob_dev 0.7.30 (which pins the nightly) still builds for Android.
Allocator.dupeZwas removed, somob_stored_queue.zig’s tests use
dupeSentinel. CI now sets up the pinned Zig from.tool-versions,
compilesmob_nif.zigfor Android and runs every Android Zig test file. - iOS sheets take their identity from
:id(115). A sheet’s
presentation state was tied to its place in the tree, and a container’s
child keying (MOB-127) does not reach every sheet, such as one that is the
screen’s root. There, after the user swiped a sheet down, a sheet with a
different:idin its place never presented, and replacing an open sheet
kept the old presentation and lost the new sheet’son_dismiss. An:id
is now the sheet’s identity on iOS as on Android (mob_new #43); without
one, identity stays positional. The replaced sheet’s lateon_dismissis
dropped. A replacement for an open sheet also presents at its own detents:
under a keyed container it came up full height with no drag indicator. - A task killed from outside right after
start_async/3reports the real
reason (MOB-500).Mob.Screen.Servercould pass{:exit, :noproc}to
handle_async/3when the kill landed before the screen’s monitor reached
the task’s runner, sinceProcess.monitor/1is asynchronous. The screen
traps exits, so it now takes the reason from the runner’s link (:killed
forProcess.exit(pid, :kill)). Seen once in a few thousand runs of
async_test.exs, next to a test-side race on the same signal ordering. - Android
on_blursurvives a re-render in the handler that took focus
away. The blur was resolved generation-strictly, but focus is lost on
the UI thread after the BEAM has already committed the handler’s new tap
table, so it carried a stale handle and was dropped: 6 of 8 blurs after
Mob.Keyboard.dismiss/1plus an assign, on a Moto G Power 2021. It now
resolves by identity (same slot, pid and tag), as change events and the
iOS final-text blur already do.
Upgrading
- Zig 0.17.0, with mob_dev and mob_new’s matching releases. In each
app, setzig 0.17.0in.tool-versions(mise use zig@0.17.0installs
it and edits the file;mise install zig@0.17.0alone leaves the app on
the nightly). iOS apps also needios/build.zigand
ios/build_device.zigoffb.build_root, which 0.17.0 removed: in the
Swift glob, replaceb.build_root.handle.openDir(with
std.Io.Dir.openDirAbsolute(, and addb.dependOnDirectoryContents(.{ .cwd_relative = b.fmt("{s}/ios", .{mob_dir}) });before it (0.17.0
caches the configure phase, so without it a new mob Swift file is missed).
Or copy the block from a freshly generated app.mix mob.doctorflags
both. - Android:
Mob.Keyboard.dismiss/1needsMobBridge.dismissKeyboard().
New apps from the matching mob_new have it. In an existing app, copy
dismissKeyboard(),focusedFieldHost, theInputMethodManagerand
LocalViewimports, and thehostViewandfocusedFieldHostlines inMobTextField
from a freshly generatedMobBridge.kt. Without the method the call leaves
the keyboard up.
Mob Info
Classification: Hybrid Mobile Framework
Description: 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.
Forum/tag: mob
Click here to view Mob’s main announcement thread.
Trending in News & Updates
Doggo 0.18.3 has been released.
Added
tabs: Add a disabled attribute to the :panel slot. A disabled tab can be focused with the arrow k...
New
Hologram v0.12 is out! This one is for the big apps. Evo Store, Hologram’s Performance Sponsor, has an app with over 9,000 Elixir modules...
New
ReqLLM v1.28.0 has been released.
Features:
add StepFun chat and audio providers (#1087) by mikehostetler
openai: honour image deta...
New
Mob 0.9.18 has been released.
Added
anchor: "bottom" on :scroll, for chat logs (MOB-481). The scroll
opens at the end of its content. ...
New
Nerves v2.0.0-pre.4 and v2.0.0-pre.3 has been released.
Changes
Fix typo preventing SOURCE_DATE_EPOCH from propogating through the
fi...
New
Mob 0.9.17, 0.9.16 and 0.9.15 has been released.
Added
Async work in screens, the LiveView way. Mob.Socket.start_async/3 runs
a functi...
New
Finitomata v1.0.0-rc.0 and v0.43.0 has been released.
Published to Hex.pm: finitomata | Hex
Documentation: Finitomata v1.0.0-rc.0 — Doc...
New
Other Trending Topics
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
With AI doing more of the implementation work, I’ve been wondering how much coding I should deliberately keep doing myself.
My main conc...
New
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with.
But I don’t use it anymore.
Serverless was the promis...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #ai
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #blog-post
- #elixirconf-us
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #elixirconf-eu
- #api
- #forms
- #security
- #hex









