 }
 #endif // STARTUP_COMMANDS
 
+#if defined(ESP32)
+void circularHandler() {
+  WebServer *server = wfb.getServer();
+
+  uint8_t pattern = 0;
+  if (server->hasArg("pattern")) {
+    pattern = server->arg("pattern").toInt();
+  }
+
+  uint16_t length = pixels.numPixels() / 8;
+  if (server->hasArg("length")) {
+    length = server->arg("length").toInt();
+  }
+
+  uint16_t period = 25;
+  if (server->hasArg("period")) {
+    period = server->arg("period").toInt();
+  }
+
+  DEBUG3_VALUE("/circular pattern=", pattern);
+  DEBUG3_VALUE(" length=", length);
+  DEBUG3_VALUELN(" period=", period);
+
+  byte output = manager.lookup_output_by_type(HMTL_OUTPUT_PIXELS);
+  if (output != HMTL_NO_OUTPUT) {
+    DEBUG4_VALUELN("/circular: output ", output);
+    program_circular_fmt(sockets[0]->send_buffer, sockets[0]->send_data_size,
+                         config.address, output,
+                         period, length, CRGB::Black,
+                         pattern, 0);
+    msg_hdr_t *msg = (msg_hdr_t *)sockets[0]->send_buffer;
+    handler.process_msg(msg, sockets[0], NULL, &config);
+  }
+
+  DEBUG3_PRINTLN("/circular done");
+
+  server->send(200, "application/json", "ok");
+}
+
+void rgbHandler() {
+  WebServer *server = wfb.getServer();
+
+  uint8_t rgb[3];
+
+  if (server->args() < 3) {
+    wfb.getServer()->send(400, "application/json", "insufficient args");
+    return;
+  }
+
+  rgb[0] = server->arg("red").toInt();
+  rgb[1] = server->arg("green").toInt();
+  rgb[2] = server->arg("blue").toInt();
+
+  DEBUG3_VALUE("/rgb r:", rgb[0]);
+  DEBUG3_VALUE("g:", rgb[1]);
+  DEBUG3_VALUELN("b:", rgb[2]);
+
+  byte output = manager.lookup_output_by_type(HMTL_OUTPUT_PIXELS);
+  if (output != HMTL_NO_OUTPUT) {
+    DEBUG4_VALUELN("/rgb output:", output);
+    hmtl_set_output_rgb(outputs[output], objects[output], rgb);
+  }
+
+  DEBUG3_PRINTLN("/rgb done");
+
+  server->send(200, "application/json", "ok");
+}
+#endif
+
+void status_update() {
+  DEBUG3_PRINTLN("Status:");
+  DEBUG3_VALUELN(" * uptime:", millis())
+
+#if defined(ESP32)
+  DEBUG3_VALUE(" * wifi connected:", wfb.connected());
+  DEBUG3_VALUE(" ssid:", WiFi.SSID());
+  DEBUG3_VALUE(" ip:", WiFi.localIP().toString());
+  DEBUG3_VALUE(" ap_ip:", WiFi.softAPIP().toString());
+#endif
+}
+
 #define MSG_MAX_SZ (sizeof(msg_hdr_t) + sizeof(msg_max_t))
 byte msg[MSG_MAX_SZ];
 byte serial_offset = 0;

  { HMTL_PROGRAM_TIMED_CHANGE, program_timed_change, program_timed_change_init },
  { HMTL_PROGRAM_FADE, program_fade, program_fade_init },
  { HMTL_PROGRAM_SPARKLE, program_sparkle, program_sparkle_init },
  { PROGRAM_BRIGHTNESS, NULL,  program_brightness },
  { PROGRAM_COLOR, NULL, program_color},


//#define STARTUP_SPARKLE
//#define STARTUP_CIRCULAR
//#define STARTUP_VALUE
//#define STARTUP_FADE_ALL
#endif

void additional_setup() {
