Skip to content

Conversation

@andreagilardoni
Copy link
Contributor

@andreagilardoni andreagilardoni commented Jan 10, 2026

The objective of this PR is to improve settings validation inside of connection handlers.

  • an additional state CHECK is added, which waits for settings provisioning (if required by the handler) before going into the INIT state
  • CHECK state can also be overridden and add checks for hw validity, like done in wifi connection handler
  • Wifi connection handler checks for ssid to contain a valid string with at least 1 character before calling begin and address IoT first Wifi connection failed #156
  • codestyle and readability improvements
@github-actions
Copy link

Memory usage change @ 8d5517f

Board flash % RAM for global variables %
arduino:esp32:nano_nora 🔺 +396 - +404 +0.01 - +0.01 0 - 0 0.0 - 0.0
arduino:mbed:envie_m7 N/A N/A N/A N/A
arduino:mbed_edge:edge_control 🔺 +72 - +72 +0.01 - +0.01 0 - 0 0.0 - 0.0
arduino:mbed_giga:giga 🔺 +248 - +248 +0.01 - +0.01 0 - 0 0.0 - 0.0
arduino:mbed_nano:nanorp2040connect 🔺 +264 - +268 0.0 - 0.0 0 - 0 0.0 - 0.0
arduino:mbed_nicla:nicla_vision 🔺 +248 - +248 +0.01 - +0.01 0 - 0 0.0 - 0.0
arduino:mbed_opta:opta 🔺 +72 - +136 0.0 - +0.01 0 - 0 0.0 - 0.0
arduino:mbed_portenta:envie_m7 N/A N/A N/A N/A
arduino:renesas_portenta:portenta_c33 🔺 +88 - +88 0.0 - 0.0 0 - 0 0.0 - 0.0
arduino:renesas_uno:unor4wifi 🔺 +248 - +248 +0.09 - +0.09 0 - 0 0.0 - 0.0
arduino:samd:mkr1000 🔺 +264 - +272 +0.1 - +0.1 0 - 0 0.0 - 0.0
arduino:samd:mkrgsm1400 🔺 +96 - +96 +0.04 - +0.04 0 - 0 0.0 - 0.0
arduino:samd:mkrnb1500 🔺 +104 - +104 +0.04 - +0.04 0 - 0 0.0 - 0.0
arduino:samd:mkrwan1300 🔺 +88 - +96 +0.03 - +0.04 0 - 0 0.0 - 0.0
arduino:samd:mkrwan1310 🔺 +88 - +96 +0.03 - +0.04 0 - 0 0.0 - 0.0
arduino:samd:mkrwifi1010 🔺 +264 - +264 +0.1 - +0.1 0 - 0 0.0 - 0.0
arduino:samd:nano_33_iot 🔺 +264 - +264 +0.1 - +0.1 0 - 0 0.0 - 0.0
esp32:esp32:esp32 🔺 +416 - +420 +0.03 - +0.03 0 - 0 0.0 - 0.0
esp8266:esp8266:huzzah 🔺 +352 - +352 +0.03 - +0.03 🔺 +48 - +48 +0.06 - +0.06
rp2040:rp2040:rpipicow 🔺 +248 - +248 +0.01 - +0.01 0 - 0 0.0 - 0.0
Click for full report table
Board examples/ConnectionHandlerDemo
flash
% examples/ConnectionHandlerDemo
RAM for global variables
% examples/CheckInternetAvailabilityDemo
flash
% examples/CheckInternetAvailabilityDemo
RAM for global variables
%
arduino:esp32:nano_nora 396 0.01 0 0.0 404 0.01 0 0.0
arduino:mbed:envie_m7 N/A N/A N/A N/A N/A N/A N/A N/A
arduino:mbed_edge:edge_control 72 0.01 0 0.0 72 0.01 0 0.0
arduino:mbed_giga:giga 248 0.01 0 0.0 248 0.01 0 0.0
arduino:mbed_nano:nanorp2040connect 264 0.0 0 0.0 268 0.0 0 0.0
arduino:mbed_nicla:nicla_vision 248 0.01 0 0.0 248 0.01 0 0.0
arduino:mbed_opta:opta 72 0.0 0 0.0 136 0.01 0 0.0
arduino:mbed_portenta:envie_m7 N/A N/A N/A N/A N/A N/A N/A N/A
arduino:renesas_portenta:portenta_c33 88 0.0 0 0.0 88 0.0 0 0.0
arduino:renesas_uno:unor4wifi 248 0.09 0 0.0 248 0.09 0 0.0
arduino:samd:mkr1000 264 0.1 0 0.0 272 0.1 0 0.0
arduino:samd:mkrgsm1400 96 0.04 0 0.0 96 0.04 0 0.0
arduino:samd:mkrnb1500 104 0.04 0 0.0 104 0.04 0 0.0
arduino:samd:mkrwan1300 88 0.03 0 0.0 96 0.04 0 0.0
arduino:samd:mkrwan1310 88 0.03 0 0.0 96 0.04 0 0.0
arduino:samd:mkrwifi1010 264 0.1 0 0.0 264 0.1 0 0.0
arduino:samd:nano_33_iot 264 0.1 0 0.0 264 0.1 0 0.0
esp32:esp32:esp32 416 0.03 0 0.0 420 0.03 0 0.0
esp8266:esp8266:huzzah 352 0.03 48 0.06 352 0.03 48 0.06
rp2040:rp2040:rpipicow 248 0.01 0 0.0 248 0.01 0 0.0
Click for full report CSV
Board,examples/ConnectionHandlerDemo<br>flash,%,examples/ConnectionHandlerDemo<br>RAM for global variables,%,examples/CheckInternetAvailabilityDemo<br>flash,%,examples/CheckInternetAvailabilityDemo<br>RAM for global variables,%
arduino:esp32:nano_nora,396,0.01,0,0.0,404,0.01,0,0.0
arduino:mbed:envie_m7,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A
arduino:mbed_edge:edge_control,72,0.01,0,0.0,72,0.01,0,0.0
arduino:mbed_giga:giga,248,0.01,0,0.0,248,0.01,0,0.0
arduino:mbed_nano:nanorp2040connect,264,0.0,0,0.0,268,0.0,0,0.0
arduino:mbed_nicla:nicla_vision,248,0.01,0,0.0,248,0.01,0,0.0
arduino:mbed_opta:opta,72,0.0,0,0.0,136,0.01,0,0.0
arduino:mbed_portenta:envie_m7,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A
arduino:renesas_portenta:portenta_c33,88,0.0,0,0.0,88,0.0,0,0.0
arduino:renesas_uno:unor4wifi,248,0.09,0,0.0,248,0.09,0,0.0
arduino:samd:mkr1000,264,0.1,0,0.0,272,0.1,0,0.0
arduino:samd:mkrgsm1400,96,0.04,0,0.0,96,0.04,0,0.0
arduino:samd:mkrnb1500,104,0.04,0,0.0,104,0.04,0,0.0
arduino:samd:mkrwan1300,88,0.03,0,0.0,96,0.04,0,0.0
arduino:samd:mkrwan1310,88,0.03,0,0.0,96,0.04,0,0.0
arduino:samd:mkrwifi1010,264,0.1,0,0.0,264,0.1,0,0.0
arduino:samd:nano_33_iot,264,0.1,0,0.0,264,0.1,0,0.0
esp32:esp32:esp32,416,0.03,0,0.0,420,0.03,0,0.0
esp8266:esp8266:huzzah,352,0.03,48,0.06,352,0.03,48,0.06
rp2040:rp2040:rpipicow,248,0.01,0,0.0,248,0.01,0,0.0
The objective of those flags is to verify that connection handlers that
require settings to be provided before starting them properly configured.
By providing stub empty definition of DEBUG_* macro utility for AVR
platform we aim to remove all the ifdefs in
WiFiConnectionHandler::update_handleInit() function thus improving itse
readability
the objective of the check state is to validate the configuration of the
connection handler before going into the init state. For the time being
the only valid check is to wait for settings to be provided if required.

WiFiConnectionHandler splits the init state into check and init
@github-actions
Copy link

Memory usage change @ 671669f

Board flash % RAM for global variables %
arduino:esp32:nano_nora 🔺 +392 - +400 +0.01 - +0.01 0 - 0 0.0 - 0.0
arduino:mbed:envie_m7 N/A N/A N/A N/A
arduino:mbed_edge:edge_control 🔺 +72 - +72 +0.01 - +0.01 0 - 0 0.0 - 0.0
arduino:mbed_giga:giga 🔺 +248 - +248 +0.01 - +0.01 0 - 0 0.0 - 0.0
arduino:mbed_nano:nanorp2040connect 🔺 +264 - +268 0.0 - 0.0 0 - 0 0.0 - 0.0
arduino:mbed_nicla:nicla_vision 🔺 +248 - +248 +0.01 - +0.01 0 - 0 0.0 - 0.0
arduino:mbed_opta:opta 🔺 +72 - +136 0.0 - +0.01 0 - 0 0.0 - 0.0
arduino:mbed_portenta:envie_m7 N/A N/A N/A N/A
arduino:renesas_portenta:portenta_c33 🔺 +88 - +88 0.0 - 0.0 0 - 0 0.0 - 0.0
arduino:renesas_uno:unor4wifi 🔺 +248 - +248 +0.09 - +0.09 0 - 0 0.0 - 0.0
arduino:samd:mkr1000 🔺 +264 - +272 +0.1 - +0.1 0 - 0 0.0 - 0.0
arduino:samd:mkrgsm1400 🔺 +96 - +96 +0.04 - +0.04 0 - 0 0.0 - 0.0
arduino:samd:mkrnb1500 🔺 +104 - +104 +0.04 - +0.04 0 - 0 0.0 - 0.0
arduino:samd:mkrwan1300 🔺 +88 - +96 +0.03 - +0.04 0 - 0 0.0 - 0.0
arduino:samd:mkrwan1310 🔺 +88 - +96 +0.03 - +0.04 0 - 0 0.0 - 0.0
arduino:samd:mkrwifi1010 🔺 +264 - +264 +0.1 - +0.1 0 - 0 0.0 - 0.0
arduino:samd:nano_33_iot 🔺 +264 - +264 +0.1 - +0.1 0 - 0 0.0 - 0.0
esp32:esp32:esp32 🔺 +416 - +420 +0.03 - +0.03 0 - 0 0.0 - 0.0
esp8266:esp8266:huzzah 🔺 +336 - +352 +0.03 - +0.03 🔺 +48 - +48 +0.06 - +0.06
rp2040:rp2040:rpipicow 🔺 +248 - +248 +0.01 - +0.01 0 - 0 0.0 - 0.0
Click for full report table
Board examples/ConnectionHandlerDemo
flash
% examples/ConnectionHandlerDemo
RAM for global variables
% examples/CheckInternetAvailabilityDemo
flash
% examples/CheckInternetAvailabilityDemo
RAM for global variables
%
arduino:esp32:nano_nora 392 0.01 0 0.0 400 0.01 0 0.0
arduino:mbed:envie_m7 N/A N/A N/A N/A N/A N/A N/A N/A
arduino:mbed_edge:edge_control 72 0.01 0 0.0 72 0.01 0 0.0
arduino:mbed_giga:giga 248 0.01 0 0.0 248 0.01 0 0.0
arduino:mbed_nano:nanorp2040connect 264 0.0 0 0.0 268 0.0 0 0.0
arduino:mbed_nicla:nicla_vision 248 0.01 0 0.0 248 0.01 0 0.0
arduino:mbed_opta:opta 72 0.0 0 0.0 136 0.01 0 0.0
arduino:mbed_portenta:envie_m7 N/A N/A N/A N/A N/A N/A N/A N/A
arduino:renesas_portenta:portenta_c33 88 0.0 0 0.0 88 0.0 0 0.0
arduino:renesas_uno:unor4wifi 248 0.09 0 0.0 248 0.09 0 0.0
arduino:samd:mkr1000 264 0.1 0 0.0 272 0.1 0 0.0
arduino:samd:mkrgsm1400 96 0.04 0 0.0 96 0.04 0 0.0
arduino:samd:mkrnb1500 104 0.04 0 0.0 104 0.04 0 0.0
arduino:samd:mkrwan1300 88 0.03 0 0.0 96 0.04 0 0.0
arduino:samd:mkrwan1310 88 0.03 0 0.0 96 0.04 0 0.0
arduino:samd:mkrwifi1010 264 0.1 0 0.0 264 0.1 0 0.0
arduino:samd:nano_33_iot 264 0.1 0 0.0 264 0.1 0 0.0
esp32:esp32:esp32 416 0.03 0 0.0 420 0.03 0 0.0
esp8266:esp8266:huzzah 336 0.03 48 0.06 352 0.03 48 0.06
rp2040:rp2040:rpipicow 248 0.01 0 0.0 248 0.01 0 0.0
Click for full report CSV
Board,examples/ConnectionHandlerDemo<br>flash,%,examples/ConnectionHandlerDemo<br>RAM for global variables,%,examples/CheckInternetAvailabilityDemo<br>flash,%,examples/CheckInternetAvailabilityDemo<br>RAM for global variables,%
arduino:esp32:nano_nora,392,0.01,0,0.0,400,0.01,0,0.0
arduino:mbed:envie_m7,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A
arduino:mbed_edge:edge_control,72,0.01,0,0.0,72,0.01,0,0.0
arduino:mbed_giga:giga,248,0.01,0,0.0,248,0.01,0,0.0
arduino:mbed_nano:nanorp2040connect,264,0.0,0,0.0,268,0.0,0,0.0
arduino:mbed_nicla:nicla_vision,248,0.01,0,0.0,248,0.01,0,0.0
arduino:mbed_opta:opta,72,0.0,0,0.0,136,0.01,0,0.0
arduino:mbed_portenta:envie_m7,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A
arduino:renesas_portenta:portenta_c33,88,0.0,0,0.0,88,0.0,0,0.0
arduino:renesas_uno:unor4wifi,248,0.09,0,0.0,248,0.09,0,0.0
arduino:samd:mkr1000,264,0.1,0,0.0,272,0.1,0,0.0
arduino:samd:mkrgsm1400,96,0.04,0,0.0,96,0.04,0,0.0
arduino:samd:mkrnb1500,104,0.04,0,0.0,104,0.04,0,0.0
arduino:samd:mkrwan1300,88,0.03,0,0.0,96,0.04,0,0.0
arduino:samd:mkrwan1310,88,0.03,0,0.0,96,0.04,0,0.0
arduino:samd:mkrwifi1010,264,0.1,0,0.0,264,0.1,0,0.0
arduino:samd:nano_33_iot,264,0.1,0,0.0,264,0.1,0,0.0
esp32:esp32:esp32,416,0.03,0,0.0,420,0.03,0,0.0
esp8266:esp8266:huzzah,336,0.03,48,0.06,352,0.03,48,0.06
rp2040:rp2040:rpipicow,248,0.01,0,0.0,248,0.01,0,0.0
@per1234 per1234 added type: enhancement Proposed improvement topic: code Related to content of the project itself labels Jan 12, 2026
@andreagilardoni
Copy link
Contributor Author

@tidjidi can you try this PR? This should address the issue

@tidjidi
Copy link

tidjidi commented Jan 13, 2026

Hi @andreagilardoni
I made a short connection trial with this new library (I was obliged to download last ArduinIotCloud library as well, since NOTECARD have disappeared). The sketch used for that, was built by myself based on the cloud examples by Arduino: it just connects to Arduino cloud...
Things seem better, as the SSID is now known from the beginning; nevertheless, for some reasons, the connection needed several trials (3) before being really connected. But, I'm not really sure of failure; it is just because the sad emoji appeared 3 times before the successful cloud picture on the LED Matrix, and the overall time for connection is rather short.
Note the sad emoji appeared just after each wifi animation..
For information, here are my debug information from the Serial monitor (sorry some comments of mine are in french, but you shall easily recognize libraries messages) - Lines beginning with "==>" or ">>>>" or "<><><>" are mine...

15:45:54.119 -> =========================================================
15:45:54.119 ->   Connection scheme (by tidjidi)
15:45:54.119 -> 
15:45:54.119 -> ==> Debug level = 4
15:45:54.119 -> ==> initProperties()
15:45:54.119 -> ==> ArduinoCloud.begin()
15:45:54.212 -> ==> Attente de la connexion avec animation de la matrice de LEDs
15:45:54.212 -> CONNECTION STATUS: connecting to WiFi
15:45:54.212 -> Current WiFi Firmware: 0.6.0
15:45:54.259 -> Network settings received:
15:45:54.259 -> WIFI
15:45:54.259 -> SSID: TIDJIDI_2
15:45:54.726 -> Current WiFi Firmware: 0.6.0
15:45:55.239 -> WiFi.status(): 0
15:45:55.333 -> Connected to "TIDJIDI_2"
15:45:56.219 -> CONNECTION STATUS: WiFi connection failed (check coverage, network credentials and WiFi band)
15:46:00.212 -> CONNECTION STATUS: WiFi connection failed (check coverage, network credentials and WiFi band)
15:46:04.259 -> CONNECTION STATUS: WiFi connection failed (check coverage, network credentials and WiFi band)
15:46:07.290 -> WiFi.ping(): 26
15:46:07.290 -> Connected to Internet
15:46:07.290 -> >>>> CONNECTED to network
15:46:07.290 -> CONNECTION STATUS: connecting to Arduino Cloud
15:46:07.385 -> TimeServiceClass::sync done. Drift: 45 RTC value: 1768315568
15:46:10.543 -> ==> Impression Debug Info
15:46:10.543 -> ***** Arduino IoT Cloud - 2.8.0 *****
15:46:10.543 -> Device ID: b9e20341-b569-452d-a874-c54cf0493f3c
15:46:10.543 -> MQTT Broker: iot.arduino.cc:8885
15:46:10.583 -> Network Configurator: 0.5.1
15:46:10.583 -> ==> Fin de la connexion: animation Tetris.........OK
15:46:15.103 -> ==> Affichage du SSID sur la Matrix... OK
15:46:20.205 -> (pour réafficher le SSID sur la Matrix, court-circuiter le pin 5 à GND)
15:46:21.203 -> Connected to Arduino IoT Cloud
15:46:21.203 -> Thing ID: 3b2dbf06-fd97-4ac5-aa2a-0e3fdad0ee9d
15:46:21.203 -> <><><>Board successfully connected to Arduino IoT Cloud Thing
15:46:21.619 -> <><><>Thing Properties synchronised
15:46:21.654 -> TimeServiceClass::setTimeZoneData offset: 3600 dst_unitl 1774746000
@andreagilardoni
Copy link
Contributor Author

That is quite odd to me, I don't see any "Provided empty ssid, please provide a valid one", the issue could be somewhere else... Can you try a simple sketch, like the following one? Please provide your ssid and password.

#include "WiFiS3.h"
#include "IPAddress.h"

char ssid[] = "SSID";
char pass[] = "PASSWORD";

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  int status;

  // check for the WiFi module:
  if ((status = WiFi.status()) == WL_NO_MODULE) {
    Serial.println("Communication with WiFi module failed!");
    // don't continue
    while (true);
  }

  String fv = WiFi.firmwareVersion();
  if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
    Serial.println("Please upgrade the firmware");
  }

  // attempt to connect to WiFi network:
  while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network.
    status = WiFi.begin(ssid, pass);

    Serial.println(status);
  }

  printWifiStatus();
}

void loop() { }

void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your board's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}
@tidjidi
Copy link

tidjidi commented Jan 14, 2026

Hi @andreagilardoni . Sorry I didn't see your message before now...
There was a confusion. I provided the log of my sketch with the new library, and I told you that it was all fine. Just a strange behaviour (but as it's an intermediate release, I guess this will be fixed later on) with the sad emoji appearing 3 times (corresponding to the messages in the log CONNECTION STATUS: WiFi connection failed (check coverage, network credentials and WiFi band))...
Anyhow, I'll do a test with the sketch provided above, with release 1.2.0 of Arduino_ConnectionHandler library and the last one you committed here.

@tidjidi
Copy link

tidjidi commented Jan 14, 2026

Well ! I tried the sketch you provide, but despite it answers that the UNO is connected, it's not!

Attempting to connect to SSID: TIDJIDI_2
3
SSID: TIDJIDI_2
IP Address: 0.0.0.0
signal strength (RSSI):-70 dBm

My router does not mention any connection of the UNO...

With my sketch (based on the Arduino cloud connection), the UNO is identified in the router
(if you need it, I can send you a copy; but there is no revolutionary code in it, as I copied the Arduino sketches from Plug & Make kit)

Addendum: I slightly modified the sketch, adding in loop function

void loop() {
  if (millis() - start >= 5000) {
    Serial.print("local IP : ");
    IPAddress ip = WiFi.localIP();
    Serial.println(ip);
    while(1);
  }
}

This times, I got an IP@...

@tidjidi
Copy link

tidjidi commented Jan 15, 2026

Hello @andreagilardoni ,
Just to be sure, I did again a test with a sketch on the Arduino cloud platform, and hereafter I copied the log of the connection process:

CONNECTION STATUS: connecting to WiFi
WiFi.status(): 0
Current WiFi Firmware: 0.6.0
Connection to "" failed
Retrying in  "500" milliseconds
Network settings received:
WIFI
SSID: TIDJIDI_2
CONNECTION STATUS: WiFi connection failed (check coverage, network credentials and WiFi band)
WiFi.status(): 0
Current WiFi Firmware: 0.6.0
Connected to "TIDJIDI_2"
WiFi.ping(): 72
Connected to Internet
CONNECTION STATUS: connecting to Arduino Cloud
TimeServiceClass::sync done. Drift: 15 RTC value: 1768474928
***** Arduino IoT Cloud - 2.8.0 *****
Device ID: b9e20341-b569-452d-a874-c54cf0493f3c
MQTT Broker: iot.arduino.cc:8885
Network Configurator: 0.5.1
Connected to Arduino IoT Cloud
Thing ID: 3a9f2efe-a6fd-413e-8542-88b79bc426f3

where the important part is : Connection to "" failed (line #109 in WiFiConnectionHandler.cpp)

@andreagilardoni
Copy link
Contributor Author

Hi @tidjidi, did you apply the changes from this PR in the last comment? In the case of empty SSID this should print "Provided empty ssid, please provide a valid one"

The RSSI value (-70dBm) is in between a okay value and a not good value, this could explain why you have some connection trials before achieving a proper connection. This value may be good for a PC with bigger antennas, but the esp32 antenna is quite smaller.

@tidjidi
Copy link

tidjidi commented Jan 19, 2026

Hi @andreagilardoni . No, this last message (and log) was with the "official" Arduino_ConnectionHandler library release (1.2.0).
I provided the log with the release of that PR with my first message; and I told you that the behaviour was weird as for each LEDMATRIX_ANIMATION_WIFI_SEARCH on the UNO R4 LED Matrix, I got a LEDMATRIX_EMOJI_SAD, three times, and eventually LEDMATRIX_ANIMATION_CLOUD for successful WiFi connection. That 3 times bad connection, corresponds to the 3 messages in the log:
15:45:56.219 -> CONNECTION STATUS: WiFi connection failed (check coverage, network credentials and WiFi band)
15:46:00.212 -> CONNECTION STATUS: WiFi connection failed (check coverage, network credentials and WiFi band)
15:46:04.259 -> CONNECTION STATUS: WiFi connection failed (check coverage, network credentials and WiFi band)

About the bad RSSI (-70dB), that's also odd! I am with the UNO just besides of my router box (of course with an excellent RSSI); but the borad chose to connect to my repeater which is on the other part of my house. Sure! It's the same SSID, but I'm surprised in prefered the further AP...

Cheers

@andreagilardoni
Copy link
Contributor Author

Thank you, that is odd, I would also expect the esp to connect to the BSSID with the best RSSI in range... I will look into the wifi driver and verify that this properly configured.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

topic: code Related to content of the project itself type: enhancement Proposed improvement

3 participants