Building an application distribution layer for Apache NuttX
My GSoC project turned NuttX's ELF loader into a usable path for discovering, validating, installing, updating, and running applications after the firmware has already been flashed.
- Project
- Apache NuttX · Apache Software Foundation
- Contributor
- Aviral Garg
- Mentors
- Alan Carvalho de Assis · Halysson Carvalho
- Snapshot
- August 21, 2026
What happens after someone chooses an application?
The project is a four-stage path around NuttX's existing ELF loader. Choose a stage below to see its input, what nxpkg owns, and what becomes possible next.
Read a package catalog
nxpkg starts with a local or network catalog rather than hard-coding applications into the firmware image.
Select a stage to follow one package from catalog to running application.
View the detailed architectureRepository input, package state, NXStore, and the NuttX runtime.
One owner for package state, one runtime path
The command line and NXStore call the same nxpkg service. Repository input is checked before it reaches the package root; the loader and supervisor then own execution and shutdown.

Catalogs and artifacts are checked before they affect installed state.
The shell and NXStore use one lifecycle API instead of separate state.
The loader and supervisor remain responsible for application processes.
Three pieces make the workflow usable
The package lifecycle, NXStore, and Library.mk are now upstream. Together they provide the device-side experience and a way for applications to package shared dependencies. Open each outcome for implementation details and source links.
nxpkg grew from a local installer into a recoverable lifecycle: sync, install, update, rollback, remove, and list. It supports local and network catalogs, validates metadata and paths, verifies SHA-256 digests, uses configurable versioned storage, and handles locks and interrupted state changes.
Tested on hardware, documented in public
I kept hardware, simulator, and environment-limited evidence separate. The primary final workflow ran on an ESP32-S3 800 × 480 touchscreen board; the NuttX simulator helped isolate NXDoom's display path, and the earlier package fixtures ran on a XIAO ESP32S3 Sense.


Validation checks
Filter the results by where each check was run.
Showing 8 of 8 checks. Hardware, simulator, and environment-limited evidence stay explicitly separated.
Public pull requests
Merged work appears first. Use the filters to view all 18 pull requests or the work that was still under review on August 21.
Showing 13 pull requests accepted into Apache repositories.
- nuttx-apps #3474Basic package lifecycle helperMerged+2,920 · 15 files
- nuttx-apps #3519Module metadata for executable toolsMerged+32 −18 · 11 files
- nuttx-apps #3526Packaged shared-library fixturesMerged+729 −31 · 8 files
- nuttx-apps #3531ELF and nxpkg validation fixturesMerged+687 −3 · 6 files
- nuttx-apps #3642Configurable, crash-aware package storageMerged+522 −57 · 5 files
- nuttx-apps #3718Catalog, path, and version validationMerged+355 −56 · 2 files
- nuttx-apps #3719Network catalog and artifact fetchingMerged+734 −1 · 4 files
- nuttx-apps #3720Lifecycle, rollback, locks, and recoveryMerged+628 −111 · 2 files
- nuttx-apps #3659LVGL touchscreen diagnosticMerged+266 · 5 files
- nuttx-apps #3643NXStore touchscreen frontendMerged+1,941 −87 · 7 files
- nuttx-apps #3662Brickmatch touchscreen and module supportMerged+324 −17 · 4 files
- nuttx-apps #3730Declarative shared-library supportMerged+257 −27 · 8 files
- nuttx #19888Shared-library declaration documentationMerged+25 · 1 file
Diff totals describe the GitHub review surface, not lines written from scratch.
From a working prototype to a real NuttX distro
The package core, NXStore, and shared-library declaration are upstream, and the product path runs on hardware. The next milestone is a store that explains each application before installation and a distribution that another person can reproduce on a supported board.
- Integrate the remaining application, metadata, and documentation pull requests.
- Display application icons and compact previews in NXStore before installation.
- Publish a reproducible ESP32-S3 reference distro with a maintained catalog and recovery path.
- Port the same distribution contract to STM32H7 and other capable boards.
- Add signed metadata, repository policy, storage limits, and dependency rules.
- Extend the merged shared-library support, then investigate CMake and FDPIC separately.