GitPedia

Nerves

Craft and deploy bulletproof embedded software in Elixir

From nerves-project·Updated June 28, 2026·View on GitHub·

Nerves provides tooling and libraries for building small, self-contained software images using the rock-solid [Erlang virtual machine](https://www.erlang.org/) hardware support of Linux, and happy development experience of Elixir for microprocessor-based embedded systems. The project is written primarily in Elixir, first published in 2016. It has gained significant community traction with 2,468 stars and 205 forks on GitHub. Key topics include: elixir, embedded, nerves.

Latest release: v1.14.3
June 12, 2026View Changelog →
<!-- SPDX-FileCopyrightText: 2016 Justin Schneck SPDX-FileCopyrightText: 2017 Frank Hunleth SPDX-FileCopyrightText: 2017 Greg Mefford SPDX-FileCopyrightText: 2017 Jeff Smith SPDX-FileCopyrightText: 2017 Xavier Damman SPDX-FileCopyrightText: 2020 Jon Carstens SPDX-FileCopyrightText: 2022 Masatoshi Nishiguchi SPDX-FileCopyrightText: 2022 Rui Lopes SPDX-FileCopyrightText: 2023 Dave Purrington SPDX-FileCopyrightText: 2024 Cocoa Xu SPDX-FileCopyrightText: 2026 Gus Workman SPDX-License-Identifier: CC-BY-4.0 -->

Nerves

Backers on Open Collective
Sponsors on Open Collective
Hex version
CircleCI
REUSE status

Craft and deploy bulletproof embedded software in Elixir

Nerves provides tooling and libraries for building small, self-contained
software images using the rock-solid Erlang virtual
machine
hardware support of Linux, and happy
development experience of Elixir for microprocessor-based embedded systems.

While the Nerves project provides base runtime libraries for hardware access and
network configuration, nearly all of the Elixir ecosystem is available,
including:

  • Phoenix and LiveView for interactive
    local web user interfaces
  • Elixir Nx for numerical computing and
    machine learning
  • Livebook for interactive code notebooks on your device
  • Scenic for local on-screen user interfaces

Or just keep it simple and use whatever libraries you need from the
Hex package manager. Nerves only includes what you use so
your embedded software can remain small.

Nerves uses the Linux kernel to support a large variety of hardware. It is not a
Linux distribution, though, and contains little of what you would find on a
typical embedded Linux system. Instead, it starts the Erlang runtime as one of
the first OS processes and lets Erlang and Elixir take over from there. Not to
fear, if you need something from Linux, Nerves provides a way to use most of the
packages available through Buildroot.

Nerves Projects

Our project is spread over many repositories in order to focus on a limited
scope per repository.

This repository
(nerves-project/nerves) is an
entrance to Nerves and provides the core tooling and documentation.

The Nerves core team maintains the projects in the nerves-project organization
with the help of many in the Elixir community. Projects under other GitHub
organizations are maintained by their respective organization, but listed here
since they're so commonly used in conjunction with the core libraries and tools.

Framework / Core

NameDescriptionRelease
ErlinitReplacement for /sbin/init that launches an Erlang/OTP ReleaseGitHub release (latest SemVer)
Nerves.BootstrapThe Nerves new project generator and low level hooks into MixHex.pm
Nerves.RuntimeSmall, general runtime utilities for Nerves devicesHex.pm
NervesPackInitialization setup for Nerves devicesHex.pm
NervesSystemBRBuildroot based build platform for Nerves SystemsHex.pm
RingLoggerA ring buffer backend for Elixir Logger with IO streamingHex.pm

Example projects

NameDescriptionRelease
Circuits QuickstartTry out Elixir Circuits with prebuilt Nerves firmwareGitHub release (latest SemVer)
NervesExamplesSmall example programs using Nerves
Nerves LivebookDevelop on embedded devices with Livebook and NervesGitHub release (latest SemVer)

Hardware

These are the officially supported hardware ports. Many others exist in the
community.

NameDescriptionRelease
NervesSystemBBBBase Nerves system configuration for the BeagleBone-based boardsHex.pm
NervesSystemOSD32MP1Base system for Octavo OSD32MP1Hex.pm
NervesSystemRPiBase Nerves system configuration for the Raspberry Pi A+ and B+Hex.pm
NervesSystemRPi0Base Nerves system configuration for the Raspberry Pi Zero and Zero WHex.pm
NervesSystemRPi0_2Nerves system for the Raspberry Pi Zero 2 WHex.pm
NervesSystemRPi2Base Nerves system configuration for the Raspberry Pi 2Hex.pm
NervesSystemRPi3Base Nerves system configuration for the Raspberry Pi 3Hex.pm
NervesSystemRPi3ANerves system for the Raspberry Pi 3 Model A+ w/ gadget mode and Raspberry Pi Zero 2 WHex.pm
NervesSystemRPi4Base Nerves system configuration for the Raspberry Pi 4Hex.pm
NervesSystemRPi5Base Nerves system configuration for the Raspberry Pi 5Hex.pm
NervesSystemVultrExperimental configuration for a Vultr cloud serverHex.pm
NervesSystemX86_64Generic Nerves system configuration x86_64 based hardwareHex.pm
NervesSystemGrisp2Base Nerves system configuration for the GRiSP 2Hex.pm
NervesSystemMangoPiMQProBase Nerves system configuration for the MangoPi MQ-ProHex.pm
NervesSystemQemuAarch64Base Nerves system configuration for the Qemu ARM system emulatorHex.pm

Networking

NameDescriptionRelease
VintageNetNetwork configuration and management for NervesHex.pm
VintageNetWiFiWiFi networking for VintageNetHex.pm
VintageNetDirectDirect network connection support for VintageNetHex.pm
VintageNetEthernetEthernet support for VintageNetHex.pm
VintageNetMobileMobile connection support for VintageNetHex.pm
VintageNetQMIVintageNet technology support for QMI mobile connectionsHex.pm
VintageNetWireGuardWireguard VPN supportHex.pm

Hardware access

NameDescriptionRelease
Circuits.GPIOUse GPIOs in ElixirHex.pm
Circuits.I2CUse I2C in ElixirHex.pm
Circuits.SPICommunicate over SPI from ElixirHex.pm
Circuits.UARTDiscover and use UARTs and serial ports in ElixirHex.pm

SSH and Shell

NameDescriptionRelease
NervesMOTDMessage of the day for Nerves devicesHex.pm
NervesSSHManage an SSH daemon and subsystems on Nerves devicesHex.pm
SSHSubsystemFwupErlang SSH Subsystem for Nerves firmware updatesHex.pm
ToolshedA toolshed of shell-like IEx helpersHex.pm

Toolchain

Nerves provides a C/C++ cross-toolchain to ensure consistency builds on all
supported host platforms. These are built using
crosstool-ng and are similar to
other GCC toolchains.

NameDescriptionRelease
nerves_toolchain_ctngCrosstool-NG integration for building Nerves toolchainsHex.pm
nerves_toolchain_aarch64_nerves_linux_gnu64-bit ARM toolchainHex.pm
nerves_toolchain_armv5_nerves_linux_musleabi32-bit ARM toolchain for older ARM processorsHex.pm
nerves_toolchain_armv6_nerves_linux_gnueabihf32-bit ARM toolchain for Raspberry Pi A, B, and ZeroHex.pm
nerves_toolchain_armv7_nerves_linux_gnueabihf32-bit ARM toolchain for most 32-bit ARMsHex.pm
nerves_toolchain_i586_nerves_linux_gnu32-bit Intel x86 toolchainHex.pm
nerves_toolchain_mipsel_nerves_linux_musl32-bit MIPS toolchainHex.pm
nerves_toolchain_riscv64_nerves_linux_gnu64-bit RISC-V toolchainHex.pm
nerves_toolchain_x86_64_nerves_linux_musl64-bit x86 toolchain using the musl libcHex.pm
nerves_toolchain_x86_64_nerves_linux_gnu64-bit x86 toolchain using GNU libcHex.pm

Miscellaneous

NameDescriptionRelease
boardidPrint out a platform-specific board serial numberGitHub release (latest SemVer)
NervesFWLoadersA collection of firmware loaders for boards with internal storageGitHub release (latest SemVer)
NervesHeartErlang heartbeat support for NervesGitHub release (latest SemVer)
ShoehornHelp handle OTP application failures and start orderHex.pm
UBootEnvRead and write to U-Boot environment blocksHex.pm

Upcoming

These projects are new or experimental and are in various stages of being ready
to promote to the above categories.

NameDescriptionRelease
NervesLoggingRoute system log messages through the Elixir loggerHex.pm
NervesUEventSimple UEvent monitor for detecting hardware and automatically loading driversHex.pm
PropertyTableIn-memory key-value store with subscriptionsHex.pm
nerves_initramfsAn initramfs for early boot handling of Nerves devicesGitHub release (latest SemVer)
nerves_system_linterMix task to check Nerves system configuration filesHex.pm
nerves_systemsBuild scripts for maintaining multiple repositoriesunreleased
<details> <summary><b>See outdated/inactive projects...</b></summary><br />
NameDescriptionRelease
nerves_ledsFunctions to drive LEDs on embedded systemsHex.pm
system_registrySerial nested term storage and dispatch registryHex.pm
system_registry_term_storageSimple term storage for SystemRegistryHex.pm
nerves_system_test
nerves_test_server

There is also a gravesite for old Nerves libraries at
https://github.com/nerves-project-attic.

</details>

Host Requirements

  • Mac OS 10.13+ (High Sierra and later)
  • 64-bit Linux (tested on Debian / Ubuntu / Redhat / CentOS / Arch)
  • Windows 10 with Windows Subsystem for Linux 2
  • Elixir ~> 1.11

See Installation Docs for
software dependencies.

Quick-Reference

Generating a New Nerves Application

bash
mix nerves.new my_app

Building Firmware

bash
export MIX_TARGET=rpi3 mix deps.get # Fetch the dependencies mix firmware # Cross-compile dependencies and create a .fw file mix firmware.burn # Burn firmware to an inserted SD card

Note: The mix firmware.burn target uses sudo to be able to write to a
MicroSD card on Linux. You will be asked for a password. You can also set the
SUDO_ASKPASS environment variable if you'd prefer an alternative way of
requesting the password. E.g., export SUDO_ASKPASS=ssh-askpass.

Docs

Installation Docs

Getting Started

Frequently-Asked Questions

Systems

Targets

User Interfaces

Advanced Configuration

Compiling non-BEAM code

Customizing Systems

Contributors

This project exists thanks to all the people who contribute.
<a href="https://github.com/nerves-project/nerves/graphs/contributors"><img src="https://opencollective.com/nerves-project/contributors.svg?width=890" /></a>

Please see our Contributing Guide for details on how you can
contribute in various ways.

Metal Level Sponsors

Metal level sponsors are companies that allow core team members to maintain and
extend Nerves for a portion of each work week. Nerves is not a product of any
one company. We also have a soft spot for supporting makers and hobbyists using
the BEAM, and it would be difficult to do this without them.

<a href="https://www.smartrent.com" target="_blank"><img width="200" height="100" src="https://nerves-project.org/img/SmartRent_logo.png"></a>

<a href="https://www.redwirelabs.com/" target="_blank"><img width="250" src="https://nerves-project.org/img/Redwire_logo.png"></a>

<a href="https://www.binarynoggin.com" target="_blank"><img width="250" src="https://nerves-project.org/img/BinaryNoggin_logo.png"></a>

[Become a metal level sponsor]

OpenCollective Backers

Thank you to all our monetary backers! Hardware costs money and without support,
we wouldn't be able to support nearly as many devices. 🙏 [Become a
backer
]

<a href="https://opencollective.com/nerves-project#backers" target="_blank"><img src="https://opencollective.com/nerves-project/backers.svg?width=890"></a>

OpenCollective Sponsors

Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Become a sponsor]

<a href="https://opencollective.com/nerves-project/sponsor/0/website" target="_blank"><img src="https://opencollective.com/nerves-project/sponsor/0/avatar.svg"></a>
<a href="https://opencollective.com/nerves-project/sponsor/1/website" target="_blank"><img src="https://opencollective.com/nerves-project/sponsor/1/avatar.svg"></a>
<a href="https://opencollective.com/nerves-project/sponsor/2/website" target="_blank"><img src="https://opencollective.com/nerves-project/sponsor/2/avatar.svg"></a>
<a href="https://opencollective.com/nerves-project/sponsor/3/website" target="_blank"><img src="https://opencollective.com/nerves-project/sponsor/3/avatar.svg"></a>
<a href="https://opencollective.com/nerves-project/sponsor/4/website" target="_blank"><img src="https://opencollective.com/nerves-project/sponsor/4/avatar.svg"></a>
<a href="https://opencollective.com/nerves-project/sponsor/5/website" target="_blank"><img src="https://opencollective.com/nerves-project/sponsor/5/avatar.svg"></a>
<a href="https://opencollective.com/nerves-project/sponsor/6/website" target="_blank"><img src="https://opencollective.com/nerves-project/sponsor/6/avatar.svg"></a>
<a href="https://opencollective.com/nerves-project/sponsor/7/website" target="_blank"><img src="https://opencollective.com/nerves-project/sponsor/7/avatar.svg"></a>
<a href="https://opencollective.com/nerves-project/sponsor/8/website" target="_blank"><img src="https://opencollective.com/nerves-project/sponsor/8/avatar.svg"></a>
<a href="https://opencollective.com/nerves-project/sponsor/9/website" target="_blank"><img src="https://opencollective.com/nerves-project/sponsor/9/avatar.svg"></a>

Copyright (C) 2015-2021 by the Nerves Project developers nerves@nerves-project.org

Contributors

Showing top 12 contributors by commit count.

View all contributors on GitHub →

This article is auto-generated from nerves-project/nerves via the GitHub API.Last fetched: 6/28/2026