What it does, and how to use it

Every feature in plain words first, then the command. On OpenWrt you are already root, so leave out sudo.

Mobile data and APN

Put a SIM card with a data plan in the device and Linux connects to 5G (NSA) or LTE by itself, then shares the connection with everything on the hotspot and the USB cable. If the modem resets, it reconnects by itself.

sudo mobile-data status        # is the connection up? which address?

The APN is the name of your operator's data gateway. Most operators need nothing: leave it empty and the device uses what the SIM card says.

SystemWhere to set the APN
Ubuntu/etc/mu300/mobile-data.conf: MU300_APN and MU300_PDP_TYPE
OpenWrtLuCI: Network > Interfaces > wan, or with uci (below)
uci set network.wan.apn='your.apn'; uci commit network; ifup wan

How much data you used

The device counts its mobile data per day and per billing cycle, in both directions, the way the operator counts it. You can set the day the cycle starts and a monthly cap with a warning; turning mobile data off at the cap is optional, and it comes back on by itself when the next cycle starts. The count survives restarts and switching between systems, and nothing is counted twice. On OpenWrt with the control panel this is the Cellular > Data usage page, and the dashboard shows the current download and upload speed every second.

mu300-traffic                       # today, this billing cycle and the cap
sudo mu300-traffic set reset-day 1  # the day a billing cycle starts
sudo mu300-traffic set cap 50G      # a monthly cap; warns at 90 %
sudo mu300-traffic set cut on       # optional: data off at the cap
mu300-traffic days                  # the last days with traffic

A fixed TTL

Every packet carries a small counter called TTL. Some operators look at it to tell hotspot traffic from the device's own. You can set a fixed value:

sudo mu300-ttl set 64          # a fixed TTL for mobile data
sudo mu300-ttl off             # back to the default

Also in mu300-toolkit (Network > TTL) and the control panel. On the mainline kernels the rule is in tc and flow offloading stays on; on 5.4 it is in nftables and offloading is off while a TTL is set. Check your operator's terms and your local law first.

Wi-Fi hotspot

The device broadcasts its own Wi-Fi network, on 5 GHz (802.11ac) or 2.4 GHz, one at a time. Unless you chose otherwise at install, it has the same name and password as under Android, so your phones join it as before.

SystemChange the name or password
Ubuntuedit /etc/mu300/hotspot.conf, then restart the service (below)
OpenWrtLuCI: Network > Wireless (the file is read only once, at the first start)
sudo nano /etc/mu300/hotspot.conf        # SSID=, PSK=, BAND=5 or 2.4, CHANNEL=auto, COUNTRY=
sudo systemctl restart mu300-hotspot

On 5 GHz the hotspot uses channels 36-48 or 149-165, never a DFS channel (52-144): the Wi-Fi driver cannot detect radar, so a DFS channel chosen in the file or in LuCI is replaced by channel 36 (149 where 36-48 are not allowed) and the log says why (from v2026.10.20; releases before it failed to start the hotspot on such a channel).

If the Wi-Fi chip's firmware crashes, the driver resets the chip and the Wi-Fi comes back by itself, as a hotspot or as a client of another network: in the tests within 15 to 20 seconds, on 6.18 and 7.2. If the chip cannot be reset within 70 seconds, the device restarts cleanly instead of hanging.

Wi-Fi client

Instead of being a hotspot, the Wi-Fi can join another network, like a hotel's or your home's. The device then uses that network for itself and shares it with its USB clients. It is one or the other: the Wi-Fi chip does one at a time.

sudo wifi-client scan                    # the networks in range
sudo wifi-client connect "NAME"          # asks for the password; nothing shows as you type
sudo wifi-client status
sudo wifi-client disconnect              # the hotspot comes back, and stays after a restart
  • Or with the menu: sudo mu300-toolkit > Network > Wi-Fi > "Join a network".
  • Give the password when asked, not on the command line: sudo writes the command line to the system journal.
  • Whether the radio is a client or a hotspot is decided at start-up. While it is the hotspot, connect saves the network and asks for a restart.
  • WPA2 and WPA2/WPA3 mixed networks work; WPA3-only networks do not (this Wi-Fi driver has no SAE). Set the router to mixed mode to join it.
  • USB clients reach only the internet through that network, not its other devices or its router, and the device's own services (SSH included) are closed to it. Reach the device over USB.
  • With both Wi-Fi and mobile data up, the Wi-Fi is used and the SIM stays idle.

USB network and serial console

Plugged into a computer, the device shows up as a network adapter, and the computer gets an address from it. The device itself is 192.168.77.1 on the F50 and 192.168.78.1 on the U30 Air, so one of each can be plugged into the same computer. Two of the same kind need /etc/mu300/lan.conf to tell them apart.

The USB network mode is NCM (with ECM as the fallback); the control panel can switch it to RNDIS, applied at the next start. The same cable also carries a serial console (ttyGS0), a login that works even when networking does not: screen /dev/cu.usbmodem* 115200 on a Mac. SSH and telnet are on.

SMS and USSD

Read, send and delete text messages on the SIM, and send USSD codes such as the one that shows your balance or your own number.

sudo sms list
sudo sms send NUMBER TEXT...
sudo sms delete INDEX
sudo mu300-ussd '*101#'                  # a USSD code, for example your balance

On OpenWrt with the control panel, SMS are under Cellular > SMS. That system syncs the SIM every 30 seconds, which marks unread messages on the SIM as read; the panel keeps its own unread state. Do not run sms delete read there. A message leaves the SIM only after its copy is safely on the disk, so a power cut loses none, and a long message whose other parts never arrive is shown after an hour, marked incomplete. On Ubuntu with the web panel extra, the MU300 page in Cockpit reads, sends and deletes messages too. sms delete accepts only an index, read or all; anything else is refused before it reaches the modem.

SMS forwarding

On OpenWrt with the control panel, Cellular > SMS forwarding sends incoming messages on: to a webhook (JSON or a form), a Telegram chat, or another phone by SMS. It is off until you turn it on. Each target has a template ({sender}, {time}, {text}, {device}) and can filter by sender and keyword. There is a "Send test" button and a delivery log; failed deliveries are retried with a growing wait. Tokens, passwords and the webhook's address stay in /etc/mu300/sms-forward.conf, readable only by root, and never appear in a log. E-mail forwarding needs msmtp, which the image does not include, so that target stays off.

VPN

A VPN sends traffic through a server of your choice, in an encrypted tunnel. Here it covers the device's own traffic and everything from its Wi-Fi and USB clients, with a kill switch: when the tunnel is down, nothing leaves the device.

It is an optional module, mu300-linux-vpn, installed on the device (or by the installer's question) and kept across updates. It keeps profiles of many kinds:

  • a WireGuard .conf (needs a mainline kernel), an OpenVPN .ovpn,
  • a VLESS, VMess, Trojan or Shadowsocks share link,
  • a Clash/mihomo YAML (add vpn-mihomo), or a raw Xray or sing-box JSON,
  • a hysteria2 or TUIC link, or a dae config, for dae (add vpn-dae; kernel 6.18 or 7.2 of v2026.10.20 or newer).
sudo mu300-extra install vpn                         # the module's latest release, checked against its SHA256SUMS; the core and Xray
sudo mu300-vpn engine install sing-box               # each engine is an extra: xray, sing-box, mihomo, dae
sudo mu300-vpn profile import ~/office.conf Office   # a WireGuard .conf, an .ovpn, a YAML or JSON file
sudo mu300-vpn profile import 'vless://...'          # or a share link
sudo mu300-vpn on
mu300-vpn status

Tailscale's traffic goes through the tunnel too. A device whose VPN is on with the kill switch fails closed when the module is missing: mobile data and the Wi-Fi client stay down until it is installed again or the VPN is turned off. Profiles, settings and the security model are in the module's README. Some carriers drop UDP and block OpenVPN.

Module v2.0.0 (with v2026.10.20) splits it into a core and engine extras that updates bring along as one set, adds subscriptions (a URL from your provider that yields profiles, refreshed on a schedule) and an IPv6 guard: when the tunnel carries no IPv6, IPv6 is blocked beside it instead of leaking past the kill switch. On OpenWrt with the control panel all of it is in the panel's VPN menu: Overview, Profiles, Subscriptions, Engines, Settings and Logs.

The toolkit menu

mu300-toolkit is a menu like a Raspberry Pi's raspi-config: temperatures, CPU and RAM use, network speeds, performance profiles, stress tests, Wi-Fi, VPN, services and software updates, without remembering any command.

sudo mu300-toolkit                       # the menu
mu300-toolkit top                        # temperatures, CPU, RAM, network speed
sudo mu300-toolkit profile performance   # also eco, balanced
sudo mu300-toolkit stress all 10         # a stability test under load

Optional parts are called extras:

mu300-extra list
sudo mu300-extra install lang            # more web interface languages (OpenWrt)
sudo mu300-extra remove vpn

Battery, power and LEDs

The status LEDs mean what they mean under ZTE's firmware:

LEDF50 / MU300U30 Air
Networkblue: 4G, white: 5G, red: no serviceblue: 4G, white: 5G, red: no service
Wi-Fion while the hotspot is upwhite: 2.4 GHz, blue: 5 GHz
Battery-white: Linux is up
Heat alarmthe network LED flashes red, white, blue in turn: the chip is at 85 °Cthe battery LED flashes red, white, blue in turn: the chip at 85 °C or the battery at 50 °C
sudo mu300-led test            # find out which LED is which

On the U30 Air, mu300-power saves the battery: profiles (plugged, battery, saver, or auto), radios that go idle when nobody is connected, and a charge limit of 0 to 100 % (from v2026.10.20; 80 % before): charging stops at the limit and resumes 5 points below it, and the battery is never held under 5 %. On the mainline kernels the charger now also reads the current a Type-C port offers, so a 1.5 or 3 A port charges at up to 2 A instead of 500 mA. On OpenWrt with the control panel this is the System > Power page.

mu300-power status
sudo mu300-power charge-limit 80         # 0-100; 100 = no limit
sudo mu300-power profile battery         # plugged, battery, saver or auto
sudo mu300-power set battery.WIFI_IDLE 10

CPU profiles

Three profiles decide how fast the processor may run: saving (cores capped at about 60 % of their maximum: cooler, less power), balanced (the default, the stock behaviour) and performance (every core cluster at its maximum). They never touch the voltage, and the thermal protection stays in charge in every profile. On the control panel: System > CPU.

mu300-cpu status
sudo mu300-cpu profile saving            # or balanced (the default), performance

A start that began because a charger was plugged in stays a charging start (LED blinking, hotspot and modem down) until you press the Wi-Fi key.

U30 Air extras

What it does
Batterylevel, voltage, current, temperature and charging state in mu300-toolkit, the control panel and /sys/class/power_supply, on every kernel. Charging: on 5.4 by the vendor charger stack, on 6.18 and 7.2 by the bq256xx driver from v2026.10.12 on; a charge limit of 0-100 % and the Type-C charging current from v2026.10.20
Buttonspower: a short press wakes the LEDs (they go dark after 60 s), held 3 s shuts down. Wi-Fi key: switches the hotspot between 2.4 and 5 GHz, held 3 s turns it off or on
NFCa phone held to the device joins the hotspot, as under ZTE's firmware
USB hostwith an OTG adapter on the mainline kernels: flash drives (FAT, exFAT), keyboards and mice, USB modems and Ethernet adapters
sudo mu300-nfc                 # shows the tag
sudo mu300-nfc wifi            # writes the hotspot's name and password
sudo mu300-usb host            # U30 Air, mainline kernels: an OTG adapter, 5 V from the battery
sudo mu300-usb device          # back to the computer (the default at every start)

On the F50 the USB port is its power supply, so it has no USB host mode; holding its power button 3 s shuts it down.

Web panels, a terminal in the browser, adb

OpenWrt with the control panel (openwrt-luci) has the MU300 pages: a status dashboard (signal, bands, cells, temperatures, the Wi-Fi clients with their speeds, the battery), network locks, SMS and SMS forwarding, data usage, an AT terminal, TTL and USB modes, and from v2026.10.20 a VPN menu (Overview, Profiles, Subscriptions, Engines, Settings, Logs), System > Terminal (a root shell in the browser, on the LAN only, opened only for your logged-in panel session, closed after 15 idle minutes) and System > Packages after an update. The panel also no longer freezes when an AT command gets stuck, and on OpenWrt an AT command now takes 0.13 s instead of a second. See what the panel adds.

Ubuntu can have a web panel too, from v2026.10.20: Cockpit, Ubuntu's own web console (terminal, logs, services, networking, storage, accounts), with an MU300 page for the mobile network, mobile data and usage, SMS, the VPN, power and CPU, the hotspot and the Wi-Fi client, and updates. It is the panel extra, not part of the image, on the LAN only, at https://192.168.77.1:9090 (U30 Air: .78.1); log in as ubuntu. The installer asks about it when Ubuntu is chosen.

sudo mu300-extra install panel                                           # Cockpit from Ubuntu's archive (about 12 MB)
sudo mu300-extra install panel --from mu300-extra-panel-offline.tar.gz   # offline, with the release's file

adb to Linux. From v2026.10.20 Linux can offer adb shell, push, pull and forward over the USB cable, as Android does. It is off by default, and only a computer whose key you authorised gets in; anyone with an authorised key gets a root shell, so authorise only your own computers. The installer asks whether to turn it on for the computer it runs on.

sudo mu300-usb adb key adbkey.pub       # the computer's ~/.android/adbkey.pub, copied to the device
sudo mu300-usb adb on                   # and off: sudo mu300-usb adb off

Bluetooth, GPU, KVM, languages

  • Bluetooth: BlueZ; scanning works.
  • GPU: the Mali-G57 runs OpenCL 3.0, with no screen.
  • KVM: /dev/kvm on all three kernels, for virtual machines.
  • Memory: about 1.4 GB usable, plus compressed swap in RAM (zram).
  • Web interface languages (OpenWrt): English, Turkish and Simplified Chinese out of the box; 40 more for LuCI and 29 more for the control panel with the lang extra. Switch under System > System > Language and Style, or System > Languages on the control panel. The panel's other translations are machine translations, and corrections are welcome.

What does not work

  • Screen outputHDMI over USB-C: the USB-C power chip never answers.
  • SoundNo speaker or microphone on the board; call audio through the modem is work in progress and not in the releases.
  • WPA3-only Wi-FiThe Wi-Fi driver has no SAE; mixed WPA2/WPA3 works.
  • Hotspot and client at onceThe Wi-Fi does one at a time.
  • Monitor modeThe Wi-Fi chip offers station and access-point mode only.
  • GPSThe device has none, so websites guess your location from the IP address.

The complete table is in the README under what works and what does not.