[{"data":1,"prerenderedAt":4540},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fflowfuse-nodes\u002Fhub\u002Fkafka\u002F":3,"featureCatalog":3075,"docs-nav":3480},{"id":4,"title":5,"body":6,"description":16,"editUrl":3065,"extension":3066,"layout":3067,"meta":3068,"metaTitle":5,"navGroup":3067,"navGroupOrder":3067,"navOrder":2491,"navTitle":5,"navigation":3069,"originalPath":3067,"path":3070,"redirect":3067,"seo":3071,"stem":3072,"updated":3073,"version":3067,"__hash__":3074},"docs\u002Fdocs\u002Fflowfuse-nodes\u002Fhub\u002Fkafka.md","Kafka",{"type":7,"value":8,"toc":3020},"minimark",[9,13,17,22,36,41,84,87,96,100,137,141,144,147,199,203,340,343,350,354,361,368,411,417,421,521,527,533,537,540,551,586,594,598,601,711,721,731,735,744,988,993,1007,1010,1020,1085,1094,1099,1106,1109,1114,1208,1218,1231,1235,1238,1270,1273,1286,1319,1323,1332,1338,1382,1396,1400,1409,1450,1457,1464,1467,1542,1546,1549,1600,1609,1613,1734,1744,1748,1751,1780,1786,1790,1798,1801,1815,1818,1824,1827,1965,1968,1980,1984,1987,1991,1996,2001,2005,2041,2050,2060,2064,2076,2084,2088,2091,2107,2113,2126,2144,2148,2154,2238,2242,2247,2389,2393,2405,2472,2479,2596,2606,2616,2630,2634,2640,2652,2659,2662,2666,2676,2679,2698,2756,2760,2765,2818,2825,2850,2855,2919,2925,2929,2938,2944,2947,2953,2956,2984,2990,3005,3016],[10,11,5],"h1",{"id":12},"kafka",[14,15,16],"p",{},"A FlowFuse-certified package that lets you connect to Apache Kafka, send and receive messages, run consumer groups, commit or roll back messages by hand, manage topics, and read offsets from your flows.",[18,19,21],"h2",{"id":20},"get-the-certified-node-in-flowfuse","Get the Certified Node in FlowFuse",[14,23,24,25,29,30,35],{},"The Kafka package is part of the FlowFuse Hub Certified Nodes catalogue, which is part of the ",[26,27,28],"strong",{},"FlowFuse Hub"," offering. Please contact our sales team at ",[31,32,34],"a",{"href":33},"\u002Fcontact-us\u002F","Contact us"," to learn more or to request access.",[37,38,40],"h3",{"id":39},"installation-steps","Installation steps",[42,43,44,48,51,58,65,72,79],"ol",{},[45,46,47],"li",{},"Open your instance in the FlowFuse editor.",[45,49,50],{},"Click the menu icon (☰) in the top-right corner.",[45,52,53,54,57],{},"Select ",[26,55,56],{},"Manage palette",".",[45,59,60,61,64],{},"Go to the ",[26,62,63],{},"Install"," tab.",[45,66,67,68,71],{},"Switch to the ",[26,69,70],{},"FlowFuse Hub Certified Nodes"," category.",[45,73,74,75,57],{},"Search for ",[76,77,78],"code",{},"@flowfuse-certified-nodes\u002Fkafka",[45,80,81,82,57],{},"Click ",[26,83,63],{},[14,85,86],{},"The Kafka nodes then appear in your palette, ready to drag onto the canvas.",[88,89,90],"blockquote",{},[14,91,92,95],{},[26,93,94],{},"Note:"," Newly installed nodes are picked up automatically, no restart needed. Restart is only required when you update a node that's already installed: restart any remote instance or hosted instance running the previous version.",[18,97,99],{"id":98},"features","Features",[101,102,103,106,109,112,115,118,128,131,134],"ul",{},[45,104,105],{},"Send messages to any topic, and set the key, partition, and compression",[45,107,108],{},"Read from several topics at once, each with its own starting offset and partition",[45,110,111],{},"Match topics by pattern, so new topics are picked up without a redeploy",[45,113,114],{},"Consumer groups, so several consumers can share the work",[45,116,117],{},"Commit and roll back by hand, instead of letting Kafka mark messages as done straight away",[45,119,120,121,124,125,127],{},"Convert ",[76,122,123],{},"\u002F"," to ",[76,126,57],{}," in topic names, so MQTT-style topics work with Kafka",[45,129,130],{},"Manage topics from a flow: create, delete, and add partitions",[45,132,133],{},"Read offsets, so you can measure how far behind a consumer is",[45,135,136],{},"TLS, including self-signed certificates, and SASL PLAIN username and password authentication",[18,138,140],{"id":139},"use-case","Use case",[14,142,143],{},"Kafka stores messages instead of just passing them on. MQTT sends a message and forgets it. Kafka keeps it for a set period, so a system that was offline can catch up later, and a new consumer can read messages that arrived before it started.",[14,145,146],{},"That makes it a good fit for these jobs:",[101,148,149,159,169,175,185],{},[45,150,151,154,155,158],{},[26,152,153],{},"Send production data to IT systems."," Write each reading to a topic with ",[26,156,157],{},"Kafka Producer",". An ERP, MES, or data lake reads that topic in its own time. It never connects to your Node-RED instance directly.",[45,160,161,164,165,168],{},[26,162,163],{},"Feed several systems from one topic."," Point more than one ",[26,166,167],{},"Kafka Consumer"," at the same topic. Each one gets every message, and each one keeps its own place in the topic. A dashboard, an alert flow, and a historian can all read the same data without getting in each other's way.",[45,170,171,174],{},[26,172,173],{},"Ride out an outage."," If a system downstream goes down, messages build up in the topic instead of being lost. You can also start a consumer at an older offset to read a shift's data again after fixing a bug.",[45,176,177,180,181,184],{},[26,178,179],{},"Handle more messages."," Use ",[26,182,183],{},"Kafka Consumer Group"," when one consumer cannot keep up. Members of a group split the work rather than each doing all of it.",[45,186,187,190,191,194,195,198],{},[26,188,189],{},"Make sure nothing is dropped."," Turn off auto commit and use ",[26,192,193],{},"Kafka Commit"," and ",[26,196,197],{},"Kafka Rollback",". A message is only marked as done once your flow has finished with it, so a failure part-way through does not lose data.",[18,200,202],{"id":201},"nodes-in-this-package","Nodes in this package",[204,205,206,225],"table",{},[207,208,209],"thead",{},[210,211,212,216,219,222],"tr",{},[213,214,215],"th",{},"Node",[213,217,218],{},"Inputs",[213,220,221],{},"Outputs",[213,223,224],{},"Purpose",[226,227,228,244,259,272,285,299,312,326],"tbody",{},[210,229,230,236,239,241],{},[231,232,233],"td",{},[26,234,235],{},"Kafka Broker",[231,237,238],{},"–",[231,240,238],{},[231,242,243],{},"Config node holding the hosts, timeouts, and security details",[210,245,246,250,253,256],{},[231,247,248],{},[26,249,157],{},[231,251,252],{},"1",[231,254,255],{},"0",[231,257,258],{},"Sends a message to a topic",[210,260,261,265,267,269],{},[231,262,263],{},[26,264,167],{},[231,266,255],{},[231,268,252],{},[231,270,271],{},"Reads messages from one or more topics",[210,273,274,278,280,282],{},[231,275,276],{},[26,277,183],{},[231,279,255],{},[231,281,252],{},[231,283,284],{},"Reads messages as part of a group, sharing topics with other members",[210,286,287,291,293,296],{},[231,288,289],{},[26,290,193],{},[231,292,252],{},[231,294,295],{},"2",[231,297,298],{},"Marks a message as done, when auto commit is off",[210,300,301,305,307,309],{},[231,302,303],{},[26,304,197],{},[231,306,252],{},[231,308,295],{},[231,310,311],{},"Leaves a message uncommitted and closes the consumer",[210,313,314,319,321,323],{},[231,315,316],{},[26,317,318],{},"Kafka Admin",[231,320,252],{},[231,322,295],{},[231,324,325],{},"Runs admin commands, such as creating topics or listing groups",[210,327,328,333,335,337],{},[231,329,330],{},[26,331,332],{},"Kafka Offset",[231,334,252],{},[231,336,295],{},[231,338,339],{},"Reads offset details for a topic or a consumer group",[14,341,342],{},"Where a node has two outputs, the first fires on success and the second on failure. Wire the second one up so errors don't disappear.",[14,344,345,346,349],{},"Every node has a ",[26,347,348],{},"Name"," field, which only changes the label shown on the canvas.",[18,351,353],{"id":352},"set-up-the-connection-kafka-broker","Set up the connection (Kafka Broker)",[14,355,356,357,360],{},"Create ",[26,358,359],{},"one Kafka Broker config node for each Kafka cluster",", then point your other nodes at it. You only enter the connection details once, and the nodes that use it share a single connection to the cluster.",[14,362,363,364,367],{},"Five nodes have a ",[26,365,366],{},"Broker"," field: Kafka Producer, Kafka Consumer, Kafka Consumer Group, Kafka Admin, and Kafka Offset. Kafka Commit and Kafka Rollback do not, because they work out which connection to use from the message they receive.",[42,369,370,373,382,391,402],{},[45,371,372],{},"Drag one of those five nodes onto the canvas and open it",[45,374,375,376,379,380],{},"Click the ",[26,377,378],{},"+"," button next to ",[26,381,366],{},[45,383,384,385,387,388],{},"Give the connection a ",[26,386,348],{},", such as ",[76,389,390],{},"Production Kafka",[45,392,393,394,397,398,401],{},"Fill in the ",[26,395,396],{},"Connection"," tab, then the ",[26,399,400],{},"Options"," tab if you need to",[45,403,81,404,407,408],{},[26,405,406],{},"Add",", then ",[26,409,410],{},"Done",[14,412,413,414,416],{},"Once the connection exists, the other nodes pick it from their own ",[26,415,366],{}," dropdown. Use the pencil button beside that dropdown to edit it later.",[37,418,420],{"id":419},"connection-tab","Connection tab",[204,422,423,433],{},[207,424,425],{},[210,426,427,430],{},[213,428,429],{},"Field",[213,431,432],{},"What it does",[226,434,435,455,465,475,485,495,509],{},[210,436,437,442],{},[231,438,439],{},[26,440,441],{},"Hosts",[231,443,444,445,448,449,451,452],{},"A table of brokers to start from. Click ",[26,446,447],{},"+Add"," for each one and fill in its ",[26,450,348],{}," (hostname or IP) and ",[26,453,454],{},"Port",[210,456,457,462],{},[231,458,459],{},[26,460,461],{},"Hosts process.env name",[231,463,464],{},"The name of an environment variable holding the host list, used instead of the table. See below",[210,466,467,472],{},[231,468,469],{},[26,470,471],{},"Use TLS",[231,473,474],{},"Tick this if your cluster requires TLS",[210,476,477,482],{},[231,478,479],{},[26,480,481],{},"Self Sign",[231,483,484],{},"Accepts a self-signed certificate. Useful in test environments, and best avoided in production",[210,486,487,492],{},[231,488,489],{},[26,490,491],{},"Use Credentials (SASL plain)",[231,493,494],{},"Tick this to authenticate with a username and password",[210,496,497,502],{},[231,498,499],{},[26,500,501],{},"User",[231,503,504,505,508],{},"Username, used when ",[26,506,507],{},"Use Credentials"," is ticked",[210,510,511,516],{},[231,512,513],{},[26,514,515],{},"Password",[231,517,518,519,508],{},"Password, used when ",[26,520,507],{},[14,522,523,524,526],{},"Authentication here is SASL PLAIN only, so the username and password travel in the clear unless you also turn on ",[26,525,471],{},". Tick both together on anything but a local test cluster.",[14,528,529,530,532],{},"You only need one or two entries in ",[26,531,441],{},". Kafka uses them to find the cluster, then learns about the remaining brokers on its own, so there is no need to list every broker you run.",[37,534,536],{"id":535},"keeping-hosts-out-of-your-flows","Keeping hosts out of your flows",[14,538,539],{},"Typing hostnames straight into the table works, but it ties the flow to one cluster. If the same flow runs against test and production, keep the hosts in an instance environment variable instead.",[14,541,542,543,545,546,550],{},"The ",[26,544,461],{}," field takes the ",[547,548,549],"em",{},"name"," of the variable, not its value:",[42,552,553,574,577],{},[45,554,555,556,559,560,563,564],{},"Go to ",[26,557,558],{},"Instance Settings → Environment"," and add a variable, for example ",[76,561,562],{},"KAFKA_HOSTS",". Its value is the host list as JSON:",[565,566,572],"pre",{"className":567,"code":569,"language":570,"meta":571},[568],"language-text","[{\"host\":\"kafka-1.example.com\",\"port\":9092}]\n","text","",[76,573,569],{"__ignoreMap":571},[45,575,576],{},"Restart the instance so Node-RED picks up the variable.",[45,578,579,580,582,583,585],{},"In the Kafka Broker config node, put ",[76,581,562],{}," in the ",[26,584,461],{}," field.",[14,587,588,589,593],{},"Each environment can now point at its own cluster, and the flow stays the same. See ",[31,590,592],{"href":591},"\u002Fblog\u002F2023\u002F01\u002Fenvironment-variables-in-node-red\u002F","Using environment variables in Node-RED"," for more on environment variables.",[37,595,597],{"id":596},"options-tab","Options tab",[14,599,600],{},"These control the connection itself rather than anything about your messages. The defaults are sensible, so most people never touch this tab.",[204,602,603,616],{},[207,604,605],{},[210,606,607,609,611,614],{},[213,608,429],{},[213,610,400],{},[213,612,613],{},"Default",[213,615,432],{},[226,617,618,633,648,673,688],{},[210,619,620,625,627,630],{},[231,621,622],{},[26,623,624],{},"Connect Timeout (ms)",[231,626],{},[231,628,629],{},"10000",[231,631,632],{},"How long to wait when opening a connection before giving up",[210,634,635,640,642,645],{},[231,636,637],{},[26,638,639],{},"Request Timeout (ms)",[231,641],{},[231,643,644],{},"30000",[231,646,647],{},"How long to wait for a reply from a broker",[210,649,650,655,663,665],{},[231,651,652],{},[26,653,654],{},"Auto Connect",[231,656,657,123,660],{},[76,658,659],{},"True",[76,661,662],{},"False",[231,664,659],{},[231,666,667,669,670,672],{},[76,668,659],{}," connects on deploy. ",[76,671,662],{}," waits until a node actually needs the connection",[210,674,675,680,682,685],{},[231,676,677],{},[26,678,679],{},"Idle Connection (mins)",[231,681],{},[231,683,684],{},"5",[231,686,687],{},"How long a quiet connection is kept open before it is dropped",[210,689,690,695,701,703],{},[231,691,692],{},[26,693,694],{},"Reconnect On Idle",[231,696,697,123,699],{},[76,698,659],{},[76,700,662],{},[231,702,659],{},[231,704,705,707,708,710],{},[76,706,659],{}," reopens the connection after it has been dropped, so a quiet flow keeps working. Set to ",[76,709,662],{}," only if you want the connection to stay closed",[14,712,713,714,194,717,720],{},"On a slow or busy network, raising ",[26,715,716],{},"Connect Timeout",[26,718,719],{},"Request Timeout"," is usually the first thing to try.",[14,722,723,724,194,727,730],{},"The examples on this page use ",[76,725,726],{},"127.0.0.1",[76,728,729],{},"9092"," as stand-ins for a local Kafka broker. Replace them with your own details.",[18,732,734],{"id":733},"send-messages-kafka-producer","Send messages (Kafka Producer)",[14,736,737,739,740,743],{},[26,738,157],{}," sends ",[76,741,742],{},"msg.payload"," to a topic. It has one input and no output.",[204,745,746,758],{},[207,747,748],{},[210,749,750,752,754,756],{},[213,751,429],{},[213,753,400],{},[213,755,613],{},[213,757,432],{},[226,759,760,786,800,817,841,856,876,893,915,934,954,973],{},[210,761,762,767,776,778],{},[231,763,764],{},[26,765,766],{},"Type",[231,768,769,772,773],{},[76,770,771],{},"Producer",", ",[76,774,775],{},"High Level",[231,777,771],{},[231,779,780,782,783,785],{},[76,781,771],{}," writes to the partition you pick. ",[76,784,775],{}," spreads messages across the topic's partitions using round robin instead",[210,787,788,792,795,797],{},[231,789,790],{},[26,791,366],{},[231,793,794],{},"your Kafka Broker configs",[231,796],{},[231,798,799],{},"Which connection to send through",[210,801,802,807,809,811],{},[231,803,804],{},[26,805,806],{},"Topic",[231,808],{},[231,810],{},[231,812,813,814],{},"The topic to write to. Can also come from ",[76,815,816],{},"msg.topic",[210,818,819,824,826,828],{},[231,820,821],{},[26,822,823],{},"Require Ack",[231,825],{},[231,827,252],{},[231,829,830,831,833,834,836,837,840],{},"How many brokers must confirm the write. ",[76,832,255],{}," doesn't wait at all, ",[76,835,252],{}," waits for the leader, ",[76,838,839],{},"-1"," waits for every replica",[210,842,843,848,850,853],{},[231,844,845],{},[26,846,847],{},"Ack Timeout (Ms)",[231,849],{},[231,851,852],{},"100",[231,854,855],{},"How long to wait for those confirmations",[210,857,858,863,870,873],{},[231,859,860],{},[26,861,862],{},"Partitioner",[231,864,865,866],{},"see ",[31,867,869],{"href":868},"#partitioner-options","Partitioner options",[231,871,872],{},"default",[231,874,875],{},"How a partition is picked when you haven't set one",[210,877,878,883,885,887],{},[231,879,880],{},[26,881,882],{},"Key",[231,884],{},[231,886],{},[231,888,889,890],{},"The message key. Consumers read it back from ",[76,891,892],{},"msg._kafka.key",[210,894,895,900,902,904],{},[231,896,897],{},[26,898,899],{},"Partition",[231,901],{},[231,903,255],{},[231,905,906,907,909,910,912,913],{},"The partition to write to. Numbering starts at ",[76,908,255],{},". Ignored when ",[26,911,766],{}," is ",[76,914,775],{},[210,916,917,922,928,931],{},[231,918,919],{},[26,920,921],{},"Compression",[231,923,865,924],{},[31,925,927],{"href":926},"#compression-options","Compression options",[231,929,930],{},"none",[231,932,933],{},"Compresses messages before sending. Worth turning on for high volumes of text",[210,935,936,941,944,947],{},[231,937,938],{},[26,939,940],{},"Convert message from JSON",[231,942,943],{},"checkbox",[231,945,946],{},"Off",[231,948,949,950,953],{},"Turns an object payload into text for you, so you don't need a separate ",[76,951,952],{},"json"," node",[210,955,956,961,963,965],{},[231,957,958],{},[26,959,960],{},"Topic replace \u002F with .",[231,962,943],{},[231,964,946],{},[231,966,967,968,124,970,972],{},"Converts ",[76,969,123],{},[76,971,57],{}," in the topic name, so MQTT-style topics work with Kafka",[210,974,975,980,982,985],{},[231,976,977],{},[26,978,979],{},"producer max Q depth",[231,981],{},[231,983,984],{},"1000",[231,986,987],{},"How many messages the node holds while waiting to send",[14,989,990,992],{},[26,991,882],{}," is a typed input, so you can enter a fixed string or point it at a message property.",[14,994,995,997,998,1000,1001,1003,1004,1006],{},[26,996,823],{}," is the setting worth thinking about. ",[76,999,255],{}," is fastest and can lose messages silently. ",[76,1002,252],{}," is the usual compromise. ",[76,1005,839],{}," is the safest and the slowest, and only makes sense on a topic with more than one replica.",[37,1008,869],{"id":1009},"partitioner-options",[14,1011,1012,1013,1015,1016,1019],{},"The partitioner decides which partition a message goes to. It only comes into play when the message itself doesn't say: set ",[26,1014,899],{}," on the node, or ",[76,1017,1018],{},"msg.partition"," on the message, and the partitioner is bypassed.",[204,1021,1022,1031],{},[207,1023,1024],{},[210,1025,1026,1029],{},[213,1027,1028],{},"Option",[213,1030,432],{},[226,1032,1033,1042,1052,1062,1075],{},[210,1034,1035,1039],{},[231,1036,1037],{},[76,1038,872],{},[231,1040,1041],{},"Sends every message to the same partition, the first one. Fine for a single-partition topic, and a common surprise on a topic with several",[210,1043,1044,1049],{},[231,1045,1046],{},[76,1047,1048],{},"random",[231,1050,1051],{},"Picks a partition at random for each message. Spreads the load, but consecutive messages can land out of order relative to each other",[210,1053,1054,1059],{},[231,1055,1056],{},[76,1057,1058],{},"cyclic",[231,1060,1061],{},"Works through the partitions in turn, one message each. An even spread, and more predictable than random",[210,1063,1064,1069],{},[231,1065,1066],{},[76,1067,1068],{},"keyed",[231,1070,1071,1072,1074],{},"Hashes the ",[26,1073,882],{}," to choose the partition, so the same key always lands on the same partition. Messages for one key then stay in the order you sent them",[210,1076,1077,1082],{},[231,1078,1079],{},[76,1080,1081],{},"custom",[231,1083,1084],{},"Uses a partitioner supplied in code instead of one of the strategies above",[14,1086,1087,1088,1090,1091,1093],{},"Pick ",[76,1089,1068],{}," when order matters within a group of messages — readings from one machine, events for one order number — and set ",[26,1092,882],{}," to whatever identifies that group. Kafka only guarantees order inside a partition, so this is the setting that keeps a machine's readings sequential.",[14,1095,1087,1096,1098],{},[76,1097,1058],{}," when you only care about spreading work evenly and order doesn't matter.",[14,1100,1101,1103,1104,57],{},[76,1102,872],{}," is worth a second look if you have a multi-partition topic and find everything piling into partition ",[76,1105,255],{},[37,1107,927],{"id":1108},"compression-options",[14,1110,542,1111,1113],{},[26,1112,921],{}," dropdown offers:",[204,1115,1116,1125],{},[207,1117,1118],{},[210,1119,1120,1122],{},[213,1121,1028],{},[213,1123,1124],{},"Notes",[226,1126,1127,1136,1152,1167,1180,1189,1199],{},[210,1128,1129,1133],{},[231,1130,1131],{},[76,1132,930],{},[231,1134,1135],{},"The default. No compression",[210,1137,1138,1149],{},[231,1139,1140,772,1143,772,1146],{},[76,1141,1142],{},"gzip",[76,1144,1145],{},"gzip best speed",[76,1147,1148],{},"gzip best compression",[231,1150,1151],{},"Widely understood by other Kafka clients",[210,1153,1154,1165],{},[231,1155,1156,772,1159,772,1162],{},[76,1157,1158],{},"zip",[76,1160,1161],{},"zip best speed",[76,1163,1164],{},"zip best compression",[231,1166],{},[210,1168,1169,1177],{},[231,1170,1171,772,1174],{},[76,1172,1173],{},"Lempel-Ziv-Markov best speed",[76,1175,1176],{},"Lempel-Ziv-Markov best compression",[231,1178,1179],{},"LZMA",[210,1181,1182,1187],{},[231,1183,1184],{},[76,1185,1186],{},"Brotli",[231,1188],{},[210,1190,1191,1196],{},[231,1192,1193],{},[76,1194,1195],{},"Snappy",[231,1197,1198],{},"Fast, with modest size savings. A common choice for Kafka",[210,1200,1201,1206],{},[231,1202,1203],{},[76,1204,1205],{},"Deflate",[231,1207],{},[14,1209,1210,1211,194,1214,1217],{},"Where a codec has ",[26,1212,1213],{},"best speed",[26,1215,1216],{},"best compression"," variants, you are trading CPU time against message size. The plain option sits between the two.",[14,1219,1220,1221,1224,1225,1227,1228,1230],{},"Whatever you pick, whatever reads the topic has to understand it. If your consumers are also Kafka Consumer nodes, set the same codec on their ",[26,1222,1223],{},"Decompression"," field. If anything else reads the topic, stick to ",[76,1226,1142],{}," or ",[76,1229,1195],{},", which every Kafka client handles. The other codecs here are not part of the standard Kafka set, so a Java or Python consumer may not be able to read them.",[37,1232,1234],{"id":1233},"setting-values-from-the-message","Setting values from the message",[14,1236,1237],{},"Four of these fields can come from the incoming message instead of the node:",[101,1239,1240,1247,1255,1262],{},[45,1241,1242,1246],{},[26,1243,1244],{},[76,1245,816],{}," — the topic to write to",[45,1248,1249,1254],{},[26,1250,1251],{},[76,1252,1253],{},"msg.key"," — the message key",[45,1256,1257,1261],{},[26,1258,1259],{},[76,1260,1018],{}," — the partition to write to",[45,1263,1264,1269],{},[26,1265,1266],{},[76,1267,1268],{},"msg.attributes"," — the attribute flag sent with the message. There is no field for this in the dialog, so the message is the only way to set it",[14,1271,1272],{},"If the message does not carry one of these, the node's own value is used instead. The node settings are defaults, in other words, and any message can override them.",[14,1274,1275,1276,1278,1279,1281,1282,1285],{},"This is what lets a single producer node serve many topics. Leave ",[26,1277,806],{}," blank on the node, set ",[76,1280,816],{}," in a ",[76,1283,1284],{},"change"," node beforehand, and the same producer handles all of them.",[14,1287,1288,1289,1292,1293,1296,1297,772,1299,1302,1303,1305,1306,1302,1309,1311,1312,1314,1315,194,1317,57],{},"Say you have a ",[76,1290,1291],{},"Temperature"," topic with three partitions, carrying ",[76,1294,1295],{},"downtown"," on partition ",[76,1298,255],{},[76,1300,1301],{},"suburban"," on ",[76,1304,252],{},", and ",[76,1307,1308],{},"industrial",[76,1310,295],{},", with the region name as the key. You can build that with three producer nodes, each configured for its own region, or with one node and a ",[76,1313,1284],{}," node that sets ",[76,1316,1253],{},[76,1318,1018],{},[18,1320,1322],{"id":1321},"receive-messages-kafka-consumer","Receive messages (Kafka Consumer)",[14,1324,1325,1327,1328,1331],{},[26,1326,167],{}," has no input. It sends out one ",[76,1329,1330],{},"msg"," for every Kafka message that arrives.",[14,1333,1334,1335,1337],{},"Two fields sit above the tabs, alongside ",[26,1336,348],{},":",[204,1339,1340,1352],{},[207,1341,1342],{},[210,1343,1344,1346,1348,1350],{},[213,1345,429],{},[213,1347,400],{},[213,1349,613],{},[213,1351,432],{},[226,1353,1354,1369],{},[210,1355,1356,1360,1363,1366],{},[231,1357,1358],{},[26,1359,766],{},[231,1361,1362],{},"dropdown",[231,1364,1365],{},"Base",[231,1367,1368],{},"Which client to use. Leave it alone unless you have a reason to change it",[210,1370,1371,1375,1377,1379],{},[231,1372,1373],{},[26,1374,366],{},[231,1376,794],{},[231,1378],{},[231,1380,1381],{},"Which connection to read through",[14,1383,1384,1385,772,1388,772,1390,1305,1393,57],{},"The remaining settings are split across four tabs: ",[26,1386,1387],{},"Topics",[26,1389,400],{},[26,1391,1392],{},"Fetch",[26,1394,1395],{},"Encoding",[37,1397,1399],{"id":1398},"topics-tab","Topics tab",[14,1401,1402,1403,1405,1406,1408],{},"Add a row to the ",[26,1404,806],{}," table for each topic you want, using ",[26,1407,447],{},". Each row has three columns:",[204,1410,1411,1420],{},[207,1412,1413],{},[210,1414,1415,1418],{},[213,1416,1417],{},"Column",[213,1419,432],{},[226,1421,1422,1431,1441],{},[210,1423,1424,1428],{},[231,1425,1426],{},[26,1427,348],{},[231,1429,1430],{},"The topic name",[210,1432,1433,1438],{},[231,1434,1435],{},[26,1436,1437],{},"Offset",[231,1439,1440],{},"Where to start reading from",[210,1442,1443,1447],{},[231,1444,1445],{},[26,1446,899],{},[231,1448,1449],{},"Which partition to read",[14,1451,1452,1453,1456],{},"Tick ",[26,1454,1455],{},"wildcard (regex)"," to treat the names as patterns instead of exact topics. Matching topics are picked up as they appear and dropped when they go away. Kafka is checked once a minute, so a new topic can take up to a minute to show up.",[14,1458,1459,1460,1463],{},"This is the setting to reach for when a topic is created per machine or per line. A pattern like ",[76,1461,1462],{},"line.*\\.temperature"," keeps working as lines are added, with no redeploy.",[37,1465,597],{"id":1466},"options-tab-1",[204,1468,1469,1481],{},[207,1470,1471],{},[210,1472,1473,1475,1477,1479],{},[213,1474,429],{},[213,1476,400],{},[213,1478,613],{},[213,1480,432],{},[226,1482,1483,1500,1523],{},[210,1484,1485,1490,1492,1497],{},[231,1486,1487],{},[26,1488,1489],{},"Group Id",[231,1491],{},[231,1493,1494],{},[76,1495,1496],{},"kafka-node-group",[231,1498,1499],{},"The group this consumer belongs to. Change it if two flows read the same topic and shouldn't share a position",[210,1501,1502,1507,1513,1515],{},[231,1503,1504],{},[26,1505,1506],{},"Auto Commit",[231,1508,1509,123,1511],{},[76,1510,659],{},[76,1512,662],{},[231,1514,659],{},[231,1516,1517,1519,1520,1522],{},[76,1518,659],{}," lets Kafka mark messages as done on a timer. ",[76,1521,662],{}," hands that job to Kafka Commit and Kafka Rollback",[210,1524,1525,1530,1532,1535],{},[231,1526,1527],{},[26,1528,1529],{},"Auto Commit Interval (Ms)",[231,1531],{},[231,1533,1534],{},"5000",[231,1536,1537,1538,912,1540],{},"How often those automatic commits happen. Ignored when ",[26,1539,1506],{},[76,1541,662],{},[37,1543,1545],{"id":1544},"fetch-tab","Fetch tab",[14,1547,1548],{},"How much data the consumer pulls at a time. Leave these alone unless you are chasing throughput or latency.",[204,1550,1551,1561],{},[207,1552,1553],{},[210,1554,1555,1557,1559],{},[213,1556,429],{},[213,1558,613],{},[213,1560,432],{},[226,1562,1563,1575,1587],{},[210,1564,1565,1570,1572],{},[231,1566,1567],{},[26,1568,1569],{},"Fetch Max Wait (Ms)",[231,1571,852],{},[231,1573,1574],{},"How long the broker holds a reply back, hoping more data turns up",[210,1576,1577,1582,1584],{},[231,1578,1579],{},[26,1580,1581],{},"Fetch Min Bytes",[231,1583,252],{},[231,1585,1586],{},"The smallest amount of data worth replying with",[210,1588,1589,1594,1597],{},[231,1590,1591],{},[26,1592,1593],{},"Fetch Max Bytes",[231,1595,1596],{},"1048576",[231,1598,1599],{},"The most data to pull in one go, 1 MB by default",[14,1601,1602,1603,194,1605,1608],{},"Raising ",[26,1604,1581],{},[26,1606,1607],{},"Fetch Max Wait"," means fewer, fuller round trips, which suits high message rates. Lowering them gets messages to your flow sooner, which suits alerting.",[37,1610,1612],{"id":1611},"encoding-tab","Encoding tab",[204,1614,1615,1627],{},[207,1616,1617],{},[210,1618,1619,1621,1623,1625],{},[213,1620,429],{},[213,1622,400],{},[213,1624,613],{},[213,1626,432],{},[226,1628,1629,1663,1685,1703,1719],{},[210,1630,1631,1636,1646,1648],{},[231,1632,1633],{},[26,1634,1635],{},"From Offset",[231,1637,1638,772,1641,772,1644],{},[76,1639,1640],{},"latest",[76,1642,1643],{},"earliest",[76,1645,930],{},[231,1647,1640],{},[231,1649,1650,1651,1653,1654,1656,1657,1659,1660,1662],{},"Where to start when the ",[26,1652,806],{}," table has no offset. ",[76,1655,1640],{}," reads only new messages, ",[76,1658,1643],{}," starts from the oldest message still held, ",[76,1661,930],{}," fails if there is no committed position",[210,1664,1665,1669,1677,1679],{},[231,1666,1667],{},[26,1668,1395],{},[231,1670,1671,772,1674],{},[76,1672,1673],{},"utf8",[76,1675,1676],{},"raw",[231,1678,1673],{},[231,1680,1681,1682,1684],{},"How the message value is decoded. ",[76,1683,1676],{}," gives you the bytes untouched, for binary payloads",[210,1686,1687,1692,1698,1700],{},[231,1688,1689],{},[26,1690,1691],{},"Key Encoding",[231,1693,1694,772,1696],{},[76,1695,1673],{},[76,1697,1676],{},[231,1699,1673],{},[231,1701,1702],{},"The same, for the message key",[210,1704,1705,1710,1712,1714],{},[231,1706,1707],{},[26,1708,1709],{},"Convert message to JSON",[231,1711,943],{},[231,1713,946],{},[231,1715,1716,1717,953],{},"Parses the message into an object for you, so you don't need a separate ",[76,1718,952],{},[210,1720,1721,1725,1729,1731],{},[231,1722,1723],{},[26,1724,1223],{},[231,1726,865,1727],{},[31,1728,927],{"href":926},[231,1730,930],{},[231,1732,1733],{},"How to decompress messages that were compressed by the producer. Must match what the producer used",[14,1735,1087,1736,1302,1738,1740,1741,1743],{},[76,1737,1643],{},[26,1739,1635],{}," when a new consumer needs the history that is already in the topic. Pick ",[76,1742,1640],{}," when it should only see what happens from now on.",[37,1745,1747],{"id":1746},"what-arrives-in-the-message","What arrives in the message",[14,1749,1750],{},"Every message the node sends out carries two things:",[101,1752,1753,1770],{},[45,1754,1755,1759,1760,1762,1763,1765,1766],{},[26,1756,1757],{},[76,1758,742],{}," — the message itself. With the default ",[76,1761,1673],{}," encoding this is text, unless you turn on ",[26,1764,1709],{},". See ",[31,1767,1769],{"href":1768},"#payloads-are-text","Payloads are text",[45,1771,1772,1777,1778],{},[26,1773,1774],{},[76,1775,1776],{},"msg._kafka"," — the details from Kafka: which topic the message came from, the partition and offset it was read at, and the key set by the producer as ",[76,1779,892],{},[14,1781,1782,1783,1785],{},"Keep ",[76,1784,1776],{}," on the message if you plan to commit or roll back later, because Kafka Commit and Kafka Rollback both need it.",[18,1787,1789],{"id":1788},"share-the-work-kafka-consumer-group","Share the work (Kafka Consumer Group)",[14,1791,1792,1794,1795,1797],{},[26,1793,183],{}," reads messages the same way as Kafka Consumer, but members that use the same ",[26,1796,1489],{}," split the work between them. Kafka gives each topic and partition to one member only, and hands them out again when a member joins or leaves.",[14,1799,1800],{},"Use a group when you need to handle more messages. Use separate Kafka Consumer nodes when every consumer needs to see every message.",[14,1802,1803,1804,194,1806,1808,1809,1811,1812,1814],{},"Above the tabs it has ",[26,1805,766],{},[26,1807,366],{},", the same as Kafka Consumer. ",[26,1810,766],{}," only offers ",[76,1813,1365],{},", so there is nothing to decide there.",[37,1816,1399],{"id":1817},"topics-tab-1",[14,1819,1820,1821,1823],{},"Add a row for each topic. Unlike Kafka Consumer, you only give the ",[26,1822,348],{}," here — there is no per-topic offset or partition.",[37,1825,597],{"id":1826},"options-tab-2",[204,1828,1829,1841],{},[207,1830,1831],{},[210,1832,1833,1835,1837,1839],{},[213,1834,429],{},[213,1836,400],{},[213,1838,613],{},[213,1840,432],{},[226,1842,1843,1856,1871,1891,1908,1927,1945],{},[210,1844,1845,1849,1851,1853],{},[231,1846,1847],{},[26,1848,1489],{},[231,1850],{},[231,1852],{},[231,1854,1855],{},"The group name. Every member sharing the work uses the same one",[210,1857,1858,1863,1865,1868],{},[231,1859,1860],{},[26,1861,1862],{},"Session Timeout (ms)",[231,1864],{},[231,1866,1867],{},"15000",[231,1869,1870],{},"How long before a quiet member is treated as gone and its work reassigned",[210,1872,1873,1878,1886,1888],{},[231,1874,1875],{},[26,1876,1877],{},"Protocol",[231,1879,1880,772,1883],{},[76,1881,1882],{},"Round Robin",[76,1884,1885],{},"Range",[231,1887,1882],{},[231,1889,1890],{},"How partitions are shared out. Round robin deals them out one at a time, range gives each member a contiguous block",[210,1892,1893,1897,1903,1905],{},[231,1894,1895],{},[26,1896,1395],{},[231,1898,1899,772,1901],{},[76,1900,1673],{},[76,1902,1676],{},[231,1904,1673],{},[231,1906,1907],{},"How the message value is decoded",[210,1909,1910,1914,1922,1924],{},[231,1911,1912],{},[26,1913,1635],{},[231,1915,1916,772,1918,772,1920],{},[76,1917,1640],{},[76,1919,1643],{},[76,1921,930],{},[231,1923,1640],{},[231,1925,1926],{},"Where a brand new group starts reading. Once the group has committed a position, that position wins",[210,1928,1929,1934,1940,1942],{},[231,1930,1931],{},[26,1932,1933],{},"Commit Offsets On First Join",[231,1935,1936,123,1938],{},[76,1937,659],{},[76,1939,662],{},[231,1941,659],{},[231,1943,1944],{},"Records a starting position as soon as the group forms, rather than waiting for the first commit",[210,1946,1947,1952,1960,1962],{},[231,1948,1949],{},[26,1950,1951],{},"Out Of Range Offset",[231,1953,1954,772,1956,772,1958],{},[76,1955,1643],{},[76,1957,1640],{},[76,1959,930],{},[231,1961,1643],{},[231,1963,1964],{},"Where to go if the stored offset no longer exists, usually because those messages have aged out",[14,1966,1967],{},"A group cannot split the work more ways than there are topics and partitions. Any extra members sit idle, which is worth remembering before adding a fourth consumer to a three-partition topic.",[14,1969,1970,1971,1973,1974,1976,1977,1979],{},"There is no ",[26,1972,1506],{}," setting here, and no ",[26,1975,1709],{},". Use a ",[76,1978,952],{}," node in the flow if you need to parse the payload.",[18,1981,1983],{"id":1982},"commit-and-roll-back-kafka-commit-kafka-rollback","Commit and roll back (Kafka Commit, Kafka Rollback)",[14,1985,1986],{},"By default a consumer commits automatically, so Kafka treats a message as done as soon as it hands it over. If your flow then fails, the message is gone. Committing by hand instead means a message is only marked as done once your flow has finished with it.",[37,1988,1990],{"id":1989},"what-each-node-does","What each node does",[14,1992,1993,1995],{},[26,1994,193],{}," commits a message that was read without auto commit. Put it at the end of the path that worked.",[14,1997,1998,2000],{},[26,1999,197],{}," rolls the message back and closes the consumer that read it. The message stays uncommitted and Kafka stops handing it out. Put it on the error path, then fix the problem and open the consumer again to carry on.",[37,2002,2004],{"id":2003},"what-they-need-to-work","What they need to work",[101,2006,2007,2018,2035],{},[45,2008,2009,2012,2013,124,2015,2017],{},[26,2010,2011],{},"Auto commit must be off."," Set ",[26,2014,1506],{},[76,2016,662],{}," on the Kafka Consumer node. Neither node does anything useful while the consumer is committing on its own.",[45,2019,2020,2025,2026,1227,2028,2031,2032,2034],{},[26,2021,2022,2023,57],{},"The message must still carry ",[76,2024,1776],{}," Both nodes use it to find the message and its consumer. A ",[76,2027,1284],{},[76,2029,2030],{},"function"," node that rebuilds ",[76,2033,1330],{}," from scratch will remove it.",[45,2036,2037,2040],{},[26,2038,2039],{},"They only work with Kafka Consumer."," Kafka Consumer Group has no auto commit setting to turn off.",[14,2042,2043,2044,2046,2047,2049],{},"Neither node has a ",[26,2045,366],{}," field, or any setting beyond ",[26,2048,348],{}," — they get the connection from the message. Both have two outputs: the first for success, the second for failure.",[88,2051,2052,2057],{},[14,2053,2054],{},[26,2055,2056],{},"Note",[14,2058,2059],{},"Kafka keeps sending messages to a consumer whether or not an earlier commit is still outstanding. A commit therefore marks every message up to that point as done, not just the one that triggered it. If that matters to you, keep the number of messages in flight low.",[18,2061,2063],{"id":2062},"administration-kafka-admin","Administration (Kafka Admin)",[14,2065,2066,2068,2069,194,2072,2075],{},[26,2067,318],{}," runs one admin command against the cluster. These are the same jobs you would otherwise do with the ",[76,2070,2071],{},"kafka-topics.sh",[76,2073,2074],{},"kafka-configs.sh"," scripts on a broker. Running them from a flow means you can create topics as part of a deployment, show cluster state on a dashboard, or check consumer groups on a schedule.",[14,2077,2078,2079,194,2081,2083],{},"The node has only ",[26,2080,348],{},[26,2082,366],{},". Everything else comes from the message. It has two outputs, one for success and one for failure.",[37,2085,2087],{"id":2086},"how-to-send-a-command","How to send a command",[14,2089,2090],{},"Every command uses the same two message properties:",[101,2092,2093,2100],{},[45,2094,2095,2099],{},[26,2096,2097],{},[76,2098,816],{}," — the command name, spelled as in the tables below. Capital letters matter",[45,2101,2102,2106],{},[26,2103,2104],{},[76,2105,742],{}," — the command's arguments, as JSON. Leave it out for commands that take none",[14,2108,2109,2110,2112],{},"The reply comes back on ",[76,2111,742],{}," from the first output.",[14,2114,2115,2116,2118,2119,2122,2123,2125],{},"Watch out for one thing: ",[76,2117,816],{}," holds the ",[26,2120,2121],{},"command name",", not a Kafka topic name. The topic a command acts on goes in ",[76,2124,742],{},". This trips up most people the first time.",[14,2127,2128,2129,2132,2133,2135,2136,2139,2140,2143],{},"An ",[76,2130,2131],{},"inject"," node is the easiest way to drive it. Set its ",[26,2134,806],{}," to the command and its ",[26,2137,2138],{},"Payload"," to the JSON, wire it into Kafka Admin, and add a ",[76,2141,2142],{},"debug"," node to each output so you see both the reply and any error.",[37,2145,2147],{"id":2146},"commands-that-take-no-arguments","Commands that take no arguments",[14,2149,2150,2151,2153],{},"Send these with ",[76,2152,816],{}," set and no payload.",[204,2155,2156,2166],{},[207,2157,2158],{},[210,2159,2160,2163],{},[213,2161,2162],{},"Command",[213,2164,2165],{},"What comes back",[226,2167,2168,2178,2188,2198,2208,2218,2228],{},[210,2169,2170,2175],{},[231,2171,2172],{},[76,2173,2174],{},"listTopics",[231,2176,2177],{},"Every topic in the cluster, with its partitions and replicas",[210,2179,2180,2185],{},[231,2181,2182],{},[76,2183,2184],{},"listGroups",[231,2186,2187],{},"All groups the coordinator knows about",[210,2189,2190,2195],{},[231,2191,2192],{},[76,2193,2194],{},"listConsumerGroups",[231,2196,2197],{},"Consumer groups only",[210,2199,2200,2205],{},[231,2201,2202],{},[76,2203,2204],{},"describeCluster",[231,2206,2207],{},"The brokers, the cluster ID, and which broker is the controller",[210,2209,2210,2215],{},[231,2211,2212],{},[76,2213,2214],{},"describeLogDirs",[231,2216,2217],{},"How much disk each broker is using",[210,2219,2220,2225],{},[231,2221,2222],{},[76,2223,2224],{},"describeReplicaLogDirs",[231,2226,2227],{},"Which directory each replica is stored in",[210,2229,2230,2235],{},[231,2231,2232],{},[76,2233,2234],{},"describeDelegationToken",[231,2236,2237],{},"The delegation tokens in use",[37,2239,2241],{"id":2240},"commands-that-take-arguments","Commands that take arguments",[14,2243,2244,2245,57],{},"Arguments always go in ",[76,2246,742],{},[204,2248,2249,2259],{},[207,2250,2251],{},[210,2252,2253,2256],{},[213,2254,2255],{},"Job",[213,2257,2258],{},"Commands",[226,2260,2261,2278,2293,2308,2329,2341,2359,2371],{},[210,2262,2263,2267],{},[231,2264,2265],{},[26,2266,1387],{},[231,2268,2269,772,2272,772,2275],{},[76,2270,2271],{},"createTopics",[76,2273,2274],{},"deleteTopics",[76,2276,2277],{},"describeTopics",[210,2279,2280,2285],{},[231,2281,2282],{},[26,2283,2284],{},"Partitions",[231,2286,2287,772,2290],{},[76,2288,2289],{},"createPartitions",[76,2291,2292],{},"electPreferredLeaders",[210,2294,2295,2300],{},[231,2296,2297],{},[26,2298,2299],{},"Settings",[231,2301,2302,772,2305],{},[76,2303,2304],{},"alterConfigs",[76,2306,2307],{},"incrementalAlterConfigs",[210,2309,2310,2315],{},[231,2311,2312],{},[26,2313,2314],{},"Consumer groups",[231,2316,2317,772,2320,772,2323,772,2326],{},[76,2318,2319],{},"describeGroups",[76,2321,2322],{},"describeConsumerGroups",[76,2324,2325],{},"deleteConsumerGroups",[76,2327,2328],{},"listConsumerGroupOffsets",[210,2330,2331,2336],{},[231,2332,2333],{},[26,2334,2335],{},"Records",[231,2337,2338],{},[76,2339,2340],{},"deleteRecords",[210,2342,2343,2348],{},[231,2344,2345],{},[26,2346,2347],{},"ACLs",[231,2349,2350,772,2353,772,2356],{},[76,2351,2352],{},"createAcls",[76,2354,2355],{},"describeAcls",[76,2357,2358],{},"deleteAcls",[210,2360,2361,2366],{},[231,2362,2363],{},[26,2364,2365],{},"Log directories",[231,2367,2368],{},[76,2369,2370],{},"alterReplicaLogDirs",[210,2372,2373,2378],{},[231,2374,2375],{},[26,2376,2377],{},"Delegation tokens",[231,2379,2380,772,2383,772,2386],{},[76,2381,2382],{},"createDelegationToken",[76,2384,2385],{},"renewDelegationToken",[76,2387,2388],{},"expireDelegationToken",[37,2390,2392],{"id":2391},"examples","Examples",[14,2394,2395,2012,2398,124,2400,194,2402,2404],{},[26,2396,2397],{},"Create a topic with three partitions.",[76,2399,816],{},[76,2401,2271],{},[76,2403,742],{}," to:",[565,2406,2409],{"className":2407,"code":2408,"language":952,"meta":571,"style":571},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[{ \"topic\": \"Temperature\", \"partitions\": 3, \"replicationFactor\": 1 }]\n",[76,2410,2411],{"__ignoreMap":571},[2412,2413,2416,2420,2423,2427,2430,2432,2434,2437,2439,2442,2444,2447,2449,2451,2455,2457,2459,2462,2464,2466,2469],"span",{"class":2414,"line":2415},"line",1,[2412,2417,2419],{"class":2418},"sMK4o","[{",[2412,2421,2422],{"class":2418}," \"",[2412,2424,2426],{"class":2425},"spNyl","topic",[2412,2428,2429],{"class":2418},"\"",[2412,2431,1337],{"class":2418},[2412,2433,2422],{"class":2418},[2412,2435,1291],{"class":2436},"sfazB",[2412,2438,2429],{"class":2418},[2412,2440,2441],{"class":2418},",",[2412,2443,2422],{"class":2418},[2412,2445,2446],{"class":2425},"partitions",[2412,2448,2429],{"class":2418},[2412,2450,1337],{"class":2418},[2412,2452,2454],{"class":2453},"sbssI"," 3",[2412,2456,2441],{"class":2418},[2412,2458,2422],{"class":2418},[2412,2460,2461],{"class":2425},"replicationFactor",[2412,2463,2429],{"class":2418},[2412,2465,1337],{"class":2418},[2412,2467,2468],{"class":2453}," 1",[2412,2470,2471],{"class":2418}," }]\n",[14,2473,2474,2475,2478],{},"The payload is an array, so one message can create several topics at once. Add ",[76,2476,2477],{},"configEntries"," to set topic settings at the same time, such as keeping messages for seven days:",[565,2480,2482],{"className":2407,"code":2481,"language":952,"meta":571,"style":571},"[{\n  \"topic\": \"Temperature\",\n  \"partitions\": 3,\n  \"replicationFactor\": 1,\n  \"configEntries\": [{ \"name\": \"retention.ms\", \"value\": \"604800000\" }]\n}]\n",[76,2483,2484,2489,2510,2525,2540,2590],{"__ignoreMap":571},[2412,2485,2486],{"class":2414,"line":2415},[2412,2487,2488],{"class":2418},"[{\n",[2412,2490,2492,2495,2497,2499,2501,2503,2505,2507],{"class":2414,"line":2491},2,[2412,2493,2494],{"class":2418},"  \"",[2412,2496,2426],{"class":2425},[2412,2498,2429],{"class":2418},[2412,2500,1337],{"class":2418},[2412,2502,2422],{"class":2418},[2412,2504,1291],{"class":2436},[2412,2506,2429],{"class":2418},[2412,2508,2509],{"class":2418},",\n",[2412,2511,2513,2515,2517,2519,2521,2523],{"class":2414,"line":2512},3,[2412,2514,2494],{"class":2418},[2412,2516,2446],{"class":2425},[2412,2518,2429],{"class":2418},[2412,2520,1337],{"class":2418},[2412,2522,2454],{"class":2453},[2412,2524,2509],{"class":2418},[2412,2526,2528,2530,2532,2534,2536,2538],{"class":2414,"line":2527},4,[2412,2529,2494],{"class":2418},[2412,2531,2461],{"class":2425},[2412,2533,2429],{"class":2418},[2412,2535,1337],{"class":2418},[2412,2537,2468],{"class":2453},[2412,2539,2509],{"class":2418},[2412,2541,2543,2545,2547,2549,2551,2554,2556,2559,2561,2563,2565,2568,2570,2572,2574,2577,2579,2581,2583,2586,2588],{"class":2414,"line":2542},5,[2412,2544,2494],{"class":2418},[2412,2546,2477],{"class":2425},[2412,2548,2429],{"class":2418},[2412,2550,1337],{"class":2418},[2412,2552,2553],{"class":2418}," [{",[2412,2555,2422],{"class":2418},[2412,2557,549],{"class":2558},"sBMFI",[2412,2560,2429],{"class":2418},[2412,2562,1337],{"class":2418},[2412,2564,2422],{"class":2418},[2412,2566,2567],{"class":2436},"retention.ms",[2412,2569,2429],{"class":2418},[2412,2571,2441],{"class":2418},[2412,2573,2422],{"class":2418},[2412,2575,2576],{"class":2558},"value",[2412,2578,2429],{"class":2418},[2412,2580,1337],{"class":2418},[2412,2582,2422],{"class":2418},[2412,2584,2585],{"class":2436},"604800000",[2412,2587,2429],{"class":2418},[2412,2589,2471],{"class":2418},[2412,2591,2593],{"class":2414,"line":2592},6,[2412,2594,2595],{"class":2418},"}]\n",[14,2597,2598,2012,2601,124,2603,2605],{},[26,2599,2600],{},"List every topic.",[76,2602,816],{},[76,2604,2174],{}," and send no payload.",[14,2607,2608,2012,2611,124,2613,2615],{},[26,2609,2610],{},"Add partitions to a topic.",[76,2612,816],{},[76,2614,2289],{},". You can only ever add partitions, never remove them, so this cannot be undone. Adding partitions also changes which partition each key goes to, so existing keys stop landing where they used to.",[14,2617,2618,2012,2621,124,2623,2625,2626,2629],{},[26,2619,2620],{},"Delete a topic.",[76,2622,816],{},[76,2624,2274],{}," and put the topic names in the payload. This only works if the brokers have ",[76,2627,2628],{},"delete.topic.enable"," turned on, which is the default from Kafka 1.0 onwards. If it is off, the request is accepted and then ignored.",[37,2631,2633],{"id":2632},"things-to-watch-out-for","Things to watch out for",[14,2635,2636,2637,2639],{},"Creating a topic takes a moment. The reply means the request was accepted, not that every broker knows about the topic yet, so a ",[76,2638,2174],{}," sent straight afterwards may not include it. If a flow creates a topic and then writes to it, add a short delay rather than wiring the two together directly.",[14,2641,2642,2644,2645,2648,2649,2651],{},[76,2643,2461],{}," cannot be higher than your number of brokers. Asking for ",[76,2646,2647],{},"3"," on a single-broker test cluster will fail, so use ",[76,2650,252],{}," locally and set the real value per environment with an environment variable.",[14,2653,2654,2655,2658],{},"You may not need to create topics at all. If the brokers have ",[76,2656,2657],{},"auto.create.topics.enable"," turned on, writing to an unknown topic creates it with the default settings. That is handy while testing and usually unwanted in production, because a typo quietly creates a new topic instead of failing.",[14,2660,2661],{},"Admin commands also need the right permissions. On a cluster with ACLs, the credentials in your Kafka Broker config need cluster-level rights, so read-only credentials that work fine for a consumer will not work here.",[18,2663,2665],{"id":2664},"offsets-kafka-offset","Offsets (Kafka Offset)",[14,2667,2668,2670,2671,194,2673,2675],{},[26,2669,332],{}," reads offset details from Kafka. Like Kafka Admin, the node has only ",[26,2672,348],{},[26,2674,366],{},", takes everything else from the message, and has two outputs.",[14,2677,2678],{},"It uses two message properties:",[101,2680,2681,2691],{},[45,2682,2683,2688,2689],{},[26,2684,2685],{},[76,2686,2687],{},"msg.action"," — which of the four actions to run. You can also put this in ",[76,2690,816],{},[45,2692,2693,2697],{},[26,2694,2695],{},[76,2696,742],{}," — the arguments for that action",[204,2699,2700,2710],{},[207,2701,2702],{},[210,2703,2704,2707],{},[213,2705,2706],{},"Action",[213,2708,2709],{},"What it returns",[226,2711,2712,2726,2736,2746],{},[210,2713,2714,2719],{},[231,2715,2716],{},[76,2717,2718],{},"fetch",[231,2720,2721,2722,2725],{},"Offsets for a topic and partition, up to ",[76,2723,2724],{},"maxNum"," of them",[210,2727,2728,2733],{},[231,2729,2730],{},[76,2731,2732],{},"fetchEarliestOffset",[231,2734,2735],{},"The oldest offset still held for a topic",[210,2737,2738,2743],{},[231,2739,2740],{},[76,2741,2742],{},"fetchLatestOffsets",[231,2744,2745],{},"The newest offset for a topic, in other words the end of it",[210,2747,2748,2753],{},[231,2749,2750],{},[76,2751,2752],{},"fetchCommits",[231,2754,2755],{},"The offsets a consumer group has committed",[37,2757,2759],{"id":2758},"payloads","Payloads",[14,2761,2762,2764],{},[76,2763,2718],{}," takes a partition and a limit:",[565,2766,2768],{"className":2407,"code":2767,"language":952,"meta":571,"style":571},"[{ \"topic\": \"test\", \"partition\": 0, \"maxNum\": 100 }]\n",[76,2769,2770],{"__ignoreMap":571},[2412,2771,2772,2774,2776,2778,2780,2782,2784,2787,2789,2791,2793,2796,2798,2800,2803,2805,2807,2809,2811,2813,2816],{"class":2414,"line":2415},[2412,2773,2419],{"class":2418},[2412,2775,2422],{"class":2418},[2412,2777,2426],{"class":2425},[2412,2779,2429],{"class":2418},[2412,2781,1337],{"class":2418},[2412,2783,2422],{"class":2418},[2412,2785,2786],{"class":2436},"test",[2412,2788,2429],{"class":2418},[2412,2790,2441],{"class":2418},[2412,2792,2422],{"class":2418},[2412,2794,2795],{"class":2425},"partition",[2412,2797,2429],{"class":2418},[2412,2799,1337],{"class":2418},[2412,2801,2802],{"class":2453}," 0",[2412,2804,2441],{"class":2418},[2412,2806,2422],{"class":2418},[2412,2808,2724],{"class":2425},[2412,2810,2429],{"class":2418},[2412,2812,1337],{"class":2418},[2412,2814,2815],{"class":2453}," 100",[2412,2817,2471],{"class":2418},[14,2819,2820,194,2822,2824],{},[76,2821,2732],{},[76,2823,2742],{}," just take the topic:",[565,2826,2828],{"className":2407,"code":2827,"language":952,"meta":571,"style":571},"[{ \"topic\": \"test\" }]\n",[76,2829,2830],{"__ignoreMap":571},[2412,2831,2832,2834,2836,2838,2840,2842,2844,2846,2848],{"class":2414,"line":2415},[2412,2833,2419],{"class":2418},[2412,2835,2422],{"class":2418},[2412,2837,2426],{"class":2425},[2412,2839,2429],{"class":2418},[2412,2841,1337],{"class":2418},[2412,2843,2422],{"class":2418},[2412,2845,2786],{"class":2436},[2412,2847,2429],{"class":2418},[2412,2849,2471],{"class":2418},[14,2851,2852,2854],{},[76,2853,2752],{}," is the odd one out. Its payload is an object rather than an array, and it needs the group as well as the topics:",[565,2856,2858],{"className":2407,"code":2857,"language":952,"meta":571,"style":571},"{\n  \"groupid\": \"aGroup\",\n  \"topics\": [{ \"topic\": \"test\" }]\n}\n",[76,2859,2860,2865,2885,2914],{"__ignoreMap":571},[2412,2861,2862],{"class":2414,"line":2415},[2412,2863,2864],{"class":2418},"{\n",[2412,2866,2867,2869,2872,2874,2876,2878,2881,2883],{"class":2414,"line":2491},[2412,2868,2494],{"class":2418},[2412,2870,2871],{"class":2425},"groupid",[2412,2873,2429],{"class":2418},[2412,2875,1337],{"class":2418},[2412,2877,2422],{"class":2418},[2412,2879,2880],{"class":2436},"aGroup",[2412,2882,2429],{"class":2418},[2412,2884,2509],{"class":2418},[2412,2886,2887,2889,2892,2894,2896,2898,2900,2902,2904,2906,2908,2910,2912],{"class":2414,"line":2512},[2412,2888,2494],{"class":2418},[2412,2890,2891],{"class":2425},"topics",[2412,2893,2429],{"class":2418},[2412,2895,1337],{"class":2418},[2412,2897,2553],{"class":2418},[2412,2899,2422],{"class":2418},[2412,2901,2426],{"class":2558},[2412,2903,2429],{"class":2418},[2412,2905,1337],{"class":2418},[2412,2907,2422],{"class":2418},[2412,2909,2786],{"class":2436},[2412,2911,2429],{"class":2418},[2412,2913,2471],{"class":2418},[2412,2915,2916],{"class":2414,"line":2527},[2412,2917,2918],{"class":2418},"}\n",[14,2920,2921,2922,2924],{},"Note the spelling: ",[76,2923,2871],{},", all lower case.",[37,2926,2928],{"id":2927},"measuring-how-far-behind-a-consumer-is","Measuring how far behind a consumer is",[14,2930,2931,2932,2934,2935,2937],{},"Run ",[76,2933,2742],{}," for the topic and ",[76,2936,2752],{}," for the group reading it, then subtract one from the other. The gap is how many messages the group still has to get through. Raise an alert when it grows past a threshold you are comfortable with.",[14,2939,2940,2941,2943],{},"These are also the offsets you put in a consumer's ",[26,2942,806],{}," table when you want to read a period of data again.",[18,2945,1769],{"id":2946},"payloads-are-text",[14,2948,2949,2950,2952],{},"Kafka stores messages as bytes. With the default ",[76,2951,1673],{}," encoding, a consumer gives you the message as text, and a producer expects text.",[14,2954,2955],{},"The nodes can handle the conversion for you, or you can do it in the flow:",[101,2957,2958,2973],{},[45,2959,2960,2963,2964,2966,2967,2972],{},[26,2961,2962],{},"Sending:"," turn on ",[26,2965,940],{}," on Kafka Producer, or put a ",[31,2968,2970],{"href":2969},"\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fparsers\u002Fjson\u002F",[76,2971,952],{}," node in stringify mode before it.",[45,2974,2975,2963,2978,2980,2981,2983],{},[26,2976,2977],{},"Receiving:",[26,2979,1709],{}," on Kafka Consumer, or put a ",[76,2982,952],{}," node in parse mode after it.",[14,2985,2986,2987,2989],{},"Kafka Consumer Group has no equivalent option, so use a ",[76,2988,952],{}," node there.",[14,2991,2992,2993,2995,2996,1314,2998,3000,3001,3004],{},"For a plain number, a ",[76,2994,952],{}," node is more than you need. A ",[76,2997,1284],{},[76,2999,742],{}," to the JSONata expression ",[76,3002,3003],{},"$number(msg.payload)"," is enough.",[14,3006,3007,3008,124,3010,3012,3013,3015],{},"For binary payloads, set ",[26,3009,1395],{},[76,3011,1676],{}," on the consumer and skip the ",[76,3014,952],{}," node altogether.",[3017,3018,3019],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":571,"searchDepth":2527,"depth":2527,"links":3021},[3022,3025,3026,3027,3028,3033,3038,3045,3049,3053,3060,3064],{"id":20,"depth":2491,"text":21,"children":3023},[3024],{"id":39,"depth":2512,"text":40},{"id":98,"depth":2491,"text":99},{"id":139,"depth":2491,"text":140},{"id":201,"depth":2491,"text":202},{"id":352,"depth":2491,"text":353,"children":3029},[3030,3031,3032],{"id":419,"depth":2512,"text":420},{"id":535,"depth":2512,"text":536},{"id":596,"depth":2512,"text":597},{"id":733,"depth":2491,"text":734,"children":3034},[3035,3036,3037],{"id":1009,"depth":2512,"text":869},{"id":1108,"depth":2512,"text":927},{"id":1233,"depth":2512,"text":1234},{"id":1321,"depth":2491,"text":1322,"children":3039},[3040,3041,3042,3043,3044],{"id":1398,"depth":2512,"text":1399},{"id":1466,"depth":2512,"text":597},{"id":1544,"depth":2512,"text":1545},{"id":1611,"depth":2512,"text":1612},{"id":1746,"depth":2512,"text":1747},{"id":1788,"depth":2491,"text":1789,"children":3046},[3047,3048],{"id":1817,"depth":2512,"text":1399},{"id":1826,"depth":2512,"text":597},{"id":1982,"depth":2491,"text":1983,"children":3050},[3051,3052],{"id":1989,"depth":2512,"text":1990},{"id":2003,"depth":2512,"text":2004},{"id":2062,"depth":2491,"text":2063,"children":3054},[3055,3056,3057,3058,3059],{"id":2086,"depth":2512,"text":2087},{"id":2146,"depth":2512,"text":2147},{"id":2240,"depth":2512,"text":2241},{"id":2391,"depth":2512,"text":2392},{"id":2632,"depth":2512,"text":2633},{"id":2664,"depth":2491,"text":2665,"children":3061},[3062,3063],{"id":2758,"depth":2512,"text":2759},{"id":2927,"depth":2512,"text":2928},{"id":2946,"depth":2491,"text":1769},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fwebsite\u002Fedit\u002Fmain\u002Fnuxt\u002Fcontent-guides\u002Fflowfuse-nodes\u002Fhub\u002Fkafka.md","md",null,{},true,"\u002Fdocs\u002Fflowfuse-nodes\u002Fhub\u002Fkafka",{"title":5,"description":16},"docs\u002Fflowfuse-nodes\u002Fhub\u002Fkafka","2026-09-09 17:44:30 +0530","B-BJHGleR8fyel7sPhKPpDG0QM-sX5unUiKOgtHyMf0",{"id":3076,"extension":3077,"meta":3078,"sections":3079,"stem":3478,"__hash__":3479},"featureCatalog\u002Ffeature-catalog.yml","yml",{},[3080,3141,3242,3304,3381,3460],{"id":3081,"title":3082,"features":3083},"ai-automation","AI & Automation",[3084,3094,3104,3114,3120,3130,3136],{"id":3085,"title":3086,"description":3087,"docsLink":3088,"changelog":3089,"tiers":3093},"flowfuse-expert-ai","FlowFuse Expert AI","Build industrial apps with agents, and query the state of the factory with an agent. Adapt your current hardware and machines so agentic work can be done against them, without ripping and replacing what's already on the plant floor.","\u002Fdocs\u002Fuser\u002Fexpert\u002F",[3090],{"url":3091,"release":3092},"\u002Fchangelog\u002F2026\u002F02\u002Fff-expert-update-banner\u002F","2.28",{"edge":3069,"hub":3069,"fleet":3069},{"id":3095,"title":3096,"description":3097,"docsLink":3098,"changelog":3099,"subfeature":3069,"showOnPricing":3102,"tiers":3103},"flowfuse-expert-support-mode","Support Mode","Chat-based assistance for FlowFuse and Node-RED, including Node-RED instance management through natural language.","\u002Fdocs\u002Fuser\u002Fexpert\u002Fchat\u002F#support-mode",[3100],{"url":3101,"release":3092},"\u002Fchangelog\u002F2026\u002F02\u002Fff-expert-debug-log-context\u002F",false,{"edge":3069,"hub":3069,"fleet":3069},{"id":3105,"title":3106,"description":3107,"docsLink":3108,"changelog":3109,"subfeature":3069,"showOnPricing":3102,"tiers":3113},"flowfuse-expert-application-building","Application Building","Describe what you want to build and FlowFuse Expert assembles it on your workspace, adding tabs, wiring nodes, and configuring properties.","\u002Fdocs\u002Fuser\u002Fexpert\u002Fchat\u002F",[3110],{"url":3111,"release":3112},"\u002Fchangelog\u002F2026\u002F05\u002Fexpert-application-building\u002F","2.30",{"edge":3069,"hub":3069,"fleet":3069},{"id":3115,"title":3116,"description":3117,"docsLink":3118,"subfeature":3069,"beta":3069,"showOnPricing":3102,"tiers":3119},"flowfuse-expert-insights-mode","Insights Mode","Connects FlowFuse Expert to MCP servers in your Node-RED instances, enabling real-time data queries and actions through a single chat interface.","\u002Fdocs\u002Fuser\u002Fexpert\u002Fchat\u002F#insights-mode",{"edge":3069,"hub":3069,"fleet":3069},{"id":3121,"title":3122,"description":3123,"docsLink":3124,"changelog":3125,"tiers":3129},"third-party-agents","Connect Your Own AI Agent","Point the AI agent your company already uses at FlowFuse, so it can query your teams and instances and build Node-RED applications, with you deciding which teams it reaches and whether it can make changes.","\u002Fdocs\u002Fuser\u002Fexpert\u002Fthird-party-agents\u002F",[3126],{"url":3127,"release":3128},"\u002Fchangelog\u002F2026\u002F08\u002Fconnect-your-own-ai-agent\u002F","3.0",{"edge":3069,"hub":3069,"fleet":3069},{"id":3131,"title":3132,"description":3133,"docsLink":3134,"tiers":3135},"mcp-servers","Agentic Operations","Expose your Node-RED flows as tools an AI agent can call directly, so agents can query the state of the factory or trigger actions without custom integration work.","\u002Fdocs\u002Fflowfuse-nodes\u002Fmcp\u002F",{"edge":3069,"hub":3069,"fleet":3069},{"id":3137,"title":3138,"description":3139,"tiers":3140},"onnx-integration","ONNX Integration","Run trained machine learning models directly in your flows, including on edge hardware, without sending data out to an external inference service.",{"edge":3069,"hub":3069,"fleet":3069},{"id":3142,"title":3143,"features":3144},"build","Build",[3145,3151,3157,3167,3173,3179,3183,3189,3195,3203,3209,3213,3217,3226,3234],{"id":3146,"title":3147,"description":3148,"docsLink":3149,"tiers":3150},"edge-development","Edge Development","Develop and test Node-RED flows directly on edge devices with a remote editor proxy.","\u002Fdocs\u002Fdevice-agent\u002Fquickstart\u002F",{"edge":3069,"hub":3102,"fleet":3069},{"id":3152,"title":3153,"description":3154,"docsLink":3155,"tiers":3156},"private-npm-registry","Custom Node-RED Nodes","Create and manage your own private npm registry for Node-RED nodes, so you can share custom nodes across your team and devices without publishing them publicly.","\u002Fdocs\u002Fuser\u002Fcustom-npm-packages\u002F",{"edge":3069,"hub":3069,"fleet":3069},{"id":3158,"title":3159,"description":3160,"docsLink":3161,"changelog":3162,"tiers":3166},"flowfuse-tables","FlowFuse Tables","A managed PostgreSQL database for every application, so you can store and query structured data without standing up and maintaining your own database.","\u002Fdocs\u002Fuser\u002Fff-tables\u002F",[3163],{"url":3164,"release":3165},"\u002Fchangelog\u002F2026\u002F07\u002Fexpert-tables-automation\u002F","2.33",{"edge":3069,"hub":3069,"fleet":3069},{"id":3168,"title":3169,"description":3170,"docsLink":3171,"tiers":3172},"persistent-files","File Storage","Store and retrieve files from your Node-RED flows, with automatic replication and backup across your devices and hosted instances.","\u002Fdocs\u002Finstall\u002Ffile-storage\u002F",{"edge":3069,"hub":3069,"fleet":3069},{"id":3174,"title":3175,"description":3176,"docsLink":3177,"showOnPricing":3102,"tiers":3178},"persistent-context","Persistent Context","In-memory values defined in a Node-RED flow persist across project restarts and upgrades.","\u002Fdocs\u002Fuser\u002Fpersistent-context\u002F",{"edge":3069,"hub":3069,"fleet":3069},{"id":3180,"title":3181,"showOnPricing":3102,"tiers":3182},"static-assets","Static Assets",{"edge":3069,"hub":3069,"fleet":3069},{"id":3184,"title":3185,"description":3186,"docsLink":3187,"tiers":3188},"team-library","Team Library","Set up standard nodes and flows that can be shared with all team members across your organisation.","\u002Fdocs\u002Fuser\u002Fshared-library\u002F",{"edge":3069,"hub":3069,"fleet":3069},{"id":3190,"title":3191,"description":3192,"docsLink":3193,"tiers":3194},"personalised-multi-user-dashboards","Personalised Multi-User Dashboards","Build applications that provide unique data to each logged-in user using personalised multi-user dashboards.","https:\u002F\u002Fdashboard.flowfuse.com\u002Fuser\u002Fmulti-tenancy.html",{"edge":3069,"hub":3069,"fleet":3069},{"id":3196,"title":3197,"description":3198,"changelog":3199,"subfeature":3069,"showOnPricing":3102,"tiers":3202},"dashboards-view","Dashboards View","Browse and open every dashboard across your team from a dedicated Dashboards view, at both team and application level, without leaving FlowFuse.",[3200],{"url":3201,"release":3165},"\u002Fchangelog\u002F2026\u002F07\u002Fteam-and-application-dashboards\u002F",{"edge":3069,"hub":3069,"fleet":3069},{"id":3204,"title":3205,"description":3206,"docsLink":3207,"tiers":3208},"blueprints-converge","Blueprints","Ready-made starting points for your apps, from cross-team Converge templates to OT and IT specific blueprints.","\u002Fdocs\u002Fuser\u002Fconcepts\u002F#blueprint",{"edge":3069,"hub":3069,"fleet":3069},{"id":3210,"title":3211,"subfeature":3069,"showOnPricing":3102,"tiers":3212},"blueprints-ot-apps","Blueprints - OT APPS",{"edge":3069,"hub":3102,"fleet":3069},{"id":3214,"title":3215,"subfeature":3069,"showOnPricing":3102,"tiers":3216},"blueprints-it-apps","Blueprints - IT APPS",{"edge":3102,"hub":3069,"fleet":3102},{"id":3218,"title":3219,"description":3220,"changelog":3221,"showOnPricing":3102,"tiers":3225},"immersive-editor-snapshots","Snapshot Details in Immersive Editor","View and manage snapshot details directly inside the immersive editor without leaving your editing session.",[3222],{"url":3223,"release":3224},"\u002Fchangelog\u002F2026\u002F03\u002Fsnapshot-detail-modal-immersive-editor\u002F","2.29",{"edge":3069,"hub":3069,"fleet":3069},{"id":3227,"title":3228,"description":3229,"changelog":3230,"showOnPricing":3102,"tiers":3233},"immersive-editor-drawer","Customisable Immersive Editor Drawer","Pin, move, resize, or full-screen the immersive editor drawer. Your preferences are remembered between sessions.",[3231],{"url":3232,"release":3112},"\u002Fchangelog\u002F2026\u002F04\u002Fimmersive-editor-drawer\u002F",{"edge":3069,"hub":3069,"fleet":3069},{"id":3235,"title":3236,"description":3237,"changelog":3238,"showOnPricing":3102,"tiers":3241},"embedded-editor-tab-title","Embedded Editor Browser Tab Title","The browser tab title updates to reflect the active Node-RED canvas tab when working in the embedded editor.",[3239],{"url":3240,"release":3224},"\u002Fchangelog\u002F2026\u002F03\u002Fembedded-editor-tab-title\u002F",{"edge":3069,"hub":3069,"fleet":3069},{"id":3243,"title":3244,"features":3245},"deploy","Deploy",[3246,3252,3261,3267,3273,3279,3285,3291,3296],{"id":3247,"title":3248,"description":3249,"docsLink":3250,"tiers":3251},"hosted-instances","Cloud Instances","Run Node-RED instances managed and hosted by FlowFuse.","\u002Fdocs\u002Fuser\u002Fintroduction\u002F#creating-a-node-red-instance",{"edge":3069,"hub":3069,"fleet":3069},{"id":3253,"title":3254,"description":3255,"docsLink":3256,"changelog":3257,"tiers":3260},"edge-devices","Edge Instances","Deploy and mange your Node-RED instances on edge PLCs and gateways, with full visibility and control from the cloud.","\u002Fdocs\u002Fdevice-agent\u002Fintroduction\u002F",[3258],{"url":3259,"release":3092},"\u002Fchangelog\u002F2026\u002F02\u002Fdevice-agent-nodejs-options\u002F",{"edge":3069,"hub":3102,"fleet":3069},{"id":3262,"title":3263,"description":3264,"docsLink":3265,"tiers":3266},"custom-hostnames","Custom Hostnames","Access your Node-RED application via your own domain name.","\u002Fdocs\u002Fuser\u002Fcustom-hostnames\u002F",{"edge":3102,"hub":3069,"fleet":3102},{"id":3268,"title":3269,"description":3270,"docsLink":3271,"tiers":3272},"mqtt-broker","MQTT Broker","Manage and create MQTT clients to transport data for efficient messaging and communication within your applications.","\u002Fdocs\u002Fuser\u002Fteambroker\u002F",{"edge":3069,"hub":3102,"fleet":3069},{"id":3274,"title":3275,"description":3276,"docsLink":3277,"showOnPricing":3102,"tiers":3278},"project-nodes","Project Nodes aka seamless project comms","FlowFuse Project Nodes enable the passing of data and messages between your Node-RED projects.","\u002Fdocs\u002Fuser\u002Fprojectnodes\u002F",{"edge":3069,"hub":3069,"fleet":3069},{"id":3280,"title":3281,"description":3282,"docsLink":3283,"tiers":3284},"devops-pipelines","DevOps Pipelines","Set up different environments for development, testing, and production Node-RED instances to support a full software delivery lifecycle.","\u002Fdocs\u002Fuser\u002Fdevops-pipelines\u002F",{"edge":3069,"hub":3069,"fleet":3069},{"id":3286,"title":3287,"description":3288,"docsLink":3289,"tiers":3290},"git-integration","Git Integration","Back up your flows to a remote Git repository through a DevOps Pipeline. Supports GitHub and Azure DevOps repositories.","\u002Fdocs\u002Fuser\u002Fdevops-pipelines\u002F#git-repository-stage",{"edge":3102,"hub":3069,"fleet":3102},{"id":3292,"title":3293,"description":3294,"docsLink":3289,"subfeature":3069,"showOnPricing":3102,"tiers":3295},"git-integration-github","GitHub","Push and pull snapshots to GitHub repositories through DevOps Pipeline Git Stages.",{"edge":3102,"hub":3069,"fleet":3102},{"id":3297,"title":3298,"description":3299,"docsLink":3289,"changelog":3300,"subfeature":3069,"showOnPricing":3102,"tiers":3303},"git-integration-azure","Azure DevOps","Push and pull snapshots to Azure DevOps repositories through DevOps Pipeline Git Stages.",[3301],{"url":3302,"release":3224},"\u002Fchangelog\u002F2026\u002F03\u002Fazure-dev-ops-gitops\u002F",{"edge":3102,"hub":3069,"fleet":3102},{"id":3305,"title":3306,"features":3307},"operate-maintain","Operate & Maintain",[3308,3314,3320,3325,3333,3337,3341,3346,3352,3358,3363,3369,3373,3377],{"id":3309,"title":3310,"description":3311,"docsLink":3312,"tiers":3313},"snapshots","Snapshots & Version History","Automatic snapshots on remote devices and hosted instances, plus a full version history timeline so you can roll back to any prior state.","\u002Fdocs\u002Fuser\u002Fsnapshots\u002F",{"edge":3069,"hub":3069,"fleet":3069},{"id":3315,"title":3316,"description":3317,"docsLink":3318,"subfeature":3069,"showOnPricing":3102,"tiers":3319},"auto-snapshot-remote","Auto Snapshot (Remote)","Automatically capture a snapshot every time a remote instance is deployed, so you always have a recoverable history of what was running on each device.","\u002Fdocs\u002Fuser\u002Fsnapshots\u002F#auto-snapshots",{"edge":3069,"hub":3069,"fleet":3069},{"id":3321,"title":3322,"description":3323,"docsLink":3318,"subfeature":3069,"showOnPricing":3102,"tiers":3324},"auto-snapshot-hosted","Auto Snapshot (Hosted)","Automatically capture a snapshot every time a hosted instance is deployed, so you always have a recoverable history of what was running.",{"edge":3069,"hub":3069,"fleet":3069},{"id":3326,"title":3327,"description":3328,"changelog":3329,"subfeature":3069,"showOnPricing":3102,"tiers":3332},"snapshot-comparison","Snapshot Comparison","Compare two snapshots side-by-side with a navigable diff view. Step through every changed, added, or deleted node and see property and code diffs.",[3330],{"url":3331,"release":3224},"\u002Fchangelog\u002F2026\u002F04\u002Fsnapshot-diff-viewer\u002F",{"edge":3069,"hub":3069,"fleet":3069},{"id":3334,"title":3335,"subfeature":3069,"showOnPricing":3102,"tiers":3336},"version-history-timeline","Version History Timeline",{"edge":3069,"hub":3069,"fleet":3069},{"id":3338,"title":3339,"tiers":3340},"unlimited-workflow-executions","Unlimited Workflow Executions",{"edge":3069,"hub":3069,"fleet":3069},{"id":3342,"title":3343,"description":3344,"tiers":3345},"device-fleet-updates","Device Fleet Updates","Connect to edge devices to quickly assess and update logic. Debug one device and roll out improvements to your fleet in minutes, securely without requiring full device access for your whole organisation.",{"edge":3069,"hub":3102,"fleet":3069},{"id":3347,"title":3348,"description":3349,"docsLink":3350,"tiers":3351},"device-group-management","Device Group Management","Logically group devices assigned to an application and integrate device groups into your DevOps Pipeline for coordinated fleet updates.","\u002Fdocs\u002Fuser\u002Fdevice-groups\u002F",{"edge":3069,"hub":3102,"fleet":3069},{"id":3353,"title":3354,"description":3355,"docsLink":3356,"tiers":3357},"high-availability","High Availability","Leverage horizontal scaling for reliable and scalable processing of your data through Node-RED.","\u002Fdocs\u002Fuser\u002Fhigh-availability\u002F",{"edge":3102,"hub":3069,"fleet":3102},{"id":3359,"title":3360,"description":3361,"tiers":3362},"performance-monitoring","Performance Monitoring & Alerts","Track CPU, memory, and event loop performance across your instances and devices, with email alerts when something needs your attention.",{"edge":3069,"hub":3069,"fleet":3069},{"id":3364,"title":3365,"description":3366,"docsLink":3367,"subfeature":3069,"showOnPricing":3102,"tiers":3368},"instance-monitoring","Instance Monitoring","Enable alerts to be sent via email when your Node-RED instances encounter issues.","\u002Fdocs\u002Fuser\u002Finstance-settings\u002F#alerts",{"edge":3069,"hub":3069,"fleet":3069},{"id":3370,"title":3371,"subfeature":3069,"showOnPricing":3102,"tiers":3372},"email-alerts","Email Alerts",{"edge":3069,"hub":3069,"fleet":3069},{"id":3374,"title":3375,"showOnPricing":3102,"tiers":3376},"api-debug-length-limit","API\u002FDebug Length Limit",{"edge":3069,"hub":3069,"fleet":3069},{"id":3378,"title":3379,"tiers":3380},"protected-instances","Protected Instances",{"edge":3102,"hub":3069,"fleet":3102},{"id":3382,"title":3383,"features":3384},"govern-secure","Govern and Secure",[3385,3394,3400,3406,3411,3417,3423,3429,3437,3443,3449,3455],{"id":3386,"title":3387,"description":3388,"docsLink":3389,"changelog":3390,"tiers":3393},"single-sign-on","Single Sign-On (SSO)","Configure FlowFuse to work with your own SSO provider, allowing users to access FlowFuse with a single set of login credentials.","\u002Fdocs\u002Fadmin\u002Fsso\u002F",[3391],{"url":3392,"release":3165},"\u002Fchangelog\u002F2026\u002F07\u002Fapplication-sso-groups\u002F",{"edge":3069,"hub":3069,"fleet":3069},{"id":3395,"title":3396,"description":3397,"docsLink":3398,"tiers":3399},"two-factor-authentication","Two-Factor Authentication","Two-factor authentication adds an extra layer of security to your FlowFuse account.","\u002Fdocs\u002Fuser\u002Fuser-settings\u002F#two-factor-authentication",{"edge":3069,"hub":3069,"fleet":3069},{"id":3401,"title":3402,"description":3403,"docsLink":3404,"tiers":3405},"certified-nodes-it","Certified Nodes - IT","IT certified node bundle includes: Redis, MQTT, HTTP Request, AI nodes (Gemini, Claude, ChatGPT, Ollama), MCP Server","\u002Fblog\u002F2025\u002F07\u002Fcertified-nodes-v2\u002F",{"edge":3102,"hub":3069,"fleet":3069},{"id":3407,"title":3408,"description":3409,"tiers":3410},"certified-nodes-ot","Certified OT Connections - OPC-UA, Modbus, etc.","OT certified node bundle includes: OPC-UA, Modbus TCP & RTU, RTSP, EtherNet\u002FIP, AI nodes (Gemini, Claude, ChatGPT, Ollama), MCP Server",{"edge":3069,"hub":3102,"fleet":3102},{"id":3412,"title":3413,"description":3414,"docsLink":3415,"tiers":3416},"audit-log","Audit Log","Keep track of everything going on in your Node-RED instances and FlowFuse. Audit Logs provide details on what actions have taken place, when they happened, and who did them.","\u002Fdocs\u002Fuser\u002Flogs\u002F#audit-log",{"edge":3069,"hub":3069,"fleet":3069},{"id":3418,"title":3419,"description":3420,"docsLink":3421,"tiers":3422},"role-based-access-control","Role-Based Access Control","Control who can do what at both the team and application level, from viewers to admins.","\u002Fdocs\u002Fuser\u002Frole-based-access-control\u002F",{"edge":3069,"hub":3069,"fleet":3069},{"id":3424,"title":3425,"description":3426,"docsLink":3427,"subfeature":3069,"showOnPricing":3102,"tiers":3428},"application-level-rbac","Application-Level RBAC","Fine-grained access control per application, allowing team members to have different permission levels across different applications without requiring separate teams.","\u002Fdocs\u002Fuser\u002Frole-based-access-control\u002F#application-level-rbac",{"edge":3069,"hub":3069,"fleet":3069},{"id":3430,"title":3431,"description":3432,"changelog":3433,"subfeature":3069,"showOnPricing":3102,"tiers":3436},"scoped-personal-access-tokens","Scoped Personal Access Tokens","Restrict a Personal Access Token to specific teams, limit it to read-only operations, or control whether it carries admin privileges.",[3434],{"url":3435,"release":3165},"\u002Fchangelog\u002F2026\u002F07\u002Fscoped-pats\u002F",{"edge":3069,"hub":3069,"fleet":3069},{"id":3438,"title":3439,"description":3440,"docsLink":3441,"showOnPricing":3102,"tiers":3442},"team-members","Team Members","Invite multiple team members to collaborate on the same Node-RED flows.","\u002Fdocs\u002Fuser\u002Fteam\u002F#teams",{"edge":3069,"hub":3069,"fleet":3069},{"id":3444,"title":3445,"description":3446,"docsLink":3447,"showOnPricing":3102,"tiers":3448},"endpoint-security","Endpoint Security","Secure HTTP endpoints for hosted Node-RED instances using FlowFuse credentials.","\u002Fdocs\u002Fuser\u002Finstance-settings\u002F#security",{"edge":3069,"hub":3069,"fleet":3069},{"id":3450,"title":3451,"description":3452,"docsLink":3453,"tiers":3454},"baa-for-hipaa","BAA for HIPAA","FlowFuse can sign a Business Associate Agreement to ensure proper safeguarding of protected health information handled on your behalf.","\u002Fhandbook\u002Fsales\u002Fsubscription-agreement-1.6\u002F",{"edge":3102,"hub":3069,"fleet":3102},{"id":3456,"title":3457,"description":3458,"tiers":3459},"sbom","Software Bill of Materials","A complete list of all software components used in your Node-RED instances and hosted applications, including version numbers and license information.",{"edge":3102,"hub":3069,"fleet":3102},{"id":3461,"title":3462,"features":3463},"support","Support",[3464,3469,3473],{"id":3465,"title":3466,"docsLink":3467,"tiers":3468},"installation-support","Installation Support","\u002Fdocs\u002Finstall\u002Fintroduction\u002F#do-you-need-help-installation-service",{"edge":3069,"hub":3069,"fleet":3069},{"id":3470,"title":3471,"showOnPricing":3102,"tiers":3472},"live-chat-support","Live Chat Support",{"edge":3069,"hub":3069,"fleet":3069},{"id":3474,"title":3475,"docsLink":3476,"tiers":3477},"enterprise-support","Enterprise Support","\u002Fdocs\u002Fpremium-support\u002F",{"edge":3069,"hub":3069,"fleet":3069},"feature-catalog","v5NjPsqOkQexQ0Fk82nqY6ZEXj128lclDvrIkmsKbpM",[3481,3567,3808,3878,3891,4035,4045,4126],{"name":3482,"order":3483,"children":3484},"Application Guide",0,[3485,3533],{"title":3486,"path":3487,"group":3482,"groupOrder":3483,"order":2415,"children":3488},"Building FlowFuse applications","\u002Fdocs\u002Fapplication-guide",[3489,3493,3505,3509,3525],{"title":3490,"path":3491,"order":2415,"children":3492},"Foundations","\u002Fdocs\u002Fapplication-guide\u002Ffoundations",[],{"title":3494,"path":3495,"order":2491,"children":3496},"App delivery methods","\u002Fdocs\u002Fapplication-guide\u002Fapp-delivery-methods",[3497,3501],{"title":3498,"path":3499,"order":2415,"children":3500},"Hardware apps","\u002Fdocs\u002Fapplication-guide\u002Fapp-delivery-methods\u002Fhardware-apps",[],{"title":3502,"path":3503,"order":2491,"children":3504},"Software apps","\u002Fdocs\u002Fapplication-guide\u002Fapp-delivery-methods\u002Fsoftware-apps",[],{"title":3506,"path":3507,"order":2512,"children":3508},"Data plane","\u002Fdocs\u002Fapplication-guide\u002Fdata-plane",[],{"title":3510,"path":3511,"order":2527,"children":3512},"Architectures","\u002Fdocs\u002Fapplication-guide\u002Farchitectures",[3513,3517,3521],{"title":3514,"path":3515,"order":2415,"children":3516},"IT architectures","\u002Fdocs\u002Fapplication-guide\u002Farchitectures\u002Fit",[],{"title":3518,"path":3519,"order":2491,"children":3520},"OT architectures","\u002Fdocs\u002Fapplication-guide\u002Farchitectures\u002Fot",[],{"title":3522,"path":3523,"order":2512,"children":3524},"IIoT architectures","\u002Fdocs\u002Fapplication-guide\u002Farchitectures\u002Fiiot",[],{"title":3526,"path":3527,"order":2542,"children":3528},"Worked examples","\u002Fdocs\u002Fapplication-guide\u002Fworked-examples",[3529],{"title":3530,"path":3531,"order":2415,"children":3532},"OEE, end to end","\u002Fdocs\u002Fapplication-guide\u002Fworked-examples\u002Foee",[],{"title":3534,"path":3535,"group":3482,"groupOrder":3483,"order":2491,"children":3536},"Designing Node-RED flows","\u002Fdocs\u002Fnode-red-guide",[3537,3540,3556],{"title":3490,"path":3538,"order":2415,"children":3539},"\u002Fdocs\u002Fnode-red-guide\u002Ffoundations",[],{"title":3541,"path":3542,"order":2491,"children":3543},"Patterns","\u002Fdocs\u002Fnode-red-guide\u002Fpatterns",[3544,3548,3552],{"title":3545,"path":3546,"order":2415,"children":3547},"Design patterns","\u002Fdocs\u002Fnode-red-guide\u002Fpatterns\u002Fdesign-patterns",[],{"title":3549,"path":3550,"order":2491,"children":3551},"Handling data","\u002Fdocs\u002Fnode-red-guide\u002Fpatterns\u002Fhandling-data",[],{"title":3553,"path":3554,"order":2512,"children":3555},"Good form","\u002Fdocs\u002Fnode-red-guide\u002Fpatterns\u002Fgood-form",[],{"title":3526,"path":3557,"order":2512,"children":3558},"\u002Fdocs\u002Fnode-red-guide\u002Fworked-examples",[3559,3563],{"title":3560,"path":3561,"order":2415,"children":3562},"OEE - Edge Aggregator","\u002Fdocs\u002Fnode-red-guide\u002Fworked-examples\u002Foee-edge-aggregator",[],{"title":3564,"path":3565,"order":2491,"children":3566},"OEE - Central Dashboard","\u002Fdocs\u002Fnode-red-guide\u002Fworked-examples\u002Foee-central-dashboard",[],{"name":3568,"order":2415,"children":3569},"FlowFuse User Manuals",[3570,3695,3699,3711],{"title":3571,"path":3572,"group":3568,"groupOrder":2415,"order":2415,"children":3573,"link":3102},"Using FlowFuse","\u002Fdocs\u002Fuser",[3574,3578,3582,3586,3590,3595,3599,3602,3606,3610,3613,3617,3633,3637,3641,3645,3649,3652,3656,3660,3664,3668,3672,3675,3679,3683,3687,3691],{"title":3575,"path":3576,"order":2415,"children":3577},"Getting Started","\u002Fdocs\u002Fuser\u002Fintroduction",[],{"title":3579,"path":3580,"order":2415,"children":3581},"Static asset service","\u002Fdocs\u002Fuser\u002Fstatic-asset-service",[],{"title":3583,"path":3584,"order":2491,"children":3585},"Bill of Materials","\u002Fdocs\u002Fuser\u002Fbill-of-materials",[],{"title":3587,"path":3588,"order":2491,"children":3589},"FlowFuse Concepts","\u002Fdocs\u002Fuser\u002Fconcepts",[],{"title":3591,"path":3592,"order":3593,"children":3594},"Instance States","\u002Fdocs\u002Fuser\u002Finstance-states",10,[],{"title":3596,"path":3597,"order":3067,"children":3598},"Changing the Stack","\u002Fdocs\u002Fuser\u002Fchangestack",[],{"title":3263,"path":3600,"order":3067,"children":3601},"\u002Fdocs\u002Fuser\u002Fcustom-hostnames",[],{"title":3603,"path":3604,"order":3067,"children":3605},"Custom Node Packages","\u002Fdocs\u002Fuser\u002Fcustom-npm-packages",[],{"title":3607,"path":3608,"order":3067,"children":3609},"Dashboards","\u002Fdocs\u002Fuser\u002Fdashboards",[],{"title":3281,"path":3611,"order":3067,"children":3612},"\u002Fdocs\u002Fuser\u002Fdevops-pipelines",[],{"title":3614,"path":3615,"order":3067,"children":3616},"Environment Variables","\u002Fdocs\u002Fuser\u002Fenvvar",[],{"title":3618,"path":3619,"order":3067,"children":3620},"FlowFuse Expert","\u002Fdocs\u002Fuser\u002Fexpert",[3621,3625,3629],{"title":3622,"path":3623,"order":3067,"children":3624},"AI in Node-RED","\u002Fdocs\u002Fuser\u002Fexpert\u002Fnode-red-embedded-ai",[],{"title":3626,"path":3627,"order":3067,"children":3628},"Chat Interface","\u002Fdocs\u002Fuser\u002Fexpert\u002Fchat",[],{"title":3630,"path":3631,"order":3067,"children":3632},"Connect Your Own Agent","\u002Fdocs\u002Fuser\u002Fexpert\u002Fthird-party-agents",[],{"title":3634,"path":3635,"order":3067,"children":3636},"FlowFuse File Nodes","\u002Fdocs\u002Fuser\u002Ffilenodes",[],{"title":3638,"path":3639,"order":3067,"children":3640},"FlowFuse MQTT Nodes","\u002Fdocs\u002Fuser\u002Fmqtt-nodes",[],{"title":3642,"path":3643,"order":3067,"children":3644},"FlowFuse Persistent Context","\u002Fdocs\u002Fuser\u002Fpersistent-context",[],{"title":3646,"path":3647,"order":3067,"children":3648},"FlowFuse Project Nodes","\u002Fdocs\u002Fuser\u002Fprojectnodes",[],{"title":3159,"path":3650,"order":3067,"children":3651},"\u002Fdocs\u002Fuser\u002Fff-tables",[],{"title":3653,"path":3654,"order":3067,"children":3655},"Groups","\u002Fdocs\u002Fuser\u002Fdevice-groups",[],{"title":3657,"path":3658,"order":3067,"children":3659},"High Availability mode","\u002Fdocs\u002Fuser\u002Fhigh-availability",[],{"title":3661,"path":3662,"order":3067,"children":3663},"HTTP Access Tokens","\u002Fdocs\u002Fuser\u002Fhttp-access-tokens",[],{"title":3665,"path":3666,"order":3067,"children":3667},"Instance Settings","\u002Fdocs\u002Fuser\u002Finstance-settings",[],{"title":3669,"path":3670,"order":3067,"children":3671},"Logging","\u002Fdocs\u002Fuser\u002Flogs",[],{"title":3419,"path":3673,"order":3067,"children":3674},"\u002Fdocs\u002Fuser\u002Frole-based-access-control",[],{"title":3676,"path":3677,"order":3067,"children":3678},"Shared Team Library","\u002Fdocs\u002Fuser\u002Fshared-library",[],{"title":3680,"path":3681,"order":3067,"children":3682},"Snapshots","\u002Fdocs\u002Fuser\u002Fsnapshots",[],{"title":3684,"path":3685,"order":3067,"children":3686},"Team Broker","\u002Fdocs\u002Fuser\u002Fteambroker",[],{"title":3688,"path":3689,"order":3067,"children":3690},"Teams","\u002Fdocs\u002Fuser\u002Fteam",[],{"title":3692,"path":3693,"order":3067,"children":3694},"User Settings","\u002Fdocs\u002Fuser\u002Fuser-settings",[],{"title":3696,"path":3697,"group":3568,"groupOrder":2415,"order":2491,"children":3698},"FlowFuse API","\u002Fdocs\u002Fapi",[],{"title":3700,"path":3701,"group":3568,"groupOrder":2415,"order":2512,"children":3702,"link":3102},"Migrating a Node-RED project to FlowFuse","\u002Fdocs\u002Fmigration",[3703,3707],{"title":3704,"path":3705,"order":2415,"children":3706},"Introduction","\u002Fdocs\u002Fmigration\u002Fintroduction",[],{"title":3708,"path":3709,"order":3067,"children":3710},"Node-RED Tools plugin","\u002Fdocs\u002Fmigration\u002Fnode-red-tools",[],{"title":3712,"path":3713,"group":3568,"groupOrder":2415,"order":2527,"children":3714},"FlowFuse Node-RED nodes","\u002Fdocs\u002Fflowfuse-nodes",[3715,3740,3760,3767,3787,3798],{"title":3716,"path":3717,"order":2415,"children":3718},"AI","\u002Fdocs\u002Fflowfuse-nodes\u002Fai",[3719,3723,3728,3732,3736],{"title":3720,"path":3721,"order":2542,"children":3722},"LLM Nodes","\u002Fdocs\u002Fflowfuse-nodes\u002Fai\u002Fllm-nodes",[],{"title":3724,"path":3725,"order":3726,"children":3727},"Depth Estimation","\u002Fdocs\u002Fflowfuse-nodes\u002Fai\u002Fdepth-estimation",50,[],{"title":3729,"path":3730,"order":3726,"children":3731},"Image Classification","\u002Fdocs\u002Fflowfuse-nodes\u002Fai\u002Fimage-classification",[],{"title":3733,"path":3734,"order":3726,"children":3735},"Object Detection","\u002Fdocs\u002Fflowfuse-nodes\u002Fai\u002Fobject-detection",[],{"title":3737,"path":3738,"order":3726,"children":3739},"ONXX","\u002Fdocs\u002Fflowfuse-nodes\u002Fai\u002Fonxx",[],{"title":3741,"path":3742,"order":2491,"children":3743},"MCP","\u002Fdocs\u002Fflowfuse-nodes\u002Fmcp",[3744,3748,3752,3756],{"title":3745,"path":3746,"order":3726,"children":3747},"MCP Prompt","\u002Fdocs\u002Fflowfuse-nodes\u002Fmcp\u002Fmcp-prompt",[],{"title":3749,"path":3750,"order":3726,"children":3751},"MCP Resource","\u002Fdocs\u002Fflowfuse-nodes\u002Fmcp\u002Fmcp-resource",[],{"title":3753,"path":3754,"order":3726,"children":3755},"MCP Responses","\u002Fdocs\u002Fflowfuse-nodes\u002Fmcp\u002Fmcp-response",[],{"title":3757,"path":3758,"order":3726,"children":3759},"MCP Tool","\u002Fdocs\u002Fflowfuse-nodes\u002Fmcp\u002Fmcp-tool",[],{"title":3159,"path":3761,"order":2512,"children":3762},"\u002Fdocs\u002Fflowfuse-nodes\u002Fflowfuse-tables",[3763],{"title":3764,"path":3765,"order":3726,"children":3766},"Query","\u002Fdocs\u002Fflowfuse-nodes\u002Fflowfuse-tables\u002Fquery",[],{"title":3768,"path":3769,"order":2527,"children":3770},"Edge","\u002Fdocs\u002Fflowfuse-nodes\u002Fedge",[3771,3775,3779,3783],{"title":3772,"path":3773,"order":2415,"children":3774},"RTSP Video Feed","\u002Fdocs\u002Fflowfuse-nodes\u002Fedge\u002Frtsp",[],{"title":3776,"path":3777,"order":2491,"children":3778},"CIP Suite, EtherNet\u002FIP Nodes","\u002Fdocs\u002Fflowfuse-nodes\u002Fedge\u002Fcip-suite",[],{"title":3780,"path":3781,"order":2512,"children":3782},"Modbus","\u002Fdocs\u002Fflowfuse-nodes\u002Fedge\u002Fmodbus",[],{"title":3784,"path":3785,"order":3726,"children":3786},"OPC UA","\u002Fdocs\u002Fflowfuse-nodes\u002Fedge\u002Fopcua",[],{"title":3638,"path":3788,"order":2542,"children":3789},"\u002Fdocs\u002Fflowfuse-nodes\u002Fmqtt",[3790,3794],{"title":3791,"path":3792,"order":3726,"children":3793},"MQTT In","\u002Fdocs\u002Fflowfuse-nodes\u002Fmqtt\u002Fmqtt-in",[],{"title":3795,"path":3796,"order":3726,"children":3797},"MQTT Out","\u002Fdocs\u002Fflowfuse-nodes\u002Fmqtt\u002Fmqtt-out",[],{"title":3799,"path":3800,"order":2542,"children":3801},"Hub","\u002Fdocs\u002Fflowfuse-nodes\u002Fhub",[3802,3806],{"title":3803,"path":3804,"order":2415,"children":3805},"Redis","\u002Fdocs\u002Fflowfuse-nodes\u002Fhub\u002Fredis",[],{"title":5,"path":3070,"order":2491,"children":3807},[],{"name":3809,"order":2491,"children":3810},"Device Agent",[3811,3859],{"title":3809,"path":3812,"group":3809,"groupOrder":2491,"order":2415,"children":3813,"link":3102},"\u002Fdocs\u002Fdevice-agent",[3814,3818,3822,3847,3851,3855],{"title":3815,"path":3816,"order":2415,"children":3817},"FlowFuse Device Agent Introduction","\u002Fdocs\u002Fdevice-agent\u002Fintroduction",[],{"title":3819,"path":3820,"order":2491,"children":3821},"Quick Start","\u002Fdocs\u002Fdevice-agent\u002Fquickstart",[],{"title":3823,"path":3824,"group":3825,"order":2512,"children":3826,"link":3102},"Installation","\u002Fdocs\u002Fdevice-agent\u002Finstall","DeviceAgentInstallation",[3827,3831,3835,3839,3843],{"title":3828,"path":3829,"group":3825,"order":2415,"children":3830},"Overview","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Foverview",[],{"title":3832,"path":3833,"group":3825,"order":2491,"children":3834},"Device Agent Installer","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fdevice-agent-installer",[],{"title":3836,"path":3837,"group":3825,"order":2512,"children":3838},"Docker Install","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fdocker",[],{"title":3840,"path":3841,"group":3825,"order":2527,"children":3842},"Kubernetes Install","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fkubernetes",[],{"title":3844,"path":3845,"group":3825,"order":2542,"children":3846},"Manual Install with NPM","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fmanual",[],{"title":3848,"path":3849,"order":2527,"children":3850},"Register your Remote Instance","\u002Fdocs\u002Fdevice-agent\u002Fregister",[],{"title":3852,"path":3853,"order":2542,"children":3854},"Running the Agent","\u002Fdocs\u002Fdevice-agent\u002Frunning",[],{"title":3856,"path":3857,"order":2592,"children":3858},"Deploying your Flows","\u002Fdocs\u002Fdevice-agent\u002Fdeploy",[],{"title":3860,"path":3861,"group":3809,"groupOrder":2491,"order":2491,"children":3862,"link":3102},"Hardware Guides","\u002Fdocs\u002Fhardware",[3863,3866,3870,3874],{"title":3828,"path":3864,"order":2415,"children":3865},"\u002Fdocs\u002Fhardware\u002Fintroduction",[],{"title":3867,"path":3868,"order":2491,"children":3869},"ctrlX - Node-RED","\u002Fdocs\u002Fhardware\u002Fctrlx-node-red",[],{"title":3871,"path":3872,"order":2512,"children":3873},"ctrlX - Device Agent","\u002Fdocs\u002Fhardware\u002Fctrlx-device-agent",[],{"title":3875,"path":3876,"order":2512,"children":3877},"Raspberry Pi with Raspbian","\u002Fdocs\u002Fhardware\u002Fraspbian",[],{"name":3879,"order":2512,"children":3880},"FlowFuse Cloud",[3881],{"title":3879,"path":3882,"group":3879,"groupOrder":2512,"order":2512,"children":3883,"link":3102},"\u002Fdocs\u002Fcloud",[3884,3887],{"title":3704,"path":3885,"order":2415,"children":3886},"\u002Fdocs\u002Fcloud\u002Fintroduction",[],{"title":3888,"path":3889,"order":3067,"children":3890},"FlowFuse Cloud Billing","\u002Fdocs\u002Fcloud\u002Fbilling",[],{"name":3892,"order":2527,"children":3893},"FlowFuse Self-Hosted",[3894,3897,3976,3988],{"title":3819,"path":3895,"group":3892,"groupOrder":2527,"order":2415,"children":3896},"\u002Fdocs\u002Fquick-start",[],{"title":3898,"path":3899,"group":3892,"groupOrder":2527,"order":2491,"children":3900,"link":3102},"Installing FlowFuse","\u002Fdocs\u002Finstall",[3901,3904,3908,3912,3932,3936,3940,3944,3972],{"title":3828,"path":3902,"order":2415,"children":3903},"\u002Fdocs\u002Finstall\u002Fintroduction",[],{"title":3905,"path":3906,"order":3067,"children":3907},"Configuring FlowFuse","\u002Fdocs\u002Finstall\u002Fconfiguration",[],{"title":3909,"path":3910,"order":3067,"children":3911},"DNS Setup","\u002Fdocs\u002Finstall\u002Fdns-setup",[],{"title":3913,"path":3914,"order":3067,"children":3915},"Docker install","\u002Fdocs\u002Finstall\u002Fdocker",[3916,3920,3924,3928],{"title":3917,"path":3918,"order":3067,"children":3919},"Add Project Stacks on Docker","\u002Fdocs\u002Finstall\u002Fdocker\u002Fstacks",[],{"title":3921,"path":3922,"order":3067,"children":3923},"Docker Engine on Windows","\u002Fdocs\u002Finstall\u002Fdocker\u002Fwindows-docker-ce",[],{"title":3925,"path":3926,"order":3067,"children":3927},"Docker from AWS Market Place","\u002Fdocs\u002Finstall\u002Fdocker\u002Faws-marketplace",[],{"title":3929,"path":3930,"order":3067,"children":3931},"Docker on Digital Ocean","\u002Fdocs\u002Finstall\u002Fdocker\u002Fdigital-ocean",[],{"title":3933,"path":3934,"order":3067,"children":3935},"Email configuration","\u002Fdocs\u002Finstall\u002Femail-providers",[],{"title":3937,"path":3938,"order":3067,"children":3939},"First Run Setup","\u002Fdocs\u002Finstall\u002Ffirst-run",[],{"title":3941,"path":3942,"order":3067,"children":3943},"FlowFuse File Storage","\u002Fdocs\u002Finstall\u002Ffile-storage",[],{"title":3945,"path":3946,"order":3067,"children":3947},"Install FlowFuse on Kubernetes","\u002Fdocs\u002Finstall\u002Fkubernetes",[3948,3952,3956,3960,3964,3968],{"title":3949,"path":3950,"order":3067,"children":3951},"AWS EKS Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws",[],{"title":3953,"path":3954,"order":3067,"children":3955},"AWS EKS Installation with Terraform and Helm","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws-terraform",[],{"title":3957,"path":3958,"order":3067,"children":3959},"Digital Ocean Kubernetes Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fdigital-ocean",[],{"title":3961,"path":3962,"order":3067,"children":3963},"Ingress Controller Migration","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fingress-controller-migration",[],{"title":3965,"path":3966,"order":3067,"children":3967},"Kubernetes Project Stacks","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fstacks",[],{"title":3969,"path":3970,"order":3067,"children":3971},"OpenShift Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fopenshift",[],{"title":3973,"path":3974,"order":3067,"children":3975},"Networking requirements","\u002Fdocs\u002Finstall\u002Fnetworking-requirements",[],{"title":3977,"path":3978,"group":3892,"groupOrder":2527,"order":2512,"children":3979},"Upgrading FlowFuse","\u002Fdocs\u002Fupgrade",[3980,3984],{"title":3981,"path":3982,"order":3067,"children":3983},"Installing a license","\u002Fdocs\u002Fupgrade\u002Fopen-source-to-premium",[],{"title":3985,"path":3986,"order":3067,"children":3987},"Upgrading the Node-RED version","\u002Fdocs\u002Fupgrade\u002Fnodered-version",[],{"title":3989,"path":3990,"group":3892,"groupOrder":2527,"order":2527,"children":3991,"link":3102},"Administering FlowFuse","\u002Fdocs\u002Fadmin",[3992,3995,4007,4015,4019,4023,4027,4031],{"title":3989,"path":3993,"order":2415,"children":3994},"\u002Fdocs\u002Fadmin\u002Fintroduction",[],{"title":3996,"path":3997,"order":3067,"children":3998},"Configuring Single Sign-On (SSO)","\u002Fdocs\u002Fadmin\u002Fsso",[3999,4003],{"title":4000,"path":4001,"order":3067,"children":4002},"LDAP SSO","\u002Fdocs\u002Fadmin\u002Fsso\u002Fldap",[],{"title":4004,"path":4005,"order":3067,"children":4006},"SAML SSO","\u002Fdocs\u002Fadmin\u002Fsso\u002Fsaml",[],{"title":4008,"path":4009,"order":3067,"children":4010,"link":3102},"Hardening","\u002Fdocs\u002Fadmin\u002Fhardening",[4011],{"title":4012,"path":4013,"order":3067,"children":4014},"Kubernetes Hardening","\u002Fdocs\u002Fadmin\u002Fhardening\u002Fkubernetes",[],{"title":4016,"path":4017,"order":3067,"children":4018},"Monitoring","\u002Fdocs\u002Fadmin\u002Fmonitoring",[],{"title":4020,"path":4021,"order":3067,"children":4022},"Observability","\u002Fdocs\u002Fadmin\u002Fobservability",[],{"title":4024,"path":4025,"order":3067,"children":4026},"Soft Launch Enablement","\u002Fdocs\u002Fadmin\u002Ffeature-flags",[],{"title":4028,"path":4029,"order":3067,"children":4030},"Telemetry","\u002Fdocs\u002Fadmin\u002Ftelemetry",[],{"title":4032,"path":4033,"order":3067,"children":4034},"User Management","\u002Fdocs\u002Fadmin\u002Fuser-management",[],{"name":3462,"order":2542,"children":4036},[4037,4041],{"title":4038,"path":4039,"group":3462,"groupOrder":2542,"order":2512,"children":4040},"Premium Support","\u002Fdocs\u002Fpremium-support",[],{"title":4042,"path":4043,"group":3462,"groupOrder":2542,"order":3067,"children":4044},"Debugging Node-RED issues","\u002Fdocs\u002Fdebugging",[],{"name":4046,"order":2592,"children":4047},"Contributing",[4048],{"title":4049,"path":4050,"group":4046,"groupOrder":2592,"order":3067,"children":4051,"link":3102},"Contributing to FlowFuse","\u002Fdocs\u002Fcontribute",[4052,4055,4059,4063,4067,4071,4075,4083,4119,4122],{"title":3704,"path":4053,"order":2415,"children":4054},"\u002Fdocs\u002Fcontribute\u002Fintroduction",[],{"title":4056,"path":4057,"order":3067,"children":4058},"Adding Template Settings","\u002Fdocs\u002Fcontribute\u002Fadding-template-settings",[],{"title":4060,"path":4061,"order":3067,"children":4062},"API Design","\u002Fdocs\u002Fcontribute\u002Fapi-design",[],{"title":4064,"path":4065,"order":3067,"children":4066},"Creating debug stack containers","\u002Fdocs\u002Fcontribute\u002Fcreating-debug-stack-containers",[],{"title":4068,"path":4069,"order":3067,"children":4070},"Database migrations","\u002Fdocs\u002Fcontribute\u002Fdb-migrations",[],{"title":4072,"path":4073,"order":3067,"children":4074},"FlowFuse Architecture","\u002Fdocs\u002Fcontribute\u002Farchitecture",[],{"title":4076,"path":4077,"order":3067,"children":4078},"Local Install","\u002Fdocs\u002Fcontribute\u002Flocal",[4079],{"title":4080,"path":4081,"order":3067,"children":4082},"Local Stacks","\u002Fdocs\u002Fcontribute\u002Flocal\u002Fstacks",[],{"title":4084,"path":4085,"order":3067,"children":4086},"State Flows","\u002Fdocs\u002Fcontribute\u002Fworkflows",[4087,4091,4095,4099,4103,4107,4111,4115],{"title":4088,"path":4089,"order":3067,"children":4090},"Device Editor","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fdevice-editor",[],{"title":4092,"path":4093,"order":3067,"children":4094},"Instance states","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fproject-states",[],{"title":4096,"path":4097,"order":3067,"children":4098},"Invite External Users","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Finvite-external-user",[],{"title":4100,"path":4101,"order":3067,"children":4102},"Project Creation","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fproject-create",[],{"title":4104,"path":4105,"order":3067,"children":4106},"Reset Password Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fpassword-reset",[],{"title":4108,"path":4109,"order":3067,"children":4110},"Team creation Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fteam-create",[],{"title":4112,"path":4113,"order":3067,"children":4114},"User Login Flows","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Flogin",[],{"title":4116,"path":4117,"order":3067,"children":4118},"User Sign up Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fsignup",[],{"title":3684,"path":4120,"order":3067,"children":4121},"\u002Fdocs\u002Fcontribute\u002Fteam-broker",[],{"title":4123,"path":4124,"order":3067,"children":4125},"Working with Feature Flags","\u002Fdocs\u002Fcontribute\u002Ffeature-flags",[],{"name":4127,"order":4128,"children":4129},"Node-RED",7,[4130],{"title":4131,"path":4132,"group":4127,"groupOrder":4128,"order":2415,"children":4133},"Using Node-RED","\u002Fdocs\u002Fnode-red",[4134,4207,4385,4412,4451,4467,4483,4511,4531,4535],{"title":4135,"path":4136,"order":2491,"children":4137},"Getting started","\u002Fdocs\u002Fnode-red\u002Fgetting-started",[4138,4158,4162,4166,4170,4174,4178,4182,4186],{"title":4139,"path":4140,"order":2415,"children":4141},"Editor","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Feditor",[4142,4146,4150,4154],{"title":4143,"path":4144,"order":3726,"children":4145},"Header","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Feditor\u002Fheader",[],{"title":4147,"path":4148,"order":3726,"children":4149},"Palette","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Feditor\u002Fpalette",[],{"title":4151,"path":4152,"order":3726,"children":4153},"Sidebar","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Feditor\u002Fsidebar",[],{"title":4155,"path":4156,"order":3726,"children":4157},"Workspace","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Feditor\u002Fworkspace",[],{"title":4159,"path":4160,"order":2491,"children":4161},"Port Configuration","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Fnode-red-port",[],{"title":4163,"path":4164,"order":2512,"children":4165},"Node-RED Library","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Flibrary",[],{"title":4167,"path":4168,"order":2512,"children":4169},"Update Node-RED","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Fupdate-node-red",[],{"title":4171,"path":4172,"order":2527,"children":4173},"Node-RED On Android","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Fnode-red-android",[],{"title":4175,"path":4176,"order":2542,"children":4177},"Working with Messages","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Fnode-red-messages",[],{"title":4179,"path":4180,"order":2592,"children":4181},"String","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Fstring",[],{"title":4183,"path":4184,"order":4128,"children":4185},"Date & Time","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Fdate-and-time",[],{"title":4187,"path":4188,"order":4189,"children":4190},"Programming","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Fprogramming",8,[4191,4195,4199,4203],{"title":4192,"path":4193,"order":3726,"children":4194},"Data Tranformation","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Fprogramming\u002Fdata-tranformation",[],{"title":4196,"path":4197,"order":3726,"children":4198},"Debugging","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Fprogramming\u002Fdebugging-flows",[],{"title":4200,"path":4201,"order":3726,"children":4202},"If-Else","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Fprogramming\u002Fif-else",[],{"title":4204,"path":4205,"order":3726,"children":4206},"Loop","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Fprogramming\u002Floop",[],{"title":4208,"path":4209,"order":2512,"children":4210},"Core nodes","\u002Fdocs\u002Fnode-red\u002Fcore-nodes",[4211,4247,4287,4329,4349,4373],{"title":4212,"path":4213,"order":2415,"children":4214},"Common nodes","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fcommon",[4215,4219,4223,4227,4231,4235,4239,4243],{"title":4216,"path":4217,"order":2415,"children":4218},"Inject","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fcommon\u002Finject",[],{"title":4220,"path":4221,"order":2491,"children":4222},"Debug","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fcommon\u002Fdebug",[],{"title":4224,"path":4225,"order":2512,"children":4226},"Complete","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fcommon\u002Fcomplete",[],{"title":4228,"path":4229,"order":2527,"children":4230},"Catch","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fcommon\u002Fcatch",[],{"title":4232,"path":4233,"order":2542,"children":4234},"Status","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fcommon\u002Fstatus",[],{"title":4236,"path":4237,"order":2592,"children":4238},"Link","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fcommon\u002Flink",[],{"title":4240,"path":4241,"order":4128,"children":4242},"Comment","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fcommon\u002Fcomment",[],{"title":4244,"path":4245,"order":4189,"children":4246},"Unknown","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fcommon\u002Funknown",[],{"title":4248,"path":4249,"order":2491,"children":4250},"Function nodes","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Ffunction",[4251,4255,4259,4263,4266,4270,4274,4278,4282],{"title":4252,"path":4253,"order":2415,"children":4254},"Function","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Ffunction\u002Ffunction",[],{"title":4256,"path":4257,"order":2491,"children":4258},"Switch","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Ffunction\u002Fswitch",[],{"title":4260,"path":4261,"order":2512,"children":4262},"Change","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Ffunction\u002Fchange",[],{"title":1885,"path":4264,"order":2527,"children":4265},"\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Ffunction\u002Frange",[],{"title":4267,"path":4268,"order":2542,"children":4269},"Template","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Ffunction\u002Ftemplate",[],{"title":4271,"path":4272,"order":2592,"children":4273},"Delay","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Ffunction\u002Fdelay",[],{"title":4275,"path":4276,"order":4128,"children":4277},"Trigger","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Ffunction\u002Ftrigger",[],{"title":4279,"path":4280,"order":4189,"children":4281},"Exec","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Ffunction\u002Fexec",[],{"title":4283,"path":4284,"order":4285,"children":4286},"Filter","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Ffunction\u002Ffilter",9,[],{"title":4288,"path":4289,"order":2512,"children":4290},"Network nodes","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fnetwork",[4291,4295,4299,4302,4305,4309,4313,4317,4321,4325],{"title":4292,"path":4293,"order":2415,"children":4294},"TLS","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fnetwork\u002Ftls",[],{"title":4296,"path":4297,"order":2491,"children":4298},"HTTP Proxy","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fnetwork\u002Fhttp-proxy",[],{"title":3791,"path":4300,"order":2512,"children":4301},"\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fnetwork\u002Fmqtt-in",[],{"title":3795,"path":4303,"order":2527,"children":4304},"\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fnetwork\u002Fmqtt-out",[],{"title":4306,"path":4307,"order":2542,"children":4308},"HTTP in","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fnetwork\u002Fhttp-in",[],{"title":4310,"path":4311,"order":2592,"children":4312},"HTTP request","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fnetwork\u002Fhttp-request",[],{"title":4314,"path":4315,"order":4128,"children":4316},"WebSocket","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fnetwork\u002Fwebsocket",[],{"title":4318,"path":4319,"order":4189,"children":4320},"TCP in","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fnetwork\u002Ftcp-in",[],{"title":4322,"path":4323,"order":4285,"children":4324},"UDP In","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fnetwork\u002Fudp-in",[],{"title":4326,"path":4327,"order":3593,"children":4328},"UDP Out","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fnetwork\u002Fudp-out",[],{"title":4330,"path":4331,"order":2527,"children":4332},"Sequence nodes","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fsequence",[4333,4337,4341,4345],{"title":4334,"path":4335,"order":2415,"children":4336},"Split","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fsequence\u002Fsplit",[],{"title":4338,"path":4339,"order":2491,"children":4340},"Sort","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fsequence\u002Fsort",[],{"title":4342,"path":4343,"order":2512,"children":4344},"Batch","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fsequence\u002Fbatch",[],{"title":4346,"path":4347,"order":2527,"children":4348},"Join","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fsequence\u002Fjoin",[],{"title":4350,"path":4351,"order":2542,"children":4352},"Parser nodes","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fparsers",[4353,4357,4361,4365,4369],{"title":4354,"path":4355,"order":2415,"children":4356},"CSV","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fparsers\u002Fcsv",[],{"title":4358,"path":4359,"order":2491,"children":4360},"HTML","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fparsers\u002Fhtml",[],{"title":4362,"path":4363,"order":2512,"children":4364},"JSON","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fparsers\u002Fjson",[],{"title":4366,"path":4367,"order":2527,"children":4368},"XML","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fparsers\u002Fxml",[],{"title":4370,"path":4371,"order":2542,"children":4372},"YAML","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fparsers\u002Fyaml",[],{"title":4374,"path":4375,"order":2592,"children":4376},"Storage nodes","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fstorage",[4377,4381],{"title":4378,"path":4379,"order":2415,"children":4380},"Write File","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fstorage\u002Fwrite-file",[],{"title":4382,"path":4383,"order":2491,"children":4384},"Read File","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fstorage\u002Fread-file",[],{"title":4386,"path":4387,"order":2527,"children":4388},"Communication protocols","\u002Fdocs\u002Fnode-red\u002Fprotocol",[4389,4393,4397,4400,4404,4408],{"title":4390,"path":4391,"order":3726,"children":4392},"AMQP","\u002Fdocs\u002Fnode-red\u002Fprotocol\u002Famqp",[],{"title":4394,"path":4395,"order":3726,"children":4396},"LwM2M","\u002Fdocs\u002Fnode-red\u002Fprotocol\u002Flwm2m",[],{"title":3780,"path":4398,"order":3726,"children":4399},"\u002Fdocs\u002Fnode-red\u002Fprotocol\u002Fmodbus",[],{"title":4401,"path":4402,"order":3726,"children":4403},"MQTT","\u002Fdocs\u002Fnode-red\u002Fprotocol\u002Fmqtt",[],{"title":4405,"path":4406,"order":3726,"children":4407},"OPC-UA","\u002Fdocs\u002Fnode-red\u002Fprotocol\u002Fopc-ua",[],{"title":4409,"path":4410,"order":3726,"children":4411},"Websocket","\u002Fdocs\u002Fnode-red\u002Fprotocol\u002Fwebsocket",[],{"title":4413,"path":4414,"order":2542,"children":4415},"Databases","\u002Fdocs\u002Fnode-red\u002Fdatabase",[4416,4420,4424,4428,4432,4436,4440,4443,4447],{"title":4417,"path":4418,"order":3726,"children":4419},"DynamoDB","\u002Fdocs\u002Fnode-red\u002Fdatabase\u002Fdynamodb",[],{"title":4421,"path":4422,"order":3726,"children":4423},"Firebase","\u002Fdocs\u002Fnode-red\u002Fdatabase\u002Ffirebase",[],{"title":4425,"path":4426,"order":3726,"children":4427},"InfluxDB","\u002Fdocs\u002Fnode-red\u002Fdatabase\u002Finfluxdb",[],{"title":4429,"path":4430,"order":3726,"children":4431},"MongoDB","\u002Fdocs\u002Fnode-red\u002Fdatabase\u002Fmongodb",[],{"title":4433,"path":4434,"order":3726,"children":4435},"MySQL","\u002Fdocs\u002Fnode-red\u002Fdatabase\u002Fmysql",[],{"title":4437,"path":4438,"order":3726,"children":4439},"PostgreSQL","\u002Fdocs\u002Fnode-red\u002Fdatabase\u002Fpostgresql",[],{"title":3803,"path":4441,"order":3726,"children":4442},"\u002Fdocs\u002Fnode-red\u002Fdatabase\u002Fredis",[],{"title":4444,"path":4445,"order":3726,"children":4446},"SQLite","\u002Fdocs\u002Fnode-red\u002Fdatabase\u002Fsqlite",[],{"title":4448,"path":4449,"order":3726,"children":4450},"TimescaleDB","\u002Fdocs\u002Fnode-red\u002Fdatabase\u002Ftimescaledb",[],{"title":4452,"path":4453,"order":2592,"children":4454},"Integration technologies","\u002Fdocs\u002Fnode-red\u002Fintegration-technologies",[4455,4459,4463],{"title":4456,"path":4457,"order":3726,"children":4458},"GraphQL API","\u002Fdocs\u002Fnode-red\u002Fintegration-technologies\u002Fgraphql",[],{"title":4460,"path":4461,"order":3726,"children":4462},"REST API","\u002Fdocs\u002Fnode-red\u002Fintegration-technologies\u002Frest",[],{"title":4464,"path":4465,"order":3726,"children":4466},"Webhook","\u002Fdocs\u002Fnode-red\u002Fintegration-technologies\u002Fwebhook",[],{"title":4468,"path":4469,"order":4128,"children":4470},"Notification services","\u002Fdocs\u002Fnode-red\u002Fnotification",[4471,4475,4479],{"title":4472,"path":4473,"order":3726,"children":4474},"Discord","\u002Fdocs\u002Fnode-red\u002Fnotification\u002Fdiscord",[],{"title":4476,"path":4477,"order":3726,"children":4478},"Email","\u002Fdocs\u002Fnode-red\u002Fnotification\u002Femail",[],{"title":4480,"path":4481,"order":3726,"children":4482},"Telegram","\u002Fdocs\u002Fnode-red\u002Fnotification\u002Ftelegram",[],{"title":4484,"path":4485,"order":4189,"children":4486},"Hardware","\u002Fdocs\u002Fnode-red\u002Fhardware",[4487,4491,4495,4499,4503,4507],{"title":4488,"path":4489,"order":3726,"children":4490},"BLIIOT ARMxy BL340","\u002Fdocs\u002Fnode-red\u002Fhardware\u002Farmxy-bl340",[],{"title":4492,"path":4493,"order":3726,"children":4494},"Opto-22 Groov Epic","\u002Fdocs\u002Fnode-red\u002Fhardware\u002Fopto-22-groove-rio-7-mm2001-10",[],{"title":4496,"path":4497,"order":3726,"children":4498},"Raspberry Pi 4","\u002Fdocs\u002Fnode-red\u002Fhardware\u002Fraspberry-pi-4",[],{"title":4500,"path":4501,"order":3726,"children":4502},"Raspberry Pi 5","\u002Fdocs\u002Fnode-red\u002Fhardware\u002Fraspberry-pi-5",[],{"title":4504,"path":4505,"order":3726,"children":4506},"Robustel EG5120","\u002Fdocs\u002Fnode-red\u002Fhardware\u002Frobustel-eg5120",[],{"title":4508,"path":4509,"order":3726,"children":4510},"Siemens IoT2050","\u002Fdocs\u002Fnode-red\u002Fhardware\u002Fsiemens-iot-2050",[],{"title":4512,"path":4513,"order":4285,"children":4514},"Peripheral devices","\u002Fdocs\u002Fnode-red\u002Fperipheral",[4515,4519,4523,4527],{"title":4516,"path":4517,"order":3726,"children":4518},"Arduino","\u002Fdocs\u002Fnode-red\u002Fperipheral\u002Fardiuno",[],{"title":4520,"path":4521,"order":3726,"children":4522},"Barcode Scanner","\u002Fdocs\u002Fnode-red\u002Fperipheral\u002Fbarcodescanner",[],{"title":4524,"path":4525,"order":3726,"children":4526},"ESP32","\u002Fdocs\u002Fnode-red\u002Fperipheral\u002Fesp32",[],{"title":4528,"path":4529,"order":3726,"children":4530},"Webcam","\u002Fdocs\u002Fnode-red\u002Fperipheral\u002Fwebcam",[],{"title":4532,"path":4533,"order":3593,"children":4534},"Terminology","\u002Fdocs\u002Fnode-red\u002Fterminology",[],{"title":4536,"path":4537,"order":4538,"children":4539},"Keyboard shortcuts","\u002Fdocs\u002Fnode-red\u002Fkeyboard",11,[],1788956317830]