INSTALL NODEPULSE

5 minutes setup

// Requirements

Termux / Android

Android 7+ — Termux app
~200 MB storage
Internet connection

WSL2 / Windows

Windows 10 (2004+) or Windows 11
WSL2 enabled — ~200 MB download
Internet connection

macOS / Apple

macOS 13 (Ventura) or newer
Intel or Apple Silicon — ~3 GB free (Homebrew + Xcode CLT)
Internet connection

Raspberry Pi

Pi 3 / 4 / 5 — Raspberry Pi OS 64-bit
A user with sudo — ~1 GB free
Internet connection

All platforms produce identical nodes — same identity, same protocol, same gossip network.

// Choose Your Platform

1 Install Termux

Download Termux from the GitHub releases.

Note: The Google Play Store version may be outdated. If you use it, run pkg update && pkg upgrade first.
2 Open Termux & Run the Installer

Copy and paste this command into Termux:

pkg install -y wget && wget https://www.plexum.net/nodepulse/core-dist/install_termux.zip && unzip install_termux.zip && bash ./termux-setup.sh
Termux
$ pkg install -y wget && ... Setting up NodePulse environment... Installing dependencies: php, nginx, cloudflared, openssl-tool, python, nodejs... Generating RSA-2048 key pair... [OK] Identity created: ~/.nodepulse/node_identity.json [OK] node_id: a3f7c1d8e290 Installing web root and PHP backend... [OK] Setup complete.

The installer will handle everything: dependencies, identity generation, web server files, and configuration.

3 Start NodePulse
bash ~/bin/start-server
Termux — NodePulse Running
Starting web server on port 8080 (php-cgi behind it)... Starting cloudflared tunnel... Waiting for tunnel URL... ============================================ NODEPULSE - Node #2 registered! node_id: b9193ecbb790 URL: https://tomato-heater-metabolism-candidates.trycloudflare.com Location: fln01 Protocol: quic ============================================ [NodePulse] Announcing to 2 targets (peers + seeds)... [NodePulse] -> https://www.plexum.net/nodepulse/api.php [OK] [NodePulse] -> https://www.paraplant.com/nodepulse/api.php [OK] [NodePulse] Announced to 2/2 seeds [NodePulse] Maintenance active (log: ~/.nodepulse/gossip.log)
4 Access Your Node

Open the URL shown in the terminal output in any browser. This is your node's public address.

First access: You will be prompted to set a password. This secures access to the Terminal, Cloud, and File Manager tools.

On the same device, you can also access your node at:

http://localhost:8080

Wait for the node to propagate across the network — check the Node Monitor page.

5 Stop NodePulse

When you wish to disable remote access to the instance and shut down the server Press Ctrl+C in the running session, or open a new Termux session and run:

bash ~/bin/stop-server
Requirement: WSL2 must be enabled. If not, open PowerShell as Administrator and run wsl --install, then reboot.
1 Download the Installer

Download install_wsl2.zip and unzip it anywhere on your PC.

Direct link:

Or download directly to your Desktop via PowerShell:

curl.exe -L -o "$env:USERPROFILE\Desktop\install_wsl2.zip" https://www.plexum.net/nodepulse/core-dist/install_wsl2.zip
2 Run the Installer

Open PowerShell as Administrator, navigate to the unzipped folder and run:

cd C:\path\to\install_wsl2
.\wsl2-import.ps1
PowerShell (Administrator)
PS> .\wsl2-import.ps1 Downloading Ubuntu 24.04 (~200MB)... Creating NodePulse WSL2 distro... Installing PHP, nginx, Python, cloudflared... Generating RSA-2048 key pair... [OK] Identity created [OK] node_id: a3f7c1d8e290 Configuring services... NodePulse is ready!

The script downloads Ubuntu 24.04 (~200MB, saved in %TEMP% for reuse), creates the NodePulse WSL2 distro, installs all services, and isolates it from the Windows filesystem.

Wait for NodePulse is ready! to appear before continuing.
3 Start NodePulse

Open PowerShell (no admin needed) and enter the distro:

wsl -d NodePulse

Then start all services:

start-server
NodePulse — WSL2
Starting nginx... Starting cloudflared tunnel... Waiting for tunnel URL... ============================================ NODEPULSE - Node #2 registered! node_id: b9193ecbb790 URL: https://tomato-heater-metabolism-candidates.trycloudflare.com Location: fln01 Protocol: quic ============================================ [NodePulse] Announcing to 2 targets (peers + seeds)... [NodePulse] -> https://www.plexum.net/nodepulse/api.php [OK] [NodePulse] -> https://www.paraplant.com/nodepulse/api.php [OK] [NodePulse] Announced to 2/2 seeds [NodePulse] Maintenance active (log: ~/.nodepulse/gossip.log)
4 Access Your Node

Open the URL shown in the terminal output in any browser. This is your node's public address.

First access: You will be prompted to set a password. This secures access to the Terminal, Cloud, and File Manager tools.

Wait for the node to propagate across the network — check the Node Monitor page.

5 Stop NodePulse

When you wish to disable remote access to the instance and shut down the server, Inside the distro, run:

stop-server

To check service status:

server-status
6 Edit Files with VS Code

The NodePulse filesystem is isolated from Windows — use VS Code with the WSL extension (ms-vscode-remote.remote-wsl).

First, mount disk C inside the distro:

mount -t drvfs C: /mnt/c

Then press Ctrl+Shift+P in VS Code and run WSL: Connect to WSL using Distro — select NodePulse. Once connected: File > Open Folder > /root/www

7 Uninstall wsl distro

From PowerShell (outside the distro):

wsl --unregister NodePulse

To also delete the distro files:

Remove-Item -Recurse -Force "$env:USERPROFILE\WSL\NodePulse"
1 Open Terminal

Open the built-in Terminal app (Applications → Utilities → Terminal, or search it with Spotlight ⌘+Space).

Note: curl and unzip ship with macOS by default. The installer pulls the remaining dependencies via Homebrew (php, nginx, cloudflared, python, tmux, node) automatically. Requires macOS 13 (Ventura) or newer.
2 Run the Installer

Copy and paste this command into Terminal:

curl -L -O https://www.plexum.net/nodepulse/core-dist/install_osx.zip && unzip -o install_osx.zip && bash ./osx-setup.sh
Terminal — macOS
$ curl -L -O https://www.plexum.net/... && ... Setting up NodePulse environment... Installing packages (php nginx cloudflared python tmux node)... Generating RSA-2048 key pair... [OK] Identity created: ~/.nodepulse/node_identity.json [OK] node_id: a3f7c1d8e290 Installing web root and PHP backend... [OK] Setup complete.

The installer will handle everything: dependencies, identity generation, web server files, and configuration.

Homebrew: If missing, the script installs Homebrew (which may pull the Xcode Command Line Tools, 1–3 GB) and uses it to fetch php, nginx, cloudflared, python, tmux and node.
3 Start NodePulse
bash ~/bin/start-server
Terminal — NodePulse Running
Starting php-cgi (:9000) + nginx on port 8080... Starting cloudflared tunnel... Waiting for tunnel URL... ============================================ NODEPULSE - Node #2 registered! node_id: b9193ecbb790 URL: https://tomato-heater-metabolism-candidates.trycloudflare.com Location: fln01 Protocol: quic ============================================ [NodePulse] Announcing to 2 targets (peers + seeds)... [NodePulse] -> https://www.plexum.net/nodepulse/api.php [OK] [NodePulse] -> https://www.paraplant.com/nodepulse/api.php [OK] [NodePulse] Announced to 2/2 seeds [NodePulse] Maintenance active (log: ~/.nodepulse/gossip.log)
4 Access Your Node

Open the URL shown in the terminal output in any browser. This is your node's public address.

First access: You will be prompted to set a password. This secures access to the Terminal, Cloud, and File Manager tools.

On the same Mac, you can also access your node at:

http://localhost:8080

Wait for the node to propagate across the network — check the Node Monitor page.

5 Stop NodePulse

When you wish to disable remote access to the instance and shut down the server Press Ctrl+C in the running session, or open a new Terminal window and run:

bash ~/bin/stop-server

To check service status:

bash ~/bin/server-status

In any new terminal the bare start-server, stop-server and server-status commands are also on PATH.

6 Uninstall

To remove NodePulse from the Mac:

pm2 delete peerserver 2>/dev/null; rm -rf ~/.nodepulse ~/www ~/nodepulse-bin ~/services/peerserver ~/.server-mode ~/bin/start-server ~/bin/stop-server ~/bin/server-status ~/bin/nodepulse

Homebrew packages (php, nginx, cloudflared, python, tmux, node) stay installed — remove them with brew uninstall if no longer needed, and delete the # NodePulse block from your shell rc file.

Requirement: Raspberry Pi OS 64-bit (Bookworm or newer). Lite is fine — no desktop needed. Run the installer as your normal user (e.g. pi), not as root.
1 Prepare the Pi

Flash Raspberry Pi OS 64-bit with the Raspberry Pi Imager, enabling SSH and your Wi-Fi credentials in the Imager settings. Then connect to it:

ssh pi@raspberrypi.local

A Pi 4 with 2 GB or more is recommended. No port forwarding and no public IP are needed — the tunnel handles inbound traffic.

2 Run the Installer

Copy and paste this command into the Pi's shell:

sudo apt update && sudo apt install -y curl unzip && curl -L -O https://www.plexum.net/nodepulse/core-dist/install_raspberry.zip && unzip -o install_raspberry.zip && bash ./rpi-setup.sh
Raspberry Pi — SSH
pi@raspberrypi:~ $ sudo apt update && ... && bash ./rpi-setup.sh [OK] Architecture: aarch64 -> cloudflared-linux-arm64 Installing packages (php-cli, php-cgi, nginx-full, python3, nodejs, tmux)... [OK] Packages installed [OK] cloudflared installed [OK] nginx configured (port 8080, prefix ~/nginx) Generating RSA-2048 key pair... [OK] Identity generated: node_id=a3f7c1d8e290 [OK] systemd unit installed SETUP COMPLETE! (Raspberry Pi)
Be patient: the npm install peer step takes several minutes on a Pi. That is normal — let it finish. If anything fails, the real error is in ~/tmp/apt-install.log.

Then open a new shell (or run source ~/.bashrc) so ~/bin lands on your PATH.

3 Start NodePulse
start-server
Raspberry Pi — NodePulse Running
Starting php-cgi (:9000) + nginx on port 8080... Starting cloudflared tunnel... Waiting for tunnel URL... ============================================ NODEPULSE - Node #2 registered! node_id: b9193ecbb790 URL: https://tomato-heater-metabolism-candidates.trycloudflare.com Location: fln01 Protocol: quic ============================================ [NodePulse] Announcing to 2 targets (peers + seeds)... [NodePulse] -> https://www.plexum.net/nodepulse/api.php [OK] [NodePulse] -> https://www.paraplant.com/nodepulse/api.php [OK] [NodePulse] Announced to 2/2 seeds [NodePulse] Maintenance active (log: ~/.nodepulse/gossip.log)

nginx runs unprivileged with its own prefix in ~/nginx/ — its logs are in ~/nginx/logs/, not /var/log/nginx.

4 Run at Boot (recommended)

This is what a Pi buys you over a phone or a laptop: a node that survives reboots and restarts itself if the stack dies. The installer ships a systemd unit — enable it:

sudo systemctl enable --now nodepulse

Follow the log to read the tunnel URL:

journalctl -u nodepulse -f
One or the other: do not run start-server by hand while the service is active — both would compete for port 8080.
5 Access Your Node

Open the URL shown in the terminal output in any browser. This is your node's public address.

First access: You will be prompted to set a password. This secures access to the Terminal, Cloud, and File Manager tools. Set it before sharing the tunnel URL.

From any device on the same LAN, you can also reach the node at:

http://raspberrypi.local:8080

Wait for the node to propagate across the network — check the Node Monitor page.

6 Stop NodePulse

If you started it by hand, press Ctrl+C in the running session, or from another shell run:

stop-server

If it is running as a service:

sudo systemctl stop nodepulse

To check services plus SoC temperature, throttling and free memory:

server-status
7 Secure the Pi

Unlike the WSL2 distro, the Pi is a persistent machine on your LAN and the tunnel exposes it publicly. The Terminal and PulseTerminal apps hand out a shell as whichever user runs the stack — and on Raspberry Pi OS that user often has passwordless sudo.

sudo passwd -l pi

Locking the password, dropping the user from the sudo group, or installing NodePulse under a dedicated unprivileged account all work. Never run the stack as root.

8 Uninstall

To remove NodePulse from the Pi:

sudo systemctl disable --now nodepulse; sudo rm -f /etc/systemd/system/nodepulse.service; sudo systemctl daemon-reload; pm2 delete peerserver 2>/dev/null; rm -rf ~/.nodepulse ~/www ~/nginx ~/services/peerserver ~/.server-mode ~/.nginx-bin ~/bin/start-server ~/bin/stop-server ~/bin/server-status ~/bin/run-looped ~/bin/nodepulse ~/bin/cloudflared

Deleting ~/.nodepulse/ destroys the node identity — the node would rejoin the network as a brand new node_id. Back that folder up first if you want to keep it. The apt packages stay installed; remove them with sudo apt remove if no longer needed.

// How It Works

1. The installer generates an RSA-2048 key pair → your unique node_id
2. A local web server starts on port 8080 (PHP behind it via FastCGI)
3. Cloudflared creates a public tunnel → your *.trycloudflare.com 
4. NodePulse signs (node_id + URL + timestamp) with your private key
5. The signed announcement is sent to seed nodes via gossip protocol
6. Seeds propagate your node to the entire network
7. A maintenance loop keeps your node alive (heartbeat + gossip sync)

No account. No registration. No cloud. Your identity is your key pair.

// Troubleshooting

> Tunnel URL not appearing

Cloudflared may take 10-30 seconds to establish. If it fails, it will automatically retry with increasing delays (30s–5min). Check your internet connection.

> "Address already in use" error

Another process is using port 8080. Stop it first:

bash ~/bin/stop-server

(bare stop-server also works when ~/bin is on PATH — e.g. inside the WSL2 distro)

> Node not visible in monitor

Propagation can take 1-2 minutes. The announce cycle contacts seed nodes, which then gossip to other peers. Refresh the monitor page after a moment.

> Raspberry Pi: node degrades after hours or days

Check for undervoltage — it is the most common cause of a Pi node that slowly falls apart:

server-status

Any throttling value other than 0x0 means the Pi is being throttled, almost always by an underpowered power supply. Use the official 5V/3A (Pi 4) or 5.1V/5A (Pi 5) adapter. On the Pi, nginx errors are in ~/nginx/logs/error.log, not /var/log/nginx.

> Complete uninstall

NodePulse is fully self-contained. To remove everything:

rm -rf ~/.nodepulse ~/www ~/.server-mode ~/services/peerserver ~/bin/start-server ~/bin/stop-server ~/bin/server-status ~/bin/nodepulse

On macOS use the Uninstall step in the macOS tab instead (it also removes ~/nodepulse-bin and the PM2 service). On the Raspberry Pi use the Uninstall step in its tab (it also removes the systemd unit and ~/nginx). On WSL2 simply unregister the distro.

Need help? Join the network and reach us through the mesh.

dev@plexum.org