<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Synacl Labs</title>
    <description>The latest articles on DEV Community by Synacl Labs (@synacl-labs).</description>
    <link>https://dev.to/synacl-labs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4132533%2F09ccf510-05ae-4aa6-bc5f-697045a1b77e.png</url>
      <title>DEV Community: Synacl Labs</title>
      <link>https://dev.to/synacl-labs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/synacl-labs"/>
    <language>en</language>
    <item>
      <title>ThingsBoard alternatives in 2026: picking an IoT platform for a small industrial fleet</title>
      <dc:creator>Synacl Labs</dc:creator>
      <pubDate>Mon, 26 Oct 2026 05:08:46 +0000</pubDate>
      <link>https://dev.to/synacl-labs/thingsboard-alternatives-in-2026-picking-an-iot-platform-for-a-small-industrial-fleet-58bl</link>
      <guid>https://dev.to/synacl-labs/thingsboard-alternatives-in-2026-picking-an-iot-platform-for-a-small-industrial-fleet-58bl</guid>
      <description>&lt;p&gt;&lt;em&gt;By the Synacl team. Originally published at &lt;a href="https://synacl.com/guides/thingsboard-alternatives/" rel="noopener noreferrer"&gt;synacl.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;ThingsBoard is the platform most people find first when they search for an open-source IoT dashboard, and for good reason: it's mature, self-hostable and can do almost anything. It's also a lot of platform for a plant with forty meters and one electrician. This guide compares the realistic alternatives for a &lt;strong&gt;small industrial fleet&lt;/strong&gt; (tens to a few hundred devices, mostly Modbus, RS485 and simple sensors) on the things that actually decide the outcome: who hosts it, how devices get in, what the pricing model does as you grow, whether commercial use is allowed on the cheap tiers, and how much engineering you need on staff.&lt;/p&gt;

&lt;p&gt;Prices below were checked in September 2026 against each vendor's public pricing page, and ThingsBoard's again on 8 October 2026 after its licence change. They change often, so treat them as the shape of the offer, not a quote. Synacl is our product, so the last section is ours to argue; the rest is written to be fair.&lt;/p&gt;

&lt;h2&gt;
  
  
  What ThingsBoard is good at, and where it gets heavy
&lt;/h2&gt;

&lt;p&gt;ThingsBoard comes in two forms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Self-managed ThingsBoard.&lt;/strong&gt; Since version 4.4 (September 2026) the old Community and Professional editions are one product under the &lt;strong&gt;Business Source License 1.1&lt;/strong&gt;. Production use is free for commercial use up to 100 devices on one server (1,000 devices for non-commercial use), as long as the ThingsBoard branding stays visible and you use a free licence key. Beyond that, self-managed subscriptions run from $99 to $499 a month, and a perpetual licence starts at $4,999. Versions before 4.4 stay Apache 2.0, and each new release becomes Apache 2.0 four years after it ships. You get device management, a rule engine, a large widget library and a dashboard builder, and you pay in servers and attention.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ThingsBoard Cloud&lt;/strong&gt; is the hosted version. It's billed by plan, and each plan caps both devices and &lt;strong&gt;data points&lt;/strong&gt;, where one data point is one telemetry value. The free tier covers 5 devices and 1 million data points a month. Paid tiers are Prototype ($49 a month, 50 devices, 10 million data points), Pilot ($149, 100 devices, 100 million), Startup ($399, 500 devices) and Business ($749, 1,000 devices), with extra devices at about $0.30 each.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's also &lt;strong&gt;ThingsBoard Edge&lt;/strong&gt;, a local instance that runs on site and syncs with the cloud.&lt;/p&gt;

&lt;p&gt;Where ThingsBoard shines: you need a rule engine you can program in depth, you want to own the stack, or you're integrating a dozen protocols through the separate &lt;strong&gt;ThingsBoard IoT Gateway&lt;/strong&gt;, a Python service you install on an edge box.&lt;/p&gt;

&lt;p&gt;Where it gets heavy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The gateway is a second product to deploy and keep alive.&lt;/li&gt;
&lt;li&gt;Modbus devices are configured in the gateway's connector config rather than in the platform.&lt;/li&gt;
&lt;li&gt;Self-hosting at scale means PostgreSQL or Cassandra plus Kafka.&lt;/li&gt;
&lt;li&gt;On Cloud, the data-point caps punish sensors that report often: 50 devices reporting four values every 10 seconds come to about 52 million data points a month, five times the Prototype allowance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your team has a developer who enjoys this, ThingsBoard is a fine choice. If your team is an installer with a laptop, it's a project. For the two side by side, feature by feature, see &lt;a href="https://synacl.com/guides/thingsboard-vs-synacl/" rel="noopener noreferrer"&gt;ThingsBoard vs Synacl&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hosted alternatives, one by one
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ThingSpeak
&lt;/h3&gt;

&lt;p&gt;ThingSpeak is MathWorks' IoT analytics service, and it comes up in almost every "ThingsBoard vs ThingSpeak" search. Its strength is MATLAB: you can run MATLAB analysis and visualisations on channel data without leaving the browser. The free tier allows about 3 million messages a year, 4 channels and one update every 15 seconds, and it's &lt;strong&gt;for non-commercial use only&lt;/strong&gt;. Paid licences are sold per unit of messages per year and priced by country rather than published. The device side is your own firmware posting over HTTP or MQTT.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; research, teaching and data analysis projects, especially if you already use MATLAB. It isn't built for fleet operations, alerting or multi-user access.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blynk
&lt;/h3&gt;

&lt;p&gt;Blynk grew up as the app builder for makers and has moved towards businesses. Its strength is the phone app: drag a few widgets, connect an ESP32 with the Blynk library, and you're done. The free plan covers 5 devices for exploration. Paid plans start at Starter ($29 a month for 10 devices), then Prototype ($99 for 50) and Production tiers from $199 for 100 devices. Modbus and RS485 aren't first-class: you write the firmware that reads the bus and publishes values.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; a product team building a consumer or light-commercial device that ships with its own firmware and needs a branded mobile app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Datacake
&lt;/h3&gt;

&lt;p&gt;Datacake is a low-code platform with unusually good LoRaWAN support. The first 5 devices are free, and paid plans are bundles priced in euros: Hobby is €25 a month for up to 25 devices, and the next step, Light, is €159 a month for 50. Device data is decoded with JavaScript payload decoders you maintain per device type. Modbus reaches Datacake through third-party RS485-to-LoRaWAN converters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; LoRaWAN sensor fleets, and anyone whose devices already speak MQTT or HTTP with a payload they can decode in a few lines.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ubidots
&lt;/h3&gt;

&lt;p&gt;Ubidots offers polished dashboards, an events engine and white-label options on higher tiers. The free STEM plan covers 3 devices for non-commercial use. The Professional plan is $99 a month for 50 devices, plus about $2 per extra device, and the Industrial and Enterprise tiers are priced on request. As with Blynk and Datacake, the device side is your problem: Ubidots ingests MQTT and HTTP, and Modbus comes in through a third-party gateway.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; teams that want a clean, presentable dashboard product on top of devices they already control.&lt;/p&gt;

&lt;h3&gt;
  
  
  TagoIO
&lt;/h3&gt;

&lt;p&gt;TagoIO is a developer-friendly platform with serverless "analysis" scripts, a dashboard builder and network integrations for LoRaWAN and similar radios. The free tier covers 5 devices. Starter is $49 a month for up to 100 devices with a monthly data allowance, and usage beyond it is pay-as-you-go. A dedicated or on-premise deployment is available at a much higher price. Like most hosted platforms it expects devices, or a third-party gateway, to deliver data over HTTP or MQTT.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; developers who want to script their own processing in JavaScript and don't mind usage-based billing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Arduino Cloud
&lt;/h3&gt;

&lt;p&gt;If your hardware is Arduino-branded, or ESP32 boards flashed with Arduino sketches, Arduino Cloud is the path of least resistance: the IDE, device provisioning and dashboards are one product. Read the licence terms carefully, though. The free plan and the Maker plan ($72 a year for 25 "Things") are for &lt;strong&gt;personal use only&lt;/strong&gt;. Commercial use starts at the Team plan, $1,000 a year for 100 Things. Industrial protocols, fleet operations and alerting are thin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; classrooms, prototypes and personal projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  AWS IoT Core and Azure IoT Hub
&lt;/h3&gt;

&lt;p&gt;These are building blocks, not platforms. You get a secure MQTT broker at any scale and pay per message and per connection minute. Then you assemble storage, dashboards, alerting, device provisioning and OTA from other services. That assembly isn't stable, either. Google shut Cloud IoT Core down in 2023, and AWS has since retired IoT Analytics and IoT Events, so a stack built on those had to be rebuilt. The hyperscalers are superb when you have a cloud team and unusual requirements, and expensive in engineering time when you don't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; software companies building their own IoT product on top.&lt;/p&gt;

&lt;p&gt;Two other names come up in enterprise shortlists. &lt;strong&gt;Losant&lt;/strong&gt; is now part of SUSE and prices by quote. &lt;strong&gt;Azure IoT Central&lt;/strong&gt; is still available, despite a 2024 retirement notice that Microsoft withdrew. Both are aimed at larger deployments than this guide covers.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you need to self-host
&lt;/h2&gt;

&lt;p&gt;Self-hosting is the main reason people choose ThingsBoard in the first place. If it's a hard requirement (data residency, an air-gapped site, company policy), the realistic options are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Self-managed ThingsBoard.&lt;/strong&gt; The most complete self-hostable platform, and the heaviest to run. Since 4.4 it is source-available rather than open source: free for commercial use up to 100 devices on one server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thinger.io.&lt;/strong&gt; Lighter, with open-source (MIT) client libraries and a hosted service priced per instance rather than per device: a free Maker tier with 2 devices, and paid instances from about €29 a month. Private on-premise instances are also offered.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node-RED + InfluxDB + Grafana + Mosquitto.&lt;/strong&gt; The DIY stack. It's all free software and endlessly flexible, and Node-RED's Modbus nodes are excellent. The cost is ownership: backups, upgrades, TLS, user management, and the knowledge living in one person's head.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Be honest about whether self-hosting is a requirement or a preference. A preference usually evaporates the first time an upgrade breaks at 2 a.m. and the only person who understands the stack is on holiday.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparison at a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Hosting&lt;/th&gt;
&lt;th&gt;Free tier&lt;/th&gt;
&lt;th&gt;Commercial use on the cheapest paid plan&lt;/th&gt;
&lt;th&gt;Pricing model&lt;/th&gt;
&lt;th&gt;Modbus / RS485 path&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ThingsBoard (self-managed)&lt;/td&gt;
&lt;td&gt;Self-hosted&lt;/td&gt;
&lt;td&gt;100 devices on one server (1,000 non-commercial)&lt;/td&gt;
&lt;td&gt;Yes, within the free licence&lt;/td&gt;
&lt;td&gt;Free to 100 devices, then subscriptions from $99/month&lt;/td&gt;
&lt;td&gt;Separate IoT Gateway service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ThingsBoard Cloud&lt;/td&gt;
&lt;td&gt;Hosted&lt;/td&gt;
&lt;td&gt;5 devices, 1M data points/month&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Plan caps devices + data points&lt;/td&gt;
&lt;td&gt;Same gateway, hosted platform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ThingSpeak&lt;/td&gt;
&lt;td&gt;Hosted&lt;/td&gt;
&lt;td&gt;3M messages/year, non-commercial&lt;/td&gt;
&lt;td&gt;Yes, on a Standard licence&lt;/td&gt;
&lt;td&gt;Per unit of messages/year, priced by country&lt;/td&gt;
&lt;td&gt;Your firmware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blynk&lt;/td&gt;
&lt;td&gt;Hosted&lt;/td&gt;
&lt;td&gt;5 devices, exploration&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Per plan by device count&lt;/td&gt;
&lt;td&gt;Your firmware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Datacake&lt;/td&gt;
&lt;td&gt;Hosted&lt;/td&gt;
&lt;td&gt;5 devices&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Device bundles, in EUR&lt;/td&gt;
&lt;td&gt;Third-party LoRaWAN converters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ubidots&lt;/td&gt;
&lt;td&gt;Hosted&lt;/td&gt;
&lt;td&gt;3 devices, non-commercial&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Plan + per extra device&lt;/td&gt;
&lt;td&gt;Third-party gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TagoIO&lt;/td&gt;
&lt;td&gt;Hosted&lt;/td&gt;
&lt;td&gt;5 devices&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Plan + pay-as-you-go data&lt;/td&gt;
&lt;td&gt;Third-party gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arduino Cloud&lt;/td&gt;
&lt;td&gt;Hosted&lt;/td&gt;
&lt;td&gt;2 Things, personal&lt;/td&gt;
&lt;td&gt;No, only from the Team plan&lt;/td&gt;
&lt;td&gt;Per plan&lt;/td&gt;
&lt;td&gt;Your sketch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thinger.io&lt;/td&gt;
&lt;td&gt;Hosted or private&lt;/td&gt;
&lt;td&gt;2 devices&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Per instance size&lt;/td&gt;
&lt;td&gt;Plugins / third-party gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node-RED + Influx + Grafana&lt;/td&gt;
&lt;td&gt;Self-hosted&lt;/td&gt;
&lt;td&gt;Free software&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Your time&lt;/td&gt;
&lt;td&gt;Node-RED Modbus nodes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS IoT / Azure IoT Hub&lt;/td&gt;
&lt;td&gt;Cloud building blocks&lt;/td&gt;
&lt;td&gt;Small credits&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Per message and connection minute&lt;/td&gt;
&lt;td&gt;Build it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Synacl&lt;/td&gt;
&lt;td&gt;Hosted&lt;/td&gt;
&lt;td&gt;5 devices&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Per plan by device count&lt;/td&gt;
&lt;td&gt;Built-in ESP32 gateway, browser-flashed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How to choose in ten minutes
&lt;/h2&gt;

&lt;p&gt;Answer five questions and most of the table disappears.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Do your devices already speak MQTT or HTTP with firmware you control?&lt;/strong&gt; If they do, every hosted platform works and you're choosing on dashboards and price. If they're Modbus meters, RS485 probes or 4–20 mA transmitters on a PLC, you need a gateway, and the question becomes who provides and maintains it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is self-hosting a requirement or a preference?&lt;/strong&gt; A requirement points at the self-hosting section above. A preference usually doesn't survive contact with the upgrade schedule.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How often do sensors report?&lt;/strong&gt; Data-point and message caps are fine at one reading a minute and painful at one a second. Per-device pricing doesn't care.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is this commercial?&lt;/strong&gt; Several free and entry tiers (ThingSpeak, Ubidots STEM, Arduino Cloud up to Team) rule out commercial use. Check before you build a customer's install on one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who will run it day to day?&lt;/strong&gt; If the answer is an electrician, an installer or a plant manager, the platform has to handle provisioning, firmware updates and diagnostics from a browser. Otherwise the work lands back on whoever set it up.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Moving off ThingsBoard
&lt;/h2&gt;

&lt;p&gt;If you already run ThingsBoard and it's become more platform than you need, migration is less work than it looks, because the part worth keeping is small:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Devices and register maps.&lt;/strong&gt; Export them from the IoT Gateway's Modbus connector config: slave IDs, register addresses, function codes, scaling. This is the knowledge that took time to collect, and it transfers to any platform as-is.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rules.&lt;/strong&gt; Most small-fleet rule chains are thresholds and offline alerts. Write them down as plain sentences ("alert if tank level &amp;lt; 20% for 5 minutes") and rebuild them, rather than trying to translate rule-chain JSON.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboards.&lt;/strong&gt; These don't move between platforms. Rebuild the few that people actually open, and skip the rest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;History.&lt;/strong&gt; Export telemetry you need for compliance or reports to CSV before you switch off. Few platforms import another's time-series history, so plan on keeping the export as an archive.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run the two systems side by side for a week on a handful of devices before you move the rest. Double-reading is harmless if both platforms read the bus, but not if one of them writes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Synacl fits, and where it doesn't
&lt;/h2&gt;

&lt;p&gt;Synacl was built for the case the table leaves half-served: &lt;strong&gt;industrial-ish hardware, a small fleet, and no software team.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The gateway is part of the platform, not a separate product.&lt;/strong&gt; It's an ESP32 you &lt;a href="https://synacl.com/flash/" rel="noopener noreferrer"&gt;flash from the browser&lt;/a&gt;, provision over USB, and update over the air with its settings kept. Modbus RTU and RS485 devices are configured in the platform, register by register, with scaling and units on each tag. Common meters and sensors start from a &lt;a href="https://synacl.com/devices/" rel="noopener noreferrer"&gt;device catalog&lt;/a&gt; with the register map already filled in, and on paid plans a fleet of identical meters can be added in one go with auto-numbered names and Modbus IDs. GPIO, I²C, 1-Wire, SPI, UART and CAN devices hang off the same gateway, and devices that already speak MQTT or HTTPS connect directly without one.&lt;/p&gt;

&lt;p&gt;On top of the devices you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;live dashboards with SCADA-style widgets and P&amp;amp;ID mimics&lt;/li&gt;
&lt;li&gt;threshold and event rules with email, webhook and MQTT actions&lt;/li&gt;
&lt;li&gt;gateway-local macros that keep running when the internet doesn't&lt;/li&gt;
&lt;li&gt;uptime history with probe and heartbeat monitors&lt;/li&gt;
&lt;li&gt;a white-label portal for installers who run fleets for several customers&lt;/li&gt;
&lt;li&gt;an MCP connection, so an AI assistant can set up devices and dashboards on your behalf&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The free &lt;a href="https://synacl.com/tools/" rel="noopener noreferrer"&gt;browser tools&lt;/a&gt; (a Modbus RTU tester, a CRC calculator, a register decoder, a slave simulator and a serial monitor) need no account at all.&lt;/p&gt;

&lt;p&gt;Pricing is per plan by device count, with no per-message or per-data-point billing. The first five devices are free, commercial use included, and the paid tiers are on the &lt;a href="https://synacl.com/plans/" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt;. It's a hosted service, billed in USD.&lt;/p&gt;

&lt;p&gt;Where Synacl isn't the right pick:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you must self-host&lt;/li&gt;
&lt;li&gt;you need a general-purpose workflow engine to build custom applications&lt;/li&gt;
&lt;li&gt;you're past several thousand devices and need an enterprise SLA&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For those, self-managed ThingsBoard, the DIY stack or the cloud building blocks will serve you better. We'd rather you pick the right tool than pick ours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is there a free alternative to ThingsBoard?&lt;/strong&gt; Several. Self-managed ThingsBoard is itself free for commercial use up to 100 devices on one server. Among hosted platforms, ThingsBoard Cloud, Blynk, Datacake, TagoIO and Synacl all have free tiers of about five devices. ThingSpeak, Ubidots STEM and Arduino Cloud have free tiers too, but those are for non-commercial or personal use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the best open-source ThingsBoard alternative?&lt;/strong&gt; For a full platform, Thinger.io, whose client libraries are open source and which offers private on-premise instances. For maximum flexibility, Node-RED with InfluxDB and Grafana. Neither has ThingsBoard's depth of rule engine, and both need someone to run them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ThingsBoard vs ThingSpeak — which should I use?&lt;/strong&gt; They solve different problems. ThingSpeak is a data-logging and MATLAB-analysis service for research and teaching, and its free tier is non-commercial. ThingsBoard is a device-management and dashboard platform for running a fleet. For monitoring equipment you're responsible for, pick a fleet platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which platform reads Modbus without writing firmware?&lt;/strong&gt; ThingsBoard, through its IoT Gateway (configured by file or UI). Node-RED, through its Modbus nodes. Synacl, through its browser-flashed ESP32 gateway configured in the web app. The other hosted platforms expect you to bring a gateway or firmware that already publishes the values.&lt;/p&gt;

&lt;p&gt;If you want to see the gateway path end to end, the &lt;a href="https://synacl.com/guides/esp32-modbus-rtu-cloud-dashboard/" rel="noopener noreferrer"&gt;ESP32 Modbus RTU to a cloud dashboard&lt;/a&gt; guide walks through a real RS485 sensor from wiring to alert in about fifteen minutes. If you're weighing the wiring first, &lt;a href="https://synacl.com/guides/modbus-rtu-vs-modbus-tcp/" rel="noopener noreferrer"&gt;Modbus RTU vs Modbus TCP&lt;/a&gt; covers that decision.&lt;/p&gt;

</description>
      <category>iot</category>
      <category>thingsboard</category>
      <category>esp32</category>
      <category>modbus</category>
    </item>
    <item>
      <title>Most of the AI traffic in our logs was fake. So we had to build a system to tell it apart</title>
      <dc:creator>Synacl Labs</dc:creator>
      <pubDate>Fri, 23 Oct 2026 17:41:02 +0000</pubDate>
      <link>https://dev.to/synacl-labs/most-of-the-ai-traffic-in-our-logs-was-fake-so-we-had-to-build-a-system-to-tell-it-apart-29pe</link>
      <guid>https://dev.to/synacl-labs/most-of-the-ai-traffic-in-our-logs-was-fake-so-we-had-to-build-a-system-to-tell-it-apart-29pe</guid>
      <description>&lt;p&gt;Every Monday we asked three things about one small site: who read it last week, was that good, and what should we write next. Then we added the question everyone with a content site is asking now: are AI assistants reading us?&lt;/p&gt;

&lt;p&gt;Counting user-agents said yes, plenty. Then we checked who was behind them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scanners wear AI user-agents.&lt;/strong&gt; In 30 days of our nginx log, 217 of the 221 ChatGPT-User requests from outside OpenAI's published IP list came from addresses that also probed for scanner paths like &lt;code&gt;/.env&lt;/code&gt; and &lt;code&gt;wp-login.php&lt;/code&gt;. Every request claiming to be DeepSeekBot, CCBot, Grok, Perplexity-User or Claude-SearchBot was fake.&lt;/p&gt;

&lt;p&gt;OpenAI, Anthropic, Perplexity, Apple, Google and Bing all publish the IP ranges their crawlers use. A request that claims to be one of their agents from outside that list is not theirs:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npx siteread check 203.0.113.9 "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot"
spoofed   203.0.113.9 claims chatgpt-user (chatgpt, answer) but is not in openai.com/chatgpt-user.json (234 prefixes)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The rule of thumb that called a real ClaudeBot fake.&lt;/strong&gt; Before using the lists, our test was "an IP that ever hit a scanner path is a scanner." Then ClaudeBot followed a GitHub README's relative links onto our domain, asked for a path that does not exist, drew one 444, and all 50 of its reads that day were counted as spoofed. Every real ClaudeBot IP was in Anthropic's published list. So siteread has one rule: where a vendor list exists, the list decides.&lt;/p&gt;

&lt;p&gt;Two more from the log: Claude Code's WebFetch sends &lt;code&gt;Claude-User (claude-code/…)&lt;/code&gt; from the user's own machine, so no list can cover it; and Google-Extended is a robots.txt token, never a real user-agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From a checker to a weekly read.&lt;/strong&gt; &lt;code&gt;siteread digest&lt;/code&gt; turns a Search Console export and your access logs into one JSON document: Search Console weeks with impression-weighted position, people by where their first visit came from, every crawler verified against its vendor's list, and goals you name. The &lt;code&gt;seo-read&lt;/code&gt; skill for Claude Code writes that up as a dated weekly memo with two to four things to do next.&lt;/p&gt;

&lt;p&gt;It runs on your machine, Node 20+, zero dependencies. No hostnames, URLs or visitor IPs leave it. The optional &lt;code&gt;siteread share&lt;/code&gt; sends one week of totals to a public benchmark, prints every byte first, and sends nothing without a yes.&lt;/p&gt;

&lt;p&gt;Try it:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx siteread check &amp;lt;ip&amp;gt; "&amp;lt;user-agent&amp;gt;"
npx siteread digest --gsc export.zip --log access.log --out .siteread/digests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The full story, the benchmark and the docs: &lt;a href="https://siteread.dev/blog/introducing-siteread" rel="noopener noreferrer"&gt;https://siteread.dev/blog/introducing-siteread&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MIT licensed, source at &lt;a href="https://github.com/synacl-iot/siteread" rel="noopener noreferrer"&gt;https://github.com/synacl-iot/siteread&lt;/a&gt;. A log line it gets wrong is the most useful issue you can send.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>ai</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Program an ESP32 without writing code or installing any tools: a browser flash, Claude, and a macro that runs on the board</title>
      <dc:creator>Synacl Labs</dc:creator>
      <pubDate>Mon, 21 Sep 2026 12:30:21 +0000</pubDate>
      <link>https://dev.to/synacl-labs/program-an-esp32-without-writing-code-or-installing-any-tools-a-browser-flash-claude-and-a-macro-58i5</link>
      <guid>https://dev.to/synacl-labs/program-an-esp32-without-writing-code-or-installing-any-tools-a-browser-flash-claude-and-a-macro-58i5</guid>
      <description>&lt;p&gt;&lt;em&gt;By the Synacl team. Originally published at &lt;a href="https://synacl.com/guides/program-esp32-without-writing-code/" rel="noopener noreferrer"&gt;synacl.com&lt;/a&gt;, where the walkthrough is interactive.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You can get an ESP32 reading a light sensor and pulsing a relay without opening an IDE, writing a sketch, or compiling anything. The board is flashed from a browser tab, it joins your Wi-Fi over the same USB cable, and the automation is written by Claude from a sentence you type — as a &lt;strong&gt;macro&lt;/strong&gt; that runs on the ESP32 itself. You read what it wrote and decide whether it may run. This guide walks the whole path on a bare dev board, using the board's own LED as the "relay" so there is nothing to wire up before you try it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Flash the gateway firmware from the browser&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxif9vy7hi472lnlrh8mb.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxif9vy7hi472lnlrh8mb.webp" alt="The Synacl web flasher after writing the gateway firmware: the log reads Flash complete and the panel below says the board is waiting to be provisioned." width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;synacl.com/flash — pick “Synacl gateway firmware”, click Connect, choose the USB port, Flash. About 25 seconds at 460800 baud; no toolchain, no account yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Register the gateway and send it Wi-Fi over the same cable&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ezuoox6iu6q95iasxv6.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ezuoox6iu6q95iasxv6.webp" alt="The Add gateway page, step 3, with the Wi-Fi form filled in and the Send Wi-Fi &amp;amp; Connect button highlighted." width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gateways → Add gateway. Skip the flash step, give the gateway a name, then type your Wi-Fi network and password: the app sends them over USB, no captive portal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The board comes online&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwjrjk7c0irtzjqqhjn1j.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwjrjk7c0irtzjqqhjn1j.webp" alt="The Gateways list with the new gateway marked online, firmware 1.5.1." width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Within about 90 seconds the gateway shows online with its firmware version. Nothing is wired to it yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Add Synacl to Claude as a connector&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqkymnayisl5qffnekj0k.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqkymnayisl5qffnekj0k.webp" alt="The claude.ai custom connector dialog with the Synacl MCP endpoint URL entered." width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In claude.ai, add a custom connector with the URL &lt;a href="https://api.synacl.com/mcp" rel="noopener noreferrer"&gt;https://api.synacl.com/mcp&lt;/a&gt;. That is the whole setup on the Claude side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Approve what Claude may do — note what is not pre-ticked&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmmg5l3wrmmtj6d3aj4cj.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmmg5l3wrmmtj6d3aj4cj.webp" alt="The Synacl authorization screen listing the permissions Claude asked for, with Run macros unticked and flagged as off by default." width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Synacl's consent screen lists every permission. “Run macros” arrives unticked and says “Off by default — can move equipment”; everything else is pre-selected, and you can grant less than asked. Tick it for this walkthrough — step 8 shows it is not enough on its own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Describe the automation in one sentence&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F13q940cr9fm8mfgbm3b3.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F13q940cr9fm8mfgbm3b3.webp" alt="A claude.ai conversation: the one-sentence request, then Claude reporting the relay device and the Blink macro it created through Synacl, and that the gateway config still needs a resend." width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“This gateway has a relay on GPIO 2. Set it up as a device, then write a macro called Blink that switches it on and off five times, half a second each.” Claude creates the device and the macro, compiles and pushes it, and tells you the config resend that puts them on the board is your click.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. The macro Claude wrote, in your app&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9ji9x6beol7pr22tgvbp.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9ji9x6beol7pr22tgvbp.webp" alt="The Synacl Macros page with the Blink macro card and its Run button." width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Macros shows Blink on your gateway with its five steps: a repeat of five around relay on, wait half a second, relay off, wait again — and Claude's own one-line description. Read it before anything runs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Ask Claude to run it — and it is refused&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0jbgbql71x5wj4rquui5.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0jbgbql71x5wj4rquui5.webp" alt="Claude declining to run the Blink macro because nobody has marked it agent-runnable in the Synacl app." width="799" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Asked to run Blink, Claude reads the macro first: “agentRunnable: false on Blink. My connection holds macro:run, but that permission only applies to macros a person has explicitly marked agent-runnable in the web app. That flag is deliberately not something I can set myself.” It holds the Run macros permission and still cannot start it — two keys, and software only ever holds one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. You read it, you allow it&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi1tdhx0c8zhgk76nrcvu.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi1tdhx0c8zhgk76nrcvu.webp" alt="The macro editor's AI agents section with Let an AI agent run this macro ticked and the equipment warning shown." width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Edit the macro and tick “Let an AI agent run this macro”. It is off on every macro by default, and no assistant can set it, not even on macros it wrote.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. Now it runs — on the board, acknowledged by the board&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi1jwk9nk90cfqhvh94vd.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi1jwk9nk90cfqhvh94vd.webp" alt="The Macros page with the Blink macro's status badge showing done after the gateway ran it." width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ask again. The gateway confirms the run started, the status goes requested → started → done, and the output pin toggles five times. Claude reports what the gateway acknowledged, not what it sent.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/r56ntpxUEQI" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;An ESP32 dev board and a USB data cable.&lt;/strong&gt; Any classic ESP32 works with the Synacl firmware; the board in the pictures is a plain ESP32-WROOM module with the usual blue LED on &lt;strong&gt;GPIO 2&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chrome or Edge on a desktop.&lt;/strong&gt; Browser flashing and USB provisioning use the Web Serial API, which Firefox and Safari do not have.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A free Synacl account&lt;/strong&gt; — the first five devices cost nothing. Create it after the flash; the flasher works without one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude, with a plan that supports custom connectors.&lt;/strong&gt; The connection is a standard remote MCP server, so any assistant that speaks MCP works the same way; the screens here are claude.ai.&lt;/li&gt;
&lt;li&gt;For the last section: a &lt;strong&gt;BH1750&lt;/strong&gt; light sensor — the common GY-302 breakout — on the I²C pins: 3.3 V, GND, SDA to GPIO 21, SCL to GPIO 22, ADDR left low for address 0x23. Any I²C sensor with a datasheet works the same way. A &lt;strong&gt;relay module&lt;/strong&gt; is only needed if you want to switch something real instead of watching the LED.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The whole thing takes about fifteen minutes, most of it waiting for the board to reboot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1 — Flash the gateway firmware from the browser
&lt;/h2&gt;

&lt;p&gt;Open &lt;a href="https://synacl.com/flash/" rel="noopener noreferrer"&gt;synacl.com/flash&lt;/a&gt;, plug the board in, and choose &lt;strong&gt;Synacl gateway firmware&lt;/strong&gt;. The page fetches the current stable build and shows its version. Click &lt;strong&gt;Connect&lt;/strong&gt;, pick the board's serial port in the browser's chooser, then &lt;strong&gt;Flash&lt;/strong&gt;. At the default 460800 baud the four images take about 25 seconds; the log ends with "Flash complete" and the board restarts on its own. Leave &lt;strong&gt;Erase entire flash&lt;/strong&gt; off — you do not need it on a fresh board, and on a board that was already a Synacl gateway it would wipe the saved Wi-Fi and account settings.&lt;/p&gt;

&lt;p&gt;No port in the chooser usually means a charge-only cable; a failed first handshake means holding BOOT while you click Connect. The &lt;a href="https://synacl.com/help/flash-esp32" rel="noopener noreferrer"&gt;flashing article&lt;/a&gt; covers the rest.&lt;/p&gt;

&lt;p&gt;What you have now is a gateway waiting for two things: a Wi-Fi network and an account to belong to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 — Register it and send Wi-Fi over the same cable
&lt;/h2&gt;

&lt;p&gt;Create your account, then open &lt;strong&gt;Gateways → Add gateway&lt;/strong&gt;. The page has three steps and you have already done the first, so skip the flash section, give the gateway a name in step 2 and register it, then in step 3 type your Wi-Fi network and password and press &lt;strong&gt;Send Wi-Fi &amp;amp; Connect&lt;/strong&gt;. The app sends the credentials and the gateway's account key over USB — no captive portal, no hotspot to find (the board does offer a &lt;code&gt;Synacl-Gateway&lt;/code&gt; fallback portal for provisioning without a computer).&lt;/p&gt;

&lt;p&gt;Back on the Gateways page the new gateway shows &lt;strong&gt;online&lt;/strong&gt; within about ninety seconds, firmware version beside it. Nothing is wired to it yet; the next steps add the devices in software, and a pin does not care what is attached until something runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 — Connect Claude
&lt;/h2&gt;

&lt;p&gt;In claude.ai, add a &lt;strong&gt;custom connector&lt;/strong&gt; and give it the Synacl MCP endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://api.synacl.com/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first time Claude uses it, your browser opens Synacl's authorization screen. Read it: it lists every permission Claude asked for under &lt;strong&gt;"It will be able to"&lt;/strong&gt;, and you can untick anything you would rather not hand over. Almost everything is pre-selected — creating devices, editing tags, writing macros — because none of that moves anything. One line is different. &lt;strong&gt;Run macros&lt;/strong&gt; arrives &lt;strong&gt;unticked&lt;/strong&gt; and is labelled &lt;em&gt;"Off by default — can move equipment"&lt;/em&gt;. Tick it — and keep step 5 in mind, where you will see that this permission on its own is not enough to run anything. Approve, and Claude is connected to your account and only your account. You can revoke the connection at any time from &lt;strong&gt;Settings → API &amp;amp; Agents&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Everything Claude does from here goes through that connection, with the permissions you ticked and no others — the &lt;a href="https://synacl.com/help/connect-an-ai-agent" rel="noopener noreferrer"&gt;AI agent article&lt;/a&gt; has the full list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4 — Say what the board should do
&lt;/h2&gt;

&lt;p&gt;Now the sentence. In a new chat, with the connector enabled:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This gateway has a relay on GPIO 2. Set it up as a device, then write a macro called &lt;strong&gt;Blink&lt;/strong&gt; that switches it on and off five times, half a second each, so I can see it work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Say where things are wired: Claude will not guess a pin, because this connection cannot delete a device and a free account has five device slots, so a wrong guess would cost you one — it asks instead. Given the pin, it looks up your gateway, creates the device — a &lt;strong&gt;GPIO digital output&lt;/strong&gt; on GPIO 2, active-high, off by default — and writes the macro.&lt;/p&gt;

&lt;p&gt;One click stays yours. A new device only reaches the board when the gateway's config is resent, and a resend reboots the gateway, so Claude reports it as &lt;em&gt;pending&lt;/em&gt; instead of doing it. Open the gateway from its card (&lt;strong&gt;Info&lt;/strong&gt;) and press &lt;strong&gt;Resend config&lt;/strong&gt;; about thirty seconds later the board is back, now owning the relay pin. A Synacl macro is a short program made of blocks: things like &lt;em&gt;switch this output&lt;/em&gt;, &lt;em&gt;wait&lt;/em&gt;, &lt;em&gt;repeat&lt;/em&gt;, &lt;em&gt;read a tag&lt;/em&gt;, &lt;em&gt;if&lt;/em&gt;. For Blink, Claude produces a &lt;code&gt;repeat&lt;/code&gt; of five with four blocks inside it: output on, wait 500 ms, output off, wait 500 ms. If it gets something wrong the platform tells it exactly which block did not compile, and it fixes it; you see none of that unless you want to.&lt;/p&gt;

&lt;p&gt;Open &lt;strong&gt;Macros&lt;/strong&gt; in your app and there it is: &lt;em&gt;Blink · your gateway · 5 steps&lt;/em&gt;, with a &lt;strong&gt;Run&lt;/strong&gt; button. Click into it and read the steps — the part most "AI does your hardware" demos skip. An assistant that has never seen your rig gets the shape right and the specifics plausibly wrong — a pin, a duration — and plausible-and-wrong is exactly what you want to catch while the board is doing nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5 — Review it, then let it run
&lt;/h2&gt;

&lt;p&gt;Ask Claude to run Blink. It won't. In our run it read the macro first, saw &lt;code&gt;agentRunnable: false&lt;/code&gt;, and said so rather than calling the tool; had it called anyway, the platform's answer is worth quoting, because it is the whole design in five lines:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Macro "Blink" is not marked as agent-runnable, so this connection may not start it. That is a deliberate per-macro setting, separate from the permissions on this token: someone has to read the sequence and allow an agent to run it, in the Synacl app. Ask the user to do that if they want it. Do not look for another way to run it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Running a macro needs &lt;strong&gt;two separate keys&lt;/strong&gt;, and software can only ever hold one of them. The first is the &lt;strong&gt;Run macros&lt;/strong&gt; permission on Claude's connection — the one that arrived unticked and that you ticked in step 3. Claude holds it, and it is still refused. The second lives on the macro itself: in the editor, below the triggers, a box labelled &lt;strong&gt;"Let an AI agent run this macro"&lt;/strong&gt;. It is off on every macro, including the ones an assistant wrote, and no assistant can tick it — the platform drops the field from any request that comes over the agent connection. A permission says which &lt;em&gt;software&lt;/em&gt; may act; it cannot tell you whether &lt;em&gt;this sequence&lt;/em&gt; is safe. So the platform asks you about the sequence, one at a time.&lt;/p&gt;

&lt;p&gt;You have read Blink. Tick the box, save, and ask again.&lt;/p&gt;

&lt;p&gt;This time the gateway acknowledges the run, and Claude tells you so: not "I sent it" but "the gateway confirmed it started". The card in Macros steps through &lt;em&gt;requested → started → done&lt;/em&gt;, and the blue LED on GPIO 2 flashes five times. That was your relay. Swap the pin for the one your relay module is on and the same macro drives the coil.&lt;/p&gt;

&lt;p&gt;Two honest notes. Claude waits a few seconds for the gateway's acknowledgement and reports &lt;strong&gt;unknown&lt;/strong&gt; if it never comes — never &lt;em&gt;done&lt;/em&gt;. And the run happened &lt;strong&gt;on the ESP32&lt;/strong&gt;: the board timed the half-seconds itself and would have finished them with the Wi-Fi pulled — which is also why &lt;strong&gt;Abort&lt;/strong&gt; is a network message, not an emergency stop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6 — Make it react to the light
&lt;/h2&gt;

&lt;p&gt;Wire the BH1750 — 3.3 V, GND, SDA to GPIO 21, SCL to GPIO 22, ADDR to GND — then tell Claude about it and change the macro rather than writing a second one:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;There is a BH1750 light sensor on I²C — SDA on GPIO 21, SCL on GPIO 22, address 0x23. Add it as a device, then change Blink so it first reads the light level and only pulses the relay for two seconds if it is darker than 20 lux. Rename it to &lt;strong&gt;Dark relay&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The sensor becomes an &lt;strong&gt;I²C&lt;/strong&gt; device on those pins with a &lt;em&gt;generic&lt;/em&gt; tag at address 0x23 — the BH1750 has no built-in driver, so Claude fills in the datasheet numbers: write 0x10 once to start continuous measurement, read two bytes, most-significant first, divide by 1.2 for lux. The &lt;a href="https://synacl.com/help/connect-i2c-device" rel="noopener noreferrer"&gt;I²C article&lt;/a&gt; lists those fields if you want to check them. Resend the config once more, and within a poll or two the lux tag is live; cover the sensor with your hand and watch the number fall. Then Claude rewrites the same macro: a &lt;code&gt;read_tag&lt;/code&gt; block that puts the lux reading in a variable, an &lt;code&gt;if&lt;/code&gt; on that variable, and the pulse inside it. Read it again — a changed macro is a new sequence, and the agent-runnable tick you gave Blink still stands, so this is your moment to check the threshold and the pin before anything moves. Then cover the sensor and ask Claude to run it: the LED pulses. Uncover it and run again: nothing happens, and the run still finishes cleanly — the macro read the sensor, decided, and stopped.&lt;/p&gt;

&lt;p&gt;That last run is the thing a lot of people expect the platform to do differently, and it deliberately does not: &lt;strong&gt;a macro runs once per trigger.&lt;/strong&gt; Dark relay reads the sensor one time, decides, and stops. It does not sit there watching the light. To make it a night-light that switches itself you give it a &lt;strong&gt;schedule&lt;/strong&gt; — in the macro editor, &lt;em&gt;every 30 seconds&lt;/em&gt; — or fire it from an &lt;strong&gt;alert rule&lt;/strong&gt; on the lux tag. Either one takes you a minute in the app. Claude cannot do it. An assistant can write and edit macros, but it cannot put one on a schedule, wire it to a device event, or re-enable a disabled one; unattended runs are set up by a person, whatever permissions the assistant holds. A sequence that fires at three in the morning with nobody in the room stays your decision.&lt;/p&gt;

&lt;p&gt;Once scheduled, the whole loop — read, compare, switch — runs on the board every thirty seconds whether or not the cloud can reach it, and every run is bounded by the gateway's own ten-minute ceiling.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Claude cannot do, and why
&lt;/h2&gt;

&lt;p&gt;It is one rule, drawn in one place: an assistant may &lt;strong&gt;author&lt;/strong&gt;, a person must &lt;strong&gt;allow&lt;/strong&gt;. Over this connection an assistant cannot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Delete&lt;/strong&gt; anything — devices, gateways, dashboards, rules or macros. It can create a duplicate; it cannot remove your data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Send a raw command&lt;/strong&gt; to a pin, coil or register. Anything that moves does so by running a macro you can read.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arm&lt;/strong&gt; a macro: no schedules, no device-event triggers, no re-enabling a disabled one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mark its own work runnable.&lt;/strong&gt; The agent-runnable tick is set by a person, in the app, per macro.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hold more than you ticked.&lt;/strong&gt; Every refusal names the permission it lacks, so you can decide, not guess.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your plan's macro allowance and the size of a macro are listed on &lt;a href="https://synacl.com/plans/" rel="noopener noreferrer"&gt;the plans page&lt;/a&gt;; the free tier is enough for everything in this guide.&lt;/p&gt;

&lt;p&gt;Said plainly: &lt;strong&gt;none of this is a safety function.&lt;/strong&gt; The bounds are real — one gateway, one run at a time, ten minutes, an abort button — but they bound a mistake; they do not make a machine safe. Abort is a message over the network and cannot reach a gateway that is offline. Synacl is not safety-rated. If the thing on the other side of the relay can hurt someone or wreck something, the protection has to be physical and independent of the platform: a hardwired emergency stop in the power path, not routed through the ESP32; interlocks; a properly rated relay; an actuator whose worst case is survivable. Grant &lt;strong&gt;Run macros&lt;/strong&gt; for the things you would be comfortable letting a colleague start from the next room.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to go next
&lt;/h2&gt;

&lt;p&gt;The same three pieces — a browser flash, an assistant over MCP, macros on the board — scale from a blinking LED to a Modbus meter and a pump. For the industrial version of this walk — an RS485 sensor on the same gateway, readings on a dashboard with an alert — read &lt;a href="https://synacl.com/guides/esp32-modbus-rtu-cloud-dashboard/" rel="noopener noreferrer"&gt;ESP32 Modbus RTU to a cloud dashboard in 15 minutes&lt;/a&gt;. The &lt;a href="https://synacl.com/help/macro-examples-basics" rel="noopener noreferrer"&gt;macro recipes&lt;/a&gt; show what the blocks can do by hand, and the &lt;a href="https://synacl.com/help/macros" rel="noopener noreferrer"&gt;Macros article&lt;/a&gt; has the limits and the safety notes in one place.&lt;/p&gt;

</description>
      <category>esp32</category>
      <category>iot</category>
      <category>nocode</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
