# Default Bootloader and OTA Data File Paths Used by esp_flasher

> Discover the default bootloader and OTA data file paths esp_flasher uses. Learn how esp_flasher automatically downloads these critical files for your ESP device.

- Repository: [Jason2866/esp_flasher](https://github.com/jason2866/esp_flasher)
- Tags: internals
- Published: 2026-03-04

---

**The esp_flasher tool references predefined URLs in [`esp_flasher/const.py`](https://github.com/jason2866/esp_flasher/blob/main/esp_flasher/const.py) to automatically download the OTA data binary (`boot_app0.bin`) and a templated bootloader ELF file, substituting runtime placeholders based on the target chip model and flash configuration.**

When flashing ESP32 devices, the `jason2866/esp_flasher` repository eliminates the need to manually locate binary files by embedding default download paths directly into its source code. These constants ensure that users can flash firmware immediately without specifying local file paths, as the tool fetches the appropriate binaries from remote URLs during the flashing process.

## Default File Paths Defined in [`esp_flasher/const.py`](https://github.com/jason2866/esp_flasher/blob/main/esp_flasher/const.py)

The central configuration file [`esp_flasher/const.py`](https://github.com/jason2866/esp_flasher/blob/main/esp_flasher/const.py) defines two critical constants that store the default locations for required binary files.

### OTA Data Binary Location

The constant `ESP32_DEFAULT_OTA_DATA` points to the pre-built OTA data partition binary:

```python
ESP32_DEFAULT_OTA_DATA = (
    "https://raw.githubusercontent.com/Jason2866/ESP_Flasher/factory/"
    "partitions/boot_app0.bin"
)

```

This URL downloads the `boot_app0.bin` file, which contains the initial OTA (Over-The-Air) data partition contents required for the ESP32 to boot into the factory application partition.

### Bootloader ELF Template

The constant `ESP32_DEFAULT_BOOTLOADER_FORMAT` stores a URL template rather than a direct link:

```python
ESP32_DEFAULT_BOOTLOADER_FORMAT = (
    "https://raw.githubusercontent.com/Jason2866/ESP_Flasher/factory/"
    "bootloader/$MODEL$/bin/bootloader_$FLASH_MODE$_$FLASH_FREQ$.elf"
)

```

This template requires runtime substitution of three placeholders to generate a valid download URL for the specific bootloader variant.

## How the Bootloader Template Works

The bootloader URL template uses three placeholders that `esp_flasher` substitutes at runtime based on the detected or specified chip configuration:

- **`$MODEL$`**: The ESP32 chip model (e.g., `esp32`, `esp32s2`, `esp32s3`, `esp32c3`)
- **`$FLASH_MODE$`**: The flash mode configuration (e.g., `dio`, `qio`, `dout`, `qout`)
- **`$FLASH_FREQ$`**: The flash frequency (e.g., `40m`, `80m`)

The substitution logic resides in [`esp_flasher/common.py`](https://github.com/jason2866/esp_flasher/blob/main/esp_flasher/common.py), specifically within the `format_bootloader_path` function. This function takes the template string and replaces each placeholder with the appropriate values derived from the chip detection process or user-specified parameters.

For example, when targeting an ESP32 with DIO flash mode at 40MHz, the resolved URL becomes:

```

https://raw.githubusercontent.com/Jason2866/ESP_Flasher/factory/bootloader/esp32/bin/bootloader_dio_40m.elf

```

## Accessing Default Paths Programmatically

You can inspect or utilize these default paths directly in Python by importing the constants module:

```python
from esp_flasher import const

# Retrieve the default OTA data URL

ota_url = const.ESP32_DEFAULT_OTA_DATA
print(f"Default OTA data URL: {ota_url}")

# Resolve the bootloader template for a specific configuration

template = const.ESP32_DEFAULT_BOOTLOADER_FORMAT
model = "esp32"
flash_mode = "dio"
flash_freq = "40m"

bootloader_url = (
    template.replace("$MODEL$", model)
    .replace("$FLASH_MODE$", flash_mode)
    .replace("$FLASH_FREQ$", flash_freq)
)

print(f"Resolved bootloader URL: {bootloader_url}")

```

This approach allows custom tooling to leverage the same binary sources as the official `esp_flasher` CLI without hardcoding URLs.

## Overriding Defaults via CLI

While `esp_flasher` provides these default paths, the CLI implementation in [`esp_flasher/__main__.py`](https://github.com/jason2866/esp_flasher/blob/main/esp_flasher/__main__.py) accepts explicit arguments to override them:

- `--bootloader`: Specify a local path or custom URL for the bootloader binary
- `--otadata`: Specify a local path or custom URL for the OTA data binary

When these arguments are omitted, the tool falls back to the constants defined in [`esp_flasher/const.py`](https://github.com/jason2866/esp_flasher/blob/main/esp_flasher/const.py), automatically downloading the required files during the flashing process.

## Summary

- **Default OTA data path**: Defined in `ESP32_DEFAULT_OTA_DATA` within [`esp_flasher/const.py`](https://github.com/jason2866/esp_flasher/blob/main/esp_flasher/const.py), pointing to `boot_app0.bin` hosted on the project's GitHub repository.
- **Default bootloader path**: Defined in `ESP32_DEFAULT_BOOTLOADER_FORMAT` as a template URL requiring runtime substitution of `$MODEL$`, `$FLASH_MODE$`, and `$FLASH_FREQ$` placeholders.
- **Template resolution**: The `format_bootloader_path` function in [`esp_flasher/common.py`](https://github.com/jason2866/esp_flasher/blob/main/esp_flasher/common.py) handles the substitution logic to generate chip-specific download URLs.
- **CLI overrides**: Users can bypass defaults using `--bootloader` and `--otadata` arguments in the command-line interface.

## Frequently Asked Questions

### Where does esp_flasher download the default bootloader from?

The tool downloads bootloader ELF files from `https://raw.githubusercontent.com/Jason2866/ESP_Flasher/factory/bootloader/`, using the template constant `ESP32_DEFAULT_BOOTLOADER_FORMAT` defined in [`esp_flasher/const.py`](https://github.com/jason2866/esp_flasher/blob/main/esp_flasher/const.py). The actual URL is constructed at runtime by substituting placeholders for the specific chip model, flash mode, and flash frequency.

### Can I use a local bootloader file instead of the default URL?

Yes. The CLI implementation in [`esp_flasher/__main__.py`](https://github.com/jason2866/esp_flasher/blob/main/esp_flasher/__main__.py) accepts a `--bootloader` argument that accepts either a local file path or a custom URL. When provided, this value overrides the default template defined in `ESP32_DEFAULT_BOOTLOADER_FORMAT`, allowing you to use locally compiled bootloader binaries or mirror servers.

### What is the purpose of the OTA data binary (boot_app0.bin)?

The `boot_app0.bin` file referenced by `ESP32_DEFAULT_OTA_DATA` contains the initial data for the ESP32's OTA (Over-The-Air) information partition. This partition tells the ESP32 which application slot to boot after a firmware update. Without this binary, the device cannot properly initialize the OTA subsystem or switch between factory and OTA application partitions.

### How does esp_flasher determine which bootloader variant to download?

The tool determines the appropriate bootloader variant by substituting three placeholders in the `ESP32_DEFAULT_BOOTLOADER_FORMAT` template: `$MODEL$` (chip type such as esp32 or esp32s3), `$FLASH_MODE$` (dio, qio, etc.), and `$FLASH_FREQ$` (40m, 80m, etc.). The `format_bootloader_path` function in [`esp_flasher/common.py`](https://github.com/jason2866/esp_flasher/blob/main/esp_flasher/common.py) performs this substitution using values detected from the connected device or specified by the user.