CLI tool
dappnode/DAppNode avatar
dappnode/DAppNode

DAppNode: running P2P clients from a browser instead of a terminal

General repository of the project dappnode

626 stars113 forksShellGPL-3.0

At a glance

What is it?
DAppNode is a self-hosted node platform that lets non-technical users deploy and update dockerized P2P clients from an admin UI in the browser, backed by a package ecosystem published to Ethereum mainnet. The install path builds a Docker image that generates a bootable ISO.
Who is it for?
Adopt DAppNode when you want ordinary users to run full nodes for crypto clients, VPNs or IPFS without touching a command line, and skip it when you need a single specialised service, since the whole model is built around a curated package list and its own update flow.
Can I use it commercially?
Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
Is it still maintained?
Yes. The repository last received commits 3 days ago.
What is it written in?
Mainly Shell, according to GitHub's language statistics.

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

Editorial analysis

The admin UI is the whole point, not a wrapper around one

DAppNode describes itself as infrastructure for the decentralized world: a simple, transparent system for hosting P2P clients for DApps, cryptocurrencies, VPNs, IPFS and more. The differentiator stated in the README is that it lowers the barrier of entry for non tech-savvy participants, and the mechanism is that you deploy, update and manage P2P clients and nodes without leaving your browser. No terminal or command line interface.

That framing tells you who the project is for. This is not a developer-facing orchestration tool. It is aimed at people who want to run a full node but are not going to learn Docker networking, container lifecycle commands or port mapping. The README also positions it as a distribution channel: its modular architecture lets any team publish a dockerized application into the DAppNode package ecosystem, and the benefit of that is described from the publisher's side, an enthusiastic crypto savvy user base and a user interface only experience that lowers onboarding friction.

The primary language of the repository is Shell, which fits a product whose core job is preparing a machine with what it needs to run containers.

The repository itself is the general project repository rather than a single application, and the documentation lives at docs.dappnode.io with the install overview at a dedicated page.

The install path runs a privileged installer service in Docker

The repository ships a docker-compose.yml and a Dockerfile, and together they describe how the platform is prepared. The compose file declares a single service named dappnode_installer that builds from the local directory, runs privileged, and mounts the host Docker socket.

yaml
version: "3.4"

services:
  dappnode_installer:
    build: .
    privileged: true

That combination is the core of the mechanism. The service is privileged and it mounts /var/run/docker.sock, so it can talk to the host Docker daemon and create the containers that will hold user packages. It also mounts ./images into the container at /images, which is where the generated artifacts land.

yaml
    environment:
      - BUILD=false # In case you want to re-generate a all the images, not recommended
      - CLEAN=true # it remove the images directory
      - UNATTENDED=${UNATTENDED} # UNATTENDED version
      - BASE_OS=${BASE_OS} # Base OS version (debian or ubuntu)
    volumes:
      - ./images:/images
      - "/var/run/docker.sock:/var/run/docker.sock"

Four switches steer the installation. BUILD=false skips regenerating all the images, and the comment marks that as not recommended. CLEAN=true removes the images directory. UNATTENDED toggles the unattended mode, which is what lets the ISO build run without someone answering prompts. BASE_OS selects the base operating system, with debian and ubuntu named as the options.

The security shape deserves to be stated plainly: a privileged container with the host Docker socket mounted has effectively the host's privileges. That is how the installer can create sibling containers, and it is the reason the install step is the part to think about before handing a machine to a non-technical user.

The Dockerfile builds an ISO generator, not the node software

The Dockerfile is short and its purpose is not what most people expect. It starts from docker:dind, the Docker-in-Docker image, and installs the tools needed to author a bootable image rather than to run the node.

dockerfile
FROM docker:dind

# Install required packages
RUN apk update && \
    apk add --no-cache xorriso git xz curl ca-certificates iptables cpio bash perl-utils 

WORKDIR /usr/src/app
COPY . .

CMD ["/usr/src/app/iso/scripts/generate_ISO.sh"]

xorriso is the ISO authoring tool, cpio and xz handle the archive contents, and iptables and perl-utils cover the networking and scripting the generation step needs. The default command is generate_ISO.sh from the iso/scripts directory, and the repository root indeed contains an iso/ directory alongside installer_instructions/, scripts/ and test/.

So the flow is: the compose file builds this image, the container runs with the Docker socket attached, and the result is a bootable ISO plus the supporting files, rather than a running node on the current machine. That is why the compose file offers an UNATTENDED mode and a BASE_OS choice, and why the repo carries installer_instructions/ as a top-level directory.

The practical consequence is that installing DAppNode is closer to writing a system image than to installing an application, and the installation flow is documented separately at the install overview page rather than in the README itself.

Packages are published to Ethereum mainnet, and gas is a real cost

The distribution model is unusual and it has direct consequences for publishers. The README states that packages are published to Ethereum mainnet and incur costs, and it adds that given current high gas prices the DAppNode team is willing to subsidize gas costs for packages of great interest to users.

For a user, this is invisible infrastructure. For a team publishing a package, it is a budget line and a dependency on a public chain at exactly the moment they publish. The upside of that design is a tamper-evident package registry that does not depend on the vendor's own server, and the downside is that publication costs money that scales with network conditions and with how many packages a team ships.

The package ecosystem itself is browsable through the package explorer, which the README describes as the place to see an up-to-date list of all packages and their versions. The list of maintained packages is long and specific: Avalanche, Bee, Bitcoin, Block-explorer, Cosmos, DMS, Ethereum Classic, Ethereum Optimism, Exporter, Geth, Goerli Geth, HTTPs Portal, Ipfs Cluster, Ipfs Pinner, Kovan, LightningNetwork, Matrix, Metrics Tools, Monero, Nethermind, Openethereum, Owncloud, Polkadot Kusama, Prysm, Prysm Pyrmont, Raiden, Raiden Testnet, Rinkeby and Ropsten among them.

For developers who want to publish, the README points at the separate DAppNodeSDK repository as the place to learn how to get started.

Champions decide which packages stay alive

The champion system is the mechanism that keeps the ecosystem from rotting. Champions are described as community members in charge of maintaining packages, keeping them updated and working. The README states that all packages in the champion list without a champion are actively looking for one, and points at a dedicated Discord channel where you can suggest a package to be championed or offer to be champion for a project you care about.

This is the honest weak point of the design. The list in the README makes it visible: ARTIS-sigma1, Block-explorer, Eth2stats-client, Ethereum Classic, Ethereum Optimism, Matrix and Polkadot Kusama have no champion listed, while others such as Geth, Prysm and Monero are maintained by named individuals. For a user choosing what to run, that column is more informative than the package name, because an unmaintained Ethereum Classic client or one that loses its champion is a different proposition from one with an owner.

The trade-off is deliberate. Instead of a single team curating and funding every package, maintenance is distributed, and the cost of that distribution is that some packages have nobody responsible for them. A project built on a championless package inherits that risk.

The channel named for this is #champion-process on the DAppNode Discord, and the wider support channels listed are the Discord, a forum on discourse.dappnode.io, and the project Medium.

Where DAppNode is the wrong shape of tool

Several boundaries are worth stating plainly, and they are not implementation details.

First, this is not a lightweight way to run one service. The install path produces an ISO through a privileged container with the host Docker socket attached, and the platform is organised around a package catalogue. If you need a single client running next to your existing stack, a plain Docker Compose file is a smaller commitment.

Second, the package ecosystem is the value and the risk at the same time. A package list maintained by community champions means version currency depends on volunteers, and the README's own table shows which ones have no owner. Ethereum clients in particular age quickly, since a client that lags a network upgrade stops syncing.

Third, the publishing side carries an Ethereum mainnet cost, and the README describes the team subsidising gas for packages it considers of interest to users. That subsidy is a policy decision by the project, not a guarantee, so a publisher who plans to ship many packages should not build a plan on it.

Finally, the documentation is spread across the wiki and the install pages rather than living in the repository, so expect to read outside the README before planning an installation.

How the browser UI differs from running the container yourself

The realistic alternative for a technical operator is to skip the platform and run the same client directly with Docker: pull the image, publish the ports you need, and manage updates by recreating the container. The difference in approach is exactly what the README claims and nothing more. A direct deployment gives you full control over the container configuration and nothing else: no package catalogue, no version list, no update path, and a browser UI that a non-technical user can operate.

DAppNode inverts that. You give up direct control of how each package's container is configured, because the packages come with their own settings through the ecosystem, and you gain a uniform admin UI where deploy, update and manage happen without a terminal. The exchange is designed for the case where the operator is not the person running the node.

For publishers there is a similar split. Publishing a dockerized application into the DAppNode ecosystem gets you a crypto-savvy user base and onboarding without a terminal, at the cost of the mainnet publication step and its gas. Publishing on Docker Hub or a registry you run yourself keeps that cost at zero and the audience entirely up to you.

The repository's licence is GPL-3.0, which is the permissive-of-copyleft kind: you can read, modify and redistribute, and the copyleft obligation applies when you distribute the work. The last push was on 2026-10-20, with release v0.3.26 on the same date, v0.3.24 on 2026-08-31 and v0.3.23 on 2026-07-01, so the platform itself is still moving.

Editorial conclusion

Adopt DAppNode when you want ordinary users to run full nodes for crypto clients, VPNs or IPFS without touching a command line, and skip it when you need a single specialised service, since the whole model is built around a curated package list and its own update flow. Before installing, read the install overview linked from the README, decide whether the Ethereum mainnet publication step and its gas cost fit your plan, and note that the last push was on 2026-10-20 with release v0.3.26, while packages without a champion may be left unmaintained.

Frequently asked questions

What is DAppNode and who is it for?

It is a system for hosting P2P clients for DApps, cryptocurrencies, VPNs and IPFS, aimed at non-technical users who want to deploy, update and manage nodes from a browser without using a terminal. The primary language of the repository is Shell.

How does the DAppNode installer work on the machine?

The docker-compose.yml builds a privileged service from the local Dockerfile, mounts the host Docker socket and the ./images directory, and runs the ISO generation script. The compose environment variables control BUILD, CLEAN, UNATTENDED and BASE_OS.

What are champions in DAppNode?

Champions are community members responsible for keeping packages updated and working, and the README lists which packages have one and which are actively looking for a champion. Joining through the #champion-process channel is how you volunteer for a package.

What does it cost to publish a package to DAppNode?

Packages are published to Ethereum mainnet and incur costs, and the README notes that high gas prices led the team to subsidise gas for packages of great interest to users. That subsidy is a project decision rather than a stated guarantee.

How do I find the available DAppNode packages?

The package explorer lists all packages and their versions in an up-to-date list, and the README also names individual package repositories such as DAppNodePackage-bitcoin, DAppNodePackage-geth and DAppNodePackage-ipfs-cluster.

Official sources

  1. dappnode/DAppNode on GitHub
  2. Issues
  3. License: GPL-3.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/dappnode-dappnode.svg)](https://hysenlabs.com/projects/dappnode-dappnode)