
The ESPHome dashboard was built to run on a laptop or a Home Assistant server, and its “Install” button assumes a wired USB serial connection to the developer machine. That has left a lot of Android-only tinkerers wondering whether they can flash an ESP32 to run ESPHome without borrowing a computer. In 2026 the answer is yes for most jobs, no for the last mile, and the picks below cover every case you are likely to hit.
The list of Android companion apps for ESP32 and ESP8266 boards more broadly is in our seven best ESPHome and microcontroller companion apps for Android roundup. This guide focuses on the one job that companion apps skip: getting the ESPHome firmware onto a fresh board in the first place.
Three routes that work from Android
The three flashing methods that actually work without a laptop, in the order you should try them:
- Improv Wi-Fi over Bluetooth — pre-flashed board arrives with Improv, phone provisions Wi-Fi credentials over BLE, ESPHome dashboard on the server picks it up for OTA. Zero cables, zero terminal.
- Home Assistant Add-on plus OTA — you already run Home Assistant on a mini PC or Raspberry Pi. First flash uses any laptop or single-board computer; every subsequent flash is over-the-air from the phone.
- USB-OTG serial — Android phone with USB-C OTG plus a serial-terminal app plus the ESPHome factory binary. Works for the initial flash. Fiddly, but no laptop required.
Method 1 is where the industry landed in 2026 and where you should start. Method 2 is the fallback for anyone whose board did not ship with Improv pre-installed. Method 3 is for corner cases: brand-new ESP32-C3 or ESP32-S3 boards that need to be bootstrapped from a completely blank flash.
Method 1: Improv Wi-Fi from the Home Assistant Android app
Google Play package: io.homeassistant.companion.android — Home Assistant on Aptoide
Improv Wi-Fi is an open protocol maintained by the Home Assistant / ESPHome team. A pre-flashed board — Athom smart plugs, Shelly devices switching to ESPHome, Everything Presence sensors, most 2025-onwards ESPHome-ready hardware — advertises itself over Bluetooth Low Energy. The phone connects, sends Wi-Fi SSID and password, and hands off to the ESPHome dashboard for OTA firmware installs from that point onward.
What you need
- An ESP32 or ESP8266 that ships with Improv pre-installed, or a board you have already flashed once with the ESPHome Improv component enabled.
- Home Assistant running somewhere on your network with the ESPHome Add-on installed.
- The Home Assistant Android app (linked above) signed into your instance.
- Bluetooth switched on on the phone. Improv uses BLE, not classic Bluetooth pairing.
Steps
- Power the ESP32. Boards with Improv factory firmware advertise for the first few minutes of every boot.
- Open the Home Assistant Android app. It listens for Improv advertisements automatically on the same network segment and surfaces a notification labelled Set up nearby device. If it does not appear, pull down to refresh the dashboard or check that Bluetooth scanning is enabled in Android’s Bluetooth settings.
- Tap the notification. The phone connects over BLE, prompts you for the Wi-Fi network to join, and sends the credentials to the board. The ESP flashes its onboard LED while it associates with your Wi-Fi.
- The ESPHome dashboard on Home Assistant surfaces the new device under Discovered. From there, adopt it, pick or write a configuration YAML, and hit Install > Wirelessly. The compile and OTA push both happen on the server; the phone just watches.
The only thing to double-check is that the ESP is on the same subnet as your Home Assistant instance. Guest Wi-Fi networks and enterprise SSIDs with client isolation break the OTA hand-off. Put the ESP on your main network for the first flash, then move it if you need to.
Method 2: OTA after a one-time server-side flash
If your board did not ship with Improv, you still do not need a laptop to reflash it after the first time. The ESPHome dashboard’s OTA installer works over Wi-Fi once any ESPHome firmware — however basic — is on the board.
The catch is that first flash has to happen somewhere. Three practical ways:
- Run ESPHome directly on a Raspberry Pi with the board plugged in. SSH from Termius on Android into the Pi, plug the ESP32 into the Pi’s USB port, run
esphome run initial.yamlfrom the shell. The Pi becomes your one-off flashing station. - Use the Home Assistant Green / Yellow / OS device’s USB port. Home Assistant OS exposes attached USB serial devices to the ESPHome Add-on. Plug the ESP into the HA box, open the ESPHome dashboard in the mobile browser, hit Install > Plug into the computer running ESPHome Dashboard. The Add-on flashes over the local USB serial connection with no laptop involved.
- Borrow a friend’s laptop for ten minutes for the first flash only, then hand it back and do all subsequent updates OTA from the Android app. This is the pragmatic default.
Once the board has any ESPHome build on it, the Install > Wirelessly option in the ESPHome dashboard becomes available and you never touch USB again — until the OTA breaks and you have to recover the board.
Method 3: USB-OTG serial from Android
Search this in Google Play: Serial USB Terminal, DroidTerm, USB Serial Console
Direct serial flashing from Android is the corner-case path. Android does not run the ESPHome Python toolchain natively, so this method is not about running esphome-flasher on your phone — it is about getting a pre-built factory binary onto the ESP through a serial-terminal app.
Hardware you need
- A phone with USB-C OTG host support. Almost every 2020-and-later Android phone has this; older phones need a USB-C-to-USB-A OTG cable.
- A USB-C-to-USB-C data cable, or a USB-C-to-Micro-USB depending on your ESP dev board.
- The ESP32 or ESP8266 board itself with a USB-to-serial bridge on-board (CP2102, CH340, CP210x — most dev boards have one).
Software
- A serial-terminal app that speaks USB-CDC to the CP2102 / CH340 chipset. Serial USB Terminal by Kai Morich is the most robust free option on Google Play; DroidTerm is a lighter alternative.
- A pre-built factory
binfile, either downloaded from the ESPHome dashboard’s compile step run on any laptop, or from Athom / Shelly’s ESPHome-ready factory downloads. - Termux plus
esptool.pyfor anyone comfortable with a shell.
Steps at a glance
- Plug the phone into the ESP32 via the OTG cable. Android should prompt to open the terminal app; grant USB permission.
- Connect to the board at 115200 baud in the terminal to verify communication.
- If you are running Termux, install Python and
esptool(pkg install python && pip install esptool) and useesptool.py --port /dev/bus/usb/... write_flash 0x0 firmware-factory.bin. Termux needs the USB serial driver hooked to/dev/bus/usb, which usually just works on modern Android after granting permission. - If you are not using Termux, some Android flashing GUI apps (search Google Play for ESP Flash Tool variants) can push a factory
.bindirectly through the CP2102 / CH340 bridge.
Reliability varies by phone. Samsung and Pixel devices with recent Android versions handle CP2102 and CH340 out of the box; older Xiaomi and Realme builds sometimes need the OTG-USB permission granted twice. The whole method is significantly less pleasant than Improv Wi-Fi; treat it as the fallback of last resort.
What Home Assistant on Android can and cannot do
The Home Assistant Companion Android app is where all three methods land eventually — the ESPHome dashboard lives inside Home Assistant, so once a device is on your network it appears in the app for monitoring and OTA updates. What the app itself cannot do:
- Compile ESPHome firmware locally on the phone. The ESPHome compiler runs on the server, not the phone. Your phone is a control surface for a remote compile.
- Push USB-serial flashes without the server. The Companion app has no direct USB-OTG flashing feature. If you want the phone to be the compiler, you are outside the supported workflow.
- Provision Improv-over-Serial. The Improv Wi-Fi variant works from Android; the Improv Serial variant needs a wired connection to the ESPHome dashboard host.
The app is excellent for what it does: BLE Improv provisioning, viewing sensor data, triggering automations, receiving notifications from your ESP32s once they are online. It replaces the laptop for day-to-day operations. It does not replace the laptop for the first bootstrap of a completely blank board unless the board ships Improv-ready.
Common pitfalls when flashing ESPHome from Android
- Board is on a captive-portal Wi-Fi. Improv sends credentials, but Wi-Fi networks that require a browser-based captive-portal login (guest networks, café Wi-Fi) will not associate an ESP32 headlessly. Move the board to a normal SSID for provisioning.
- Home Assistant is on a different VLAN. ESPHome OTA requires mDNS discovery on the same broadcast domain. If your ESPs live on an IoT VLAN and Home Assistant on the main LAN, enable mDNS reflection on your router or provision the ESP on the same VLAN as HA and move it after.
- BLE scanning permission missing. Android 12+ splits Bluetooth into Nearby devices (scan) and Bluetooth Connect. Improv needs the scan permission — grant both to the Home Assistant app.
- USB-OTG cable is charge-only. Cheap USB-C-to-USB-C cables that come with wall chargers often lack the data pairs. Symptom: phone recognises the ESP is drawing power but never enumerates the serial device. Use a data-rated cable.
- Board holds boot mode incorrectly. ESP32-C3 and ESP32-S3 sometimes need the
BOOTbutton held during power-on before serial flashing. USB-OTG cables that also power the board make this awkward. Use a Y-cable or a separate power source if you hit this.
Where each method fits
| Method | First flash of a blank board | Reflash after first setup | Requires laptop |
|---|---|---|---|
| Improv Wi-Fi from HA Android app | Only if the board ships Improv-ready | Yes (over Wi-Fi) | No |
| ESPHome OTA after server-side first flash | No (needs server or friend’s laptop once) | Yes (over Wi-Fi) | Once |
| USB-OTG serial from Android | Yes | Yes | No |
The order to try them in stays the same: Improv first, OTA after server-side bootstrap second, USB-OTG serial only when the first two are not available.
FAQ
Can I run the full ESPHome dashboard on my Android phone?
Not natively. The ESPHome dashboard is a Python web app that runs on Home Assistant OS, a Docker container, or a Linux install. You can access it in a mobile browser and control everything from the phone, but the compile toolchain itself runs on the server side.
Do I need Home Assistant to use ESPHome from Android?
Improv Wi-Fi provisioning and OTA flashing both assume an ESPHome dashboard is reachable from the ESP. That dashboard usually lives inside Home Assistant. You can run the ESPHome Docker image without Home Assistant, but the Android side of the workflow is designed around the Home Assistant Companion app’s Improv integration.
What if my ESP32 board doesn’t have a USB-to-serial bridge?
Some newer ESP32-S3 and ESP32-C3 modules expose USB directly without a CP2102 or CH340 bridge. These sometimes present as a native USB CDC device Android’s terminal apps can talk to, but the mode-switching quirks vary by dev-board vendor. Improv Wi-Fi or a server-side first flash sidesteps the issue entirely.
Is Improv Wi-Fi secure?
Improv encrypts the Wi-Fi credentials in transit over BLE using a session key. It does not authenticate the ESP — a nearby attacker could technically impersonate an Improv-advertising device. In practice this matters only for the first-provisioning moment. After that, the ESP is on your Wi-Fi and communicating with Home Assistant over the LAN.
Can I flash ESPHome from an iPhone the same way?
Improv Wi-Fi works from iOS through Safari’s Web Bluetooth support, and the Home Assistant iOS app supports Improv provisioning. USB-OTG serial flashing is much more restricted on iOS because Apple’s Lightning-to-USB and USB-C-to-USB adapters do not expose the CDC serial layer to third-party apps the way Android does.