GenericJam

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, so on_submit never fires for
    them), another field taking focus, and the iOS keyboard-toolbar “Done”.
    New dismiss_keyboard/0 NIF. iOS resigns the first responder in any
    visible window and returns once the main thread has done it (IO_BOUND,
    2 s bound), so a value: assigned in the same handler reaches the field.
    Android calls MobBridge.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} and dismiss/1 is a
    no-op.
    dismiss/1 returns 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 exact zig version match. 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.bufPrintZ was removed in 0.17.0, and its replacement
    std.mem.printSentinel is missing in 0.17.0-dev.269, so the post-mortem
    marker paths in mob_nif.zig format through a local printZ on
    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.dupeZ was removed, so mob_stored_queue.zig’s tests use
    dupeSentinel. CI now sets up the pinned Zig from .tool-versions,
    compiles mob_nif.zig for 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 :id in its place never presented, and replacing an open sheet
    kept the old presentation and lost the new sheet’s on_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 late on_dismiss is
    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/3 reports the real
    reason (MOB-500).
    Mob.Screen.Server could pass {:exit, :noproc} to
    handle_async/3 when the kill landed before the screen’s monitor reached
    the task’s runner, since Process.monitor/1 is asynchronous. The screen
    traps exits, so it now takes the reason from the runner’s link (:killed
    for Process.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_blur survives 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/1 plus 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, set zig 0.17.0 in .tool-versions (mise use zig@0.17.0 installs
    it and edits the file; mise install zig@0.17.0 alone leaves the app on
    the nightly). iOS apps also need ios/build.zig and
    ios/build_device.zig off b.build_root, which 0.17.0 removed: in the
    Swift glob, replace b.build_root.handle.openDir( with
    std.Io.Dir.openDirAbsolute(, and add b.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.doctor flags
    both.
  • Android: Mob.Keyboard.dismiss/1 needs MobBridge.dismissKeyboard().
    New apps from the matching mob_new have it. In an existing app, copy
    dismissKeyboard(), focusedFieldHost, the InputMethodManager and
    LocalView imports, and the hostView and focusedFieldHost lines in MobTextField
    from a freshly generated MobBridge.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.

Where Next? Top

Trending in News & Updates Top

woylie
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
bartblast
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
mikehostetler
ReqLLM v1.28.0 has been released. Features: add StepFun chat and audio providers (#1087) by mikehostetler openai: honour image deta...
New
GenericJam
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
fhunleth
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
GenericJam
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
mudasobwa
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 Top

mudasobwa
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
KristerV
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
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
juhalehtonen
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
webofbits
With AI doing more of the implementation work, I’ve been wondering how much coding I should deliberately keep doing myself. My main conc...
#ai
New
budgie
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

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews