diff --git a/src/server/Dockerfile.nodered b/src/server/Dockerfile.nodered
new file mode 100644
index 0000000000000000000000000000000000000000..ea7a16989a7d7726d37263210c71535ac8d74f56
--- /dev/null
+++ b/src/server/Dockerfile.nodered
@@ -0,0 +1,8 @@
+FROM nodered/node-red
+
+USER root
+
+RUN apk add --no-cache imagemagick && \
+    chmod -R 777 /data
+
+USER node-red
\ No newline at end of file
diff --git a/src/server/docker-compose.yml b/src/server/docker-compose.yml
index b5409be8f7ed0d109e11d062f3eced2183bd09b7..4c39320be78520fd160a0a4b9a89a169c7003cd7 100644
--- a/src/server/docker-compose.yml
+++ b/src/server/docker-compose.yml
@@ -13,12 +13,13 @@ services:
       - ./mosquitto/log:/mosquitto/log
 
   nodered:
-    image: nodered/node-red
+    build:
+      context: .
+      dockerfile: Dockerfile.nodered
     restart: always
     ports:
       - 1880:1880
     volumes:
       - ./nodered/data:/data
     depends_on:
-      - mosquitto
-    command: bash -c "npm install --save red-contrib-image-tools  && npm start"
\ No newline at end of file
+      - mosquitto
\ No newline at end of file
diff --git a/src/server/nodered/data/current_image.png b/src/server/nodered/data/current_image.png
new file mode 100644
index 0000000000000000000000000000000000000000..9265a1f5348e538b5d745f6c6bf8e696613583eb
Binary files /dev/null and b/src/server/nodered/data/current_image.png differ
diff --git a/src/server/nodered/data/current_image.ppm b/src/server/nodered/data/current_image.ppm
new file mode 100644
index 0000000000000000000000000000000000000000..7a5d7fe2accad0cf7e488800d0bbc7afcd4fa427
Binary files /dev/null and b/src/server/nodered/data/current_image.ppm differ
diff --git a/src/server/nodered/data/flows.json b/src/server/nodered/data/flows.json
index 45fca16b8dc15edc80b8400ad254663620474894..63f0dd429b4b108240cb32598df2b9bf33624d94 100644
--- a/src/server/nodered/data/flows.json
+++ b/src/server/nodered/data/flows.json
@@ -7,11 +7,152 @@
         "info": "",
         "env": []
     },
+    {
+        "id": "ab311349d4b5cc9f",
+        "type": "group",
+        "z": "3bceb6b167ec8f8a",
+        "name": "Send specified text to specified topic",
+        "style": {
+            "fill": "#d1d1d1",
+            "label": true,
+            "stroke": "#0070c0",
+            "fill-opacity": "0.39",
+            "label-position": "n",
+            "color": "#000000"
+        },
+        "nodes": [
+            "6733248e98f29d82",
+            "36f36de07403b7d6",
+            "20bcaabc7490baa3",
+            "0bdc49908bd4f2f1",
+            "87c4ad3199d925b7",
+            "42dbb76d083c3f72",
+            "93da9eba0950dd63",
+            "72c71253f8eba10b",
+            "265bcfa660b95831"
+        ],
+        "x": 274,
+        "y": 819,
+        "w": 1112,
+        "h": 182
+    },
+    {
+        "id": "cef277eaea93cf97",
+        "type": "group",
+        "z": "3bceb6b167ec8f8a",
+        "style": {
+            "stroke": "#999999",
+            "stroke-opacity": "1",
+            "fill": "none",
+            "fill-opacity": "1",
+            "label": true,
+            "label-position": "nw",
+            "color": "#a4a4a4"
+        },
+        "nodes": [
+            "a63837b2eb699492",
+            "e20cd041191b8d4e",
+            "78ab95610abae69c",
+            "4e424320f91a0972",
+            "d4274a7556fc52fd",
+            "ac11c7560fd51964",
+            "450b91f9f9995ab9",
+            "cc59fd7b9c9b3506",
+            "c8a3cea728dcb733",
+            "4ca6c5aab2ed689f",
+            "215e9359f56544ac",
+            "832dd4609eeee57d",
+            "f47dec60f15aec1e"
+        ],
+        "x": 274,
+        "y": 39,
+        "w": 1572,
+        "h": 242
+    },
+    {
+        "id": "33e927adfa7339c6",
+        "type": "group",
+        "z": "3bceb6b167ec8f8a",
+        "style": {
+            "stroke": "#999999",
+            "stroke-opacity": "1",
+            "fill": "none",
+            "fill-opacity": "1",
+            "label": true,
+            "label-position": "nw",
+            "color": "#a4a4a4"
+        },
+        "nodes": [
+            "b826d57ee3a29903",
+            "0559e96b14f3b3aa",
+            "87fd07530005b8d7",
+            "1b58c8a5d3013bb3",
+            "4cd2b8e22daa26d1",
+            "2aafe2f8036cf29d",
+            "9b320aa0f05f6f60",
+            "691a5ba5df37551b",
+            "7827e7131abb42bd",
+            "ef46247ac204a721",
+            "706ccfd82d795270",
+            "fa69925fce69b14f",
+            "5a542a293c03214f"
+        ],
+        "x": 274,
+        "y": 319,
+        "w": 1572,
+        "h": 242
+    },
+    {
+        "id": "b37cc1f0a54b395f",
+        "type": "group",
+        "z": "3bceb6b167ec8f8a",
+        "name": "Image choice",
+        "style": {
+            "label": true,
+            "label-position": "n",
+            "color": "#000000"
+        },
+        "nodes": [
+            "c5268070.c55a3",
+            "5e18b80e617a3db8",
+            "c084ef02cb008e01",
+            "961a4eb72567178d"
+        ],
+        "x": 1134,
+        "y": 579,
+        "w": 592,
+        "h": 162
+    },
+    {
+        "id": "3f31d3a22e2ed424",
+        "type": "group",
+        "z": "3bceb6b167ec8f8a",
+        "name": "Cluster size management",
+        "style": {
+            "label": true,
+            "label-position": "n",
+            "color": "#000000"
+        },
+        "nodes": [
+            "9a776038fabcbc12",
+            "913bc42e687c40dc",
+            "f091b9306cf9ecbd",
+            "bd55fb4e5bd7ca09",
+            "ee884f98c1da8270",
+            "356add1a97a5f06a",
+            "ca8c09f033269fd4",
+            "f391acb6082be40f"
+        ],
+        "x": 274,
+        "y": 579,
+        "w": 832,
+        "h": 202
+    },
     {
         "id": "7c97b0098dfaf791",
         "type": "mqtt-broker",
         "name": "Laptop broker",
-        "broker": "192.168.1.103",
+        "broker": "192.168.1.101",
         "port": "1883",
         "clientid": "",
         "autoConnect": true,
@@ -37,7 +178,7 @@
     {
         "id": "d2a2041e4b1000cb",
         "type": "ui_tab",
-        "name": "Image",
+        "name": "MQTT Dashboard",
         "icon": "dashboard",
         "disabled": false,
         "hidden": false
@@ -46,19 +187,20 @@
         "id": "fec55bf4e58f79e6",
         "type": "ui_base",
         "theme": {
-            "name": "theme-light",
+            "name": "theme-dark",
             "lightTheme": {
                 "default": "#0094CE",
-                "baseColor": "#0094CE",
-                "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif",
+                "baseColor": "#ed333b",
+                "baseFont": "Impact,Impact,Charcoal,sans-serif",
                 "edited": true,
                 "reset": false
             },
             "darkTheme": {
                 "default": "#097479",
-                "baseColor": "#097479",
+                "baseColor": "#99c1f1",
                 "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif",
-                "edited": false
+                "edited": true,
+                "reset": false
             },
             "customTheme": {
                 "name": "Untitled Theme 1",
@@ -68,16 +210,16 @@
             },
             "themeState": {
                 "base-color": {
-                    "default": "#0094CE",
-                    "value": "#0094CE",
-                    "edited": false
+                    "default": "#097479",
+                    "value": "#99c1f1",
+                    "edited": true
                 },
                 "page-titlebar-backgroundColor": {
-                    "value": "#0094CE",
+                    "value": "#99c1f1",
                     "edited": false
                 },
                 "page-backgroundColor": {
-                    "value": "#fafafa",
+                    "value": "#111111",
                     "edited": false
                 },
                 "page-sidebar-backgroundColor": {
@@ -85,27 +227,27 @@
                     "edited": false
                 },
                 "group-textColor": {
-                    "value": "#1bbfff",
+                    "value": "#dceafa",
                     "edited": false
                 },
                 "group-borderColor": {
-                    "value": "#ffffff",
+                    "value": "#555555",
                     "edited": false
                 },
                 "group-backgroundColor": {
-                    "value": "#ffffff",
+                    "value": "#333333",
                     "edited": false
                 },
                 "widget-textColor": {
-                    "value": "#111111",
+                    "value": "#eeeeee",
                     "edited": false
                 },
                 "widget-backgroundColor": {
-                    "value": "#0094ce",
+                    "value": "#99c1f1",
                     "edited": false
                 },
                 "widget-borderColor": {
-                    "value": "#ffffff",
+                    "value": "#333333",
                     "edited": false
                 },
                 "base-font": {
@@ -142,37 +284,30 @@
     {
         "id": "e342ae49e88427ae",
         "type": "ui_group",
-        "name": "Default",
+        "name": "Image",
         "tab": "d2a2041e4b1000cb",
-        "order": 1,
+        "order": 2,
         "disp": true,
-        "width": "6",
+        "width": "10",
         "collapse": false
     },
     {
         "id": "c33a1024a72aa169",
         "type": "ui_group",
         "name": "Text",
-        "tab": "cc6c4310cf7b61cc",
+        "tab": "d2a2041e4b1000cb",
         "order": 1,
         "disp": true,
         "width": "10",
         "collapse": false
     },
-    {
-        "id": "cc6c4310cf7b61cc",
-        "type": "ui_tab",
-        "name": "Text",
-        "icon": "dashboard",
-        "disabled": false,
-        "hidden": false
-    },
     {
         "id": "6733248e98f29d82",
         "type": "mqtt out",
         "z": "3bceb6b167ec8f8a",
-        "name": "",
-        "topic": "tophone",
+        "g": "ab311349d4b5cc9f",
+        "name": "To specified topic",
+        "topic": "",
         "qos": "",
         "retain": "",
         "respTopic": "",
@@ -181,16 +316,17 @@
         "correl": "",
         "expiry": "",
         "broker": "7c97b0098dfaf791",
-        "x": 1140,
-        "y": 460,
+        "x": 1270,
+        "y": 960,
         "wires": []
     },
     {
         "id": "9a776038fabcbc12",
         "type": "mqtt in",
         "z": "3bceb6b167ec8f8a",
-        "name": "",
-        "topic": "topc",
+        "g": "3f31d3a22e2ed424",
+        "name": "from cluster2/size",
+        "topic": "cluster2/size",
         "qos": "2",
         "datatype": "auto-detect",
         "broker": "7c97b0098dfaf791",
@@ -198,11 +334,12 @@
         "rap": true,
         "rh": 0,
         "inputs": 0,
-        "x": 590,
+        "x": 380,
         "y": 740,
         "wires": [
             [
-                "913bc42e687c40dc"
+                "ee884f98c1da8270",
+                "ca8c09f033269fd4"
             ]
         ]
     },
@@ -210,16 +347,17 @@
         "id": "913bc42e687c40dc",
         "type": "debug",
         "z": "3bceb6b167ec8f8a",
-        "name": "debug 2",
+        "g": "3f31d3a22e2ed424",
+        "name": "Size cluster 2",
         "active": false,
         "tosidebar": true,
         "console": true,
         "tostatus": false,
-        "complete": "payload",
-        "targetType": "msg",
+        "complete": "true",
+        "targetType": "full",
         "statusVal": "",
         "statusType": "auto",
-        "x": 790,
+        "x": 980,
         "y": 740,
         "wires": []
     },
@@ -227,8 +365,9 @@
         "id": "f091b9306cf9ecbd",
         "type": "mqtt in",
         "z": "3bceb6b167ec8f8a",
-        "name": "",
-        "topic": "fromesp",
+        "g": "3f31d3a22e2ed424",
+        "name": "from cluster1/size",
+        "topic": "cluster1/size",
         "qos": "2",
         "datatype": "auto-detect",
         "broker": "7c97b0098dfaf791",
@@ -236,11 +375,12 @@
         "rap": true,
         "rh": 0,
         "inputs": 0,
-        "x": 580,
-        "y": 800,
+        "x": 380,
+        "y": 660,
         "wires": [
             [
-                "bd55fb4e5bd7ca09"
+                "356add1a97a5f06a",
+                "f391acb6082be40f"
             ]
         ]
     },
@@ -248,25 +388,27 @@
         "id": "bd55fb4e5bd7ca09",
         "type": "debug",
         "z": "3bceb6b167ec8f8a",
-        "name": "debug 3",
+        "g": "3f31d3a22e2ed424",
+        "name": "Size cluster 1",
         "active": false,
         "tosidebar": true,
         "console": true,
         "tostatus": false,
-        "complete": "payload",
-        "targetType": "msg",
+        "complete": "true",
+        "targetType": "full",
         "statusVal": "",
         "statusType": "auto",
-        "x": 790,
-        "y": 800,
+        "x": 980,
+        "y": 660,
         "wires": []
     },
     {
         "id": "a63837b2eb699492",
         "type": "mqtt out",
         "z": "3bceb6b167ec8f8a",
+        "g": "cef277eaea93cf97",
         "name": "",
-        "topic": "toesp/image",
+        "topic": "cluster1/image",
         "qos": "",
         "retain": "",
         "respTopic": "",
@@ -275,45 +417,29 @@
         "correl": "",
         "expiry": "",
         "broker": "7c97b0098dfaf791",
-        "x": 1310,
-        "y": 240,
-        "wires": []
-    },
-    {
-        "id": "db996401e5e29e5c",
-        "type": "debug",
-        "z": "3bceb6b167ec8f8a",
-        "name": "debug 6",
-        "active": false,
-        "tosidebar": true,
-        "console": true,
-        "tostatus": false,
-        "complete": "payload",
-        "targetType": "msg",
-        "statusVal": "",
-        "statusType": "auto",
-        "x": 910,
-        "y": 220,
+        "x": 1740,
+        "y": 180,
         "wires": []
     },
     {
         "id": "e20cd041191b8d4e",
         "type": "file in",
         "z": "3bceb6b167ec8f8a",
-        "name": "read",
-        "filename": "/data/pika.ppm",
-        "filenameType": "str",
+        "g": "cef277eaea93cf97",
+        "name": "read image",
+        "filename": "path",
+        "filenameType": "msg",
         "format": "",
         "chunk": false,
         "sendError": false,
         "encoding": "none",
         "allProps": false,
-        "x": 690,
-        "y": 240,
+        "x": 1550,
+        "y": 180,
         "wires": [
             [
-                "db996401e5e29e5c",
-                "a63837b2eb699492"
+                "a63837b2eb699492",
+                "f47dec60f15aec1e"
             ]
         ]
     },
@@ -321,26 +447,27 @@
         "id": "78ab95610abae69c",
         "type": "ui_button",
         "z": "3bceb6b167ec8f8a",
-        "name": "",
+        "g": "cef277eaea93cf97",
+        "name": "Send image cluster 1",
         "group": "e342ae49e88427ae",
-        "order": 0,
-        "width": "3",
-        "height": "2",
+        "order": 1,
+        "width": 10,
+        "height": 1,
         "passthru": false,
-        "label": "button",
+        "label": "Send image to cluster 1",
         "tooltip": "",
         "color": "",
         "bgcolor": "",
         "icon": "",
-        "payload": "/data/med.ppm",
+        "payload": "",
         "payloadType": "str",
         "topic": "topic",
         "topicType": "msg",
-        "x": 530,
-        "y": 240,
+        "x": 400,
+        "y": 80,
         "wires": [
             [
-                "e20cd041191b8d4e"
+                "cc59fd7b9c9b3506"
             ]
         ]
     },
@@ -348,21 +475,24 @@
         "id": "c5268070.c55a3",
         "type": "ui_template",
         "z": "3bceb6b167ec8f8a",
+        "g": "b37cc1f0a54b395f",
         "group": "e342ae49e88427ae",
         "name": "Upload Btn",
-        "order": 8,
-        "width": "3",
-        "height": 1,
-        "format": "\n<body>\n<button class=\"md-raised md-button md-ink-ripple\" onclick=\"importData()\">Upload</button>    \n\n<script>\nlet restoreScope = scope;\n\nfunction importData() {\n  let input = document.createElement('input');\n  input.type = 'file';\n  input.id = 'restoreBtn';\n  input.onchange = _ => {\n    // you can use this method to get file and perform respective operations\n        let fReader = new FileReader();\n        fReader.readAsText(input.files[0]);\n        fReader.onloadend = function(event){\n        restoreScope.send({payload:event.target.result});}\n        };\n  input.click();\n}\n</script>\n</body>\n",
+        "order": 2,
+        "width": "10",
+        "height": "1",
+        "format": "\n<body>\n<button class=\"md-raised md-button md-ink-ripple\" onclick=\"importData()\">Upload</button>    \n\n<script>\nlet restoreScope = scope;\n\nfunction importData() {\n  let input = document.createElement('input');\n  input.type = 'file';\n  input.id = 'restoreBtn';\n  input.onchange = _ => {\n        let file = input.files[0];\n\n    // you can use this method to get file and perform respective operations\n        let fReader = new FileReader();\n        fReader.readAsText(input.files[0]);\n        fReader.onloadend = function(event)\n        {\n          let filename = file.name;\n          let payload = event.target.result;\n          restoreScope.send({payload: payload, filename: filename});}\n        };\n  input.click();\n}\n</script>\n</body>\n",
         "storeOutMessages": true,
         "fwdInMessages": true,
         "resendOnRefresh": false,
         "templateScope": "local",
-        "x": 550,
-        "y": 280,
+        "x": 1230,
+        "y": 660,
         "wires": [
             [
-                "5e18b80e617a3db8"
+                "5e18b80e617a3db8",
+                "c084ef02cb008e01",
+                "961a4eb72567178d"
             ]
         ]
     },
@@ -370,68 +500,597 @@
         "id": "5e18b80e617a3db8",
         "type": "debug",
         "z": "3bceb6b167ec8f8a",
-        "name": "",
-        "active": false,
+        "g": "b37cc1f0a54b395f",
+        "name": "Uploaded Image filename",
+        "active": true,
         "tosidebar": true,
-        "console": false,
+        "console": true,
         "tostatus": false,
-        "complete": "false",
+        "complete": "filename",
+        "targetType": "msg",
         "statusVal": "",
         "statusType": "auto",
-        "x": 910,
-        "y": 280,
+        "x": 1480,
+        "y": 700,
         "wires": []
     },
     {
         "id": "36f36de07403b7d6",
         "type": "ui_text_input",
         "z": "3bceb6b167ec8f8a",
+        "g": "ab311349d4b5cc9f",
         "name": "Message",
         "label": "Message",
         "tooltip": "",
         "group": "c33a1024a72aa169",
         "order": 1,
-        "width": "6",
-        "height": "3",
+        "width": 10,
+        "height": 3,
+        "passthru": true,
+        "mode": "text",
+        "delay": "0",
+        "topic": "payload",
+        "topicType": "msg",
+        "x": 360,
+        "y": 900,
+        "wires": [
+            [
+                "87c4ad3199d925b7"
+            ]
+        ]
+    },
+    {
+        "id": "20bcaabc7490baa3",
+        "type": "ui_button",
+        "z": "3bceb6b167ec8f8a",
+        "g": "ab311349d4b5cc9f",
+        "name": "",
+        "group": "c33a1024a72aa169",
+        "order": 2,
+        "width": 10,
+        "height": 1,
+        "passthru": false,
+        "label": "Send ",
+        "tooltip": "",
+        "color": "",
+        "bgcolor": "",
+        "icon": "",
+        "payload": "message",
+        "payloadType": "flow",
+        "topic": "",
+        "topicType": "str",
+        "x": 370,
+        "y": 940,
+        "wires": [
+            [
+                "42dbb76d083c3f72"
+            ]
+        ]
+    },
+    {
+        "id": "0bdc49908bd4f2f1",
+        "type": "debug",
+        "z": "3bceb6b167ec8f8a",
+        "g": "ab311349d4b5cc9f",
+        "name": "debug 7",
+        "active": true,
+        "tosidebar": true,
+        "console": false,
+        "tostatus": false,
+        "complete": "true",
+        "targetType": "full",
+        "statusVal": "",
+        "statusType": "auto",
+        "x": 1240,
+        "y": 920,
+        "wires": []
+    },
+    {
+        "id": "87c4ad3199d925b7",
+        "type": "change",
+        "z": "3bceb6b167ec8f8a",
+        "g": "ab311349d4b5cc9f",
+        "name": "save msg.payload into flow.message",
+        "rules": [
+            {
+                "t": "set",
+                "p": "message",
+                "pt": "flow",
+                "to": "payload",
+                "tot": "msg",
+                "dc": true
+            }
+        ],
+        "action": "",
+        "property": "",
+        "from": "",
+        "to": "",
+        "reg": false,
+        "x": 610,
+        "y": 900,
+        "wires": [
+            []
+        ]
+    },
+    {
+        "id": "42dbb76d083c3f72",
+        "type": "change",
+        "z": "3bceb6b167ec8f8a",
+        "g": "ab311349d4b5cc9f",
+        "name": "save flow.message into msg.payload",
+        "rules": [
+            {
+                "t": "set",
+                "p": "payload",
+                "pt": "msg",
+                "to": "message",
+                "tot": "flow",
+                "dc": true
+            }
+        ],
+        "action": "",
+        "property": "",
+        "from": "",
+        "to": "",
+        "reg": false,
+        "x": 610,
+        "y": 940,
+        "wires": [
+            [
+                "265bcfa660b95831"
+            ]
+        ]
+    },
+    {
+        "id": "93da9eba0950dd63",
+        "type": "ui_text_input",
+        "z": "3bceb6b167ec8f8a",
+        "g": "ab311349d4b5cc9f",
+        "name": "Topic",
+        "label": "Topic",
+        "tooltip": "",
+        "group": "c33a1024a72aa169",
+        "order": 1,
+        "width": 10,
+        "height": 3,
         "passthru": true,
         "mode": "text",
         "delay": "0",
-        "topic": "none",
-        "topicType": "flow",
-        "x": 700,
-        "y": 440,
+        "topic": "",
+        "topicType": "str",
+        "x": 370,
+        "y": 860,
+        "wires": [
+            [
+                "72c71253f8eba10b"
+            ]
+        ]
+    },
+    {
+        "id": "72c71253f8eba10b",
+        "type": "change",
+        "z": "3bceb6b167ec8f8a",
+        "g": "ab311349d4b5cc9f",
+        "name": "save msg.payload into flow.topic_text",
+        "rules": [
+            {
+                "t": "set",
+                "p": "topic_text",
+                "pt": "flow",
+                "to": "payload",
+                "tot": "msg",
+                "dc": true
+            }
+        ],
+        "action": "",
+        "property": "",
+        "from": "",
+        "to": "",
+        "reg": false,
+        "x": 610,
+        "y": 860,
+        "wires": [
+            []
+        ]
+    },
+    {
+        "id": "265bcfa660b95831",
+        "type": "change",
+        "z": "3bceb6b167ec8f8a",
+        "g": "ab311349d4b5cc9f",
+        "name": "save flow.topic_text into msg.topic",
+        "rules": [
+            {
+                "t": "set",
+                "p": "topic",
+                "pt": "msg",
+                "to": "topic_text",
+                "tot": "flow",
+                "dc": true
+            }
+        ],
+        "action": "",
+        "property": "",
+        "from": "",
+        "to": "",
+        "reg": false,
+        "x": 940,
+        "y": 940,
         "wires": [
             [
+                "6733248e98f29d82",
                 "0bdc49908bd4f2f1"
             ]
         ]
     },
     {
-        "id": "5206964bfdc23d45",
-        "type": "comment",
+        "id": "4e424320f91a0972",
+        "type": "exec",
         "z": "3bceb6b167ec8f8a",
-        "name": "Image",
-        "info": "",
-        "x": 850,
+        "g": "cef277eaea93cf97",
+        "command": "convert",
+        "addpay": "payload",
+        "append": "",
+        "useSpawn": "false",
+        "timer": "10",
+        "winHide": false,
+        "oldrc": false,
+        "name": "Convert",
+        "x": 920,
+        "y": 140,
+        "wires": [
+            [
+                "d4274a7556fc52fd"
+            ],
+            [
+                "ac11c7560fd51964"
+            ],
+            [
+                "450b91f9f9995ab9",
+                "215e9359f56544ac"
+            ]
+        ]
+    },
+    {
+        "id": "d4274a7556fc52fd",
+        "type": "debug",
+        "z": "3bceb6b167ec8f8a",
+        "g": "cef277eaea93cf97",
+        "name": "stdout",
+        "active": true,
+        "tosidebar": true,
+        "console": false,
+        "tostatus": false,
+        "complete": "payload",
+        "targetType": "msg",
+        "statusVal": "",
+        "statusType": "auto",
+        "x": 1090,
+        "y": 100,
+        "wires": []
+    },
+    {
+        "id": "ac11c7560fd51964",
+        "type": "debug",
+        "z": "3bceb6b167ec8f8a",
+        "g": "cef277eaea93cf97",
+        "name": "stderr",
+        "active": true,
+        "tosidebar": true,
+        "console": false,
+        "tostatus": false,
+        "complete": "payload",
+        "targetType": "msg",
+        "statusVal": "",
+        "statusType": "auto",
+        "x": 1090,
+        "y": 140,
+        "wires": []
+    },
+    {
+        "id": "450b91f9f9995ab9",
+        "type": "debug",
+        "z": "3bceb6b167ec8f8a",
+        "g": "cef277eaea93cf97",
+        "name": "return",
+        "active": true,
+        "tosidebar": true,
+        "console": false,
+        "tostatus": false,
+        "complete": "payload",
+        "targetType": "msg",
+        "statusVal": "",
+        "statusType": "auto",
+        "x": 1090,
+        "y": 220,
+        "wires": []
+    },
+    {
+        "id": "ee884f98c1da8270",
+        "type": "change",
+        "z": "3bceb6b167ec8f8a",
+        "g": "3f31d3a22e2ed424",
+        "name": "save msg.payload into flow.cluster2size",
+        "rules": [
+            {
+                "t": "set",
+                "p": "cluster2size",
+                "pt": "flow",
+                "to": "payload",
+                "tot": "msg",
+                "dc": true
+            }
+        ],
+        "action": "",
+        "property": "",
+        "from": "",
+        "to": "",
+        "reg": false,
+        "x": 680,
+        "y": 740,
+        "wires": [
+            [
+                "913bc42e687c40dc"
+            ]
+        ]
+    },
+    {
+        "id": "356add1a97a5f06a",
+        "type": "change",
+        "z": "3bceb6b167ec8f8a",
+        "g": "3f31d3a22e2ed424",
+        "name": "save msg.payload into flow.cluster1size",
+        "rules": [
+            {
+                "t": "set",
+                "p": "cluster1size",
+                "pt": "flow",
+                "to": "payload",
+                "tot": "msg",
+                "dc": true
+            }
+        ],
+        "action": "",
+        "property": "",
+        "from": "",
+        "to": "",
+        "reg": false,
+        "x": 680,
+        "y": 660,
+        "wires": [
+            [
+                "bd55fb4e5bd7ca09"
+            ]
+        ]
+    },
+    {
+        "id": "ca8c09f033269fd4",
+        "type": "ui_text",
+        "z": "3bceb6b167ec8f8a",
+        "g": "3f31d3a22e2ed424",
+        "group": "e342ae49e88427ae",
+        "order": 3,
+        "width": 0,
+        "height": 0,
+        "name": "SIze cluster 2",
+        "label": "Size cluster 2 : ",
+        "format": "{{msg.payload}}",
+        "layout": "row-center",
+        "x": 600,
+        "y": 700,
+        "wires": []
+    },
+    {
+        "id": "f391acb6082be40f",
+        "type": "ui_text",
+        "z": "3bceb6b167ec8f8a",
+        "g": "3f31d3a22e2ed424",
+        "group": "e342ae49e88427ae",
+        "order": 3,
+        "width": 0,
+        "height": 0,
+        "name": "Size cluster 1",
+        "label": "Size cluster 1 : ",
+        "format": "{{msg.payload}}",
+        "layout": "row-center",
+        "x": 600,
+        "y": 620,
+        "wires": []
+    },
+    {
+        "id": "c084ef02cb008e01",
+        "type": "ui_text",
+        "z": "3bceb6b167ec8f8a",
+        "g": "b37cc1f0a54b395f",
+        "group": "e342ae49e88427ae",
+        "order": 3,
+        "width": 0,
+        "height": 0,
+        "name": "Loaded image",
+        "label": "Loaded image : ",
+        "format": "{{msg.filename}}",
+        "layout": "row-center",
+        "x": 1440,
+        "y": 620,
+        "wires": []
+    },
+    {
+        "id": "cc59fd7b9c9b3506",
+        "type": "change",
+        "z": "3bceb6b167ec8f8a",
+        "g": "cef277eaea93cf97",
+        "name": "get filename and size from flow",
+        "rules": [
+            {
+                "t": "set",
+                "p": "filename",
+                "pt": "msg",
+                "to": "image_filename",
+                "tot": "flow",
+                "dc": true
+            },
+            {
+                "t": "set",
+                "p": "size",
+                "pt": "msg",
+                "to": "cluster1size",
+                "tot": "flow",
+                "dc": true
+            }
+        ],
+        "action": "",
+        "property": "",
+        "from": "",
+        "to": "",
+        "reg": false,
+        "x": 670,
         "y": 80,
+        "wires": [
+            [
+                "c8a3cea728dcb733"
+            ]
+        ]
+    },
+    {
+        "id": "961a4eb72567178d",
+        "type": "change",
+        "z": "3bceb6b167ec8f8a",
+        "g": "b37cc1f0a54b395f",
+        "name": "save msg.filename into flow.image_filename",
+        "rules": [
+            {
+                "t": "set",
+                "p": "image_filename",
+                "pt": "flow",
+                "to": "filename",
+                "tot": "msg",
+                "dc": true
+            }
+        ],
+        "action": "",
+        "property": "",
+        "from": "",
+        "to": "",
+        "reg": false,
+        "x": 1530,
+        "y": 660,
+        "wires": [
+            []
+        ]
+    },
+    {
+        "id": "c8a3cea728dcb733",
+        "type": "function",
+        "z": "3bceb6b167ec8f8a",
+        "g": "cef277eaea93cf97",
+        "name": "Build convertion string",
+        "func": "let pl = msg.payload;\nlet filename = msg.filename;\nlet raw_filename = filename.split(\".\")[0]\n//console.log(\"-scale \" + msg.size + \"! \" + \"/data/\" + filename + \" /data/\" + raw_filename + \".ppm\");\n// msg.payload = \"-scale 20x20! -interpolate Integer -filter point /data/graham.jpg /data/graham.png\"\nmsg.payload = \"-scale \" + msg.size + \"! \" + \"/data/\" + filename + \" /data/\" + \"current_image.ppm\";\nreturn msg;",
+        "outputs": 1,
+        "noerr": 0,
+        "initialize": "",
+        "finalize": "",
+        "libs": [],
+        "x": 680,
+        "y": 140,
+        "wires": [
+            [
+                "4ca6c5aab2ed689f",
+                "4e424320f91a0972"
+            ]
+        ]
+    },
+    {
+        "id": "4ca6c5aab2ed689f",
+        "type": "debug",
+        "z": "3bceb6b167ec8f8a",
+        "g": "cef277eaea93cf97",
+        "name": "Convert string",
+        "active": true,
+        "tosidebar": true,
+        "console": true,
+        "tostatus": false,
+        "complete": "true",
+        "targetType": "full",
+        "statusVal": "",
+        "statusType": "auto",
+        "x": 680,
+        "y": 200,
         "wires": []
     },
     {
-        "id": "9bd7f64eef65d068",
-        "type": "comment",
+        "id": "215e9359f56544ac",
+        "type": "change",
         "z": "3bceb6b167ec8f8a",
-        "name": "Text",
-        "info": "",
-        "x": 850,
-        "y": 380,
+        "g": "cef277eaea93cf97",
+        "name": "get filename from flow",
+        "rules": [
+            {
+                "t": "set",
+                "p": "filename",
+                "pt": "msg",
+                "to": "image_filename",
+                "tot": "flow",
+                "dc": true
+            }
+        ],
+        "action": "",
+        "property": "",
+        "from": "",
+        "to": "",
+        "reg": false,
+        "x": 1140,
+        "y": 180,
+        "wires": [
+            [
+                "832dd4609eeee57d"
+            ]
+        ]
+    },
+    {
+        "id": "832dd4609eeee57d",
+        "type": "function",
+        "z": "3bceb6b167ec8f8a",
+        "g": "cef277eaea93cf97",
+        "name": "Build full path",
+        "func": "msg.path = \"/data/\" + msg.filename\nreturn msg;",
+        "outputs": 1,
+        "noerr": 0,
+        "initialize": "",
+        "finalize": "",
+        "libs": [],
+        "x": 1360,
+        "y": 180,
+        "wires": [
+            [
+                "e20cd041191b8d4e"
+            ]
+        ]
+    },
+    {
+        "id": "f47dec60f15aec1e",
+        "type": "debug",
+        "z": "3bceb6b167ec8f8a",
+        "g": "cef277eaea93cf97",
+        "name": "return",
+        "active": true,
+        "tosidebar": true,
+        "console": true,
+        "tostatus": false,
+        "complete": "true",
+        "targetType": "full",
+        "statusVal": "",
+        "statusType": "auto",
+        "x": 1720,
+        "y": 240,
         "wires": []
     },
     {
-        "id": "a2038022178487b0",
+        "id": "b826d57ee3a29903",
         "type": "mqtt out",
         "z": "3bceb6b167ec8f8a",
+        "g": "33e927adfa7339c6",
         "name": "",
-        "topic": "toesp/text",
+        "topic": "cluster2/image",
         "qos": "",
         "retain": "",
         "respTopic": "",
@@ -440,51 +1099,283 @@
         "correl": "",
         "expiry": "",
         "broker": "7c97b0098dfaf791",
-        "x": 1140,
-        "y": 400,
+        "x": 1740,
+        "y": 460,
         "wires": []
     },
     {
-        "id": "20bcaabc7490baa3",
+        "id": "0559e96b14f3b3aa",
+        "type": "file in",
+        "z": "3bceb6b167ec8f8a",
+        "g": "33e927adfa7339c6",
+        "name": "read image",
+        "filename": "path",
+        "filenameType": "msg",
+        "format": "",
+        "chunk": false,
+        "sendError": false,
+        "encoding": "none",
+        "allProps": false,
+        "x": 1550,
+        "y": 460,
+        "wires": [
+            [
+                "b826d57ee3a29903",
+                "5a542a293c03214f"
+            ]
+        ]
+    },
+    {
+        "id": "87fd07530005b8d7",
         "type": "ui_button",
         "z": "3bceb6b167ec8f8a",
-        "name": "",
-        "group": "c33a1024a72aa169",
+        "g": "33e927adfa7339c6",
+        "name": "Send image cluster 2",
+        "group": "e342ae49e88427ae",
         "order": 1,
-        "width": "2",
-        "height": "2",
+        "width": 10,
+        "height": 1,
         "passthru": false,
-        "label": "button",
+        "label": "Send image to cluster 2",
         "tooltip": "",
         "color": "",
         "bgcolor": "",
         "icon": "",
         "payload": "",
         "payloadType": "str",
-        "topic": "",
-        "topicType": "str",
-        "x": 530,
-        "y": 440,
+        "topic": "topic",
+        "topicType": "msg",
+        "x": 400,
+        "y": 360,
         "wires": [
             [
-                "36f36de07403b7d6"
+                "691a5ba5df37551b"
             ]
         ]
     },
     {
-        "id": "0bdc49908bd4f2f1",
+        "id": "1b58c8a5d3013bb3",
+        "type": "exec",
+        "z": "3bceb6b167ec8f8a",
+        "g": "33e927adfa7339c6",
+        "command": "convert",
+        "addpay": "payload",
+        "append": "",
+        "useSpawn": "false",
+        "timer": "10",
+        "winHide": false,
+        "oldrc": false,
+        "name": "Convert",
+        "x": 920,
+        "y": 420,
+        "wires": [
+            [
+                "4cd2b8e22daa26d1"
+            ],
+            [
+                "2aafe2f8036cf29d"
+            ],
+            [
+                "9b320aa0f05f6f60",
+                "706ccfd82d795270"
+            ]
+        ]
+    },
+    {
+        "id": "4cd2b8e22daa26d1",
         "type": "debug",
         "z": "3bceb6b167ec8f8a",
-        "name": "debug 7",
+        "g": "33e927adfa7339c6",
+        "name": "stdout",
         "active": true,
         "tosidebar": true,
         "console": false,
         "tostatus": false,
-        "complete": "false",
+        "complete": "payload",
+        "targetType": "msg",
+        "statusVal": "",
+        "statusType": "auto",
+        "x": 1090,
+        "y": 380,
+        "wires": []
+    },
+    {
+        "id": "2aafe2f8036cf29d",
+        "type": "debug",
+        "z": "3bceb6b167ec8f8a",
+        "g": "33e927adfa7339c6",
+        "name": "stderr",
+        "active": true,
+        "tosidebar": true,
+        "console": false,
+        "tostatus": false,
+        "complete": "payload",
+        "targetType": "msg",
+        "statusVal": "",
+        "statusType": "auto",
+        "x": 1090,
+        "y": 420,
+        "wires": []
+    },
+    {
+        "id": "9b320aa0f05f6f60",
+        "type": "debug",
+        "z": "3bceb6b167ec8f8a",
+        "g": "33e927adfa7339c6",
+        "name": "return",
+        "active": true,
+        "tosidebar": true,
+        "console": false,
+        "tostatus": false,
+        "complete": "payload",
+        "targetType": "msg",
+        "statusVal": "",
+        "statusType": "auto",
+        "x": 1090,
+        "y": 500,
+        "wires": []
+    },
+    {
+        "id": "691a5ba5df37551b",
+        "type": "change",
+        "z": "3bceb6b167ec8f8a",
+        "g": "33e927adfa7339c6",
+        "name": "get filename and size from flow",
+        "rules": [
+            {
+                "t": "set",
+                "p": "filename",
+                "pt": "msg",
+                "to": "image_filename",
+                "tot": "flow",
+                "dc": true
+            },
+            {
+                "t": "set",
+                "p": "size",
+                "pt": "msg",
+                "to": "cluster2size",
+                "tot": "flow",
+                "dc": true
+            }
+        ],
+        "action": "",
+        "property": "",
+        "from": "",
+        "to": "",
+        "reg": false,
+        "x": 670,
+        "y": 360,
+        "wires": [
+            [
+                "7827e7131abb42bd"
+            ]
+        ]
+    },
+    {
+        "id": "7827e7131abb42bd",
+        "type": "function",
+        "z": "3bceb6b167ec8f8a",
+        "g": "33e927adfa7339c6",
+        "name": "Build convertion string",
+        "func": "let pl = msg.payload;\nlet filename = msg.filename;\nlet raw_filename = filename.split(\".\")[0]\n//console.log(\"-scale \" + msg.size + \"! \" + \"/data/\" + filename + \" /data/\" + raw_filename + \".ppm\");\n// msg.payload = \"-scale 20x20! -interpolate Integer -filter point /data/graham.jpg /data/graham.png\"\nmsg.payload = \"-scale \" + msg.size + \"! \" + \"/data/\" + filename + \" /data/\" + \"current_image.ppm\";\nreturn msg;",
+        "outputs": 1,
+        "noerr": 0,
+        "initialize": "",
+        "finalize": "",
+        "libs": [],
+        "x": 680,
+        "y": 420,
+        "wires": [
+            [
+                "ef46247ac204a721",
+                "1b58c8a5d3013bb3"
+            ]
+        ]
+    },
+    {
+        "id": "ef46247ac204a721",
+        "type": "debug",
+        "z": "3bceb6b167ec8f8a",
+        "g": "33e927adfa7339c6",
+        "name": "Convert string",
+        "active": true,
+        "tosidebar": true,
+        "console": true,
+        "tostatus": false,
+        "complete": "true",
+        "targetType": "full",
+        "statusVal": "",
+        "statusType": "auto",
+        "x": 680,
+        "y": 480,
+        "wires": []
+    },
+    {
+        "id": "706ccfd82d795270",
+        "type": "change",
+        "z": "3bceb6b167ec8f8a",
+        "g": "33e927adfa7339c6",
+        "name": "get filename from flow",
+        "rules": [
+            {
+                "t": "set",
+                "p": "filename",
+                "pt": "msg",
+                "to": "image_filename",
+                "tot": "flow",
+                "dc": true
+            }
+        ],
+        "action": "",
+        "property": "",
+        "from": "",
+        "to": "",
+        "reg": false,
+        "x": 1140,
+        "y": 460,
+        "wires": [
+            [
+                "fa69925fce69b14f"
+            ]
+        ]
+    },
+    {
+        "id": "fa69925fce69b14f",
+        "type": "function",
+        "z": "3bceb6b167ec8f8a",
+        "g": "33e927adfa7339c6",
+        "name": "Build full path",
+        "func": "msg.path = \"/data/\" + msg.filename\nreturn msg;",
+        "outputs": 1,
+        "noerr": 0,
+        "initialize": "",
+        "finalize": "",
+        "libs": [],
+        "x": 1360,
+        "y": 460,
+        "wires": [
+            [
+                "0559e96b14f3b3aa"
+            ]
+        ]
+    },
+    {
+        "id": "5a542a293c03214f",
+        "type": "debug",
+        "z": "3bceb6b167ec8f8a",
+        "g": "33e927adfa7339c6",
+        "name": "return",
+        "active": true,
+        "tosidebar": true,
+        "console": true,
+        "tostatus": false,
+        "complete": "true",
+        "targetType": "full",
         "statusVal": "",
         "statusType": "auto",
-        "x": 880,
-        "y": 440,
+        "x": 1720,
+        "y": 520,
         "wires": []
     }
 ]
\ No newline at end of file
diff --git a/src/server/nodered/data/graham.png b/src/server/nodered/data/graham.png
new file mode 100644
index 0000000000000000000000000000000000000000..845958251496eed133b09934c4cf613a1f5af152
Binary files /dev/null and b/src/server/nodered/data/graham.png differ
diff --git a/src/server/readme.md b/src/server/readme.md
index c21213fb11d59cdbff291651ef37b9d5ca6ce7a7..d16ffa524cacc9936527198145b038bd7adb4e25 100644
--- a/src/server/readme.md
+++ b/src/server/readme.md
@@ -1,4 +1,18 @@
-# This documents how to run the server
+# This documents how to run the server on a Raspberry PI (3B)
+
+## Install raspbian on the PI
+We need to install a linux on the PI.
+
+Download the Raspberry PI Imager on [https://www.raspberrypi.com/software/](https://www.raspberrypi.com/software/)
+
+or on Ubuntu with :
+```bash
+sudo apt-install rpi-imager
+```
+
+https://docs.docker.com/engine/install/raspbian/
+
+
 
 
 ## Install and run