Bifrost turns 1! Get 30% off annual plans with code
HAPPYBIRTHDAY

Changelog


For changes prior to v4, see the v3 documentation.

4.5.2#

Released: September 23, 2026

What's Changed

  • Test shared() async results against #[On] listeners by @simonhamp in #484
  • Allow x86_64 simulator builds for Intel Macs by @simonhamp in #363
  • fix(ios): let pre-Xcode-26 toolchains compile the Liquid Glass surfaces by @simonhamp in #364
  • fix: iOS build fails on Xcode 27 when a plugin uses an older iOS library by @SRWieZ in #487
  • Let an OTA payload reach, and survive in, the app it was built for by @shanerbaner82 in #476

Full Changelog: https://github.com/NativePHP/mobile-air/compare/4.5.1...4.5.2


4.5.1#

Released: September 19, 2026

What's Changed

  • Let bg-* fill the safe areas again on iOS by @shanerbaner82 in #477
  • Fix five ways native:install reports success while doing the wrong thing by @simonhamp in #317
  • Run the package jobs migration after the app's own by @simonhamp in #479
  • Set NATIVEPHP_RUNNING before any artisan runs, and migrate once per platform by @simonhamp in #478
  • Hot reload: explicit trigger on iOS, debug builds only on Android by @simonhamp in #472
  • Place flex children from a measurement of the placement proposal by @shanerbaner82 in #480
  • fix(android): allow root hosts to reserve the navigation bar slot by @jsdatarocks in #404
  • Give each iOS simulator and device its own hot reload port by @simonhamp in #482
  • Responsive breakpoints: md:/lg:/xl: classes resolved against the live window width by @shanerbaner82 in #467
  • fix: gate the error screen's exception detail on app.debug by @CodyPChristian in #408

New Contributors

Full Changelog: https://github.com/NativePHP/mobile-air/compare/4.5.0...4.5.1


4.5.0#

Released: September 18, 2026

What's Changed

New Contributors

Full Changelog: https://github.com/NativePHP/mobile-air/compare/4.4.1...4.5.0


4.4.1#

Released: September 12, 2026

What's Changed

  • fix: honour per-screen tab-bar hiding on the custom-Column chrome path by @shanerbaner82 in #347

Full Changelog: https://github.com/NativePHP/mobile-air/compare/4.4.0...4.4.1


4.4.0#

Released: September 11, 2026

What's Changed

  • Emit the iOS launch image set whole by @unlocdavid in #320
  • Honour a whitespace policy on <text> so slot content can keep its line breaks by @shanerbaner82 in #424
  • Let apps scope which paths open on Android app links by @shanerbaner82 in #403
  • Make text whitespace symmetric with the browser, with whitespace-* classes to opt out (#356 rebased) by @shanerbaner82 in #425
  • Fix empty POST bodies and 404s on redirect in the iOS scheme handler by @gwleuverink in #326
  • Attach artisan to the live TSRM instead of re-initialising it by @gwleuverink in #329
  • Hold the extraction lock across the background artisan commands by @gwleuverink in #330
  • Merge Info.plist entries structurally so plugins can declare any value type (#377 rebased) by @shanerbaner82 in #427
  • Deliver native events to webview screens on Android by @gwleuverink in #379
  • Apply the review nits from #391 and #392 by @gwleuverink in #398
  • Resolve the iOS build number before the Laravel app is bundled by @shanerbaner82 in #434

Full Changelog: https://github.com/NativePHP/mobile-air/compare/4.3.2...4.4.0


4.3.2#

Released: September 5, 2026

What's Changed

New Contributors

Full Changelog: https://github.com/NativePHP/mobile-air/compare/4.3.1...4.3.2


4.3.1#

Released: September 1, 2026

What's Changed

Full Changelog: https://github.com/NativePHP/mobile-air/compare/4.3.0...4.3.1


4.3.0#

Released: August 28, 2026

What's Changed

  • Stop registering view paths the bundle never ships by @gwleuverink in #346
  • fix: scrolling gets stuck on elements with press-* feedback (iOS 18) by @SRWieZ in #374
  • fix: don't paint the keyboard's helper windows in UI.SetBackground (iOS) by @SRWieZ in #373
  • fix: Android bottom-bar draws under the system navigation bar by @SRWieZ in #375
  • fix: inline top-bar background never paints on iOS 26.2 by @SRWieZ in #380
  • Decode zip entry names as UTF-8 when extracting the app bundle by @gwleuverink in #331
  • Seed the Vite hot file into the simulator container on watch start by @gwleuverink in #333
  • Revert "Seed the Vite hot file into the simulator container on watch start (#333)" by @shanerbaner82 in #385
  • Revert "Decode zip entry names as UTF-8 when extracting the app bundle (#331)" by @shanerbaner82 in #386
  • Revert "fix: inline top-bar background never paints on iOS 26.2 (#380)" by @shanerbaner82 in #387
  • Revert "fix: Android bottom-bar draws under the system navigation bar (#375)" by @shanerbaner82 in #388
  • Revert "fix: don't paint the keyboard's helper windows in UI.SetBackground (iOS) (#373)" by @shanerbaner82 in #389
  • Revert "fix: scrolling gets stuck on elements with press-* feedback (iOS 18) (#374)" by @shanerbaner82 in #390
  • Decode zip entry names as UTF-8 when extracting the app bundle by @gwleuverink in #392
  • fix: Android bottom-bar draws under the system navigation bar by @SRWieZ in #395
  • Seed the Vite hot file into the simulator container on watch start by @gwleuverink in #391
  • fix: don't paint the keyboard's helper windows in UI.SetBackground (iOS) by @SRWieZ in #393

New Contributors

Full Changelog: https://github.com/NativePHP/mobile-air/compare/4.2.0...4.3.0


4.2.0#

Released: August 14, 2026

What's Changed

  • [Masterclass] Fix items-start/items-stretch inversion on iOS and max-w-* being dropped on both platforms by @shanerbaner82 in #313
  • [Masterclass] Support per-corner and per-side border radius classes by @shanerbaner82 in #314
  • [Masterclass] Dismiss the keyboard on tap for screens with native chrome by @shanerbaner82 in #315
  • Use destructive theme color for native errors by @wojt-janowski in #295
  • Fix glass elements ignoring their corner radius on iOS by @shanerbaner82 in #323
  • Restore push notification badge clearing by @wojt-janowski in #294
  • Ignore file URLs in DeepLinkRouter by @gwleuverink in #332
  • Restore the video and audio MIME types the squash dropped by @gwleuverink in #328
  • Restore the Android query string handling the SuperNative squash reverted by @gwleuverink in #327
  • fix: forward flexDirection into layout — completes flex-row/flex-col by @shanerbaner82 in #270

Full Changelog: https://github.com/NativePHP/mobile-air/compare/4.1.0...4.2.0


4.1.0#

Released: August 7, 2026

What's Changed

  • fix(ios): stop aliasing the plain "plus" icon to plus.circle.fill by @shanerbaner82 in #255
  • fix: parse flex-row / flex-col direction utilities by @shanerbaner82 in #256
  • feat: content-addressed callback ids by @shanerbaner82 in #257
  • feat: TreeObservers — observe published trees, events, and navigation by @shanerbaner82 in #259
  • feat: #[Locked] properties — bindings cannot write identity props by @shanerbaner82 in #260
  • Remove deprecated flashlight method from System class by @simonhamp in #263
  • fix: measure cross-axis size against the resolved main size by @simonhamp in #264
  • fix(ios): recompute remaining space before placing justified children by @shanerbaner82 in #254
  • feat: GatedBridge contract + FakeBridge capability deny-list by @shanerbaner82 in #258
  • perf: cut hot reload latency and its variance by @simonhamp in #266
  • feat(ios): implement UI.SetBackground for parity with Android by @shanerbaner82 in #277
  • fix: hot reload permanently wedging when a trigger lands mid-reboot by @shanerbaner82 in #278
  • feat: expose stored navigation configs on CallbackRegistry by @shanerbaner82 in #267
  • feat: NativeRouteFallback — apps decide what a browser sees on native routes by @shanerbaner82 in #268
  • feat: plugin-registered element attribute capture by @shanerbaner82 in #269
  • Fix deep link delivery in native-ui (EDGE) apps on iOS by @shanerbaner82 in #282
  • Restore the zip error detail lost by the SuperNative squash by @gwleuverink in #276
  • fix(android): avoid resizing WebView for keyboard insets by @buseduran in #156
  • feat(edge): dispatch screen lifecycle events from the navigation loop by @sylvesterdamgaard in #248
  • Ship the real app name in CFBundleName (OAuth consent alert fix) by @shanerbaner82 in #285
  • Fix top-bar background_color not rendering at the scroll edge (iOS) by @shanerbaner82 in #284
  • Extend shows-indicators to refreshable and lazy-grid by @shanerbaner82 in #286
  • Fix - Expose tree publication revisions on Android by @wojt-janowski in #280
  • Port signed-zero inset anchoring from the dev core (parser + iOS + Android) by @shanerbaner82 in #288
  • Port the background-layer core seams from the dev core (Android) by @shanerbaner82 in #287
  • Honour platforms, and stop copying SwiftPM manifests and test targets into the app target by @ICTtrying in #262
  • Distinguish a locked device from a missing key in SecureStorage by @simonhamp in #283
  • Make the Android plugin dependency block marker-delimited, so build.gradle.kts stops growing a comment per build by @ICTtrying in #271
  • Add Tailwind aliases and unsupported class warnings by @wojt-janowski in #296
  • fix(ios): stop mangling certificate passwords containing special characters by @shanerbaner82 in #210
  • fix(plugins): copy Android plugin sources into a dedicated wiped source root by @simonhamp in #215
  • Accept format v4 — event channel is a queue, and pin the binaries release by @simonhamp in #265

New Contributors

Full Changelog: https://github.com/NativePHP/mobile-air/compare/4.0.1...4.1.0


4.0.1#

Released: July 31, 2026

What's Changed

  • Recreate the runtime directories Laravel needs in the bundle copy by @gwleuverink in #247
  • Fold the runtime dir list onto BundleExclusions and guard it by name by @simonhamp in #249
  • fix(ios): use persistent WKWebsiteDataStore so cookies survive cold launch by @sawan-webmavens in #140
  • Fix: make iOS bundle extraction atomic and self-healing by @voicecode-bv in #153
  • Substitute ${ENV_VAR} placeholders in Android plugin meta-data by @voicecode-bv in #167

New Contributors

Full Changelog: https://github.com/NativePHP/mobile-air/compare/4.0.0...4.0.1


4.0.0#

Released: July 30, 2026

What's Changed

New Contributors

Full Changelog: https://github.com/NativePHP/mobile-air/compare/3.3.6...4.0.0


4.0.0-rc.1#

Released: July 15, 2026

What's Changed

  • SuperNative — fully native UI powered by SwiftUI on iOS and Jetpack Compose on Android, and the new default for v4 apps
  • Livewire-like native components — each screen is a PHP NativeComponent class holding its state and behavior, re-rendering the native UI as your properties change
  • Shared memory between PHP and the native layer — no serialization overhead or web view bridge between your code and the UI
  • Web view as a component — the classic web-view-first approach is now opt-out: render a single native route with a full-screen web view to keep building the v3 way
  • Layouts — declare shared chrome (nav bars, tab bars) once in a NativeLayout class and attach it to a route or group of routes
  • Native navigation stack — register screens with Route::native(), then push, pop, and replace them with native transitions
  • Component testing suite — mount a NativeComponent, drive interactions, and assert on state and output entirely in-process, with no device or simulator
  • Device, Dialog, File and System Plugins are now core built-ins — nativephp/mobile-device, nativephp/mobile-dialog, nativephp/mobile-file, and nativephp/mobile-system plugins have moved into nativephp/mobile. Remove the standalone plugins before upgrading (see the Upgrade Guide). The facades and events are unchanged, so no application code changes are needed.
  • The Vite dev server is now opt-in — native:run / native:watch no longer start Vite automatically. Pass --vite to enable JS/CSS HMR. The --no-vite flag still works but is now redundant. See Hot Reloading.
  • Fix: Remove stray tag by @martin-ro in #158

New Contributors

Full Changelog: https://github.com/NativePHP/mobile-air/compare/3.3.6...4.0.0-rc.1