diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..88fc45a5d3e6393ec741bdcde9b09edfd146f48e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,251 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+#   For a library or package, you might want to ignore these files since the code is
+#   intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+#   However, in case of collaboration, if having platform-specific dependencies or dependencies
+#   having no cross-platform support, pipenv may install dependencies that don't work, or not
+#   install all needed dependencies.
+#Pipfile.lock
+
+# poetry
+#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+#   This is especially recommended for binary packages to ensure reproducibility, and is more
+#   commonly ignored for libraries.
+#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+#poetry.lock
+
+# pdm
+#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
+#pdm.lock
+#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
+#   in version control.
+#   https://pdm.fming.dev/#use-with-ide
+.pdm.toml
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# PyCharm
+#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can
+#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+#  and can be added to the global gitignore or merged into this file.  For a more nuclear
+#  option (not recommended) you can uncomment the following to ignore the entire idea folder.
+#.idea/
+
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# AWS User-specific
+.idea/**/aws.xml
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn.  Uncomment if using
+# auto-import.
+# .idea/artifacts
+# .idea/compiler.xml
+# .idea/jarRepositories.xml
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# SonarLint plugin
+.idea/sonarlint/
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+!.vscode/*.code-snippets
+
+# Local History for Visual Studio Code
+.history/
+
+# Built Visual Studio Code Extensions
+*.vsix
diff --git a/code-snippets/client/transfer-data-to-host-endpoint/.gitignore b/code-snippets/client/transfer-data-to-host-endpoint/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..89cc49cbd652508924b868ea609fa8f6b758ec56
--- /dev/null
+++ b/code-snippets/client/transfer-data-to-host-endpoint/.gitignore
@@ -0,0 +1,5 @@
+.pio
+.vscode/.browse.c_cpp.db*
+.vscode/c_cpp_properties.json
+.vscode/launch.json
+.vscode/ipch
diff --git a/code-snippets/client/transfer-data-to-host-endpoint/.vscode/extensions.json b/code-snippets/client/transfer-data-to-host-endpoint/.vscode/extensions.json
new file mode 100644
index 0000000000000000000000000000000000000000..080e70d08b9811fa743afe5094658dba0ed6b7c2
--- /dev/null
+++ b/code-snippets/client/transfer-data-to-host-endpoint/.vscode/extensions.json
@@ -0,0 +1,10 @@
+{
+    // See http://go.microsoft.com/fwlink/?LinkId=827846
+    // for the documentation about the extensions.json format
+    "recommendations": [
+        "platformio.platformio-ide"
+    ],
+    "unwantedRecommendations": [
+        "ms-vscode.cpptools-extension-pack"
+    ]
+}
diff --git a/code-snippets/client/transfer-data-to-host-endpoint/include/README b/code-snippets/client/transfer-data-to-host-endpoint/include/README
new file mode 100644
index 0000000000000000000000000000000000000000..194dcd43252dcbeb2044ee38510415041a0e7b47
--- /dev/null
+++ b/code-snippets/client/transfer-data-to-host-endpoint/include/README
@@ -0,0 +1,39 @@
+
+This directory is intended for project header files.
+
+A header file is a file containing C declarations and macro definitions
+to be shared between several project source files. You request the use of a
+header file in your project source file (C, C++, etc) located in `src` folder
+by including it, with the C preprocessing directive `#include'.
+
+```src/main.c
+
+#include "header.h"
+
+int main (void)
+{
+ ...
+}
+```
+
+Including a header file produces the same results as copying the header file
+into each source file that needs it. Such copying would be time-consuming
+and error-prone. With a header file, the related declarations appear
+in only one place. If they need to be changed, they can be changed in one
+place, and programs that include the header file will automatically use the
+new version when next recompiled. The header file eliminates the labor of
+finding and changing all the copies as well as the risk that a failure to
+find one copy will result in inconsistencies within a program.
+
+In C, the usual convention is to give header files names that end with `.h'.
+It is most portable to use only letters, digits, dashes, and underscores in
+header file names, and at most one dot.
+
+Read more about using header files in official GCC documentation:
+
+* Include Syntax
+* Include Operation
+* Once-Only Headers
+* Computed Includes
+
+https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
diff --git a/code-snippets/client/transfer-data-to-host-endpoint/platformio.ini b/code-snippets/client/transfer-data-to-host-endpoint/platformio.ini
new file mode 100644
index 0000000000000000000000000000000000000000..458c08b6f0717089ed05bbfa9af532e8ee811887
--- /dev/null
+++ b/code-snippets/client/transfer-data-to-host-endpoint/platformio.ini
@@ -0,0 +1,18 @@
+; PlatformIO Project Configuration File
+;
+;   Build options: build flags, source filter
+;   Upload options: custom upload port, speed and extra flags
+;   Library options: dependencies, extra library storages
+;   Advanced options: extra scripting
+;
+; Please visit documentation for the other options and examples
+; https://docs.platformio.org/page/projectconf.html
+
+[env:esp32c3]
+platform = espressif32
+board = esp32-c3-devkitm-1
+framework = arduino
+monitor_speed = 115200
+lib_deps = 
+	sparkfun/SparkFun SCD30 Arduino Library@^1.0.18
+	bblanchon/ArduinoJson@^6.19.4
diff --git a/code-snippets/client/transfer-data-to-host-endpoint/src/main.cpp b/code-snippets/client/transfer-data-to-host-endpoint/src/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..38d380fd338affc9d4933fa030db7663eb0148bd
--- /dev/null
+++ b/code-snippets/client/transfer-data-to-host-endpoint/src/main.cpp
@@ -0,0 +1,116 @@
+
+/*******************************************
+   LIBRARIES
+   The use of angle brackets (<>) causes the
+   compiler to search the default include
+   directory. Double quotes ("") causes it
+   to search the current working directory
+   and, if that search fails, it defaults
+   to the default include directory.
+*******************************************/
+
+#include <Wire.h>                           // I2C bus
+#include "WiFi.h"                           // WiFi connection
+#include <SparkFun_SCD30_Arduino_Library.h> // CO2 sensor library
+
+/*******************************************
+   VARIABLES & CONSTANTS
+*******************************************/
+
+#define I2C_SDA 18 // use GPIO pin for I2C: SDA 
+#define I2C_SCL 19 // use GPIO pin for I2C: SCL  
+/*******************************************
+   INSTANTIATION
+*******************************************/
+
+SCD30 airSensor;
+WiFiClient client;
+
+void connectToWiFi()
+{
+
+    WiFi.mode(WIFI_STA);
+    WiFi.begin("micropython", "ThisIsAPassword");
+    Serial.print("Connecting to micropython");
+
+    uint8_t i = 0;
+    while (WiFi.status() != WL_CONNECTED)
+    {
+        Serial.print('.');
+        delay(500);
+
+        if ((++i % 16) == 0)
+        {
+            Serial.println(F(" still trying to connect"));
+        }
+    }
+
+    Serial.print(F("Connected. My IP address is: "));
+    Serial.println(WiFi.localIP());
+}
+
+void setup()
+{
+    Serial.begin(115200);
+    Serial.println("SCD30 Example");
+    Wire.begin(I2C_SDA, I2C_SCL);
+
+    if (airSensor.begin() == false)
+    {
+        Serial.println("Air sensor not detected. Please check wiring. Freezing...");
+        while (true)
+        {
+        }
+    }
+    connectToWiFi();
+}
+
+void send_data_wifi(String send_string)
+{
+    // Send data to server
+    int conn = client.connect("192.168.4.1", 80);
+    if (conn == 1)
+    {
+        client.println("POST / HTTP/1.1");
+        client.println("Host: 192.168.4.1");
+        client.println("Content-Type: application/json");
+        client.println("Content-Length: " + String(send_string.length()));
+        client.println();
+        client.println(send_string);
+    }
+    else
+    {
+        client.stop();
+        Serial.println("Connection failed");
+    }
+}
+
+void loop()
+{
+    if (airSensor.dataAvailable())
+    {
+
+        auto c02 = airSensor.getCO2();
+        Serial.print("co2(ppm):");
+        Serial.print(c02);
+
+        auto temp = airSensor.getTemperature();
+        Serial.print(" temp(C):");
+        Serial.print(temp, 1);
+
+        auto humidity = airSensor.getHumidity();
+        Serial.print(" humidity(%):");
+        Serial.print(humidity, 1);
+
+        Serial.println();
+
+        String str = "{\"co2\": " + String(c02) + ", \"temp\": " + String(temp) + ", \"humidity\": " + String(humidity) + "}";
+        send_data_wifi(str);
+        
+    }
+    else
+        Serial.println("Waiting for new data");
+
+    // The SCD30 has data ready every two seconds
+    delay(2500);
+}
\ No newline at end of file
diff --git a/code-snippets/client/transfer-data-to-host-endpoint/test/README b/code-snippets/client/transfer-data-to-host-endpoint/test/README
new file mode 100644
index 0000000000000000000000000000000000000000..9b1e87bc67c90e7f09a92a3e855444b085c655a6
--- /dev/null
+++ b/code-snippets/client/transfer-data-to-host-endpoint/test/README
@@ -0,0 +1,11 @@
+
+This directory is intended for PlatformIO Test Runner and project tests.
+
+Unit Testing is a software testing method by which individual units of
+source code, sets of one or more MCU program modules together with associated
+control data, usage procedures, and operating procedures, are tested to
+determine whether they are fit for use. Unit testing finds problems early
+in the development cycle.
+
+More information about PlatformIO Unit Testing:
+- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html
diff --git a/code-snippets/host/simple-microdot-webserver.py b/code-snippets/host/simple-microdot-webserver.py
new file mode 100644
index 0000000000000000000000000000000000000000..c5c4f1eeca6faa691393536c3384ae7fdcffd121
--- /dev/null
+++ b/code-snippets/host/simple-microdot-webserver.py
@@ -0,0 +1,36 @@
+import network
+
+# start the ESP in AP mode
+ap = network.WLAN(network.AP_IF)
+ap.active(True)
+ap.config(essid='micropython', password=b"ThisIsAPassword", channel=11,
+          authmode=network.AUTH_WPA_WPA2_PSK)  # Set up an access point
+print('network config:', ap.ifconfig())
+print('network status:', ap.status())
+
+import uasyncio
+# to install microdot, see https://git.uibk.ac.at/informatik/qe/forte/forte/-/wikis/Microdot-Installation
+from lib.src.microdot_asyncio import Microdot
+
+# setup webserver
+app = Microdot()
+
+# add a route
+@app.post('/')
+async def hello(request):
+    with open("test.txt", "a") as f:
+        f.write("request " + str(request.body) + "\n")
+        print("request")
+    return 'Hello world'
+
+
+def start_server():
+    print('Starting microdot app')
+    try:
+        app.run(port=80)
+    except:
+        app.shutdown()
+
+
+start_server()
+