Web installer

Install, update and remove Linux from this page, over USB, in Chrome or Edge. Nothing to install on the computer.

Tested on an F50, from Chrome on macOS

On 2026-10-13 this page was run from start to finish on a ZTE F50 (64 GB, Android 13, Magisk 30.6) from Chrome 155 on macOS, with release v2026.10.25: installing one system and two, with the device downloading the release itself and with a file chosen by hand, a tab closed in the middle of an installation, starting Linux, managing it, going back to Android, and uninstalling.

Not tested yet: Windows (the adb interface needs the WinUSB driver there) and Linux as the computer's system (it needs the udev rule shown below); a U30 Air; an SD card as the target; a root manager other than Magisk; and the device's own download over real mobile data (the test device's Android had no internet, so its download reached GitHub through the test computer). For those, the installer for computers and the Magisk zips are the tested ways. If something goes wrong here, keep the log (the page can save it) and tell us.

Before you start

What the page does, and what runs on the device

The page is a small adb client. It talks to the device over USB and does three things there: it puts a few of the project's scripts and the release's Magisk zip on the device, it starts the zip's own installer (the one the Magisk app runs) with your answers, and it shows what that installer prints. The installing, the checks and the order of the writes are the device's, the same as for a zip flashed in Magisk.

It does not shrink Android's data partition on the 32 GB variant (it shows the figures and points to the installer for computers), and it does not grow it back.

You choose the system, the kernel and the release; the page names the file that belongs to that choice and its size, and gets it onto the device without you downloading anything: it asks the device to download the file itself from the project's releases on GitHub, over the device's own internet connection, and shows how far it is. A download that breaks continues where it stopped. That costs the file's size (39 to 124 MB per system) of the device's mobile data, which an operator may charge by volume. When the device has no connection, the page says so and this computer downloads the file from the project's mirror of the release on GitHub and sends it over the cable (GitHub does not let a web page read a release's own files, so the project keeps a copy where a page can). As a last way you download the file yourself and choose it.

Whichever way a file comes, the device uses it only when it has the checksum GitHub publishes for the release, which the browser reads from GitHub directly. A file's integrity comes from that pinned checksum, not from the connection it travelled over: the downloader on the device (Magisk's busybox) cannot verify GitHub's certificate, so nothing is believed because of where it seems to come from. The page also holds a download to the size the release names and stops one that is sent anywhere but GitHub.

If the browser cannot open the device

Everywhere

A running adb server (Android Studio, adb on a terminal, scrcpy, some phone tools) has claimed the device, or another browser window has this page open and is connected to it. Only one program at a time can talk to the device.

adb kill-server, close those programs and that other window or tab, connect again. The page says “another program is using the device” when this is the reason.

Windows

The browser can only use an interface that has the WinUSB driver. Android's adb interface asks Windows for it by itself on most devices; whether the F50 and U30 Air do has not been measured. A maker's own adb driver in its place blocks the browser.

In Device Manager, look at the device's “ADB Interface”. If it has another driver or none, install Google's USB driver (it is WinUSB) or bind WinUSB to that interface with Zadig. Change only the adb interface, not the network or modem ones.

Linux

The device node belongs to root, so the browser may not write to it.

Add a udev rule for adb interfaces, then plug the device in again:
echo 'SUBSYSTEM=="usb", ATTR{bInterfaceClass}=="ff", ATTR{bInterfaceSubClass}=="42", MODE="0660", TAG+="uaccess"' | sudo tee /etc/udev/rules.d/51-adb-webusb.rules
sudo udevadm control --reload && sudo udevadm trigger
A browser installed as a snap or flatpak may need its own permission for USB.

macOS

Nothing to install. Only another program holding the device stops the browser.

Quit that program.

The page says which of these it ran into, as far as the browser tells it.

Managing MU300 Linux: turn adb on first

From the release after v2026.10.23 on, Linux offers adb over the same cable to every computer, and the page can manage it without any preparation. An older Linux has adb off (sudo mu300-usb adb on), and one that was set to authorised keys only lets in just the computers whose adb key it knows; there is no screen to ask on. This browser has a key of its own (the page shows it under “This browser's adb key”). To authorise it, run on the device, over SSH:

echo '<the key line the page shows>' | sudo mu300-usb adb key -
sudo mu300-usb adb on

Whoever holds an authorised key gets a root shell on the device, so authorise only your own browsers and computers.

If the tab closes or the cable comes out

The installation is a job on the device. It does not need this page: closing the tab, a browser crash or a sleeping computer ends the page's view of it, not the job. Connect again and the page shows where it is. A cable pulled from an F50 is a power cut (it has no battery); a U30 Air runs on.

Stopped whileThe device then
sending files, working out the plan, building the boot imageNothing has been written to its storage. It starts Android.
installing the systemAn unfinished Linux filesystem that nothing starts. The boot partitions and misc are untouched: it starts Android. Run the installation again.
writing the boot imageOnly the Linux slot's boot partition is written, never Android's. The half-written image is not the boot target: the 32 bytes that make the device try it are written last, after the image was read back. It starts Android.
arming (32 bytes of misc)One small write, read back, and undone if it does not verify. Either Android's block or the Linux trial block is there.
after thatLinux is tried; a Linux that does not finish starting falls back to Android by itself.

Uninstalling goes the other way round: Android is made the boot system first, then the Linux slot gets Android's boot image back, then the Linux filesystem is erased. Whatever stops it, the device starts Android.

What the page sees and keeps

From a phone?

Chrome on Android has WebUSB too, so a phone with an OTG cable could in principle run this page. It is not built or tested for that: the phone would have to power an F50 through the adapter for the whole installation, and the release files would have to be on the phone. Use a computer.