{"id":52235,"date":"2026-11-01T10:50:43","date_gmt":"2026-11-01T10:50:43","guid":{"rendered":"http:\/\/siratek.net\/index.php\/tutorials\/esp32-web-server\/"},"modified":"2026-11-01T10:50:43","modified_gmt":"2026-11-01T10:50:43","slug":"esp32-web-server","status":"publish","type":"siratek_tutorial","link":"https:\/\/siratek.net\/index.php\/tutorials\/esp32-web-server\/","title":{"rendered":"Serving a Page from an ESP32"},"content":{"rendered":"<body><p><\/p>\n<h2>What it does<\/h2>\n<p>The board becomes a small web server on your network. Type its address into a phone and you get a page showing a sensor reading, with buttons that switch something on and off.<\/p>\n<p>This is the point at which a project stops needing a laptop. No serial monitor, no app to install, no cable. Anyone on the same Wi-Fi can open it in a browser they already have.<\/p>\n<p>It is also where a few web ideas have to be met, and this page keeps them to the minimum: what a request is, why a page that refreshes itself is a poor idea, and why the obvious way of handling buttons is a bug.<\/p>\n<h2>Before you begin<\/h2>\n<h3>Required parts and tools<\/h3>\n<ul>\n<li>One ESP32 board, connected to your Wi-Fi as in the previous tutorial.<\/li>\n<li>An LED and a 220 ohm resistor on <code>GPIO 4<\/code>, so there is something to switch.<\/li>\n<li>A phone or computer on the same network.<\/li>\n<\/ul>\n<h3>What a request actually is<\/h3>\n<p>When a browser opens <code>http:\/\/192.168.1.50\/<\/code>, it connects and sends a line of text:<\/p>\n<pre><code>GET \/ HTTP\/1.1<\/code><\/pre>\n<p>The server replies with a status line, a blank line, and the page. That is genuinely all it is, and the first example does exactly that by hand so the mechanism is visible.<\/p>\n<p>The <code>\/<\/code> is the <strong>path<\/strong>, and it is how one server offers several things. <code>\/on<\/code> and <code>\/off<\/code> are paths too, which is how the buttons below work.<\/p>\n<h3>Two ways to write this<\/h3>\n<p><strong>By hand<\/strong>, with <code>WiFiServer<\/code>, reading the request as text. More code, no dependencies, and you can see every part of it.<\/p>\n<p><strong>With a library<\/strong>, such as <code>WebServer<\/code>, which comes with the ESP32 package. You register a function per path and it does the rest.<\/p>\n<p>This page does the first once, to show what is happening, then switches to the second, which is what you should actually use.<\/p>\n<h3>Do not put it on the internet<\/h3>\n<p>What follows is fine on your home network and is <strong>not safe to expose to the internet<\/strong>.<\/p>\n<p>There is no password, no encryption, and no protection against anything. Forwarding a port on your router to this board means anybody who finds it can switch your relay. The code here has no defences and is not trying to have any.<\/p>\n<p>If a project genuinely needs remote access, the right shape is the board making outbound connections to a service, as in the MQTT tutorial, rather than accepting inbound ones.<\/p>\n<h2>Pin reference<\/h2>\n<table>\n<thead>\n<tr>\n<th>Pin<\/th>\n<th>Purpose<\/th>\n<th>Notes<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>GPIO 4<\/code><\/td>\n<td>LED through 220 ohms<\/td>\n<td>Any general-purpose pin<\/td>\n<\/tr>\n<tr>\n<td><code>GPIO 34<\/code><\/td>\n<td>A sensor, optional<\/td>\n<td>ADC1, so it survives Wi-Fi<\/td>\n<\/tr>\n<tr>\n<td><code>GND<\/code><\/td>\n<td>Ground<\/td>\n<td><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<figure class=\"siratek-tutorial-figure\"><img decoding=\"async\" src=\"http:\/\/siratek.net\/wp-content\/uploads\/2026\/11\/esp32-web-server-wiring.svg\" alt=\"An ESP32 serving a page to a phone over Wi-Fi, with the browser request and the board's reply shown as the two halves of the exchange\" loading=\"lazy\"><figcaption>The browser sends a path; the board replies with a page. Buttons are just links to different paths.<\/figcaption><\/figure>\n<h2>Wiring steps<\/h2>\n<ol>\n<li>Unplug the USB cable.<\/li>\n<li>LED through a 220 ohm resistor from <code>GPIO 4<\/code> to <code>GND<\/code>, long leg to the resistor.<\/li>\n<li>Plug the USB cable back in.<\/li>\n<\/ol>\n<h2>Software and libraries<\/h2>\n<p>Both libraries used here come with the ESP32 board package. Nothing to install.<\/p>\n<h2>Minimal working example<\/h2>\n<p>The long way first, so the exchange is visible.<\/p>\n<pre><code>\/\/ Siratek: a web server written out by hand, so you can see the request.\n\n#include &lt;WiFi.h&gt;\n\nconst char* ssid     = \"your network name\";\nconst char* password = \"your password\";\n\nWiFiServer server(80);\n\nvoid setup() {\n  Serial.begin(115200);\n  WiFi.mode(WIFI_STA);\n  WiFi.begin(ssid, password);\n\n  unsigned long start = millis();\n  while (WiFi.status() != WL_CONNECTED &amp;&amp; millis() - start &lt; 20000) {\n    delay(500);\n  }\n\n  if (WiFi.status() != WL_CONNECTED) {\n    Serial.println(\"Siratek: no Wi-Fi. See the previous tutorial.\");\n    return;\n  }\n\n  server.begin();\n  Serial.print(\"Siratek: open http:\/\/\");\n  Serial.println(WiFi.localIP());\n}\n\nvoid loop() {\n  WiFiClient client = server.accept();\n  if (!client) {\n    return;\n  }\n\n  \/\/ Read the first line, which holds the method and the path.\n  String request = client.readStringUntil('\\r');\n  Serial.print(\"request: \");\n  Serial.println(request);\n  client.readStringUntil('\\n');\n\n  client.println(\"HTTP\/1.1 200 OK\");\n  client.println(\"Content-Type: text\/html\");\n  client.println(\"Connection: close\");\n  client.println();                       \/\/ the blank line matters\n  client.println(\"&lt;!DOCTYPE html&gt;&lt;html&gt;&lt;body&gt;\");\n  client.println(\"&lt;h1&gt;Siratek&lt;\/h1&gt;&lt;p&gt;Hello from an ESP32.&lt;\/p&gt;\");\n  client.println(\"&lt;\/body&gt;&lt;\/html&gt;\");\n\n  client.stop();\n}<\/code><\/pre>\n<p><strong><code>accept()<\/code>, not <code>available()<\/code>.<\/strong> Older code and older tutorials write <code>server.available()<\/code> here, and on ESP32 core 2.x that was the only name. Core 3 renamed it to <code>accept()<\/code> and left the old name in place as deprecated, so <code>available()<\/code> still works but the compiler now warns about it. If you are on core 2.x the line must read <code>available()<\/code>; the Boards Manager tells you which version you have.<\/p>\n<p><strong>The blank line is not optional.<\/strong> It separates the headers from the page, and without it the browser waits for headers that never end and eventually gives up. It is the most common mistake in hand-written servers.<\/p>\n<p>Watch the serial monitor while you load the page. You will usually see <strong>two<\/strong> requests: one for the page and one for <code>\/favicon.ico<\/code>, which the browser asks for automatically. That surprises people and is normal.<\/p>\n<h3>The useful version<\/h3>\n<pre><code>\/\/ Siratek: a page showing a reading, with buttons that work.\n\n#include &lt;WiFi.h&gt;\n#include &lt;WebServer.h&gt;\n\nconst char* ssid     = \"your network name\";\nconst char* password = \"your password\";\n\nWebServer server(80);\n\nconst int ledPin = 4;\nconst int sensorPin = 34;       \/\/ ADC1, so Wi-Fi does not break it\n\nbool ledOn = false;\n\nString page() {\n  int reading = analogRead(sensorPin);\n\n  String html = \"&lt;!DOCTYPE html&gt;&lt;html&gt;&lt;head&gt;\";\n  html += \"&lt;meta name='viewport' content='width=device-width,initial-scale=1'&gt;\";\n  html += \"&lt;title&gt;Siratek&lt;\/title&gt;\";\n  html += \"&lt;style&gt;body{font-family:system-ui;margin:2rem;line-height:1.6}\";\n  html += \"a{display:inline-block;padding:.6rem 1.2rem;margin-right:.5rem;\";\n  html += \"background:#0f766e;color:#fff;text-decoration:none;border-radius:6px}&lt;\/style&gt;\";\n  html += \"&lt;\/head&gt;&lt;body&gt;\";\n  html += \"&lt;h1&gt;Siratek sensor node&lt;\/h1&gt;\";\n  html += \"&lt;p&gt;Reading: &lt;strong&gt;\" + String(reading) + \"&lt;\/strong&gt; of 4095&lt;\/p&gt;\";\n  html += \"&lt;p&gt;LED is &lt;strong&gt;\" + String(ledOn ? \"on\" : \"off\") + \"&lt;\/strong&gt;&lt;\/p&gt;\";\n  html += \"&lt;p&gt;&lt;a href='\/on'&gt;Turn on&lt;\/a&gt;&lt;a href='\/off'&gt;Turn off&lt;\/a&gt;&lt;\/p&gt;\";\n  html += \"&lt;\/body&gt;&lt;\/html&gt;\";\n\n  return html;\n}\n\nvoid handleRoot() {\n  server.send(200, \"text\/html\", page());\n}\n\nvoid handleOn() {\n  ledOn = true;\n  digitalWrite(ledPin, HIGH);\n  \/\/ Redirect back to the main page, so a refresh does not switch it again.\n  server.sendHeader(\"Location\", \"\/\");\n  server.send(303);\n}\n\nvoid handleOff() {\n  ledOn = false;\n  digitalWrite(ledPin, LOW);\n  server.sendHeader(\"Location\", \"\/\");\n  server.send(303);\n}\n\nvoid setup() {\n  pinMode(ledPin, OUTPUT);\n  Serial.begin(115200);\n\n  WiFi.mode(WIFI_STA);\n  WiFi.begin(ssid, password);\n  unsigned long start = millis();\n  while (WiFi.status() != WL_CONNECTED &amp;&amp; millis() - start &lt; 20000) {\n    delay(500);\n  }\n  if (WiFi.status() != WL_CONNECTED) {\n    Serial.println(\"Siratek: no Wi-Fi.\");\n    return;\n  }\n\n  server.on(\"\/\", handleRoot);\n  server.on(\"\/on\", handleOn);\n  server.on(\"\/off\", handleOff);\n  server.onNotFound([]() {\n    server.send(404, \"text\/plain\", \"Not found\");\n  });\n\n  server.begin();\n  Serial.print(\"Siratek: open http:\/\/\");\n  Serial.println(WiFi.localIP());\n}\n\nvoid loop() {\n  server.handleClient();        \/\/ must be called often\n}<\/code><\/pre>\n<p>Four decisions here are worth more than the rest of the code.<\/p>\n<p><strong>The viewport meta tag.<\/strong> Without it a phone renders the page as if it were a desktop and everything is tiny. One line, and the page is usable on the device people will actually open it on.<\/p>\n<p><strong>The redirect after switching.<\/strong> Without it, <code>\/on<\/code> returns the page directly, the browser\u2019s address bar still says <code>\/on<\/code>, and the next refresh switches it on again. With a user that is merely odd; with a relay it means a reload can re-trigger an action. Redirecting back to <code>\/<\/code> means a refresh only ever reloads the page.<\/p>\n<p><strong>The sensor is on an ADC1 pin.<\/strong> On ADC2 it would read nothing at all once Wi-Fi started, and the sketch would look broken for no visible reason.<\/p>\n<p><strong><code>server.handleClient()<\/code> must be called often.<\/strong> Anything that blocks <code>loop()<\/code> makes the page unresponsive. Use the <code>millis()<\/code> pattern for periodic work, never <code>delay()<\/code>.<\/p>\n<h3>Why not just auto-refresh<\/h3>\n<p>The usual next step is a meta refresh tag that reloads the page every few seconds. It works, and it has two costs: the whole page is rebuilt and resent each time, and the page visibly flickers.<\/p>\n<p>The better shape is to serve the number separately and let the browser fetch just that:<\/p>\n<pre><code>server.on(\"\/reading\", []() {\n  server.send(200, \"text\/plain\", String(analogRead(sensorPin)));\n});<\/code><\/pre>\n<p>Then a few lines of JavaScript in the page update one element:<\/p>\n<pre><code>&lt;script&gt;\nsetInterval(async () =&gt; {\n  const r = await fetch('\/reading');\n  document.getElementById('v').textContent = await r.text();\n}, 2000);\n&lt;\/script&gt;<\/code><\/pre>\n<p>The page loads once. Only the number moves. That is a reasonable amount of web knowledge to pick up for the improvement it gives.<\/p>\n<h2>Expected result<\/h2>\n<p>An IP address on the serial monitor, and a page at that address from any device on the network, showing the reading and two working buttons.<\/p>\n<p>Open it on a phone. If the text is minute, the viewport tag is missing.<\/p>\n<h2>Troubleshooting<\/h2>\n<table>\n<thead>\n<tr>\n<th>Symptom<\/th>\n<th>Likely cause<\/th>\n<th>Check or fix<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Browser hangs, never loads<\/td>\n<td>Missing blank line after the headers<\/td>\n<td><code>client.println()<\/code> with no argument<\/td>\n<\/tr>\n<tr>\n<td>Page loads once then stops<\/td>\n<td><code>handleClient()<\/code> not called often<\/td>\n<td>Nothing in <code>loop()<\/code> may block<\/td>\n<\/tr>\n<tr>\n<td>Reading always 0 or 4095<\/td>\n<td>Sensor on an ADC2 pin<\/td>\n<td>Use 32 to 39<\/td>\n<\/tr>\n<tr>\n<td>Refresh switches the LED again<\/td>\n<td>No redirect after the action<\/td>\n<td>Send a 303 back to <code>\/<\/code><\/td>\n<\/tr>\n<tr>\n<td>Two requests per page load<\/td>\n<td>Browser asking for the favicon<\/td>\n<td>Normal<\/td>\n<\/tr>\n<tr>\n<td><code>available()<\/code> is deprecated<\/td>\n<td>Core 3 renamed it<\/td>\n<td>Use <code>accept()<\/code>; <code>available()<\/code> on core 2.x<\/td>\n<\/tr>\n<tr>\n<td>Tiny text on a phone<\/td>\n<td>No viewport meta tag<\/td>\n<td>Add it<\/td>\n<\/tr>\n<tr>\n<td>Works on the laptop, not the phone<\/td>\n<td>Phone on mobile data or another network<\/td>\n<td>Same Wi-Fi<\/td>\n<\/tr>\n<tr>\n<td>Address stopped working<\/td>\n<td>Router gave a new address<\/td>\n<td>Reserve it, or use mDNS<\/td>\n<\/tr>\n<tr>\n<td>Board resets under load<\/td>\n<td>Current during transmission<\/td>\n<td>Better cable and port<\/td>\n<\/tr>\n<tr>\n<td>Page slow to respond<\/td>\n<td><code>delay()<\/code> in <code>loop()<\/code><\/td>\n<td>Use the <code>millis()<\/code> pattern<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Next steps<\/h2>\n<ul>\n<li><strong>Easier first:<\/strong> <em>ESP32, Your First Wi-Fi Project<\/em>.<\/li>\n<li><strong>Related:<\/strong> the relay tutorial, if the button should switch something real, and its safety section before you do.<\/li>\n<li><strong>Next project:<\/strong> a weather station page, serving a DHT22 reading to any phone in the house.<\/li>\n<\/ul>\n<h2>Sources and attribution<\/h2>\n<p>All text, wiring guidance and code in this tutorial are original Siratek work.<\/p>\n<ul>\n<li>Arduino-ESP32 documentation for the <code>WiFi<\/code>, <code>WiFiServer<\/code> and <code>WebServer<\/code> interfaces.<\/li>\n<li>HTTP\u2019s request line, status codes and header-body separation are defined by the HTTP specification; they are described here in the plainest terms that make the code make sense.<\/li>\n<\/ul>\n<p>The warning against exposing this server to the internet is a deliberate limitation of scope. No third-party tutorial text, diagrams, photographs or code has been reproduced here.<\/p>\n<p><\/p>\n<\/body>","protected":false},"excerpt":{"rendered":"<p>The board becomes a small web server on your network. Type its address into a phone and you get a page showing a sensor reading, with buttons that switch something on and off.<\/p>\n","protected":false},"featured_media":0,"template":"","siratek_tutorial_level":[],"class_list":["post-52235","siratek_tutorial","type-siratek_tutorial","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Serving a Page from an ESP32 - siratek<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/siratek.net\/index.php\/tutorials\/esp32-web-server\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Serving a Page from an ESP32 - siratek\" \/>\n<meta property=\"og:description\" content=\"The board becomes a small web server on your network. Type its address into a phone and you get a page showing a sensor reading, with buttons that switch something on and off.\" \/>\n<meta property=\"og:url\" content=\"http:\/\/siratek.net\/index.php\/tutorials\/esp32-web-server\/\" \/>\n<meta property=\"og:site_name\" content=\"siratek\" \/>\n<meta property=\"og:image\" content=\"http:\/\/siratek.net\/wp-content\/uploads\/2026\/11\/esp32-web-server-wiring.svg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/esp32-web-server\\\/\",\"url\":\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/esp32-web-server\\\/\",\"name\":\"Serving a Page from an ESP32 - siratek\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/siratek.net\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/esp32-web-server\\\/#primaryimage\"},\"image\":{\"@id\":\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/esp32-web-server\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/siratek.net\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/esp32-web-server-wiring.svg\",\"datePublished\":\"2026-11-01T10:50:43+00:00\",\"breadcrumb\":{\"@id\":\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/esp32-web-server\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/esp32-web-server\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/esp32-web-server\\\/#primaryimage\",\"url\":\"https:\\\/\\\/siratek.net\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/esp32-web-server-wiring.svg\",\"contentUrl\":\"https:\\\/\\\/siratek.net\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/esp32-web-server-wiring.svg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/esp32-web-server\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/siratek.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorials\",\"item\":\"https:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Serving a Page from an ESP32\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/siratek.net\\\/#website\",\"url\":\"https:\\\/\\\/siratek.net\\\/\",\"name\":\"siratek\",\"description\":\"Your Best Electronic Retail Shop\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/siratek.net\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Serving a Page from an ESP32 - siratek","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/siratek.net\/index.php\/tutorials\/esp32-web-server\/","og_locale":"en_US","og_type":"article","og_title":"Serving a Page from an ESP32 - siratek","og_description":"The board becomes a small web server on your network. Type its address into a phone and you get a page showing a sensor reading, with buttons that switch something on and off.","og_url":"http:\/\/siratek.net\/index.php\/tutorials\/esp32-web-server\/","og_site_name":"siratek","og_image":[{"url":"http:\/\/siratek.net\/wp-content\/uploads\/2026\/11\/esp32-web-server-wiring.svg","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/siratek.net\/index.php\/tutorials\/esp32-web-server\/","url":"http:\/\/siratek.net\/index.php\/tutorials\/esp32-web-server\/","name":"Serving a Page from an ESP32 - siratek","isPartOf":{"@id":"https:\/\/siratek.net\/#website"},"primaryImageOfPage":{"@id":"http:\/\/siratek.net\/index.php\/tutorials\/esp32-web-server\/#primaryimage"},"image":{"@id":"http:\/\/siratek.net\/index.php\/tutorials\/esp32-web-server\/#primaryimage"},"thumbnailUrl":"http:\/\/siratek.net\/wp-content\/uploads\/2026\/11\/esp32-web-server-wiring.svg","datePublished":"2026-11-01T10:50:43+00:00","breadcrumb":{"@id":"http:\/\/siratek.net\/index.php\/tutorials\/esp32-web-server\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["http:\/\/siratek.net\/index.php\/tutorials\/esp32-web-server\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"http:\/\/siratek.net\/index.php\/tutorials\/esp32-web-server\/#primaryimage","url":"https:\/\/siratek.net\/wp-content\/uploads\/2026\/11\/esp32-web-server-wiring.svg","contentUrl":"https:\/\/siratek.net\/wp-content\/uploads\/2026\/11\/esp32-web-server-wiring.svg"},{"@type":"BreadcrumbList","@id":"http:\/\/siratek.net\/index.php\/tutorials\/esp32-web-server\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/siratek.net\/"},{"@type":"ListItem","position":2,"name":"Tutorials","item":"https:\/\/siratek.net\/index.php\/tutorials\/"},{"@type":"ListItem","position":3,"name":"Serving a Page from an ESP32"}]},{"@type":"WebSite","@id":"https:\/\/siratek.net\/#website","url":"https:\/\/siratek.net\/","name":"siratek","description":"Your Best Electronic Retail Shop","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/siratek.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/siratek.net\/index.php\/wp-json\/wp\/v2\/siratek_tutorial\/52235","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/siratek.net\/index.php\/wp-json\/wp\/v2\/siratek_tutorial"}],"about":[{"href":"https:\/\/siratek.net\/index.php\/wp-json\/wp\/v2\/types\/siratek_tutorial"}],"version-history":[{"count":0,"href":"https:\/\/siratek.net\/index.php\/wp-json\/wp\/v2\/siratek_tutorial\/52235\/revisions"}],"wp:attachment":[{"href":"https:\/\/siratek.net\/index.php\/wp-json\/wp\/v2\/media?parent=52235"}],"wp:term":[{"taxonomy":"siratek_tutorial_level","embeddable":true,"href":"https:\/\/siratek.net\/index.php\/wp-json\/wp\/v2\/siratek_tutorial_level?post=52235"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}