Skip to content

Releases: lyrixx/nativella

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 20 Oct 14:15
cb469ba

Nativella runs a Symfony, Laravel or plain PHP app as a desktop app, with PHP inside the app process.

What's new since 0.2

  • iOS apps without Xcode (experimental). nativella ios makes the iOS app of a project from a template app of this release, on any computer, without Xcode nor a Mac:

    # For the simulator
    nativella ios path/to/project --template nativella-ios-template-iphonesimulator-arm64.zip -o dist/notes.app
    
    # For devices: an IPA, signed with your certificate (its password in NATIVELLA_CERTIFICATE_PASSWORD)
    nativella ios path/to/project --template nativella-ios-template-iphoneos-arm64.zip \
        --certificate ios.p12 --profile notes.mobileprovision -o dist/notes.ipa

    The CI makes the app of the Symfony demo on Linux and opens it in the simulator, where PHP answers. No IPA has run on a device yet: if you try one, tell what the device says in an issue. The icon of the project does not reach iOS apps yet. See Mobile.

  • Phones get the PHP of the desktop. Android and iOS apps used NativePHP's prebuilt PHP. Nativella now builds its own, from the same sources and with the same extensions as the desktop, intl included. ICU and its data add about 36 MB, as on the desktop: the template APK about doubles. See PHP for the phone.

  • Android apps get the icon of their project. nativella android makes the icon of the project the launcher icon, drawn for each screen density. Without one, the APK gets the Nativella icon, no longer Tauri's logo. No adaptive icon yet.

  • Third-party notices. Every executable, APK and iOS app carries the licenses of the software it contains: PHP, its libraries, the Rust crates and, on Android, the Java libraries. nativella licenses prints them, nativella build writes THIRD_PARTY_NOTICES.txt next to the executable, and App::thirdPartyNotices() returns them, for an "about" page. Distribute them with your app, with the licenses of your own dependencies. The static PHP links LGPL code (GNU libiconv, libbcmath, libmbfl): the notices give the version and the source archive of each. See Licenses.

  • Linux, distribution by distribution. Installation lists the packages of WebKitGTK 4.1 and of the tray for Ubuntu, Debian, Fedora, the RHEL 10 family and Arch. The users of your app need them too. The RHEL 9 family, with glibc 2.34, cannot run the releases.

Under the hood

  • static-php-cli builds no PHP for phones: castor static-php:android and castor static-php:ios cross compile PHP and its libraries from its downloads, with the extension list of the desktop. PHP runs without JIT on phones. From the repository, --abi=x86_64 builds Android apps for the emulators of x86_64 computers; the release has arm64 only.
  • cargo-about gathers the licenses of the Rust crates: a crate under a license that tools/cargo-about/about.toml does not list fails the build.
  • CI: only main saves the caches, as those of pull requests filled the 10 GB and evicted them; pull requests no longer build the release executables, main does; the Linux jobs run on Ubuntu 26.04.
  • sha2 0.11.1.

Upgrading from 0.2

Require the packages with ^0.3: before 1.0, ^0.2 does not accept 0.3. With Symfony, for example:

composer require nativella/nativella:^0.3 nativella/symfony-bundle:^0.3

With Laravel, nativella/laravel:^0.3. Take the nativella command and the templates from the same release.

  • nativella bundle is gone: nativella ios makes iOS apps from a template instead.
  • PHP on phones no longer has sockets nor the mb_ereg* functions, which NativePHP's had and the desktop's does not. It gains intl and zip.
  • nativella android now reads the icon of the project: it fails when the file is missing or is not a PNG.

Try it

Download the Symfony demo for your platform below, nativella-demo-symfony-linux-x86_64 or nativella-demo-symfony-macos-aarch64: one executable, PHP inside. Make it executable with chmod +x <file>, then run it.

  • On Linux, it needs glibc 2.35 or later and the system webview, WebKitGTK 4.1: sudo apt install libwebkit2gtk-4.1-0, sudo dnf install webkit2gtk4.1 or sudo pacman -S webkit2gtk-4.1 (see Installation for the other distributions).
  • On macOS, the executable is not signed: xattr -d com.apple.quarantine <file> after downloading it with a browser.

Then read Getting started to run your own app. Nativella is experimental: read Limitations and roadmap first.

Files

nativella-<platform> runs a PHP project (nativella run <project-dir>)
and builds standalone applications (nativella build);
nativella-demo-*-<platform> are the demos, as standalone applications.
SHA256SUMS-<platform> holds their checksums.

THIRD_PARTY_NOTICES-<platform>.txt holds the licenses of the software they
contain: PHP, its libraries, the Rust crates and, on Android, the Java
libraries. nativella licenses prints them, nativella build writes them
next to the applications it builds, and the APKs and the iOS apps carry
them: distribute them with your applications.

They are linked against a static PHP 8.5: they need no PHP on the machine.

Linux x86_64: glibc 2.35 or later (Ubuntu 22.04, Debian 12, Fedora,
RHEL 10, Arch…), and the webview of the system, WebKitGTK 4.1, to run:
sudo apt install libwebkit2gtk-4.1-0, sudo dnf install webkit2gtk4.1
or sudo pacman -S webkit2gtk-4.1. An application with a tray icon needs
the library of the tray too. The packages of each distribution:
https://lyrixx.github.io/nativella/docs/installation/#linux-x86_64

macOS arm64: they need nothing installed. They are not signed: downloaded
with a browser, remove the quarantine first, with
xattr -d com.apple.quarantine <file>.

Android arm64: nativella android <project-dir> --template nativella-android-template-arm64.apk makes the APK of a PHP project of
this template, with the nativella command of the same release.

iOS arm64, experimental: nativella ios <project-dir> --template nativella-ios-template-iphonesimulator-arm64.zip makes an app of a PHP
project for the simulator; with nativella-ios-template-iphoneos-arm64.zip,
--certificate and --profile, an IPA for devices, which no device has
run yet.

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 19 Oct 19:38
296405c

Nativella runs a Symfony, Laravel or plain PHP app as a desktop app, with PHP inside the app process.

What's new since 0.1

  • intl. The PHP inside the executables has the intl extension: numbers and dates formatted for a locale, collation, transliteration, the Intl component of Symfony and its forms, the Number helper of Laravel. ICU and its data, for every locale, add 36 MB to each executable: nativella-linux-x86_64 goes from 51 to 87 MB. Phones still have no intl.

  • Android apps without the Android tools. nativella android makes the APK of a project from the template APK of this release, in seconds, with no JDK, Android SDK, NDK or Rust on the machine:

    nativella android path/to/project --template nativella-android-template-arm64.apk -o dist/notes.apk

    Take the command and the template from the same release: nativella android warns when they differ. The APK is signed with APK Signature Scheme v2, with --key, an EC P-256 private key in PKCS #8 PEM, or else with a debug key that nativella makes once per computer. The Android application ID is the identifier of the project, its dashes as underscores. Not there yet: the icon of the project (the APK has the template's), downloading the template, Java keystores, Google Play bundles (AAB), x86_64, and iOS on the same model. It is experimental, tested on an Android 16 emulator, not on a phone. See Mobile.

  • The PHP packages are on Packagist: composer require nativella/symfony-bundle, nativella/laravel or nativella/nativella, with no clone of the repository. The bundle and the Laravel package bring nativella/nativella. They are split from packages/ of this repository to read-only repositories, and released with the same version as the nativella command: issues and pull requests still go here. See Installation.

  • The Symfony web debug toolbar works in the app. It stayed on "Loading…": its script fetched http://localhost/_wdt/…, outside the app. The runtime rewrote the absolute URLs of HTML and CSS, not the requests of scripts: those of fetch(), XMLHttpRequest and EventSource to http://localhost/… now reach the app too.

  • nativella build names the local overrides it leaves out. .env.local and the other paths ending with .local never ship, but they were left out silently: an APP_ENV=prod set there did not reach the executable. nativella build and nativella bundle now list them, with how to ship the production environment: a file that ships, like the .env.local.php of composer dump-env prod.

  • Credentials. Building a standalone app says where each kind of credential goes: the secret of the framework is each installation's own, those of the user go to the keychain, yours stay on a server of yours, and only keys made to be public ship.

  • nativella alone prints the help: the list of the commands, with a line each. It used to run the project of the current directory, as nativella <project-dir> did: run a project with nativella run [<project-dir>].

Upgrading from 0.1

nativella and nativella <project-dir> no longer run a project: use nativella run or nativella run <project-dir>.

An application that took the packages from a clone of the repository: remove the path repository from its composer.json, then require the packages with ^0.2, as before 1.0 ^0.1 does not accept 0.2. With Symfony, for example:

composer require nativella/nativella:^0.2 nativella/symfony-bundle:^0.2

Under the hood

  • On Linux, the static PHP builds with gcc instead of zig, for the C++ of ICU: the process has a single C++ runtime, the libstdc++ that WebKitGTK loads. The executables still need glibc 2.35, and the release checks that they need no libstdc++ newer than the one of Ubuntu 22.04 (GLIBCXX_3.4.30).
  • The Composer dependencies are up to date: the Symfony demo has Symfony 8.1.9, which fixes CVE-2026-109449 in symfony/expression-language.
  • The CI runs each job only on the changes that can break it, with one workflow per group of jobs.
  • Dependabot updates the Composer, Cargo and Docker dependencies too, one pull request per ecosystem. Its first round is in: Tauri 2.12.3, ext-php-rs 0.16.2, p256 0.14 and sha2 0.11 (a test pins the certificate of the APK signature, so apps signed with a key keep updating), Twig CS Fixer 4, Debian 13.7 and Traefik 3.7.14 in the development stack. jni stays on the version Tauri uses.
  • The APK and the bundle that the Mobile workflow passes from one job to another expire after a day.
  • The test of the Laravel demo accepts its native calls at boot in any order, as Laravel discovers its listeners in the order of the filesystem.

Try it

Download the Symfony demo for your platform below, nativella-demo-symfony-linux-x86_64 or nativella-demo-symfony-macos-aarch64: one executable, PHP inside. Make it executable with chmod +x <file>, then run it.

  • On Linux, it needs glibc 2.35 or later and the system webview, WebKitGTK 4.1: sudo apt install libwebkit2gtk-4.1-0, sudo dnf install webkit2gtk4.1 or sudo pacman -S webkit2gtk-4.1 (see Installation for the other distributions).
  • On macOS, the executable is not signed: xattr -d com.apple.quarantine <file> after downloading it with a browser.

Then read Getting started to run your own app. Nativella is experimental: read Limitations and roadmap first.

Files

nativella-<platform> runs a PHP project (nativella run <project-dir>)
and builds standalone applications (nativella build);
nativella-demo-*-<platform> are the demos, as standalone applications.
SHA256SUMS-<platform> holds their checksums.

They are linked against a static PHP 8.5: they need no PHP on the machine.

Linux x86_64: glibc 2.35 or later (Ubuntu 22.04, Debian 12, Fedora,
RHEL 10, Arch…), and the webview of the system, WebKitGTK 4.1, to run:
sudo apt install libwebkit2gtk-4.1-0, sudo dnf install webkit2gtk4.1
or sudo pacman -S webkit2gtk-4.1. An application with a tray icon needs
the library of the tray too. The packages of each distribution:
https://lyrixx.github.io/nativella/docs/installation/#linux-x86_64

macOS arm64: they need nothing installed. They are not signed: downloaded
with a browser, remove the quarantine first, with
xattr -d com.apple.quarantine <file>.

Android arm64: nativella android <project-dir> --template nativella-android-template-arm64.apk makes the APK of a PHP project of
this template, with the nativella command of the same release.

v0.1.1

Choose a tag to compare

@github-actions github-actions released this 14 Oct 15:10

nativella-<platform> runs a PHP project (nativella run <project-dir>)
and builds standalone applications (nativella build);
nativella-demo-*-<platform> are the demos, as standalone applications.
SHA256SUMS-<platform> holds their checksums.

They are linked against a static PHP 8.5: they need no PHP on the machine.

Linux x86_64: Ubuntu 22.04 or later, Debian 12 or later (glibc 2.35).
They need the webview of the system, WebKitGTK 4.1:
sudo apt install libwebkit2gtk-4.1-0. An application with a tray icon
needs libayatana-appindicator3-1 too, which Ubuntu desktops have.

macOS arm64: they need nothing installed. They are not signed: downloaded
with a browser, remove the quarantine first, with
xattr -d com.apple.quarantine <file>.

v0.1.0

Choose a tag to compare

@github-actions github-actions released this 12 Oct 14:27

nativella-<platform> runs a PHP project (nativella run <project-dir>)
and builds standalone applications (nativella build);
nativella-demo-*-<platform> are the demos, as standalone applications.
SHA256SUMS-<platform> holds their checksums.

They are linked against a static PHP 8.5: they need no PHP on the machine.

Linux x86_64: Ubuntu 22.04 or later, Debian 12 or later (glibc 2.35).
They need the webview of the system, WebKitGTK 4.1:
sudo apt install libwebkit2gtk-4.1-0. An application with a tray icon
needs libayatana-appindicator3-1 too, which Ubuntu desktops have.

macOS arm64: they need nothing installed. They are not signed: downloaded
with a browser, remove the quarantine first, with
xattr -d com.apple.quarantine <file>.