SuperDMZ
Back to the blog
🤖
Updates · · SuperDMZ Team

We shipped SuperDMZ for ESP32 — and how it landed on the Arduino Library Manager

The SuperDMZ Arduino library is now available straight from the IDE. Four lines of code turn any ESP32 into a public https://your-host.dmzgate.com address. We also walk you through the GitHub journey and the release behind the scenes.

Why ESP32 is now part of SuperDMZ

About half of the support tickets we get are a variation of: "I have a sensor/camera/panel running on an ESP, can I expose it through SuperDMZ without installing the client on a PC next to it?". Answer is now yes — in four lines of code.

The Windows/Linux/macOS client is great when there's a real OS at the edge. For IoT that requirement is friction: the device IS the "PC". Forcing an intermediate machine just to run the tunnel raises the BOM, expands the failure surface, and adds another cable we have to maintain.

The SuperDMZ library we shipped today embeds the tunnel protocol straight into the ESP32 firmware. The device connects on its own to a SuperDMZ relay over WebSocket TLS and becomes reachable at https://<your-host>.dmzgate.com with a valid Let's Encrypt cert — no public IP, no router port forwarding, no external cloud.

Compatibility

The whole ESP32 family is supported:

  • ESP32 classic (WROOM-32, WROVER)
  • ESP32-S2 and ESP32-S3
  • ESP32-C3 and ESP32-C6 (RISC-V)
  • Arduino Nano ESP32 — works out of the box; it's an ESP32-S3 in Nano form factor

ESP8266 is officially out — its embedded mbedtls doesn't have enough heap to keep WSS stable in production. You can compile for it with some effort, but we don't recommend it for real deployments.

Roadmap is already on the table for Arduino UNO R4 WiFi (v1.1), MKR WiFi 1010 / Nano 33 IoT (v1.2), Portenta H7 / Giga R1 WiFi (v1.3), and Raspberry Pi Pico W (v2.0). Each one is a port of the network layer to the chip-specific library (WiFiS3.h, WiFiNINA.h, MbedOS WiFi, etc.) — same public API.

How to install

In Arduino IDE 2.x:

  1. Sketch → Include Library → Manage Libraries…
  2. Search for SuperDMZ
  3. Click Install. Dependencies (WebSockets by Markus Sattler and ArduinoJson by Benoit Blanchon) are offered in the same prompt.

In PlatformIO:

; platformio.ini
lib_deps =
    superdmz/SuperDMZ@^1.0.2

Hello World

Four lines to bring up an ESP32 talking to the world:

#include <WiFi.h>
#include <WebServer.h>
#include <SuperDMZ.h>

WebServer server(80);
SuperDMZ  tunnel;

void setup() {
  WiFi.begin("YOUR_WIFI", "YOUR_PASS");
  while (WiFi.status() != WL_CONNECTED) delay(200);

  server.on("/", [](){ server.send(200, "text/html", "<h1>Hello</h1>"); });
  server.begin();

  tunnel.begin("PASTE_YOUR_48_HEX_TOKEN", 80);
}

void loop() {
  server.handleClient();
  tunnel.loop();
}

Build, upload, open the Serial Monitor at 115200 baud. Within ~5 seconds:

[wifi] OK, IP = 192.168.1.42
[http] local WebServer on port 80
[SuperDMZ] connecting wss://spo1.nodes.superdmz.com:443/ws/tunnel ...
[SuperDMZ] ONLINE: https://your-host.dmzgate.com -> http://localhost:80

Done. Open the public URL from any phone on the other side of the planet, and the ESP page responds.

The path to the Arduino Library Manager

For the library to show up in the IDE's official Library Manager for anyone in the world, it has to be accepted in the index maintained by Arduino. The flow is all public on GitHub and takes about 30 minutes end-to-end when everything is in order.

Here's what we did:

  1. Public repo at github.com/superdmz/SuperDMZ-Arduino with the code, examples, library.properties, library.json, LICENSE, keywords.txt, and CHANGELOG.md.
  2. Semver tag pointing at the release commit (1.0.1).
  3. GitHub Actions CI running arduino/arduino-lint-action in strict mode plus arduino/compile-sketches compiling examples across a six-board ESP32 matrix — zero regressions on future releases.
  4. Fork of arduino/library-registry, add one line to repositories.txt with the URL of our repo, open a PR.
  5. Arduino's bot runs the automated check (stricter than our local CI), comments the result, and merges if everything is green.
  6. The Arduino indexer syncs the index every hour. On the next Library Manager refresh inside the IDE, the library shows up for everyone in the world.

Worth noting: for future releases (v1.0.2, v1.1, etc.) we don't have to open another PR. Just push the new tag to our repo — the indexer picks it up and publishes it in ~1 hour.

The bug the author hit

On the initial publish we fell into a classic trap for anyone working on a multilingual product: we left Portuguese comments inside the library's .ino and .cpp files. Serial.printf was already in English from the start (logs are consumed by global tooling — Stack Overflow, grep, dashboards — and translation breaks integrations), but the comments slipped through. A few hours later that became v1.0.2 with a full cleanup. Internal lesson reinforced: code that ships to the world via Library Manager is English in everything: logs, comments, docstrings, example strings.

Next steps

For you, the user:

  • The full installation guide has the step-by-step, the 7 steps, an API reference table, and troubleshooting.
  • Create the tunnel in the panel with protocol HTTP and local_port = 80.
  • The WebServerBridge (ESPAsyncWebServer + JSON + GPIO) and ProvisioningPortal (captive portal saving WiFi+token in NVS) examples cover real use cases — including OTA.

For folks building products: ProvisioningPortal solves the provisioning problem without compiling a custom firmware per customer. The device leaves the factory in AP mode, the end customer points their phone at it, configures WiFi and token through the captive portal, and the ESP reboots as a regular client. Marketing copy writes itself: "your IoT gets a public address in 30 seconds — no public IP, no router port forwarding, no external cloud".

Happy hacking. Bugs and new-board requests: GitHub Issues.


Want to try SuperDMZ?

Free plan, no credit card. Your first tunnel runs in under 60 seconds.

Create a free account

More in Updates