Library / SDK
espressif/esp-idf avatar
espressif/esp-idf

ESP-IDF: the official Espressif framework, read through its support policy and quick reference

Espressif IoT Development Framework. Official development framework for Espressif SoCs.

19,208 stars8,531 forksCApache-2.0

At a glance

What is it?
What the repository actually commits to: per-chip documentation, a release support schedule, EIM as the install path, and a build tool built around idf.py.
Who is it for?
The repository's real contribution to a reader's decision is its support policy file, since ESP-IDF v5.2 reached end-of-life in August 2026 and the maintainers say plainly that v5.2 users should move to something like v6.0.3. Start from the release you are told to target, install with EIM rather than a hand-built toolchain, and read COMPATIBILITY.md if your parts have revision-specific behaviour.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly C, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 11, 2026, and from our analysis. They are not legal advice.

Editorial analysis

An Apache-2.0 framework with 19,000 stars and a version policy

ESP-IDF is the development framework for Espressif SoCs on Windows, Linux and macOS, and it is the framework Espressif points everyone at first. The repository carries 19,058 stars, 8,488 forks and 1,680 open issues, is written in C, is licensed Apache-2.0, is not archived, and had a push on 2026-09-19. The fork count is the striking number: it says more people are shipping on this framework than contribute to it.

What the README spends its space on is version management, not features. There is a release support schedule image, a link to `SUPPORT_POLICY.md`, and a link to the documentation's versions page. A second table covers chip support, and `COMPATIBILITY.md` is the file that spells out how each IDF release relates to revisions of each SoC. That compatibility file is more operationally useful than anything else in the repository for anyone debugging a part-specific quirk, because silicon revisions behave differently often enough that Espressif tracks it explicitly.

One boundary worth stating early: the README sends pre-2016 parts, the ESP8266 and ESP8285, to a separate RTOS SDK. ESP-IDF is not a unified Espressif toolchain. It covers the current families, and the older ones live somewhere else entirely.

The repository root also advertises how seriously the tooling is taken. There are `install.sh`, `install.fish`, `install.bat` and `install.ps1` alongside matching `export` scripts, a `Kconfig`, `.gitmodules`, `add_path.sh`, `sdkconfig.rename`, and Python-side configuration in `ruff.toml`, `.mypy.ini` and `conftest.py`. A framework that runs its own linters and type checks in the repository is doing maintenance work most embedded toolchains skip.

EIM has replaced the old install ritual

The recent release notes mark a change in how you are expected to obtain ESP-IDF. The v5.3.6 notes name the ESP-IDF Installation Manager, EIM, as the recommended way to obtain and install the release, and say it supports fetching releases from Espressif mirrors as well as straight from Git repositories. The old instructions are still there, but they are now labelled a legacy installation method.

That matters because the legacy path is the one most tutorials still describe: clone the repository, run the install script, source the export script, and hope the tool versions line up. EIM packages that step, taking either a release version or a directory you already cloned and attaching the right tools to it. Either way, you end up with an environment you activate per shell, which is why the export scripts still exist and why the README insists you source the export script in every shell before using ESP-IDF.

The legacy setup, for comparison, is two commands on Unix.

bash
install.sh
source export.sh

The README lists the full set: `install.bat` or `install.ps1` on Windows, `install.sh` or `install.fish` on Unix, with `export.bat` on Windows and the export script sourced on Unix. PowerShell and fish users are first-class here rather than an afterthought, which is not true of most embedded toolchains.

The clone itself has one rule, and it is easy to get wrong: use `--recursive`, because the framework vendors a set of submodules. The v6.0.3 notes go further and warn that the source archives attached to a release will not work for that reason, so a shallow download of a tarball is not a supported starting point.

If you clone from somewhere other than GitHub, the submodules will not resolve, because `.gitmodules` uses relative URLs that point at GitHub. The repository ships a script for exactly that case.

bash
tools/set-submodules-to-github.sh

Run it after cloning a fork and a recursive submodule update will complete. If you cloned from GitHub itself, the README says this step is not needed.

What the v5.2, v5.3 and v6.0 notes tell you about the roadmap

Three releases published within two weeks of each other tell a clearer story than a single release would. v5.2.8 on 2026-09-11 is described as a bugfix update for v5.2 and also the last bugfix release of v5.2. It adds that the v5.2 release branch reached end-of-life in August 2026 per the support period policy, that new features, bug fixes and security fixes will no longer be supported there, and that customers on v5.2 are encouraged to move to a more recent release such as v6.0.3.

Then v6.0.3 on 2026-09-02 and v5.3.6 on 2026-09-15, both described as bugfix releases for their branches. The pattern is a v5.2 shutdown bracketed by maintenance on two live branches. There is a `ROADMAP.md` at the root if you want the longer view, but the release notes already say the important part: v5.2 is closed, v5.3 and v6.0 are open.

For a project starting now, that points at v6.0.x. For a project already shipping on v5.2, the notes are unusually direct about the consequence, which is more than most vendor frameworks tell you: no security fixes, not just no features.

The documentation structure is versioned per SoC series and per release, which is the second thing to internalise. Each SoC series and each ESP-IDF release has its own documentation set, and the README points at the versions page for how to find the right one. Practical consequence: an answer you find under `latest` may not describe the branch your product is pinned to, so read the docs that match your checkout rather than the ones search results surface.

The idf.py loop, in the order you will actually use it

The quick reference in the README is short and complete. A new shell needs the export script sourced, then a project needs a target, then everything else follows from `idf.py`.

bash
idf.py set-target <chip_name>
idf.py menuconfig
idf.py build
idf.py -p PORT flash
idf.py monitor

`set-target` picks the chip, and running it with no arguments lists the supported targets, which is the fastest way to confirm a name is spelled the way the tool expects. `menuconfig` opens the text configuration menu driven by the repository's `Kconfig`. `build` compiles the app and bootloader and generates a partition table. `flash` writes the whole project, and the port can be given with `-p`, otherwise the first available serial port is used.

Two details in the notes save real time. You do not need to run `build` before `flash`, because `flash` rebuilds whatever changed. And `flash` does not erase the entire flash, which matters when you change the partition table or do an OTA update; for a genuinely blank chip the target is `erase-flash`, which can be combined with `flash` in one invocation.

bash
idf.py -p PORT erase-flash flash

For the normal development loop, two targets shorten it further.

bash
idf.py app
idf.py app-flash

`app` builds just the application and `app-flash` flashes just the application, rebuilding first if sources changed. During ordinary development the README notes there is no real downside to reflashing the bootloader and partition table each time when they have not changed, which is a fair correction to the habit most people pick up from other ecosystems.

Output comes back through `idf.py monitor`, which wraps the separate esp-idf-monitor tool to decode crash output and interact with the device. You leave it with Ctrl-]. And because the monitor is a target rather than a separate program, build, flash and watch in one pass.

bash
idf.py flash monitor

Twenty example directories and how to use them without polluting the tree

ESP-IDF ships its own examples rather than pointing only at a template project, and the `examples/` directory has twenty entries. They are organised by subsystem: `wifi/`, `bluetooth/`, `ethernet/`, `ieee802154/`, `openthread/`, `mesh/` and `zigbee/` for connectivity, `peripherals/`, `phy/`, `storage/`, `lowpower/` and `security/` for the chip itself, `protocols/`, `system/`, `build_system/`, `cxx/` and `custom_bootloader/` for the framework's own mechanics, and `get-started/`, `common_components/` alongside them.

The `cxx/` directory answers the question people ask most often about the framework's language, and it is worth being precise about the answer. The repository's primary language is C, and the components are C, but C++ support is part of the build system rather than an afterthought bolted on afterwards.

The README also gives one instruction that saves real confusion later: to start your own project based on an example, copy the example directory outside of the ESP-IDF directory. Working inside the checkout makes version control and submodules fight you, and it means an `idf.py` invocation picks up the framework's own components rather than yours.

What the repository does not do is explain the architecture. The README is candid about this by routing you to the documentation site for anything conceptual, and it lists the documentation, a beginner video, the esp32.com forum, the issues tracker and the contributions guide. For a project this size that is a reasonable division: the code is the reference for structure, the docs are the reference for concepts.

Where ESP-IDF sits against the Arduino route

The comparison comes up constantly, and the repository is not the place to settle it, so it is worth being clear about what the framework actually asks for. `idf.py menuconfig` and a generated partition table assume you are building a product image, not uploading a sketch. Partition layout, bootloader, Kconfig-driven configuration and a C build system are all steps Arduino hides.

What that buys is the ability to treat a firmware image as something with a plan: a bootloader, an application, an optional OTA slot, and a table that says where each one lives. It also buys a component model, so code is organised into components with their own manifests rather than into whatever a single .ino file holds.

The cost is honest friction. `install.sh` plus a sourced `export.sh` in every shell is a real tax compared with an IDE that downloads its own toolchain, and EIM exists precisely because that tax was worth removing. The migration also has a cliff in it: `menuconfig` settings and `sdkconfig` files are part of your project's history, so moving between IDF majors is a project in itself, and the v5.2 end-of-life note is a good illustration of why.

The middle ground is common and sensible. Use the framework's examples as reference implementations while prototyping, keep an Arduino-based build for throwaway experiments, and move to IDF when the firmware needs partition control, OTA, or a component structure you can grow into. Whichever side of the line a project sits on, `COMPATIBILITY.md` and `SUPPORT_POLICY.md` are the two files to read before committing, because they answer the question Arduino documentation never raises: how long will this toolchain still receive fixes.

Editorial conclusion

The repository's real contribution to a reader's decision is its support policy file, since ESP-IDF v5.2 reached end-of-life in August 2026 and the maintainers say plainly that v5.2 users should move to something like v6.0.3. Start from the release you are told to target, install with EIM rather than a hand-built toolchain, and read COMPATIBILITY.md if your parts have revision-specific behaviour.

Frequently asked questions

What is an ESP-IDF?

ESP-IDF is Espressif's official development framework for its SoCs, supported on Windows, Linux and macOS. It is written primarily in C, licensed Apache-2.0, and provides a Kconfig-based configuration menu, a component model and the idf.py build, flash and monitor toolchain.

Is ESP-idf better than Arduino?

It depends on what you are building. ESP-IDF gives you partition tables, a bootloader, Kconfig configuration and a component structure, which suits firmware that ships as a product image with OTA. Arduino is a shorter path for quick prototypes, at the cost of those product-level decisions.

Is ESP-idf in C or C++?

The framework and its components are written in C, and the repository reports C as its primary language. C++ is part of the build system as well, with a dedicated examples/cxx directory showing how C++ fits into a project.

Is ESP-IDF difficult?

The learning curve is real but the steps are documented: run the install script, source the export script in every shell, then set a target with idf.py set-target and open idf.py menuconfig. Recent releases recommend the ESP-IDF Installation Manager, which packages the environment setup that used to be the fiddliest part.

Official sources

  1. espressif/esp-idf on GitHub
  2. Issues
  3. License: Apache-2.0
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/espressif-esp-idf.svg)](https://hysenlabs.com/projects/espressif-esp-idf)