NativePHP for Mobile v4 is here — build real native UIs from Blade with SuperNative

Changelog


For changes prior to v4, see the v3 documentation.

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