You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@streampipes.apache.org by ri...@apache.org on 2026/06/03 09:00:38 UTC

(streampipes-website) branch refactor-website created (now 3d69246ef)

This is an automated email from the ASF dual-hosted git repository.

dominikriemer pushed a change to branch refactor-website
in repository https://gitbox.apache.org/repos/asf/streampipes-website.git


      at 3d69246ef Add more content

This branch includes the following new commits:

     new 7d67d22be feat: Restructure docs
     new aebfdc092 Remove old images, add new screenshots
     new 6796377e5 Merge branch 'dev' into refactor-website
     new c04cde2c9 Add screenshots
     new f2730429f Add screenshots
     new bd8c7efc1 Update content
     new b7b5f5096 Update homepage
     new 3d69246ef Add more content

The 8 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(streampipes-website) 03/08: Merge branch 'dev' into refactor-website

Posted by ri...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dominikriemer pushed a commit to branch refactor-website
in repository https://gitbox.apache.org/repos/asf/streampipes-website.git

commit 6796377e5b166b66d6d560fbb764042c9c4d248a
Merge: aebfdc092 4b6f64a7d
Author: Dominik Riemer <do...@gmail.com>
AuthorDate: Tue Jun 2 15:09:51 2026 +0000

    Merge branch 'dev' into refactor-website

 .asf.yaml                       | 16 ++++++++++++-
 .devcontainer/devcontainer.json | 30 +++++++++++++++++++++++++
 .vscode/launch.json             | 17 ++++++++++++++
 .vscode/tasks.json              | 50 +++++++++++++++++++++++++++++++++++++++++
 4 files changed, 112 insertions(+), 1 deletion(-)


(streampipes-website) 07/08: Update homepage

Posted by ri...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dominikriemer pushed a commit to branch refactor-website
in repository https://gitbox.apache.org/repos/asf/streampipes-website.git

commit b7b5f5096198ada5ed10d89baee6bb1b99175325
Author: Dominik Riemer <do...@gmail.com>
AuthorDate: Wed Jun 3 10:15:44 2026 +0200

    Update homepage
---
 website-v2/src/components/Teaser.tsx               |  20 +++++++-----
 .../src/components/home/LovedByDevelopers.tsx      |  16 ----------
 website-v2/src/components/home/LovedByUsers.tsx    |  35 +++++++++++++--------
 .../src/components/home/ReadyforProduction.tsx     |   6 ++--
 website-v2/static/css/custom-website.css           |  12 +++----
 .../img/2026/pipeline-editor-configuration.png     | Bin 0 -> 309764 bytes
 6 files changed, 44 insertions(+), 45 deletions(-)

diff --git a/website-v2/src/components/Teaser.tsx b/website-v2/src/components/Teaser.tsx
index fe1f4573a..80d4e96c3 100644
--- a/website-v2/src/components/Teaser.tsx
+++ b/website-v2/src/components/Teaser.tsx
@@ -1,6 +1,5 @@
 import React, { FC } from 'react';
 import TeaserFeature from './TeaserFeature';
-import CircleContainer from './CircleContainer';
 
 const Teaser = (props) => (
   <>
@@ -13,10 +12,10 @@ const Teaser = (props) => (
                 <span className={"top-claim-area-subtitle-text"}>All-In-One</span>
               </div>
               <div className={"top-claim-area-main-title"}>
-                Industrial IoT Toolbox
+                Industrial IoT Data Platform
               </div>
             </div>
-            <div className="apache-teaser">Apache StreamPipes is a self-service Industrial IoT toolbox to enable
+            <div className="apache-teaser">Apache StreamPipes is a self-service Industrial IoT data platform to enable
               non-technical
               users to
               connect, analyze and explore IoT data streams.
@@ -37,27 +36,34 @@ const Teaser = (props) => (
 
             <div className="container-header">
               <div className="row">
-                <div className="col-12 col-lg-4">
+                <div className="col-12 col-lg-3">
                   <TeaserFeature
                     icon={"fa-table-columns"}
                     title={"Easy to use"}
                     subtitle={"Intuitive and fully integrated web-based user interface"}>
                   </TeaserFeature>
                 </div>
-                <div className="col-12 col-lg-4">
+                <div className="col-12 col-lg-3">
                   <TeaserFeature
                     icon={"fa-bolt"}
                     title={"Powerful"}
-                    subtitle={"Quickly implement your IIoT use cases"}>
+                    subtitle={"Quickly implement your IIoT use cases."}>
                   </TeaserFeature>
                 </div>
-                <div className="col-12 col-lg-4">
+                <div className="col-12 col-lg-3">
                   <TeaserFeature
                     icon={"fa-code"}
                     title={"Extensible"}
                     subtitle={"Developer tools for Java, Python and TypeScript"}>
                   </TeaserFeature>
                 </div>
+                <div className="col-12 col-lg-3">
+                  <TeaserFeature
+                    icon={"fa-industry"}
+                    title={"Enterprise-ready"}
+                    subtitle={"Scale from pilot to production"}>
+                  </TeaserFeature>
+                </div>
                 {/*<a href="https://www.apache.org/events/current-event.html">*/}
                 {/*  <img src="https://www.apache.org/events/current-event-125x125.png"*/}
                 {/*       className={"event-image"}/>*/}
diff --git a/website-v2/src/components/home/LovedByDevelopers.tsx b/website-v2/src/components/home/LovedByDevelopers.tsx
index 9d171195e..3c395b97c 100644
--- a/website-v2/src/components/home/LovedByDevelopers.tsx
+++ b/website-v2/src/components/home/LovedByDevelopers.tsx
@@ -75,22 +75,6 @@ const LovedByDevelopers = (props) => (
             <img className="d-block w-100 mt-2 mb-2" src={"/img/screenshots/python-onlineml.png"} alt={"Online ML"}/>
           </div>
         </TwoColumnFeatureSection>
-        <TwoColumnFeatureSection>
-          <div>
-            <img className="d-block w-100 mt-2 mb-2" src={"/img/screenshots/streampipes-custom-ui.png"} alt={"Online ML"}/>
-          </div>
-          <Subsection title={"Customized User Interfaces"}>
-            <p className={"text-left"}>
-              As a software platform that targets the Industrial IoT, we know that many applications require their own user interface, for instance, to assist maintenance personnel or to visualize machine behaviour.
-            </p>
-            <p className={"text-left"}>
-              The default user interface of StreamPipes can be extended with additional views by an integrated microfrontend framework.
-            </p>
-            <p className={"text-left"}>
-              A Typescript client library and an API to access platform features help you to build your custom IIoT solution with much less programming effort.
-            </p>
-          </Subsection>
-        </TwoColumnFeatureSection>
       </PageSection>
 
     </>
diff --git a/website-v2/src/components/home/LovedByUsers.tsx b/website-v2/src/components/home/LovedByUsers.tsx
index 3185baa7f..2cacb7774 100644
--- a/website-v2/src/components/home/LovedByUsers.tsx
+++ b/website-v2/src/components/home/LovedByUsers.tsx
@@ -9,19 +9,20 @@ const LovedByUsers = (props) => (
                    sectionSubtitle={"No more application wiring"} backgroundClass={"background-white"}>
         <FeatureItemHorizontal featureNumber={"01."} title={"IIoT Connectivity"}
                                images={[
-                                 {src: "/img/screenshots/streampipes-connect-opcua.png", alt: "StreamPipes Connect OPC-UA Browser"},
-                                 {src: "/img/screenshots/streampipes-connect-overview.png", alt: "StreamPipes Connect"},
-                                 {src: "/img/screenshots/streampipes-connect-schema-editor.png", alt: "StreamPipes Connect Schema Editor"}]}>
+                                 {src: "/img/2026/connect-create-select-adapter.png", alt: "StreamPipes Connect Adapter Library"},
+                                 {src: "/img/2026/connect-create-opcua-browser.png", alt: "StreamPipes Connect OPC UA browser"},
+                                 {src: "/img/2026/connect-create-configure-schema-example.png", alt: "StreamPipes Connect Schema Transformations"}]}>
           <p className={"text-left"}>Integrate data streams using the built-in StreamPipes Connect library
-            with support many industrial protoocls such as S7, MQTT, Modbus, OPC-UA and many other IT protocols such as Apache Kafka and Apache Pulsar.</p>
+            with support many industrial protoocls such as S7, MQTT, Modbus, OPC UA, OPC UA Events, WinCC Alarm Archive and many other IT protocols such as Apache Kafka and Apache Pulsar.</p>
           <hr/>
           <p><b>Some included adapters and integrations:</b></p>
           <p className={"text-left"}>
+            <a href="https://opcfoundation.org/">OPC UA</a>,
             <a href="https://kafka.apache.org">Apache Kafka</a>,
-            <a href="https://pulsar.apache.org">Apache Pulsar</a>,
-            <a href="https://plc4x.apache.org">Apache PLC4X (e.g., S7</a>,
+            <a href="https://mqtt.org">MQTT</a>,
+            <a href="https://plc4x.apache.org">Apache PLC4X (e.g., S7, Modbus)</a>,
             <a href="https://www.ros.org">Robot Operating System (ROS)</a>,
-            OPC-UA, MQTT and more.
+            and many more.
           </p>
           <hr/>
           <p className={"text-left"}>Adapters can be easily configured right from the user interface - with an intuitive
@@ -33,7 +34,7 @@ const LovedByUsers = (props) => (
           <a href="/docs/use-connect/" className="sp-button sp-button-medium sp-button-blue"><i
             className="fas fa-hand-point-right"></i> Learn more</a>
         </FeatureItemHorizontal>
-        <FeatureItemHorizontal featureNumber={"02."} title={"Analyze"} images={[{src: "/img/screenshots/sp-editor-pipeline.png", alt: "StreamPipes Pipeline Editor"}, {src: "/img/screenshots/sp-editor-config-trend.png", alt: "Pipeline Editor Configuration"}]}>
+        <FeatureItemHorizontal featureNumber={"02."} title={"Analyze"} images={[{src: "/img/2026/pipeline-editor-example.png", alt: "StreamPipes Pipeline Editor"}, {src: "/img/2026/pipeline-editor-configuration.png", alt: "Pipeline Configuration"}, {src: "/img/2026/pipeline-overview-grouped.png", alt: "Pipeline Overview"}]}>
           <p className={"text-left"}>Harmonize and analyze data by using the real-time algorithm toolbox ranging from simple filters up to pre-trained neural networks - or build your own algorithm with the provided SDK.</p>
           <hr/>
           <p className={"text-left"}><b>Some included data processors:</b></p>
@@ -46,7 +47,7 @@ const LovedByUsers = (props) => (
           <a href="/docs/use-pipeline-editor/" className="sp-button sp-button-medium sp-button-blue"><i
             className="fas fa-hand-point-right"></i> Learn more</a>
         </FeatureItemHorizontal>
-        <FeatureItemHorizontal featureNumber={"03."} title={"Exploit"} images={[{src: "/img/screenshots/sp-data-explorer-config.png", alt: "Data Explorer Widgets"}, {src: "/img/screenshots/sp-explorer-ts.png", alt: "StreamPipes Data Explorer Time Series Chart"}, {src: "/img/screenshots/sp-dashboard.png", alt: "Live Dashboard"}]}>
+        <FeatureItemHorizontal featureNumber={"03."} title={"Exploit"} images={[{src: "/img/2026/dashboard-create.png", alt: "Dashboards"}, {src: "/img/2026/chart-status-heatmap.png", alt: "StreamPipes Status Heatmap"}, {src: "/img/2026/chart-traffic-light.png", alt: "Chart Traffic Light"}]}>
           <p className={"text-left"}>Trigger notifications, configure your real-time dashboard or send data to third-party systems such as databases (e.g., Kafka or Elasticsearch), external services (e.g., Slack) or IoT actuators.</p>
           <hr/>
           <p className={"text-left"}><b>Some included data sinks:</b></p>
@@ -58,13 +59,21 @@ const LovedByUsers = (props) => (
             OPC-UA, RabbitMQ, Email, Slack, Internal Notification, PostgreSQL and more.
           </p>
           <hr/>
-          <p className={"text-left"}>The brand-new data explorer gives you an intuitive and feature-rich component to visually analyze persisted time-series data and comes with ready-to-use visualizations such as heatmaps, value distribution charts or time-series charts.</p>
+          <p className={"text-left"}>The chart library gives you an intuitive and feature-rich component to visually analyze persisted time-series data and comes with ready-to-use visualizations such as heatmaps, value distribution charts or time-series charts.</p>
           <hr/>
           <p className={"text-left"}>Use the live dashboard to visualize data in real-time, e.g., show critical values directly on the shopfloor.</p>
-          <a href="/docs/use-data-explorer/" className="sp-button sp-button-medium sp-button-blue"><i
-            className="fas fa-hand-point-right/"></i> Data Explorer</a>
+          <a href="/docs/use-charts/" className="sp-button sp-button-medium sp-button-blue"><i
+            className="fas fa-hand-point-right/"></i> Charts</a>
           <a href="/docs/use-dashboard/" className="sp-button sp-button-medium sp-button-blue"><i
-            className="fas fa-hand-point-right"></i> Live Dashboard</a>
+            className="fas fa-hand-point-right"></i> Dashboards</a>
+        </FeatureItemHorizontal>
+        <FeatureItemHorizontal featureNumber={"04."} title={"Manage"} images={[{src: "/img/2026/home-map.png", alt: "Homepage"}, {src: "/img/2026/asset-create.png", alt: "Asset Management"}, {src: "/img/2026/dataset-export-provider-dialog-s3.png", alt: "Retention Config"}]}>
+          <p className={"text-left"}>Manage assets, sites, locations and assign resources to physical assets. Organize your unified namespace.</p>
+          <hr/>
+          <p className={"text-left"}>As an integrated data platform you can manage assets, sites, users, permissions and much more. Developer interfaces ensure that StreamPipes integrates with your existing infrastructure.</p>
+          <hr/>
+          <a href="/docs/use-assets/" className="sp-button sp-button-medium sp-button-blue"><i
+            className="fas fa-hand-point-right"></i> Assets</a>
         </FeatureItemHorizontal>
       </PageSection>
 
diff --git a/website-v2/src/components/home/ReadyforProduction.tsx b/website-v2/src/components/home/ReadyforProduction.tsx
index df479a95b..a5f26b661 100644
--- a/website-v2/src/components/home/ReadyforProduction.tsx
+++ b/website-v2/src/components/home/ReadyforProduction.tsx
@@ -14,17 +14,17 @@ const ReadyforProduction = (props) => (
             User management is included and can be configured directly from the user interface.
           </p>
           <p className={"text-left text-light"}>
-            StreamPipes supports the management of users, groups and permissions, so that access to views can be individually restricted.
+            StreamPipes supports the management of users, groups and permissions, so that access to views can be individually restricted. OAuth 2.0 can enabled.
           </p>
         </Subsection>
         <div>
-          <img className="d-block w-100 mt-2 mb-2" src={"/img/screenshots/streampipes-user-management.png"} alt={"User Management"}/>
+          <img className="d-block w-100 mt-2 mb-2" src={"/img/2026/security-edit-user.png"} alt={"User Management"}/>
         </div>
       </TwoColumnFeatureSection>
 
       <TwoColumnFeatureSection>
         <div>
-          <img className="d-block w-100 mt-2 mb-2" src={"/img/screenshots/streampipes-mail-configuration.png"} alt={"Mail Configuration"}/>
+          <img className="d-block w-100 mt-2 mb-2" src={"/img/2026/settings-mail-template.png"} alt={"Mail Configuration"}/>
         </div>
         <Subsection title={"Email & notifications"}>
           <p className={"text-left text-light"}>
diff --git a/website-v2/static/css/custom-website.css b/website-v2/static/css/custom-website.css
index 7d6f0c0ee..216635667 100644
--- a/website-v2/static/css/custom-website.css
+++ b/website-v2/static/css/custom-website.css
@@ -301,7 +301,7 @@ img {
 	width:100%;
 	//background: rgba(255, 255, 255, 0.85);
 	box-shadow: rgba(0, 0, 0, 0.02) 0px 1px 3px 0px, rgba(27, 31, 35, 0.15) 0px 0px 0px 1px;
-	height: 250px;
+	height: 200px;
 	border-radius: 10px;
 	text-align: center;
 	padding: 15px;
@@ -310,20 +310,20 @@ img {
 .feature-highlights-icon {
     margin-right:10px;
 	color: var(--color-accent);
-	font-size: 3rem;
+	font-size: 2.5rem;
 }
 
 .feature-highlights-title {
     font-weight: 800;
 	color: var(--color-accent);
-	font-size: 1.5rem;
+	font-size: 1.25rem;
 }
 
 .feature-highlights-subtitle {
 	color:var(--color-primary);
 	padding:3px;
 	font-weight: 500;
-	font-size: 1rem;
+	font-size: 0.9rem;
 }
 
 .sp-blue {
@@ -389,7 +389,7 @@ img {
 }
 
 .teaser-image {
-	background-image:url('/img/bg-img/sp.png');
+	background-image:url('/img/2026/home-table.png');
 	//background:linear-gradient(0deg, rgba(255, 255, 255, 0.5), rgba(255, 255, 255, 0.5)), url('/img/bg-img/bg-index-color.png');
 	background-size:cover;
 	border-radius: 20px;
@@ -451,7 +451,7 @@ img {
 
 .top-claim-area-main-title {
 	font-weight: 800;
-	font-size: 5.25rem;
+	font-size: 4.25rem;
 	color: var(--color-primary);
 }
 
diff --git a/website-v2/static/img/2026/pipeline-editor-configuration.png b/website-v2/static/img/2026/pipeline-editor-configuration.png
new file mode 100644
index 000000000..7cdca9cc4
Binary files /dev/null and b/website-v2/static/img/2026/pipeline-editor-configuration.png differ


(streampipes-website) 08/08: Add more content

Posted by ri...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dominikriemer pushed a commit to branch refactor-website
in repository https://gitbox.apache.org/repos/asf/streampipes-website.git

commit 3d69246ef1fd37c8289962d913f5d8288b08ef26
Author: Dominik Riemer <do...@gmail.com>
AuthorDate: Wed Jun 3 11:00:18 2026 +0200

    Add more content
---
 docs/04_use-charts.md                              |  69 +++++++++++++-----
 docs/04_use-dashboards.md                          |  18 ++---
 docs/04_use-datasets.md                            |  80 +++++++++------------
 website-v2/docusaurus.config.js                    |   2 +-
 .../src/components/docs/ScreenshotFigure.tsx       |  11 ++-
 website-v2/src/components/docs/docs.module.css     |  10 +++
 website-v2/src/components/home/LovedByUsers.tsx    |   6 +-
 .../img/2026/dataset-configure-retention.png       | Bin 0 -> 235702 bytes
 8 files changed, 112 insertions(+), 84 deletions(-)

diff --git a/docs/04_use-charts.md b/docs/04_use-charts.md
index d4c31e44d..ba7fece60 100644
--- a/docs/04_use-charts.md
+++ b/docs/04_use-charts.md
@@ -9,7 +9,7 @@ import ScreenshotSlideshow from '@site/src/components/docs/ScreenshotSlideshow';
 
 Charts are where persisted industrial data becomes something a user can actually read and act on. In StreamPipes, a chart starts with an existing dataset, turns that dataset into a query result, and then presents that result in a visualization that matches the analytical question.
 
-This is an important distinction from `Connect` and `Pipelines`. Those features bring data into StreamPipes and prepare it. Charts work one step later. They assume that the data already exists and help you ask questions such as: What happened over time? What is the current value? How are two measurements related? Which states occurred most often?
+Charts assume that the data already exists as a a dataset and help you ask questions such as: What happened over time? What is the current value? How are two measurements related? Which states occurred most often?
 
 <ScreenshotFigure
   src="/img/2026/chart-timeseries.png"
@@ -29,7 +29,7 @@ That also explains how to think about charts in the wider platform. A chart is n
 
 The chart feature has two parts. The `Charts` overview is where you manage existing charts. The editor is where you design or refine one chart.
 
-The overview lets you open, edit, clone, share, and delete charts. It also warns you when a chart is outdated. Two cases matter here. Older `legacy multi-source charts` still exist, but the current editor is built around one dataset per chart. In addition, StreamPipes can tell you when a chart `requires attention` because the schema of the underlying dataset has changed. Both warnings are useful because they tell you that the problem is not cosmetic. In those situations, the chart defini [...]
+The overview lets you open, edit, clone, share, and delete charts. It also warns you when a chart is outdated. StreamPipes can tell you when a chart `requires attention` because the schema of the underlying dataset has changed. Both warnings are useful because they tell you that the problem is not cosmetic. In those situations, the chart definition itself needs review.
 
 Inside the editor, the work usually follows the same order every time. First select the dataset. Then decide which query result you want. Only after the data preview looks right does it make sense to choose the chart type and adjust appearance. Users who reverse that order often spend time tweaking a visualization when the real problem is still in the query.
 
@@ -53,6 +53,14 @@ The first decision is the query type. StreamPipes currently supports `Raw`, `Agg
 
 `Single` is the right choice when the chart should show one current state rather than a history. A gauge for current pressure, a status light for machine availability, or an indicator for current power draw are typical examples. In those cases, a time series would add noise instead of clarity.
 
+<ScreenshotFigure
+src="/img/2026/chart-data-aggregation.png"
+alt="Chart editor data tab with aggregation selection"
+title="Query Type"
+caption="Field selection, grouping, and filters define the analytical result before the visualization tab turns it into a chart."
+size="compact"
+/>
+
 ## Refine the result with fields, filters, grouping, and order
 
 After choosing the query type, continue refining the result itself. StreamPipes loads the dataset fields and preselects an initial set to get you started. Keep in mind that field selection is not just cosmetic. It changes what the chart can work with.
@@ -65,19 +73,30 @@ Grouping and ordering complete the query shape. `Group by` is what makes one dat
 
 At the bottom of the data configuration, StreamPipes also offers two small but practical switches: the browser overload warning and the missing-values option. These are not usually the main story of the chart, but they matter operationally. A large result set can make the browser heavy, and incomplete rows can distort multi-field charts. If a chart becomes unstable because one field is occasionally missing, ignoring incomplete events can be more useful than trying to style around the problem.
 
+<ScreenshotFigure
+src="/img/2026/chart-data-fields.png"
+alt="Chart editor data tab with field selection"
+title="Build the Query First"
+eyebrow="Data Configuration"
+caption="Field selection, grouping, and filters define the analytical result before the visualization tab turns it into a chart."
+size="compact"
+/>
+
+<ScreenshotFigure
+src="/img/2026/chart-advanced-filter.png"
+alt="Advanced Filter"
+title="Advanced Filter"
+caption="Use the Advanced Filter for complex filter expressions"
+size="compact"
+/>
+
 ## Use the data preview as your checkpoint
 
 The `Data preview` is one of the most important parts of the chart editor. It is the moment where the abstract query becomes visible as concrete rows. Users who learn to trust the preview usually build better charts faster.
 
 Before spending time on chart type or appearance, look at the preview and ask a few basic questions. Did you select the correct dataset? Did the filter return the right subset? Did grouping create the result shape you expected? Does the result look like something the chosen chart type can represent well? Many chart problems are already obvious in the preview. If a pie chart seems wrong, the grouped values are often already wrong in the table. If a status chart looks confusing, the issue  [...]
 
-<ScreenshotFigure
-  src="/img/2026/chart-data-fields.png"
-  alt="Chart editor data tab with field selection"
-  title="Build the Query First"
-  eyebrow="Data Configuration"
-  caption="Field selection, grouping, and filters define the analytical result before the visualization tab turns it into a chart."
-/>
+The three configuration tabs are easiest to understand as a sequence. `Data` defines what should be queried. `Visualization` decides how that result should be interpreted as a chart type. `Appearance` is where presentation details are refined once the analytical meaning is already correct.
 
 ## Choose the chart type to match the question
 
@@ -137,6 +156,28 @@ After selecting the chart type, the designer panel lets you refine `Visualizatio
 
 This separation is worth keeping in mind because it prevents a common mistake. If the chart tells the wrong story, the problem is usually not in the appearance tab. It is usually in the query or in the chart type. Appearance should be the final polishing step, not the place where the analytical meaning is invented.
 
+<ScreenshotFigure
+  src="/img/2026/chart-time-selection.png"
+  alt="Chart editor with the time selection menu and custom date range dialog open"
+  title="Time Selection"
+  eyebrow="Chart Configuration"
+  caption="The time selector in the toolbar lets you switch quickly between relative ranges such as the last 15 minutes or the last month, or define an explicit custom start and end time when the chart should answer a precise historical question."
+  size="compact"
+/>
+
+Time selection matters more than it first appears. A chart can be technically correct and still communicate the wrong thing when the active time range does not match the operational question. Short ranges are usually best for current monitoring and troubleshooting. Longer ranges are better when you want to understand trends, compare shifts, or inspect seasonal behavior. The custom date range is the right choice whenever the chart should focus on one exact incident window instead of a rol [...]
+
+<ScreenshotFigure
+  src="/img/2026/chart-appearance.png"
+  alt="Appearance tab in the chart editor with color, chart settings, and zoom options"
+  title="Appearance Settings"
+  eyebrow="Chart Configuration"
+  caption="The appearance tab refines how the chart is presented through colors, legend and tooltip visibility, decimal formatting, and interactive options such as zoom behavior."
+  size="compact"
+/>
+
+This is where a technically correct chart becomes easier to consume. Colors should support recognition rather than decoration. Legend, toolbox, and tooltip settings decide how much local guidance the viewer gets. Decimal formatting matters when values are either too noisy or not precise enough for the intended audience. Options such as zoom are useful when a chart is meant for exploration instead of only passive monitoring. The key is still the same: use these controls to improve readabi [...]
+
 ## Save, reuse, and manage the chart
 
 The chart toolbar is deliberately small, but every action there matters. You can edit the `Chart Name`, `Save` the chart, `Add To Asset`, `Discard` changes, `Download data`, and change the time range.
@@ -150,13 +191,3 @@ Back in the overview, you can open the chart again, edit it, clone it, manage pe
 Charts are best treated as reusable analytical building blocks. A chart should answer one question well. A dashboard can then combine several of those answers into one operational view. That is why the recommended workflow is to build and validate the chart first, save it, and only then add it to one or more dashboards.
 
 When users follow that approach, both features become easier to maintain. If one dashboard item looks wrong later, the place to fix it is often the source chart, not the dashboard itself.
-
-## Image placeholders
-
-`[Image placeholder: chart overview with warnings for legacy multi-source charts and schema-change attention states]`
-
-`[Image placeholder: chart data configuration showing dataset selection, query type, filters, grouping, and ordering]`
-
-`[Image placeholder: chart type selector with current visualization options such as Time Series Chart, Gauge, Table, Pie, Scatter, and Status]`
-
-`[Image placeholder: finished chart editor with chart name, save, add-to-asset, download, time selector, and data preview]`
diff --git a/docs/04_use-dashboards.md b/docs/04_use-dashboards.md
index 0f35d4648..f9f683002 100644
--- a/docs/04_use-dashboards.md
+++ b/docs/04_use-dashboards.md
@@ -7,7 +7,7 @@ sidebar_label: Dashboards
 import ScreenshotComparison from '@site/src/components/docs/ScreenshotComparison';
 import ScreenshotFigure from '@site/src/components/docs/ScreenshotFigure';
 
-Dashboards are the place where individual charts become a shared operational view. In the current StreamPipes product, dashboards are no longer built from a separate widget framework. Instead, they reuse the charts you already created in `Charts` and arrange them into one screen for monitoring, analysis, or presentation.
+Dashboards are the place where individual charts become a shared operational view. Dashboards reuse the charts you already created in `Charts` and arrange them into one screen for monitoring, analysis, or presentation.
 
 That design is important because it keeps the responsibilities clear. A chart answers one analytical question well. A dashboard combines several of those answers so a user can understand a machine, a line, or a whole process at a glance.
 
@@ -24,9 +24,9 @@ That design is important because it keeps the responsibilities clear. A chart an
     },
     {
       src: '/img/2026/dashboard-create.png',
-      alt: 'Dashboard runtime and edit mode',
-      title: 'Dashboard Runtime',
-      caption: 'The runtime screen shows the actual chart composition, the global toolbar, and the chart-selection panel in edit mode.',
+      alt: 'Dashboard edit mode',
+      title: 'Dashboard',
+      caption: 'The dashboard screen shows the actual chart composition, the global toolbar, and the chart-selection panel in edit mode.',
     },
   ]}
 />
@@ -170,13 +170,3 @@ Permissions matter when a dashboard should be available only to certain teams, r
 Charts and dashboards are tightly related, but they solve different problems. A chart answers one analytical question well. A dashboard combines several saved charts into one operational context. This is why the cleanest working style is to refine the chart first, save it, and then reuse it in one or more dashboards.
 
 If something looks wrong later, the right fix is often not in the dashboard layout at all. It is in the source chart. Once users understand that distinction, both features become much easier to use well.
-
-## Image placeholders
-
-`[Image placeholder: dashboard overview with actions for show, edit, clone, kiosk mode, settings, permissions, and delete]`
-
-`[Image placeholder: dashboard settings dialog with grid and slide options, global time, grid columns, row height, and hide-toolbox option]`
-
-`[Image placeholder: dashboard edit mode with right-side chart selection panel and a button to add saved charts]`
-
-`[Image placeholder: one dashboard shown in grid view and slide view to explain the difference between the two modes]`
diff --git a/docs/04_use-datasets.md b/docs/04_use-datasets.md
index b59242ade..c1a32b246 100644
--- a/docs/04_use-datasets.md
+++ b/docs/04_use-datasets.md
@@ -16,13 +16,12 @@ This makes datasets an important part of the platform story. Adapters and pipeli
 
 ## Understand where datasets come from
 
-Datasets are not created in isolation. They are usually the result of one of three workflows.
+The default way how datasets are created are pipelines when using the `Data Lake` sink. 
+A team creates an adapter or a pipeline, enables persistence, and lets StreamPipes store the resulting events continuously. The dataset then becomes the historical record of that live source.
+A pipeline cleans, enriches, or aggregates raw input and writes the result as a dataset. In practice, these datasets are often the best source for dashboards because they already contain business-ready fields instead of raw machine payloads.
 
-The first is live persistence. A team creates an adapter or a pipeline, enables persistence, and lets StreamPipes store the resulting events continuously. The dataset then becomes the historical record of that live source.
-
-The second is processed persistence. A pipeline cleans, enriches, or aggregates raw input and writes the result as a dataset. In practice, these datasets are often the best source for dashboards because they already contain business-ready fields instead of raw machine payloads.
-
-The third is CSV import. A team already has historical data in files and wants to start with analysis immediately, even before a live connection is available.
+There are also short-hand features to create datasets directly from an adapter (which internally creates a pipeline upon start of the adapter) and by CSV import.
+In this case. a team already has historical data in files and wants to start with analysis immediately, even before a live connection is available.
 
 <UseCaseExample title="Think of datasets as durable context">
   A raw machine stream may be useful for live processing, but a persisted dataset is what lets another team come back tomorrow, open the same data again, build charts on top of it, and compare current behavior with last week.
@@ -74,35 +73,17 @@ To open the preview, open `Datasets`, find the row, and click the preview action
   A team imports one week of machine history from CSV and sees the row count they expected. That still does not prove the timestamp column was interpreted correctly. One preview is usually enough to catch that kind of problem before the data reaches charts and dashboards.
 </UseCaseExample>
 
-<ScreenshotSlideshow
-  title="Inspect and Import Data"
-  eyebrow="Dataset Actions"
-  items={[
-    {
-      src: '/img/2026/dataset-upload-data-dialog-preview.png',
-      alt: 'CSV upload preview dialog for datasets',
-      title: 'Validate CSV Parsing',
-      caption: 'Check delimiters, headers, and timestamp interpretation before imported data becomes part of a dataset.',
-    },
-    {
-      src: '/img/2026/dataset-download-data-dialog.png',
-      alt: 'Dataset download dialog',
-      title: 'Download Data',
-      caption: 'Export the current dataset when another team or tool needs an offline extract.',
-    },
-    {
-      src: '/img/2026/dataset-export-provider-dialog-s3.png',
-      alt: 'S3 export provider dialog for datasets',
-      title: 'Configure Export Providers',
-      caption: 'Retention rules can archive older data through reusable export-provider settings such as S3-compatible targets.',
-    },
-  ]}
-/>
-
 ## Import CSV data when the live connection is not the starting point
 
 CSV import is the fastest way to create datasets from historical machine data, vendor exports, test data, or migrated records from another system. The import flow is deliberately guided so users can validate the file structure before anything is written permanently.
 
+<ScreenshotFigure
+src="/img/2026/dataset-upload-data-dialog-preview.png"
+alt="Import CSV Data"
+title="Import CSV Data"
+caption="Check delimiters, headers, and timestamp interpretation before imported data becomes part of a dataset."
+/>
+
 You would typically use CSV import when a machine vendor provides data history as files, when dashboards should be prepared before the live source exists, or when legacy historian exports need to be brought into StreamPipes for comparison and reuse.
 
 <StepFlow
@@ -136,6 +117,15 @@ Datasets are also a handover point to external consumers. Sometimes a process en
 
 To download a dataset, open the row action menu, click `Download`, configure the export dialog, and start the export. The exact export shape depends on the dialog options, but the operational idea is simple: StreamPipes remains the source of truth while still letting data move into external workflows when required.
 
+<ScreenshotFigure
+src="/img/2026/dataset-download-data-dialog.png"
+alt="Download Datasets"
+title="Download Datasets"
+caption="Retention rules can archive older data through reusable export-provider settings such as S3-compatible targets."
+/>
+
+Current export options are CSV, JSON and Microsoft Excel. In case you want to export data in Excel format, it is also possible to upload a template that will be used to append data to a formatted spreadsheet.
+
 ## Configure retention when stored data keeps growing
 
 Retention is where dataset operation becomes long-term platform operation. Machine data often grows continuously, and not every dataset should remain in the active store forever. A retention rule lets you decide what should happen to older data after a certain age.
@@ -150,9 +140,11 @@ If the action includes saving data, the same dialog also requires export setting
 
 Once a rule exists, the same dialog can be used operationally. `Run Sync Now` executes the configured rule immediately, which is useful for testing, and `Delete Sync` removes the stored retention configuration.
 
-<DocVisualPlaceholder
-  title="Retention configuration"
-  purpose="Show the retention dialog with age threshold, interval, action, export settings, provider selection, and run-now controls."
+<ScreenshotFigure
+src="/img/2026/dataset-configure-retention.png"
+alt="Configure Retention"
+title="Configure Retention"
+caption="Define a retention policy for a dataset."
 />
 
 ## Use export providers as shared retention infrastructure
@@ -161,6 +153,14 @@ Export providers define where retained data should be sent when a retention rule
 
 The practical pattern is to configure the provider once, test it, and then reuse it across several dataset rules. That keeps retention predictable and avoids copy-pasting infrastructure details into every single dataset workflow.
 
+<ScreenshotFigure
+src="/img/2026/dataset-export-provider-dialog-s3.png"
+alt="S3 export provider dialog for datasets"
+title="S3 export provider dialog for datasets"
+caption="Export the current dataset when another team or tool needs an offline extract."
+/>
+
+
 ## Know the difference between truncating data and deleting the dataset
 
 StreamPipes distinguishes between clearing stored events and removing the dataset itself, and that distinction matters.
@@ -174,15 +174,3 @@ Use `Delete dataset` when the dataset should disappear completely. Open the same
 Datasets often sit between several roles. One team may own ingestion, another may consume charts, and a third may be responsible for audit or export. For that reason, permission management is available directly from the dataset row.
 
 Open the action menu, click `Manage permissions`, and update access in the dialog. This keeps ownership and consumption separate without duplicating the stored data itself.
-
-## Typical ways teams use datasets
-
-The simplest workflow starts in `Connect`: a team creates an adapter, enables persistence, opens `Datasets` to confirm the new store appears, checks the recent count, previews one event, and then builds charts on top of the result.
-
-Another common workflow starts with historical files: open `Datasets`, click `Import CSV`, upload the file, validate parsing and timestamps, finish the upload, confirm the total event count, and then move directly into chart creation.
-
-A more operational workflow appears later in production: once a high-volume dataset grows steadily, the team adds a retention rule, selects `Save and Delete`, assigns the export provider, and monitors the retention log to make sure old data is archived as intended.
-
-## Work with datasets deliberately
-
-The most useful mindset is to treat datasets as governed operational stores, not only as technical byproducts of persistence. Check freshness before assuming the source is healthy. Preview before building a chart on top of imported or transformed data. Append CSV files only when the schema truly matches. Use retention once storage growth becomes part of daily operation, and use permissions when the same data must serve several roles with different responsibilities.
diff --git a/website-v2/docusaurus.config.js b/website-v2/docusaurus.config.js
index 0ad744fec..0e6ee5266 100644
--- a/website-v2/docusaurus.config.js
+++ b/website-v2/docusaurus.config.js
@@ -48,7 +48,7 @@ module.exports = {
           "showLastUpdateTime": true,
           "path": "../docs",
           "sidebarPath": "./sidebars.json",
-
+          lastVersion: 'current'
         },
         "blog": {
           "path": "blog"
diff --git a/website-v2/src/components/docs/ScreenshotFigure.tsx b/website-v2/src/components/docs/ScreenshotFigure.tsx
index 59308182c..95978325c 100644
--- a/website-v2/src/components/docs/ScreenshotFigure.tsx
+++ b/website-v2/src/components/docs/ScreenshotFigure.tsx
@@ -9,6 +9,7 @@ type ScreenshotFigureProps = {
   eyebrow?: string;
   badge?: string;
   href?: string;
+  size?: 'full' | 'compact' | 'narrow';
 };
 
 const ScreenshotFigure = ({
@@ -19,8 +20,16 @@ const ScreenshotFigure = ({
   eyebrow,
   badge,
   href,
+  size = 'full',
 }: ScreenshotFigureProps) => {
   const image = <img className={styles.screenshotImage} src={src} alt={alt} />;
+  const mediaClassName = `${styles.screenshotMedia} ${
+    size === 'compact'
+      ? styles.screenshotMediaCompact
+      : size === 'narrow'
+        ? styles.screenshotMediaNarrow
+        : ''
+  }`;
 
   return (
     <figure className={styles.screenshotFrame}>
@@ -35,7 +44,7 @@ const ScreenshotFigure = ({
           {badge ? <span className={styles.screenshotBadge}>{badge}</span> : null}
         </div>
       ) : null}
-      <div className={styles.screenshotMedia}>
+      <div className={mediaClassName}>
         {href ? (
           <a className={styles.screenshotMediaLink} href={href}>
             {image}
diff --git a/website-v2/src/components/docs/docs.module.css b/website-v2/src/components/docs/docs.module.css
index c0e6bb5d6..a0107f2d2 100644
--- a/website-v2/src/components/docs/docs.module.css
+++ b/website-v2/src/components/docs/docs.module.css
@@ -241,6 +241,16 @@
   padding: 1rem;
 }
 
+.screenshotMediaCompact {
+  margin: 0 auto;
+  max-width: 620px;
+}
+
+.screenshotMediaNarrow {
+  margin: 0 auto;
+  max-width: 460px;
+}
+
 .screenshotMediaLink {
   color: inherit;
   display: block;
diff --git a/website-v2/src/components/home/LovedByUsers.tsx b/website-v2/src/components/home/LovedByUsers.tsx
index 2cacb7774..6d3fbfbd2 100644
--- a/website-v2/src/components/home/LovedByUsers.tsx
+++ b/website-v2/src/components/home/LovedByUsers.tsx
@@ -44,7 +44,7 @@ const LovedByUsers = (props) => (
           </p>
           <hr/>
           <p>Our pipeline elements focus on analyzing industrial IoT data - for instance, we provide many operators to transform process data from PLC systems.</p>
-          <a href="/docs/use-pipeline-editor/" className="sp-button sp-button-medium sp-button-blue"><i
+          <a href="/docs/use-pipelines/" className="sp-button sp-button-medium sp-button-blue"><i
             className="fas fa-hand-point-right"></i> Learn more</a>
         </FeatureItemHorizontal>
         <FeatureItemHorizontal featureNumber={"03."} title={"Exploit"} images={[{src: "/img/2026/dashboard-create.png", alt: "Dashboards"}, {src: "/img/2026/chart-status-heatmap.png", alt: "StreamPipes Status Heatmap"}, {src: "/img/2026/chart-traffic-light.png", alt: "Chart Traffic Light"}]}>
@@ -63,8 +63,8 @@ const LovedByUsers = (props) => (
           <hr/>
           <p className={"text-left"}>Use the live dashboard to visualize data in real-time, e.g., show critical values directly on the shopfloor.</p>
           <a href="/docs/use-charts/" className="sp-button sp-button-medium sp-button-blue"><i
-            className="fas fa-hand-point-right/"></i> Charts</a>
-          <a href="/docs/use-dashboard/" className="sp-button sp-button-medium sp-button-blue"><i
+            className="fas fa-hand-point-right"></i> Charts</a>
+          <a href="/docs/use-dashboards/" className="sp-button sp-button-medium sp-button-blue"><i
             className="fas fa-hand-point-right"></i> Dashboards</a>
         </FeatureItemHorizontal>
         <FeatureItemHorizontal featureNumber={"04."} title={"Manage"} images={[{src: "/img/2026/home-map.png", alt: "Homepage"}, {src: "/img/2026/asset-create.png", alt: "Asset Management"}, {src: "/img/2026/dataset-export-provider-dialog-s3.png", alt: "Retention Config"}]}>
diff --git a/website-v2/static/img/2026/dataset-configure-retention.png b/website-v2/static/img/2026/dataset-configure-retention.png
new file mode 100644
index 000000000..bd6224b13
Binary files /dev/null and b/website-v2/static/img/2026/dataset-configure-retention.png differ


(streampipes-website) 06/08: Update content

Posted by ri...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dominikriemer pushed a commit to branch refactor-website
in repository https://gitbox.apache.org/repos/asf/streampipes-website.git

commit bd8c7efc11165763015dfb302c33f15897c85b73
Author: Dominik Riemer <do...@gmail.com>
AuthorDate: Wed Jun 3 09:35:40 2026 +0200

    Update content
---
 docs/01_overview.md                                |   2 -
 docs/02_quick-start-guide.md                       | 150 +++------
 docs/04_use-connect.md                             | 164 ++++------
 docs/04_use-pipelines.md                           |  21 +-
 docs/06_configure-operate-environment-variables.md | 342 ++++++++++++++++-----
 .../src/components/docs/ScreenshotSlideshow.tsx    |   2 +-
 website-v2/src/components/download/DownloadBox.tsx |  22 --
 7 files changed, 372 insertions(+), 331 deletions(-)

diff --git a/docs/01_overview.md b/docs/01_overview.md
index 817d4c0c0..e046fd860 100644
--- a/docs/01_overview.md
+++ b/docs/01_overview.md
@@ -49,8 +49,6 @@ Here are some screenshots that help you understand what you can do with StreamPi
 
 <ScreenshotSlideshow
 title="StreamPipes Features"
-eyebrow="Style Check"
-badge="Preview"
 items={[
 {
 src: '/img/2026/home-map.png',
diff --git a/docs/02_quick-start-guide.md b/docs/02_quick-start-guide.md
index a696994d0..e6163c21d 100644
--- a/docs/02_quick-start-guide.md
+++ b/docs/02_quick-start-guide.md
@@ -46,26 +46,20 @@ Use the installation package below to start a local or test instance.
 
 <DownloadSection version={'0.98.0'} releaseDate={'2025-12-15'}></DownloadSection>
 
-For production-oriented setups, also review the Kubernetes-based deployment options that are part of the installation kit.
-
-## Complete the initial setup
+For production-oriented setups, also review the Kubernetes-based deployment options that are part of the installation kit or check the [Deployment](06_configure-operate-deployment.md) section.
 
 After starting StreamPipes and opening the provided URL in your browser, StreamPipes performs its initial installation flow.
 
-To complete the first setup:
+You should see the following login screen:
 
-1. Open the StreamPipes URL in your browser.
-2. Wait until the installation process finishes.
-3. Click `Go to login page`.
-4. Sign in with the credentials from your installation.
+<ScreenshotFigure
+src="/img/2026/login.png"
+alt="Login screen"
+title="Login Screen"
+/>
 
 After login, you are ready to work in the web interface.
 
-<DocVisualPlaceholder
-  title="First login and home screen"
-  purpose="Orient new users after installation and show that the main modules are ready to use."
-/>
-
 :::danger If installation components do not start
 If the installation does not complete successfully, the most common reason is an underpowered local environment.
 
@@ -78,11 +72,11 @@ Check that:
 If necessary, stop the deployment, remove the containers, and start again with a clean state.
 :::
 
-## What you will build
+## First steps
 
 After installation, this quick start takes you through one simple end-to-end workflow:
 
-- create a sample adapter, ideally with a simulator source
+- create a sample adapter using the machine data simulator
 - persist the events so StreamPipes creates a dataset
 - create a chart from that dataset
 - add the chart to a dashboard
@@ -116,63 +110,31 @@ The goal is not to explain every feature. The goal is to get one complete flow r
 
 If you complete these steps once, the rest of the platform becomes much easier to understand.
 
-<DocVisualPlaceholder
-  title="Quick start overview"
-  purpose="Show the first-run flow from Connect to Datasets, Charts, and Dashboards in one simple diagram."
-/>
-
-## Understand the first-run path
-
-A good first StreamPipes experience is not to start with a complex pipeline. Start with a simpler path that proves the platform is working:
 
-1. create one source in `Connect`
-2. persist its events
-3. confirm the dataset receives data
-4. build one chart
-5. add the chart to a dashboard
-
-This gives you a concrete result quickly and introduces the main objects of the platform in the right order.
-
-## Step 1: Connect a first data source
+### Step 1: Connect a first data source
 
 Open `Connect` and create a new adapter.
 
-For a first test, a simulator adapter is usually the best choice because it lets you validate the platform flow without depending on an external machine or broker.
+For a first test, the `Machine Data Simulator` is usually the best choice because it lets you validate the platform flow without depending on an external machine or broker.
 
 <UseCaseExample title="Recommended first source">
-  Start with a simulator or sample-style adapter if one is available in your installation. It removes protocol and network uncertainty from the first run, so you can focus on learning the StreamPipes workflow itself.
+  Start with the Machine Data Simulator for your first adapter. It removes protocol and network uncertainty from the first run, so you can focus on learning the StreamPipes workflow itself.
 </UseCaseExample>
 
 To create the adapter:
 
 1. Open `Connect`.
 2. Click `New Adapter`.
-3. Choose a sample or simulator-style adapter if one is available in your installation.
-4. Configure the adapter parameters.
-5. Move through the creation wizard until the final step.
+3. Choose `Machine Data Simulator`.
+4. Configure the `Machine Data Simulator`, e.g.,  by choosing the `Flow Rate` sensor and a frequency of `1000ms`.
+5. Click `Next` to see a preview of the data. We don't apply any transformation script for now, so it's enough to click `Next`.
+6. In the `Configure schema` section, choose the `timestamp` row and set the scope from `Measurement` to `Timestamp`.
+7. Click `Next` to open the adapter settings view.
 
 If your preferred adapter is not visible, first install the required extension in `Configuration > Extensions`.
 
-### What to pay attention to during adapter creation
-
-While creating the adapter, do not rush through the wizard. The important idea is that StreamPipes does more than establish a connection.
-
-During onboarding, you can already:
 
-- validate incoming sample events
-- refine the schema
-- adjust field metadata
-- add transformations if needed
-- decide whether the stream should be persisted immediately
-
-For the quick start, keep the schema simple and focus on getting a clean, running stream.
-
-<DocVisualPlaceholder
-  title="Connect wizard"
-  purpose="Show adapter selection, sample preview, schema refinement, and start options in one current UI screenshot."
-/>
-
-## Step 2: Start the adapter and persist the events
+### Step 2: Start the adapter and persist the events
 
 On the final adapter step, give the adapter a clear name and enable persistence.
 
@@ -184,23 +146,22 @@ To do that:
 
 If your installation offers additional startup options such as asset linking or event-rate reduction, you can leave them at their defaults for the first run unless you already know you need them.
 
-### Why persistence matters in the quick start
+#### Why persistence matters in the quick start
 
 Persistence creates a dataset from the incoming events. That dataset becomes the basis for charts and dashboards.
 
 Without persistence, you may still have a live stream, but you will not get the full chart and dashboard workflow that best demonstrates the current StreamPipes product model.
 
-### What success looks like
+#### What success looks like
 
 After the adapter starts successfully:
 
 - the stream is available in StreamPipes
-- events begin to flow
-- a dataset is created and starts filling with records
+- events begin to flow in the live preview dialog
 
 If no data appears later in the quick start, come back to this step first and verify that the adapter is actually running and persistence was enabled.
 
-## Step 3: Check the dataset
+### Step 3: Check the dataset
 
 Next, confirm that the persisted data is available as a dataset.
 
@@ -215,12 +176,13 @@ You should see incoming records and a schema that matches the data you connected
 
 This is the first important checkpoint in the quick start. Once data reaches a dataset, the rest of the workflow usually becomes straightforward.
 
-<DocVisualPlaceholder
-  title="Dataset overview and preview"
-  purpose="Show where users confirm that persisted events are arriving and inspect the resulting schema."
+<ScreenshotFigure
+src="/img/2026/dataset-overview.png"
+alt="Dataset overview with event counts, retention column, and export provider section"
+title="Dataset Overview"
 />
 
-## Step 4: Create a chart
+### Step 4: Create a chart
 
 Now create a visualization from the dataset.
 
@@ -229,30 +191,19 @@ To create your first chart:
 1. Open `Charts`.
 2. Create a new chart.
 3. Select the dataset from the dropdown.
-4. Choose a query type such as `Raw`, `Aggregated`, or `Single`.
-5. Configure the fields needed for the chart.
+4. Keep `Raw` as a query type.
+5. In the fields selection, choose `Select all` to query all fields from the dataset.
 6. Use the preview to confirm the query result.
-7. Choose a visualization type.
+7. Switch to the `Visualization` tab and choose `Time Series Chart` as visualization type.
 8. Save the chart.
 
-For a first run:
-
-- use `Single` when you want one current value
-- use `Raw` when you want to see individual incoming events
-- use `Aggregated` when you want to summarize values over time
-
-### A simple first chart
-
-If your sample data contains a numeric measurement such as temperature, pressure, speed, or fill level, start with a simple line chart or value view. These are the fastest visualizations to validate.
-
-The goal here is not to build the perfect visualization. The goal is to confirm that the dataset can be queried and rendered correctly.
-
-<DocVisualPlaceholder
-  title="First chart creation"
-  purpose="Show dataset selection, query preview, and visualization choice in the current chart workflow."
+<ScreenshotFigure
+src="/img/2026/chart-timeseries.png"
+alt="Chart editor with time series visualization, toolbar, data preview, and visualization settings"
 />
 
-## Step 5: Add the chart to a dashboard
+
+### Step 5: Add the chart to a dashboard
 
 Dashboards in the current StreamPipes version are built from saved charts.
 
@@ -260,29 +211,19 @@ To create a dashboard:
 
 1. Open `Dashboards`.
 2. Create a new dashboard.
-3. Configure the basic dashboard settings.
-4. Open the chart panel on the right side.
-5. Add the chart you saved in the previous step.
-6. Arrange the chart on the grid.
-7. Save the dashboard.
+3. Open the dashboard if it does not directly open.
+4. Add the chart you saved in the previous step.
+5. Arrange the chart on the grid.
+6. Save the dashboard.
+
+<ScreenshotFigure
+src="/img/2026/dashboard-create.png"
+alt="Dashboard view"
+/>
 
 At this point, you have completed a full first-use flow: from data onboarding to a reusable dashboard view.
 
-### Why this matters
-
-This is the moment where StreamPipes usually becomes clear to new users:
-
-- `Connect` creates usable data streams
-- `Datasets` preserve the data
-- `Charts` query and visualize it
-- `Dashboards` combine saved visualizations into an operational view
-
-<DocVisualPlaceholder
-  title="Dashboard editor with saved chart"
-  purpose="Show the current dashboard model where saved charts are added from the side panel."
-/>
-
-## Optional next step: Build a pipeline
+### Optional next step: Build a pipeline
 
 Once the quick start flow above works, the next logical step is to create a pipeline that transforms or enriches your live stream before persisting or visualizing it.
 
@@ -303,7 +244,6 @@ If you cannot complete one of the steps, the most common reasons are:
 - the required adapter or sink is not installed
 - the adapter is not running
 - `Persist events` was not enabled
-- no events are arriving from the source
 - the dataset is empty, so the chart query has nothing to show
 
 Check these in order. Most first-run issues are resolved by going one step upstream.
diff --git a/docs/04_use-connect.md b/docs/04_use-connect.md
index 7edf58a06..53511c41c 100644
--- a/docs/04_use-connect.md
+++ b/docs/04_use-connect.md
@@ -10,10 +10,10 @@ import ScreenshotFigure from '@site/src/components/docs/ScreenshotFigure';
 import ScreenshotSlideshow from '@site/src/components/docs/ScreenshotSlideshow';
 
 Apache StreamPipes Connect is the entry point for bringing industrial and IoT data into the platform.
-It lets users create adapters from the web interface, inspect incoming events, refine schemas, and publish the resulting data streams for reuse across pipelines, dashboards, charts, assets, and datasets.
+It lets users create adapters from the web interface, inspect incoming events, refine schemas, and publish the resulting data streams for reuse across pipelines, dashboards, charts, and datasets.
 
 This page explains the capabilities of StreamPipes Connect and the general workflow for connecting data.
-It intentionally does not cover protocol-specific configuration details. Those belong in the how-to section.
+It intentionally does not cover protocol-specific configuration details. Those can be found in the How-to sections.
 
 ## What StreamPipes Connect does
 
@@ -31,8 +31,8 @@ Instead of building custom ingestion services for every source, users can config
       text: 'Check that the source is reachable and inspect sample events before committing to a final stream.',
     },
     {
-      title: 'Refine schema and transformations',
-      text: 'Shape raw payloads into a cleaner StreamPipes event model with field metadata and optional scripts.',
+      title: 'Define transformations and metadata',
+      text: 'Shape raw payloads into a cleaner StreamPipes event model with field metadata and optional pre-processing scripts.',
     },
     {
       title: 'Create an operated platform resource',
@@ -41,9 +41,6 @@ Instead of building custom ingestion services for every source, users can config
   ]}
 />
 
-This makes Connect more than a connection dialog.
-It is the ingestion layer of the StreamPipes data platform.
-
 <ScreenshotFigure
   src="/img/2026/connect-overview.png"
   alt="Connect overview with adapter list, status indicators, and create action"
@@ -144,15 +141,17 @@ Depending on the adapter, this can include endpoint details, authentication info
 For adapters that support multiple payload formats, StreamPipes also includes the format-related configuration as part of this stage.
 The exact fields differ by adapter, but the purpose stays the same: define how StreamPipes should connect to the source and read events from it.
 
-Example: imagine a team receives machine events from a broker in CSV format.
-In this step, they would define where the source is located, how StreamPipes should access it, and how the incoming payload should be interpreted before any schema work begins.
+<UseCaseExample title="OPC UA">
+  Imagine a team receives machine events from an OPC UA Server.
+In this step, they would define where the server is located, the mode (subscrition or polling), security settings and the nodes to fetch.
+</UseCaseExample> 
 
 <ScreenshotFigure
-  src="/img/2026/connect-create-adapter-settings.png"
+  src="/img/2026/connect-create-configure-adapter.png"
   alt="Adapter settings step in Connect with source-specific configuration fields"
   title="Configure Source Settings"
   eyebrow="Step 2"
-  caption="The settings step defines how StreamPipes reaches the source and how the adapter should interpret the incoming payload."
+  caption="The first configuration step provides protocol-specific configuration options."
 />
 
 ### 3. Inspect and shape the incoming event structure
@@ -171,34 +170,22 @@ This step supports several important tasks:
 This is where StreamPipes starts turning source-specific payloads into platform-ready event structures.
 Instead of blindly ingesting data, users can validate whether the input looks correct before continuing.
 
-Example: if a machine emits timestamps in a custom field such as `input_timestamp`, users can inspect a sample event, test a transformation script, and verify the output before the stream is created.
+<UseCaseExample title="Script Transformation">
+If the source event does not provide a timestamp, users can add an ingestion timestamp to the event in the script editor.
+</UseCaseExample>
 
-<ScreenshotSlideshow
-  title="Schema and Metadata Workflow"
-  eyebrow="Step 3"
-  badge="Preview"
-  items={[
-    {
-      src: '/img/2026/connect-create-configure-schema-example.png',
-      alt: 'Schema configuration step with sample event preview',
-      title: 'Inspect the Sample Event',
-      caption: 'Load or refresh a representative event before publishing anything into the platform model.',
-    },
-    {
-      src: '/img/2026/connect-create-configure-schema-measurement-unit.png',
-      alt: 'Schema configuration with measurement unit refinement',
-      title: 'Refine the Schema',
-      caption: 'Adjust field semantics such as units and measurement meaning before downstream users consume the stream.',
-    },
-    {
-      src: '/img/2026/connect-create-configure-metadata.png',
-      alt: 'Metadata configuration step in StreamPipes Connect',
-      title: 'Add Metadata and Runtime Options',
-      caption: 'The final step captures naming, persistence, and asset-context decisions that turn the connection into an operated resource.',
-    },
-  ]}
+<ScreenshotFigure
+src="/img/2026/connect-create-configure-schema-example.png"
+alt="Adapter settings step in Connect with source-specific configuration fields"
+title="Script transformation"
 />
 
+:::info
+As a convention, every event that is ingested into StreamPipes needs to provide a timestamp measured in UNIX milliseconds. The key doesn't matter, but you need one value of this type. If you don't have such a formatted timestamp, use the script editor to transform an existing time indicator or create a new timestamp using the utility functions.
+:::
+
+See below for a details description which features are available in the script editor.
+
 #### Using script-based transformations
 
 The transformation editor is the place where users can modify incoming events before they are turned into the final StreamPipes event structure.
@@ -368,23 +355,22 @@ A well-defined schema improves discoverability, validation, pipeline configurati
 
 Assigning a timestamp is especially important, since time-aware storage, charts, and stream processing depend on it.
 
-Example: after a script has already normalized the payload, a stream might contain `temperature`, `machineId`, and `timestamp`.
-In this step, a user can mark `temperature` as a measurement, classify `machineId` as a dimension, mark `timestamp` as the event time, and attach the correct unit so later users do not have to guess what the fields mean.
-
-#### What this step is for
-
-The configure-fields step is the semantic cleanup stage of onboarding.
-The source payload already exists and the transformation script has already shaped it into the structure you want.
-Now the task is to make every field meaningful to other users and other parts of StreamPipes.
-
-This matters because the same stream will later appear in:
+<ScreenshotFigure
+src="/img/2026/connect-create-configure-metadata.png"
+alt="Metadata configuration step in StreamPipes Connect"
+title="Add Metadata and Runtime Options"
+caption="Configure dimensions and metadata."
+/>
 
-* pipeline element configuration dialogs
-* charts and dashboards
-* historical storage and query results
-* asset-linked views and other user-facing features
+<ScreenshotFigure
+src="/img/2026/connect-create-configure-schema-measurement-unit.png"
+alt="Schema configuration with measurement unit refinement"
+title="Refine the Schema"
+caption="Adjust field semantics such as units and measurement meaning before downstream users consume the stream."
+/>
 
-If the field definitions are clear here, the rest of the platform becomes easier to use later.
+Example: after a script has already normalized the payload, a stream might contain `temperature`, `machineId`, and `timestamp`.
+In this step, a user can mark `temperature` as a measurement, classify `machineId` as a dimension, mark `timestamp` as the event time, and attach the correct unit so later users do not have to guess what the fields mean.
 
 #### Measurement, dimension, and header
 
@@ -429,9 +415,7 @@ To assign a property scope in the UI:
 
 1. open the **Configure fields** step
 2. locate the field you want to refine in the field list
-3. open the field editor for that property
-4. choose the appropriate property scope, such as `Measurement`, `Dimension`, or `Header`
-5. save the field configuration and verify the updated preview
+3. choose the appropriate property scope, such as `Measurement`, `Dimension`, or `Header`
 
 #### Units and unit conversion
 
@@ -456,32 +440,6 @@ The practical workflow is:
 
 This improves consistency across streams and reduces repeated conversion logic in later pipelines.
 
-In other words, unit conversion is configured per field, inside the field dialog.
-Users do not configure it globally for the whole adapter.
-
-#### Timestamp handling in this step
-
-This is also the step where a field is marked as the event timestamp if it was not already created in a transformation script.
-The timestamp field should represent the business time of the event whenever possible, not only the ingestion time.
-
-For example:
-
-* use the machine-provided event time when the source contains one
-* use an added timestamp during onboarding when the source has no reliable timestamp of its own
-
-This distinction becomes important for historical storage, charts, and any analysis that depends on the real event order.
-
-To mark a field as the timestamp in the UI:
-
-1. open the field editor for the field that represents event time
-2. enable the timestamp option for that field
-3. if needed, configure timestamp parsing or conversion so the value is stored in the expected format
-4. save the field and confirm that the stream now has a valid timestamp before moving on
-
-<img className="docs-image" src="/img/03_use-connect/03_schema-editor.png" alt="StreamPipes Connect field configuration"/>
-
-<img className="docs-image" src="/img/03_use-connect/04_schema-editor-conversion.png" alt="StreamPipes Connect field metadata and unit conversion"/>
-
 ### 5. Create and start the adapter
 
 The final step is **Start adapter**.
@@ -504,19 +462,17 @@ From there, the stream can be used in pipelines, dashboards, charts, or other do
 
 Example: a production engineer may start the adapter immediately for live monitoring, while a data team may also enable persistence so the same source is available later for historical analysis.
 
+<ScreenshotFigure
+src="/img/2026/connect-create-adapter-settings.png"
+alt="Adapter settings"
+title="Adapter settings are the final step of the adapter creation."
+/>
+
 #### Name and description
 
 Every adapter should be given a clear name and, ideally, a short description.
 This matters because adapters become long-lived platform resources that appear in operational views and may later be edited, linked to assets, or reused by other teams.
 
-A good name usually identifies:
-
-* the source or machine
-* the signal or purpose
-* optionally the location or environment
-
-Example: `Filling Line 2 - Temperature Stream` is more useful than `Adapter 1`.
-
 #### Start adapter now
 
 The **Start adapter now** option determines whether the adapter should begin consuming data immediately after creation.
@@ -617,18 +573,17 @@ A common workflow in the final step is:
 2. decide whether the adapter should start immediately
 3. optionally link it to the relevant asset
 4. decide whether the stream should also be persisted historically
-5. optionally enable duplicate filtering or event-rate reduction if the source behavior requires it
-6. optionally inspect the generated code before finishing
-7. create or update the adapter
+5. create or update the adapter
 
-This is the point where StreamPipes turns a tested source configuration into an operational data source.
+Afterwards, StreamPipes generates the adapter, creates a data stream that can be used within pipelines and external clients and starts the adapter if configured.
+You should see a live preview as follows:
 
-<img className="docs-image" src="/img/03_use-connect/05_adapter-generation.png" alt="StreamPipes Connect start adapter configuration"/>
+<ScreenshotFigure
+src="/img/2026/connect-create-adapter-settings-preview.png"
+alt="Adapter live preview"
+title="Live preview"
+/>
 
-:::info Suggested image placeholder
-**Image idea:** Current final step screenshot showing name, start option, persistence option, asset linking, and show-code option.  
-**Purpose:** Show that adapter creation includes operational decisions, not just connection details.
-:::
 
 ## Transformation and schema features
 
@@ -684,10 +639,11 @@ Connect therefore supports not only initial onboarding, but also ongoing mainten
 
 Example: if a source system adds or renames fields, the adapter can be edited, the schema can be refreshed, and dependent pipelines can be migrated instead of being manually rebuilt from scratch.
 
-:::info Suggested image placeholder
-**Image idea:** Screenshot of the adapter table with status, message count, last message, and action menu.  
-**Purpose:** Show that Connect includes runtime operations and governance after setup.
-:::
+<ScreenshotFigure
+src="/img/2026/connect-overview.png"
+alt="Existing adapters"
+title="Existing adapters"
+/>
 
 ## How Connect fits into the broader platform
 
@@ -812,9 +768,7 @@ A better approach is:
 
 This keeps the programmatic workflow grounded in a configuration that is already known to work.
 
-## What this page does not cover
+## Next steps
 
 This page focuses on the general Connect workflow and feature set.
-It does not explain how to configure specific adapters or industrial protocols.
-
-For protocol-specific instructions, continue with the how-to guides for the relevant source type.
+It does not explain how to configure specific adapters or industrial protocols. View the How-to section and the extensions reference for an in-depth user guide on how to work with selected adapters.
diff --git a/docs/04_use-pipelines.md b/docs/04_use-pipelines.md
index 6ef71ea65..b3da6022f 100644
--- a/docs/04_use-pipelines.md
+++ b/docs/04_use-pipelines.md
@@ -10,15 +10,12 @@ import ScreenshotComparison from '@site/src/components/docs/ScreenshotComparison
 import ScreenshotFigure from '@site/src/components/docs/ScreenshotFigure';
 
 Pipelines are where connected data becomes operational logic inside StreamPipes. They let you take one or more live streams, combine them with processors and sinks, and turn that flow into something useful: filtering, enrichment, alerting, routing, storage, or analytics.
-
-This is why pipelines matter so much in daily work. `Connect` brings data into the platform. Pipelines decide what should happen to that data next.
+The pipeline module uses an extensible set of `Extensions` such as data processors and data sinks and lets users define stream processing logic based on live data streams.
 
 ## What a pipeline is for
 
 A pipeline usually starts with a live stream, adds zero or more processing steps, and ends in one or more sinks. That sounds abstract at first, but in practice most pipelines serve straightforward industrial goals. A pipeline may keep only events above a threshold, enrich raw measurements with labels or derived values, forward selected events to another system, or persist curated results separately from the raw source data.
 
-In other words, pipelines are not just an “advanced analytics” feature. They are the main place where a team shapes live industrial data into reusable behavior.
-
 <UseCaseExample title="A typical operational pipeline">
   A team receives machine temperature values as a live stream. They filter for high readings, enrich the event with a severity label, and send the result to both a notification sink and a persisted dataset. The pipeline is not an experiment; it is a maintained operational flow.
 </UseCaseExample>
@@ -212,16 +209,8 @@ The most reliable workflow is still to validate the pipeline visually first, the
 
 ## How to work well with pipelines
 
-In practice, good pipeline work usually follows a predictable pattern. Start with one clear input stream. Add only the processors that the use case truly needs. Configure each element against the actual upstream schema. Use preview early. Save with a name and description that make operational sense. Only then start the flow against real data.
-
-That style keeps pipelines understandable later. A pipeline should not feel like a temporary experiment nobody wants to touch. It should feel like a maintained part of the data platform.
-
-## Image placeholders
-
-`[Image placeholder: pipeline editor showing catalog, assembly canvas, compatible elements, and toolbar actions]`
-
-`[Image placeholder: pipeline element configuration dialog with input schema, documentation toggle, recommended settings, and template actions]`
-
-`[Image placeholder: pipeline overview showing status, health, warnings, start/stop actions, and bulk operations]`
+In practice, good pipeline work usually follows a predictable pattern. Start with one clear input stream. 
+Add only the processors that the use case truly needs. Configure each element against the actual upstream schema. Use preview early. Save with a name and description that make operational sense. Only then start the flow against real data.
 
-`[Image placeholder: pipeline details view showing logs, status, actions, live preview, and pipeline-as-code access]`
+If you are coming from other tools such as Node-RED, don't start with rebuilding the behaviour. In StreamPipes, pipelines are supposed to be single-purpose analytics functions. If a pipeline serves different purposes and has many splits, it is often better to split it into multiple pipelines and manage them independently. 
+Built-in features such as auto-migrations in case of changes in the related adapters make it easy to work with a larger number of pipelines.
diff --git a/docs/06_configure-operate-environment-variables.md b/docs/06_configure-operate-environment-variables.md
index 916941fd8..db83f6f61 100644
--- a/docs/06_configure-operate-environment-variables.md
+++ b/docs/06_configure-operate-environment-variables.md
@@ -6,83 +6,265 @@ sidebar_label: Environment Variables
 
 ## Introduction
 
-A StreamPipes installation can be configured in many ways by providing environment variables.
-The following lists describe available environment variables along with a description.
-
-## StreamPipes Core Service
-
-### Internal
-
-| Env Variable Name              | Default Value                                           | Description                                                                                                                      |
-|--------------------------------|---------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------|
-| SP_DEBUG                       | false                                                   | Should only be set for local development to reroute traffic to localhost                                                         |
-| SP_INITIAL_ADMIN_EMAIL         | admin@streampipes.apache.org                            | Installation-time variable for defining the default user name                                                                    |
-| SP_INITIAL_ADMIN_PASSWORD      | admin                                                   | Installation-time variable for defining the default user password                                                                |
-| SP_INITIAL_SERVICE_USER        | sp-service-client                                       | Installation-time variable for defining the initial service user (must be same to the configured user in the extension service)  |
-| SP_INITIAL_SERVICE_USER_SECRET | my-apache-streampipes-secret-key-change-me              | Installation-time variable for defining the initial service secret (minimum 35 chars)                                            |
-| SP_JWT_SECRET                  | Empty for Docker, Auto-generated for K8s                | JWT secret, base64-encoded, minimum 256 bits                                                                                     |
-| SP_JWT_SIGNING_MODE            | HMAC                                                    | HMAC or RSA, RSA can be used to authenticate Core-Extensions communication                                                       |
-| SP_JWT_PRIVATE_KEY_LOC         | Empty                                                   | Required id SP_JWT_SIGNING_MODE=RSA, path to the private key, can be generated in the UI (Settings->Security->Generate Key Pair) |
-| SP_ENCRYPTION_PASSCODE         | eGgemyGBoILAu3xckolp for Docker, Auto-generated for K8s | Encryption passcode for `SecretStaticProperties`                                                                                 |
-| SP_PRIORITIZED_PROTOCOL        | kafka                                                   | Messaging layer for data exchange between extensions                                                                             |
-
-
-### Third-party services
-
-| Env Variable Name      | Default Value | Description                                                               |
-|------------------------|---------------|---------------------------------------------------------------------------|
-| SP_COUCHDB_HOST        | couchdb       | The hostname or IP of the CouchDB database                                |
-| SP_COUCHDB_PROTOCOL    | http          | The protocol (http or https) of the CouchDB database                      |
-| SP_COUCHDB_PORT        | 5984          | The port of the CouchDB database                                          |
-| SP_COUCHDB_USER        | admin         | The user of the CouchDB database (must have permissions to add databases) |
-| SP_COUCHDB_PASSWORD    | admin         | The password of the CouchDB user                                          |
-| SP_TS_STORAGE_HOST     | influxdb      | The hostname of the timeseries storage (currently InfluxDB)               |
-| SP_TS_STORAGE_PORT     | 8086          | The port of the timeseries storage                                        |
-| SP_TS_STORAGE_PROTOCOL | http          | The protocol of the timeseries storage (http or https)                    |
-| SP_TS_STORAGE_BUCKET   | sp            | The InfluxDB storage bucket name                                          |
-| SP_TS_STORAGE_ORG      | sp            | The InfluxDB storage org                                                  |
-| SP_TS_STORAGE_TOKEN    | sp-admin      | The InfluxDB storage token                                                |
-
-The InfluxDB itself can be configured by providing the variables `DOCKER_INFLUXDB_INIT_PASSWORD` and `DOCKER_INFLUXDB_INIT_ADMIN_TOKEN`. See the `docker-compose` file for details.
-
-## StreamPipes Extensions Service
-
-### Internal
-
-| Env Variable Name              | Default Value                              | Description                                                                                                        |
-|--------------------------------|--------------------------------------------|--------------------------------------------------------------------------------------------------------------------|
-| SP_CLIENT_USER                 | Empty                                      | Service account for communication with Core                                                                        |
-| SP_CLIENT_SECRET               | Empty                                      | Service secret for communication with Core                                                                         |
-| SP_EXT_AUTH_MODE               | sp-service-client                          | When set to AUTH: all interfaces are only accessible with authentication (requires SP_JET_PRIVATE_KEY_LOC in Core) |
-| SP_JWT_PUBLIC_KEY_LOC          | my-apache-streampipes-secret-key-change-me | Path to the public key of the corresponding SP_JWT_PRIVATE_KEY defined in Core                                     |
-
-### Third-party services
-
-The following variables are only required for extensions which require access to the internal time-series storage (the `Data Lake Sink`).
-
-| Env Variable Name      | Default Value | Description                                                               |
-|------------------------|---------------|---------------------------------------------------------------------------|
-| SP_TS_STORAGE_HOST     | influxdb      | The hostname of the timeseries storage (currently InfluxDB)               |
-| SP_TS_STORAGE_PORT     | 8086          | The port of the timeseries storage                                        |
-| SP_TS_STORAGE_PROTOCOL | http          | The protocol of the timeseries storage (http or https)                    |
-| SP_TS_STORAGE_BUCKET   | sp            | The InfluxDB storage bucket name                                          |
-| SP_TS_STORAGE_ORG      | sp            | The InfluxDB storage org                                                  |
-| SP_TS_STORAGE_TOKEN    | sp-admin      | The InfluxDB storage token                                                |
-
-
-## Recommended variables
-
-For a standard deployment, it is recommended to customize the following variables:
-
-*	Initiales Admin-Passwort (SP_INITIAL_ADMIN_PASSWORD, Core)
-*	Initiales Client Secret (SP_INITIAL_SERVICE_USER_SECRET, Core)
-*	Client Secret Extensions (SP_CLIENT_USER, Extensions)
-*	Encryption Passcode (SP_ENCRYPTION_PASSCODE, Core)
-*	CouchDB-Password (SP_COUCHDB_PASSWORD, Core + Extensions + CouchDB)
-*	InfluxDB Storage Password (DOCKER_INFLUXDB_INIT_PASSWORD, InfluxDB)
-*	InfluxDB Storage Token (SP_TS_STORAGE_TOKEN (Core, Extensions)
-  * DOCKER_INFLUXDB_INIT_ADMIN_TOKEN (InfluxDB service)
-
-## Auto-generation of variables in K8s setups
-
-See the [Kubernetes Guide](06_deploy-kubernetes.md) for an overview of auto-generated variables.
+StreamPipes can be configured extensively through environment variables. The list below is aligned with the `Envs` definition in `streampipes-commons`, which is the shared source of truth for the variables used across core and extension services.
+
+The page is grouped by operational concern rather than by source file. That makes it easier to answer the practical questions administrators usually have: which variables define instance identity, which ones control storage and transport, which ones are security-sensitive, and which ones tune runtime behavior.
+
+## Core identity and internal service endpoints
+
+These variables define how StreamPipes identifies itself internally and how services find each other.
+
+| Env Variable Name | Scope | Default Value | Description |
+|---|---|---|---|
+| `SP_HOST` | Core + Extensions | Empty | Generic host override used by some deployments and wrappers. |
+| `SP_PORT` | Core + Extensions | Empty | Generic port override used by some deployments and wrappers. |
+| `SP_CORE_SCHEME` | Extensions | `http` | Scheme used by internal clients when contacting the core service. |
+| `SP_CORE_HOST` | Extensions | `backend` | Internal host name of the core service. |
+| `SP_CORE_PORT` | Extensions | `8030` | Internal port of the core service. |
+| `SP_CORE_ASSET_BASE_DIR` | Core | Empty | Base directory for core-managed asset files. |
+| `SP_EXT_ASSET_BASE_DIR` | Extensions | Empty | Base directory for extension-managed asset files. |
+| `SP_CORE_EXTENSION_TRANSPORT_MODE` | Core | `http` | Transport mode used by the core when communicating with extensions. |
+| `SP_CORE_EXTENSIONS_TRANSPORT_MODE_TIMEOUT_SECONDS` | Core | `20` | Timeout in seconds for core-to-extension transport calls. |
+| `SP_EXTENSION_TRANSPORT_MODE` | Extensions | `http` | Transport mode used by extensions when communicating with the core. |
+| `SP_EXTENSION_REQUEST_TOPIC_PREFIX` | Core + Extensions | `sp.extensions.request` | Topic prefix used for extension request messaging. |
+| `SP_SERVICE_TAGS` | Core + Extensions | Empty | Comma-separated service tags used during service registration and discovery. |
+
+## Installation, setup, and general runtime
+
+These variables shape first startup behavior and a few cross-cutting runtime options.
+
+| Env Variable Name | Scope | Default Value | Description |
+|---|---|---|---|
+| `SP_DEBUG` | Core + Extensions | `false` | Debug mode for local development and related traffic-routing behavior. |
+| `SP_SETUP_INSTALL_PIPELINE_ELEMENTS` | Core | From `DefaultEnvValues.INSTALL_PIPELINE_ELEMENTS` | Controls whether pipeline elements are installed automatically during setup. |
+| `SP_INITIAL_WAIT_BEFORE_INSTALLATION_MS` | Core | `5000` | Wait time before installation tasks start. |
+| `SP_MAX_WAIT_TIME_AT_SHUTDOWN` | Core + Extensions | Empty | Maximum wait time during shutdown handling. |
+| `SP_ALLOWED_UPLOAD_FILETYPES` | Core | Empty | Comma-separated allowlist for uploadable file types. |
+
+## Security, authentication, and initial credentials
+
+These variables control bootstrap credentials, encryption, JWT signing, and extension-to-core authentication.
+
+| Env Variable Name | Scope | Default Value | Description |
+|---|---|---|---|
+| `SP_INITIAL_ADMIN_EMAIL` | Core | `admin@streampipes.apache.org` | Initial administrator email for a fresh installation. |
+| `SP_INITIAL_ADMIN_PASSWORD` | Core | `admin` | Initial administrator password for a fresh installation. |
+| `SP_INITIAL_SERVICE_USER` | Core | `sp-service-client` | Initial technical service account used for service-to-service communication. |
+| `SP_INITIAL_SERVICE_USER_SECRET` | Core | From `DefaultEnvValues.INITIAL_CLIENT_SECRET_DEFAULT` | Initial secret for the technical service account. |
+| `SP_CLIENT_USER` | Extensions | `sp-service-client` | Service account used by extensions or integrations to authenticate against the core. |
+| `SP_CLIENT_SECRET` | Extensions | From `DefaultEnvValues.INITIAL_CLIENT_SECRET_DEFAULT` | Secret used together with `SP_CLIENT_USER`. |
+| `SP_EXT_AUTH_MODE` | Extensions | Empty | Extension authentication mode, for example whether extension endpoints require authenticated access. |
+| `SP_ENCRYPTION_PASSCODE` | Core | From `DefaultEnvValues.DEFAULT_ENCRYPTION_PASSCODE` | Encryption passcode used for secret static properties and related protected values. |
+| `SP_JWT_SECRET` | Core | Empty | Shared JWT secret used in HMAC-based signing setups. |
+| `SP_JWT_SIGNING_MODE` | Core | Empty | JWT signing mode, typically `HMAC` or `RSA`. |
+| `SP_JWT_PRIVATE_KEY_LOC` | Core | Empty | Path to the JWT private key for RSA-based signing. |
+| `SP_JWT_PUBLIC_KEY_LOC` | Extensions | Empty | Path to the JWT public key for RSA-based verification. |
+
+## OAuth and external identity providers
+
+These variables enable OAuth-based login and define provider-specific mappings.
+
+| Env Variable Name | Scope | Default Value | Description |
+|---|---|---|---|
+| `SP_OAUTH_ENABLED` | Core | `false` | Enables OAuth-based login. |
+| `SP_OAUTH_REDIRECT_URI` | Core | Empty | Public base URL used for OAuth redirect handling. |
+| `SP_OAUTH_PROVIDER_{PROVIDER_ID}_{SETTING}` | Core | Empty | Pattern for provider-specific OAuth configuration such as client credentials, endpoints, scopes, and claim mappings. |
+
+Typical supported provider settings include `AUTHORIZATION_URI`, `CLIENT_NAME`, `CLIENT_ID`, `CLIENT_SECRET`, `FULL_NAME_ATTRIBUTE_NAME`, `ISSUER_URI`, `JWK_SET_URI`, `SCOPES`, `TOKEN_URI`, `USER_INFO_URI`, `EMAIL_ATTRIBUTE_NAME`, `USER_ID_ATTRIBUTE_NAME`, `ROLE_ATTRIBUTE_NAME`, `NAME`, and `DEFAULT_ROLES`.
+
+## Storage backends
+
+These variables configure the document store and the time-series backend used by StreamPipes.
+
+### CouchDB
+
+| Env Variable Name | Scope | Default Value | Description |
+|---|---|---|---|
+| `SP_COUCHDB_PROTOCOL` | Core + Extensions | `http` | Protocol used to access CouchDB. |
+| `SP_COUCHDB_HOST` | Core + Extensions | `couchdb` | Host name of the CouchDB instance. |
+| `SP_COUCHDB_PORT` | Core + Extensions | `5984` | Port of the CouchDB instance. |
+| `SP_COUCHDB_USER` | Core + Extensions | `admin` | User name used for CouchDB access. |
+| `SP_COUCHDB_PASSWORD` | Core + Extensions | `admin` | Password used for CouchDB access. |
+
+### Time-series storage
+
+| Env Variable Name | Scope | Default Value | Description |
+|---|---|---|---|
+| `SP_TS_STORAGE` | Core + Extensions | `influxdb` | Selected time-series backend implementation. |
+| `SP_TS_STORAGE_PROTOCOL` | Core + Extensions | `http` | Protocol used to access the time-series backend. |
+| `SP_TS_STORAGE_HOST` | Core + Extensions | `influxdb` | Host name of the time-series backend. |
+| `SP_TS_STORAGE_PORT` | Core + Extensions | `8086` | Port of the time-series backend. |
+| `SP_TS_STORAGE_TOKEN` | Core + Extensions | `sp-admin` | Token used for time-series backend access. |
+| `SP_TS_STORAGE_ORG` | Core + Extensions | `sp` | Organization name used by the time-series backend. |
+| `SP_TS_STORAGE_BUCKET` | Core + Extensions | `sp` | Bucket or logical storage target used by the time-series backend. |
+| `SP_TS_STORAGE_IOT_DB_SESSION_POOL_SIZE` | Core + Extensions | `10` | Session-pool size for IoTDB-based setups. |
+| `SP_TS_STORAGE_IOT_DB_SESSION_POOL_ENABLE_COMPRESSION` | Core + Extensions | `false` | Enables compression for the IoTDB session pool. |
+| `SP_TS_STORAGE_IOT_DB_USER` | Core + Extensions | `root` | User name for IoTDB-based setups. |
+| `SP_TS_STORAGE_IOT_DB_PASSWORD` | Core + Extensions | `root` | Password for IoTDB-based setups. |
+
+The containerized InfluxDB service itself may also need service-specific variables such as `DOCKER_INFLUXDB_INIT_PASSWORD` and `DOCKER_INFLUXDB_INIT_ADMIN_TOKEN`, but those are not part of the shared `Envs` class.
+
+## Messaging and broker configuration
+
+These variables configure the preferred transport layer and the connection details of supported brokers.
+
+| Env Variable Name | Scope | Default Value | Description |
+|---|---|---|---|
+| `SP_PRIORITIZED_PROTOCOL` | Core + Extensions | `kafka` | Preferred messaging layer for data exchange between services. |
+| `SP_KAFKA_RETENTION_MS` | Core | From `DefaultEnvValues.SP_KAFKA_RETENTION_MS_DEFAULT` | Retention time for Kafka-backed topics where applicable. |
+| `SP_KAFKA_HOST` | Core + Extensions | `kafka` | Host name of the Kafka broker. |
+| `SP_KAFKA_PORT` | Core + Extensions | `9092` | Port of the Kafka broker. |
+| `SP_MQTT_HOST` | Core + Extensions | `mosquitto` | Host name of the MQTT broker. |
+| `SP_MQTT_PORT` | Core + Extensions | `1883` | Port of the MQTT broker. |
+| `SP_NATS_HOST` | Core + Extensions | `nats` | Host name of the NATS broker. |
+| `SP_NATS_PORT` | Core + Extensions | `4222` | Port of the NATS broker. |
+| `SP_NATS_TOKEN` | Core + Extensions | Empty | Token used for NATS authentication if required. |
+| `SP_PULSAR_URL` | Core + Extensions | `pulsar://localhost:6650` | Connection URL for Apache Pulsar. |
+
+## Health checks, metrics, and polling
+
+These variables influence monitoring endpoints, health-check cadence, and background polling behavior.
+
+| Env Variable Name | Scope | Default Value | Description |
+|---|---|---|---|
+| `SP_PROMETHEUS_ENDPOINT_INCLUDE` | Core + Extensions | `health,prometheus` | Comma-separated endpoints included in Prometheus-related exposure. |
+| `SP_SETUP_PROMETHEUS_ENDPOINT` | Core + Extensions | `false` | Enables setup of the Prometheus endpoint during startup. |
+| `SP_HEALTH_CHECK_INTERVAL_MS` | Core + Extensions | `30000` | Interval between health checks. |
+| `SP_HEALTH_CHECK_INITIAL_DELAY` | Core + Extensions | `10000` | Initial delay before health checks begin. |
+| `SP_LOG_FETCH_INTERVAL_MS` | Core | `60000` | Interval for background log fetching. |
+| `SP_HEALTH_SERVICE_MAX_UNHEALTHY_TIME_MS` | Core | `60000` | Maximum tolerated unhealthy duration before service health is escalated. |
+| `SP_CDC_MSSQL_POLL_INTERVAL_MS` | Extensions | `1000` | Polling interval used by MSSQL CDC-related components. |
+
+## Upload security, certificates, and protocol-specific security stores
+
+These variables define keystore, truststore, and OPC UA-specific security behavior.
+
+### OPC UA security
+
+| Env Variable Name | Scope | Default Value | Description |
+|---|---|---|---|
+| `SP_OPCUA_MIN_PULL_INTERVAL_MS` | Extensions | Empty | Minimum allowed polling interval for OPC UA reads. |
+| `SP_OPCUA_SECURITY_DIR` | Extensions | `/streampipes-security/opcua` | Base directory for OPC UA security material. |
+| `SP_OPCUA_KEYSTORE_FILE` | Extensions | `keystore.pfx` | OPC UA keystore file name. |
+| `SP_OPCUA_KEYSTORE_PASSWORD` | Extensions | `password` | Password for the OPC UA keystore. |
+| `SP_OPCUA_KEYSTORE_TYPE` | Extensions | `PKCS12` | Type of the OPC UA keystore. |
+| `SP_OPCUA_KEYSTORE_ALIAS` | Extensions | `apache-streampipes` | Alias used inside the OPC UA keystore. |
+| `SP_OPCUA_APPLICATION_URI` | Extensions | `urn:org:apache:streampipes:opcua:client` | Application URI used by the OPC UA client. |
+
+### General keystore and truststore
+
+| Env Variable Name | Scope | Default Value | Description |
+|---|---|---|---|
+| `SP_SECURITY_KEYSTORE_FILENAME` | Core + Extensions | `/streampipes-security/keystore.pfx` | Default keystore filename. |
+| `SP_SECURITY_KEYSTORE_PASSWORD` | Core + Extensions | Empty | Password for the default keystore. |
+| `SP_SECURITY_KEYSTORE_TYPE` | Core + Extensions | `PKCS12` | Type of the default keystore. |
+| `SP_SECURITY_KEY_PASSWORD` | Core + Extensions | Empty | Password for the key inside the keystore if it differs from the store password. |
+| `SP_SECURITY_TRUSTSTORE_FILENAME` | Core + Extensions | `/streampipes-security/truststore.pfx` | Default truststore filename. |
+| `SP_SECURITY_TRUSTSTORE_PASSWORD` | Core + Extensions | Empty | Password for the default truststore. |
+| `SP_SECURITY_TRUSTSTORE_TYPE` | Core + Extensions | `PKCS12` | Type of the default truststore. |
+| `SP_SECURITY_ALLOW_SELFSIGNED` | Core + Extensions | `false` | Whether self-signed certificates are accepted. |
+
+## PLC4X, retention, and archive behavior
+
+These variables tune protocol-level pooling and retention/archive handling.
+
+### PLC4X connection cache
+
+| Env Variable Name | Scope | Default Value | Description |
+|---|---|---|---|
+| `SP_PLC4X_CONN_MAX_WAIT_TIME_MS` | Extensions | `20000` | Maximum wait time when borrowing a PLC4X connection. |
+| `SP_PLC4X_CONN_MAX_LEASE_TIME_MS` | Extensions | `4000` | Maximum lease time for a PLC4X connection. |
+
+### Retention and archiving
+
+| Env Variable Name | Scope | Default Value | Description |
+|---|---|---|---|
+| `SP_RETENTION_LOCAL_DIR` | Core | `./ArchivedData` | Local directory used for archived retention data. |
+| `SP_DATALAKE_SCHEDULER_CRON` | Core | `0 1 0 * * 6` | Cron expression for scheduled data-lake retention jobs. |
+| `SP_RETENTION_LOG_LENGTH` | Core | `10` | Number of retention log entries kept. |
+| `SP_CERTIFICATE_EXPIRY_CRON` | Core | `0 2 0 * * *` | Cron expression for certificate-expiry checks. |
+| `SP_CERTIFICATE_EXPIRY_EMAIL_DAYS` | Core | Empty | Number of days before expiry when certificate warning emails are sent. |
+
+## Logging
+
+These variables configure file and console logging behavior.
+
+| Env Variable Name | Scope | Default Value | Description |
+|---|---|---|---|
+| `SP_LOGGING_FILE_ENABLED` | Core + Extensions | `false` | Enables file-based logging. |
+| `SP_LOGGING_CONSOLE_ENABLED` | Core + Extensions | `true` | Enables console logging. |
+| `SP_LOGGING_FILE_PREFIX` | Core + Extensions | `streampipes` | Prefix used for generated log files. |
+| `SP_LOGGING_FILE_DIR` | Core + Extensions | `logs` | Directory used for file-based logs. |
+| `SP_LOGGING_FILE_PATTERN` | Core + Extensions | `%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n` | Logback-style pattern used for file logging. |
+
+## Load management and resource balancing
+
+These variables influence the optional load-management features and their weighting model.
+
+| Env Variable Name | Scope | Default Value | Description |
+|---|---|---|---|
+| `SP_CPU_RESOURCE_WEIGHT` | Core | `1.0` | Weight of CPU usage in load-balancing decisions. |
+| `SP_MEMORY_RESOURCE_WEIGHT` | Core | `1.0` | Weight of memory usage in load-balancing decisions. |
+| `SP_DIR_MEMORY_RESOURCE_WEIGHT` | Core | `1.0` | Weight of direct-memory usage in load-balancing decisions. |
+| `SP_BANDWIDTH_IN_RESOURCE_WEIGHT` | Core | `1.0` | Weight of inbound bandwidth in load-balancing decisions. |
+| `SP_BANDWIDTH_OUT_RESOURCE_WEIGHT` | Core | `1.0` | Weight of outbound bandwidth in load-balancing decisions. |
+| `SP_THRESHOLD_MIGRATOR_PERCENTAGE` | Core | `20.0` | Threshold percentage used by the migrator. |
+| `SP_MIN_MIGRATOR_PERCENTAGE` | Core | `20.0` | Minimum migrator percentage. |
+| `SP_OVERLOADED_THRESHOLD_PERCENTAGE` | Core | `85` | Threshold from which a node is treated as overloaded. |
+| `SP_HISTORY_RESOURCE_PERCENTAGE` | Core | `0.9` | Percentage of historical resource usage considered by the load manager. |
+| `SP_MSG_RATE_DIFFERENCE_MIGRATOR_THRESHOLD` | Core | `85` | Threshold for message-rate differences that trigger migration. |
+| `SP_LOAD_TARGET_STD` | Core | `25.0` | Target standard deviation used in load balancing. |
+| `SP_SELECTOR` | Core | `WeightedRandomSelector` | Selector implementation used by the load manager. |
+| `SP_MIGRATOR` | Core | `ThresholdMigrator` | Migrator implementation used by the load manager. |
+| `SP_LOAD_MANAGER_ENABLE` | Core | `false` | Enables the load manager. |
+
+## Rate limiter and memory manager
+
+These variables tune the internal rate limiter and memory-management utilities.
+
+### Rate limiter
+
+| Env Variable Name | Scope | Default Value | Description |
+|---|---|---|---|
+| `SP_RATE_LIMITER_DEFAULT_WARMUP_PERIOD` | Core | `1000` | Default warmup period for the rate limiter. |
+| `SP_RATE_LIMITER_SCHEDULER_INITIAL_DELAY_SECONDS` | Core | `0` | Initial delay for the rate-limiter scheduler. |
+| `SP_RATE_LIMITER_SCHEDULER_PERIOD_SECONDS` | Core | `15` | Scheduler period for rate-limiter updates. |
+| `SP_RATE_LIMITER_STATS_RESET_THRESHOLD` | Core | `1000` | Threshold used for statistics reset logic. |
+| `SP_RATE_LIMITER_STATS_RESET_FACTOR` | Core | `999` | Factor used for statistics reset logic. |
+| `SP_RATE_LIMITER_STATS_RESET_DIVISOR` | Core | `1000` | Divisor used for statistics reset logic. |
+| `SP_RATE_LIMITER_SHUTDOWN_TIMEOUT_SECONDS` | Core | `5` | Shutdown timeout for the rate limiter. |
+| `SP_RATE_LIMITER_TIMEOUT_MS` | Core | `1000` | Timeout for rate-limiter operations. |
+| `SP_RATE_LIMITER_PERMITS_SET_PERCENTAGE` | Core | `0.7` | Percentage used when calculating permit counts. |
+
+### Memory manager
+
+| Env Variable Name | Scope | Default Value | Description |
+|---|---|---|---|
+| `SP_MEMORY_MANAGER_DEFAULT_INITIAL_MEMORY` | Core | `1073741824` | Default initial memory allocation used by the memory manager. |
+| `SP_MEMORY_MANAGER_WAIT_TIMEOUT_MS` | Core | `1000` | Wait timeout for memory-manager coordination. |
+| `SP_MEMORY_SCHEDULER_INITIAL_DELAY_SECONDS` | Core | `0` | Initial delay for the memory scheduler. |
+| `SP_MEMORY_SCHEDULER_PERIOD_SECONDS` | Core | `15` | Scheduler period for memory checks. |
+| `SP_MEMORY_BYTES_TO_MB` | Core | `1048576` | Conversion factor from bytes to megabytes. |
+| `SP_MEMORY_MANAGER_SHUTDOWN_TIMEOUT_SECONDS` | Core | `5` | Shutdown timeout for the memory manager. |
+| `SP_MEMORY_MANAGER_USAGE_THRESHOLD` | Core | `0.9` | Usage threshold above which the memory manager reacts. |
+| `SP_MEMORY_WARNING_THRESHOLD` | Core | `0.8` | Warning threshold for memory usage. |
+
+## Recommended variables to customize
+
+For most non-trivial deployments, the first variables to review are the security-sensitive and identity-defining ones. In practice, that usually means:
+
+- `SP_INITIAL_ADMIN_PASSWORD`
+- `SP_INITIAL_SERVICE_USER_SECRET`
+- `SP_CLIENT_USER`
+- `SP_CLIENT_SECRET`
+- `SP_ENCRYPTION_PASSCODE`
+- `SP_JWT_SECRET` or the RSA key locations
+- `SP_COUCHDB_PASSWORD`
+- `SP_TS_STORAGE_TOKEN`
+- `SP_OAUTH_REDIRECT_URI` when OAuth is enabled
+
+If your deployment uses container-level initialization variables for external services such as InfluxDB, those should be reviewed alongside the StreamPipes variables, even though they are not part of the shared `Envs` class.
+
+## Kubernetes-specific note
+
+Some Kubernetes-based deployments auto-generate selected credentials and secrets. See the [Deployment Guide](./06_configure-operate-deployment.md) for the deployment-specific behavior around generated values and secret management.
diff --git a/website-v2/src/components/docs/ScreenshotSlideshow.tsx b/website-v2/src/components/docs/ScreenshotSlideshow.tsx
index 420318b03..502d486f8 100644
--- a/website-v2/src/components/docs/ScreenshotSlideshow.tsx
+++ b/website-v2/src/components/docs/ScreenshotSlideshow.tsx
@@ -26,7 +26,7 @@ type ScreenshotSlideshowProps = {
 const ScreenshotSlideshow = ({
   items,
   title,
-  eyebrow = 'Slideshow',
+  eyebrow,
   badge,
   autoplayDelay = 3500,
 }: ScreenshotSlideshowProps) => {
diff --git a/website-v2/src/components/download/DownloadBox.tsx b/website-v2/src/components/download/DownloadBox.tsx
index 3e5af5ec7..42dbe5401 100644
--- a/website-v2/src/components/download/DownloadBox.tsx
+++ b/website-v2/src/components/download/DownloadBox.tsx
@@ -47,28 +47,6 @@ const DownloadBox = (props) => {
               </table>
             </div>
 
-            <div className="row">
-              <div className="col-12" style={{paddingLeft: '20px', paddingRight: '20px'}}>
-                <div
-                  className="alert alert-danger"
-                  role="alert"
-                  aria-live="polite"
-                  style={{
-                    backgroundColor: '#f8d7da',
-                    color: '#721c24',
-                    border: '1px solid #f5c6cb',
-                    padding: '15px',
-                    marginTop: '20px',
-                    marginBottom: '20px',
-                    borderRadius: '4px'
-                  }}
-                >
-                  <i className="fas fa-exclamation-triangle" style={{marginRight: '8px'}} aria-hidden="true"></i>
-                  <strong>Important:</strong>&nbsp;If you update from 0.97.0 to 0.98.0 and have been using the Kafka broker, you must use <strong>docker-compose.kafka.yml</strong> to run StreamPipes. The default docker-compose now uses NATS as the broker. Existing Kafka-based instances cannot be migrated automatically and cannot simply be switched to the default compose file.
-                </div>
-              </div>
-            </div>
-
             <div className="row">
               <div className="alert alert-info" role="alert" style={{marginLeft: '20px', marginRight: '20px'}}>
                 <p>


(streampipes-website) 05/08: Add screenshots

Posted by ri...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dominikriemer pushed a commit to branch refactor-website
in repository https://gitbox.apache.org/repos/asf/streampipes-website.git

commit f2730429f493b5553df064735b968df823264653
Author: Dominik Riemer <do...@gmail.com>
AuthorDate: Tue Jun 2 23:35:11 2026 +0200

    Add screenshots
---
 docs/04_use-assets.md                           |  41 ++--
 docs/04_use-charts.md                           |  63 +++++-
 docs/04_use-connect.md                          |  57 ++++--
 docs/04_use-dashboards.md                       |  31 ++-
 docs/04_use-datasets.md                         |  37 +++-
 docs/04_use-pipelines.md                        |  33 +++-
 docs/06_configure-operate-extension-services.md | 146 +++-----------
 docs/06_configure-operate-extensions.md         | 142 +++-----------
 docs/06_configure-operate-general-settings.md   |  10 +-
 docs/06_configure-operate-security.md           | 243 +++++++-----------------
 10 files changed, 335 insertions(+), 468 deletions(-)

diff --git a/docs/04_use-assets.md b/docs/04_use-assets.md
index eb3642ab5..461ae7869 100644
--- a/docs/04_use-assets.md
+++ b/docs/04_use-assets.md
@@ -6,7 +6,7 @@ sidebar_label: Assets & Sites
 
 import UseCaseExample from '@site/src/components/docs/UseCaseExample.tsx';
 import StepFlow from '@site/src/components/docs/StepFlow.tsx';
-import DocVisualPlaceholder from '@site/src/components/docs/DocVisualPlaceholder.tsx';
+import ScreenshotFigure from '@site/src/components/docs/ScreenshotFigure';
 
 Assets and sites give StreamPipes industrial context. They let you describe machines, lines, stations, and plants as real-world objects and then connect adapters, datasets, charts, dashboards, and pipelines to those objects.
 
@@ -50,9 +50,12 @@ Open `Assets` from the main navigation to reach the overview. The overview lists
 
 The overview is intentionally simple. The interesting structure appears once you open one asset model and begin to navigate or edit its hierarchy.
 
-<DocVisualPlaceholder
-  title="Asset overview"
-  purpose="Show the root asset table with actions for opening, editing, managing permissions, and deleting asset models."
+<ScreenshotFigure
+  src="/img/2026/asset-create.png"
+  alt="Asset editor with hierarchy on the left and basic fields on the right"
+  title="Asset Editor"
+  eyebrow="Assets"
+  caption="The asset editor combines the hierarchy tree with the selected asset's identity, type, labels, and other structural metadata."
 />
 
 ## Create the asset model before you fill in the details
@@ -132,6 +135,14 @@ The distinction is simple but important. The site gives reusable general locatio
 
 This is a good example of how the model stays flexible. Not every machine needs a precise map point. But the ones that do can have one without forcing the same detail level onto every other asset.
 
+<ScreenshotFigure
+  src="/img/2026/asset-asset-link-overview.png"
+  alt="Asset links section with site assignment and linked resources"
+  title="Site Assignment and Asset Links"
+  eyebrow="Operational Context"
+  caption="Sites provide reusable location context, while asset links turn the asset into a navigable entry point for adapters, pipelines, datasets, and streams."
+/>
+
 ## Link resources once the model is meaningful
 
 The `Asset links` section is what makes the asset model valuable across the rest of StreamPipes. In edit mode, you can add one link at a time or open the broader link-management flow when several resources should be attached together.
@@ -161,25 +172,3 @@ Deletion should be treated carefully because an asset may contain hierarchy and
 The cleanest working style is to model the industrial hierarchy first, assign site context second, and link technical resources third. That order tends to produce the most coherent result because the structure exists before the individual platform objects are attached to it.
 
 The most common mistake is to build many useful charts, datasets, and dashboards but leave them unlinked. In that situation, StreamPipes still works, but much of the contextual value of the platform is lost. Assets are what turn those isolated resources into something users can navigate naturally.
-
-## Image placeholders
-
-<DocVisualPlaceholder
-  title="Asset model and hierarchy"
-  purpose="Show one industrial hierarchy with a root asset, subassets, and linked resources such as adapters, datasets, charts, dashboards, and pipelines."
-/>
-
-<DocVisualPlaceholder
-  title="Asset editor"
-  purpose="Show edit mode with the hierarchy tree on the left and the selected asset details on the right."
-/>
-
-<DocVisualPlaceholder
-  title="Site and exact location"
-  purpose="Show the site assignment section together with the exact-location controls in the asset editor."
-/>
-
-<DocVisualPlaceholder
-  title="Linked resources view"
-  purpose="Show one machine asset in view mode with its linked resources section populated."
-/>
diff --git a/docs/04_use-charts.md b/docs/04_use-charts.md
index 7e4cf4db8..d4c31e44d 100644
--- a/docs/04_use-charts.md
+++ b/docs/04_use-charts.md
@@ -4,11 +4,20 @@ title: Charts
 sidebar_label: Charts
 ---
 
+import ScreenshotFigure from '@site/src/components/docs/ScreenshotFigure';
+import ScreenshotSlideshow from '@site/src/components/docs/ScreenshotSlideshow';
+
 Charts are where persisted industrial data becomes something a user can actually read and act on. In StreamPipes, a chart starts with an existing dataset, turns that dataset into a query result, and then presents that result in a visualization that matches the analytical question.
 
 This is an important distinction from `Connect` and `Pipelines`. Those features bring data into StreamPipes and prepare it. Charts work one step later. They assume that the data already exists and help you ask questions such as: What happened over time? What is the current value? How are two measurements related? Which states occurred most often?
 
-> [Image placeholder: chart overview and chart editor with toolbar, designer panel, chart canvas, and data preview]
+<ScreenshotFigure
+  src="/img/2026/chart-timeseries.png"
+  alt="Chart editor with time series visualization, toolbar, data preview, and visualization settings"
+  title="Chart Editor Overview"
+  eyebrow="Charts"
+  caption="The chart editor combines dataset-driven query design, live visualization preview, and chart-specific styling in one screen."
+/>
 
 ## Before you create a chart
 
@@ -62,7 +71,13 @@ The `Data preview` is one of the most important parts of the chart editor. It is
 
 Before spending time on chart type or appearance, look at the preview and ask a few basic questions. Did you select the correct dataset? Did the filter return the right subset? Did grouping create the result shape you expected? Does the result look like something the chosen chart type can represent well? Many chart problems are already obvious in the preview. If a pie chart seems wrong, the grouped values are often already wrong in the table. If a status chart looks confusing, the issue  [...]
 
-> [Image placeholder: chart data preview showing the actual query result before visualization]
+<ScreenshotFigure
+  src="/img/2026/chart-data-fields.png"
+  alt="Chart editor data tab with field selection"
+  title="Build the Query First"
+  eyebrow="Data Configuration"
+  caption="Field selection, grouping, and filters define the analytical result before the visualization tab turns it into a chart."
+/>
 
 ## Choose the chart type to match the question
 
@@ -72,6 +87,50 @@ The simplest way to choose among them is not to memorize all options, but to thi
 
 A few examples help. Machine temperature over the last eight hours is usually a `Time Series Chart`. Current tank fill level is a `Gauge`. Current compressed-air consumption as a KPI is an `Indicator`. The share of machine states during a shift is a `Pie`. The distribution of cycle times is a `Histogram`. The relationship between temperature and vibration is a `Scatter` plot. These are not hard rules, but they are reliable defaults.
 
+<ScreenshotSlideshow
+  title="Representative Chart Types"
+  eyebrow="Visualization Examples"
+  badge="Gallery"
+  items={[
+    {
+      src: '/img/2026/chart-gauge.png',
+      alt: 'Gauge chart configuration',
+      title: 'Gauge',
+      caption: 'Use gauges when one current numeric state should be understood at a glance.',
+    },
+    {
+      src: '/img/2026/chart-indicator.png',
+      alt: 'Indicator chart configuration',
+      title: 'Indicator',
+      caption: 'Indicators highlight one KPI with minimal visual noise.',
+    },
+    {
+      src: '/img/2026/chart-scatter.png',
+      alt: 'Scatter chart configuration',
+      title: 'Scatter',
+      caption: 'Scatter plots help compare two measurements against each other instead of against time.',
+    },
+    {
+      src: '/img/2026/chart-histogram.png',
+      alt: 'Histogram chart configuration',
+      title: 'Histogram',
+      caption: 'Histograms show the distribution of values across buckets instead of showing event order.',
+    },
+    {
+      src: '/img/2026/chart-status.png',
+      alt: 'Status chart configuration',
+      title: 'Status',
+      caption: 'Status-style charts communicate categorical state quickly for operational dashboards.',
+    },
+    {
+      src: '/img/2026/chart-table.png',
+      alt: 'Table chart configuration',
+      title: 'Table',
+      caption: 'Use tables when the exact stored rows still matter more than summarized visualization.',
+    },
+  ]}
+/>
+
 ## Finish the chart in visualization and appearance
 
 After selecting the chart type, the designer panel lets you refine `Visualization` and `Appearance`. The exact controls depend on the selected chart type, but the conceptual split stays the same: `Data` decides what is returned, `Visualization` decides how that result is interpreted, and `Appearance` controls presentation such as titles, colors, and formatting.
diff --git a/docs/04_use-connect.md b/docs/04_use-connect.md
index 6ab698792..7edf58a06 100644
--- a/docs/04_use-connect.md
+++ b/docs/04_use-connect.md
@@ -5,8 +5,9 @@ sidebar_label: Connect IoT Data
 ---
 
 import FeatureList from '@site/src/components/docs/FeatureList.tsx';
-import DocVisualPlaceholder from '@site/src/components/docs/DocVisualPlaceholder.tsx';
 import UseCaseExample from '@site/src/components/docs/UseCaseExample.tsx';
+import ScreenshotFigure from '@site/src/components/docs/ScreenshotFigure';
+import ScreenshotSlideshow from '@site/src/components/docs/ScreenshotSlideshow';
 
 Apache StreamPipes Connect is the entry point for bringing industrial and IoT data into the platform.
 It lets users create adapters from the web interface, inspect incoming events, refine schemas, and publish the resulting data streams for reuse across pipelines, dashboards, charts, assets, and datasets.
@@ -43,9 +44,12 @@ Instead of building custom ingestion services for every source, users can config
 This makes Connect more than a connection dialog.
 It is the ingestion layer of the StreamPipes data platform.
 
-<DocVisualPlaceholder
-  title="Connect overview"
-  purpose="Show the adapter list, status indicators, and create action so Connect reads as an operational ingestion workspace."
+<ScreenshotFigure
+  src="/img/2026/connect-overview.png"
+  alt="Connect overview with adapter list, status indicators, and create action"
+  title="Connect Overview"
+  eyebrow="Connect"
+  caption="The Connect workspace shows all configured adapters, their runtime status, and the operational context assigned to each source."
 />
 
 ## Key features
@@ -121,7 +125,13 @@ The goal of this step is simple: choose the adapter that best matches the source
   A team wants to onboard one new machine feed. They do not start by thinking about downstream pipelines yet. They start by choosing the adapter that best matches the source they already have, because that determines the configuration options and the sample data StreamPipes can inspect next.
 </UseCaseExample>
 
-<img className="docs-image" src="/img/03_use-connect/01_connect-overview.png" alt="StreamPipes Connect adapter catalog"/>
+<ScreenshotFigure
+  src="/img/2026/connect-create-select-adapter.png"
+  alt="Adapter selection dialog in StreamPipes Connect"
+  title="Select an Adapter"
+  eyebrow="Step 1"
+  caption="The adapter catalog is the entry point for choosing the integration type that matches the external source."
+/>
 
 ### 2. Configure source settings
 
@@ -137,11 +147,12 @@ The exact fields differ by adapter, but the purpose stays the same: define how S
 Example: imagine a team receives machine events from a broker in CSV format.
 In this step, they would define where the source is located, how StreamPipes should access it, and how the incoming payload should be interpreted before any schema work begins.
 
-<img className="docs-image" src="/img/03_use-connect/06_connect-create.png" alt="StreamPipes Connect adapter settings"/>
-
-<DocVisualPlaceholder
-  title="Adapter settings step"
-  purpose="Show current adapter-specific configuration fields together with the stepper to make the guided setup flow visible."
+<ScreenshotFigure
+  src="/img/2026/connect-create-adapter-settings.png"
+  alt="Adapter settings step in Connect with source-specific configuration fields"
+  title="Configure Source Settings"
+  eyebrow="Step 2"
+  caption="The settings step defines how StreamPipes reaches the source and how the adapter should interpret the incoming payload."
 />
 
 ### 3. Inspect and shape the incoming event structure
@@ -162,7 +173,31 @@ Instead of blindly ingesting data, users can validate whether the input looks co
 
 Example: if a machine emits timestamps in a custom field such as `input_timestamp`, users can inspect a sample event, test a transformation script, and verify the output before the stream is created.
 
-<img className="docs-image" src="/img/03_use-connect/02_customize-format.png" alt="StreamPipes Connect schema configuration"/>
+<ScreenshotSlideshow
+  title="Schema and Metadata Workflow"
+  eyebrow="Step 3"
+  badge="Preview"
+  items={[
+    {
+      src: '/img/2026/connect-create-configure-schema-example.png',
+      alt: 'Schema configuration step with sample event preview',
+      title: 'Inspect the Sample Event',
+      caption: 'Load or refresh a representative event before publishing anything into the platform model.',
+    },
+    {
+      src: '/img/2026/connect-create-configure-schema-measurement-unit.png',
+      alt: 'Schema configuration with measurement unit refinement',
+      title: 'Refine the Schema',
+      caption: 'Adjust field semantics such as units and measurement meaning before downstream users consume the stream.',
+    },
+    {
+      src: '/img/2026/connect-create-configure-metadata.png',
+      alt: 'Metadata configuration step in StreamPipes Connect',
+      title: 'Add Metadata and Runtime Options',
+      caption: 'The final step captures naming, persistence, and asset-context decisions that turn the connection into an operated resource.',
+    },
+  ]}
+/>
 
 #### Using script-based transformations
 
diff --git a/docs/04_use-dashboards.md b/docs/04_use-dashboards.md
index 6efddaa10..0f35d4648 100644
--- a/docs/04_use-dashboards.md
+++ b/docs/04_use-dashboards.md
@@ -4,11 +4,32 @@ title: Dashboards
 sidebar_label: Dashboards
 ---
 
+import ScreenshotComparison from '@site/src/components/docs/ScreenshotComparison';
+import ScreenshotFigure from '@site/src/components/docs/ScreenshotFigure';
+
 Dashboards are the place where individual charts become a shared operational view. In the current StreamPipes product, dashboards are no longer built from a separate widget framework. Instead, they reuse the charts you already created in `Charts` and arrange them into one screen for monitoring, analysis, or presentation.
 
 That design is important because it keeps the responsibilities clear. A chart answers one analytical question well. A dashboard combines several of those answers so a user can understand a machine, a line, or a whole process at a glance.
 
-> [Image placeholder: dashboard overview and dashboard panel showing multiple saved charts reused in one layout]
+<ScreenshotComparison
+  title="Dashboard Overview and Runtime"
+  eyebrow="Dashboards"
+  summary="The overview helps manage saved dashboards, while the runtime panel is where the composed charts are actually consumed."
+  items={[
+    {
+      src: '/img/2026/dashboard-preview.png',
+      alt: 'Dashboard overview with preview drawer',
+      title: 'Dashboard Overview',
+      caption: 'Use the overview to browse saved dashboards, inspect metadata, and preview one dashboard before opening it.',
+    },
+    {
+      src: '/img/2026/dashboard-create.png',
+      alt: 'Dashboard runtime and edit mode',
+      title: 'Dashboard Runtime',
+      caption: 'The runtime screen shows the actual chart composition, the global toolbar, and the chart-selection panel in edit mode.',
+    },
+  ]}
+/>
 
 ## Before you build a dashboard
 
@@ -90,7 +111,13 @@ The toolbar is small, but it defines how the dashboard behaves. In edit mode, it
 
 This split between the panel and the settings dialog is useful. Settings define what the dashboard should be. The panel is where users experience that decision in practice.
 
-> [Image placeholder: dashboard panel with toolbar, time selector, options menu, chart canvas, and right-side chart selection panel in edit mode]
+<ScreenshotFigure
+  src="/img/2026/dashboard-create.png"
+  alt="Dashboard edit mode with save toolbar, chart canvas, and chart selection panel"
+  title="Compose the Dashboard"
+  eyebrow="Edit Mode"
+  caption="In edit mode, the dashboard becomes a composition surface where saved charts are placed, arranged, and coordinated through shared settings."
+/>
 
 ## Move into edit mode when the composition should change
 
diff --git a/docs/04_use-datasets.md b/docs/04_use-datasets.md
index 922b6d5e7..b59242ade 100644
--- a/docs/04_use-datasets.md
+++ b/docs/04_use-datasets.md
@@ -7,6 +7,8 @@ sidebar_label: Datasets
 import StepFlow from '@site/src/components/docs/StepFlow.tsx';
 import UseCaseExample from '@site/src/components/docs/UseCaseExample.tsx';
 import DocVisualPlaceholder from '@site/src/components/docs/DocVisualPlaceholder.tsx';
+import ScreenshotFigure from '@site/src/components/docs/ScreenshotFigure';
+import ScreenshotSlideshow from '@site/src/components/docs/ScreenshotSlideshow';
 
 A dataset in StreamPipes is stored operational data. It is the point where live machine events stop being only transient stream traffic and become something users can inspect later, analyze in charts, reuse in dashboards, export for other systems, and govern over time.
 
@@ -26,9 +28,12 @@ The third is CSV import. A team already has historical data in files and wants t
   A raw machine stream may be useful for live processing, but a persisted dataset is what lets another team come back tomorrow, open the same data again, build charts on top of it, and compare current behavior with last week.
 </UseCaseExample>
 
-<DocVisualPlaceholder
-  title="Dataset overview"
-  purpose="Show how persisted adapters, persisted pipelines, and imported CSV files all result in datasets that appear in one operational workspace."
+<ScreenshotFigure
+  src="/img/2026/dataset-overview.png"
+  alt="Dataset overview with event counts, retention column, and export provider section"
+  title="Dataset Overview"
+  eyebrow="Datasets"
+  caption="The datasets page brings persisted event stores and export-provider management together in one operational workspace."
 />
 
 ## Open the dataset workspace
@@ -69,9 +74,29 @@ To open the preview, open `Datasets`, find the row, and click the preview action
   A team imports one week of machine history from CSV and sees the row count they expected. That still does not prove the timestamp column was interpreted correctly. One preview is usually enough to catch that kind of problem before the data reaches charts and dashboards.
 </UseCaseExample>
 
-<DocVisualPlaceholder
-  title="Dataset preview"
-  purpose="Show one stored event with a timestamp, dimensions, and measurements so users understand what the preview action validates."
+<ScreenshotSlideshow
+  title="Inspect and Import Data"
+  eyebrow="Dataset Actions"
+  items={[
+    {
+      src: '/img/2026/dataset-upload-data-dialog-preview.png',
+      alt: 'CSV upload preview dialog for datasets',
+      title: 'Validate CSV Parsing',
+      caption: 'Check delimiters, headers, and timestamp interpretation before imported data becomes part of a dataset.',
+    },
+    {
+      src: '/img/2026/dataset-download-data-dialog.png',
+      alt: 'Dataset download dialog',
+      title: 'Download Data',
+      caption: 'Export the current dataset when another team or tool needs an offline extract.',
+    },
+    {
+      src: '/img/2026/dataset-export-provider-dialog-s3.png',
+      alt: 'S3 export provider dialog for datasets',
+      title: 'Configure Export Providers',
+      caption: 'Retention rules can archive older data through reusable export-provider settings such as S3-compatible targets.',
+    },
+  ]}
 />
 
 ## Import CSV data when the live connection is not the starting point
diff --git a/docs/04_use-pipelines.md b/docs/04_use-pipelines.md
index 24a2d69db..6ef71ea65 100644
--- a/docs/04_use-pipelines.md
+++ b/docs/04_use-pipelines.md
@@ -6,7 +6,8 @@ sidebar_label: Pipelines
 
 import StepFlow from '@site/src/components/docs/StepFlow.tsx';
 import UseCaseExample from '@site/src/components/docs/UseCaseExample.tsx';
-import DocVisualPlaceholder from '@site/src/components/docs/DocVisualPlaceholder.tsx';
+import ScreenshotComparison from '@site/src/components/docs/ScreenshotComparison';
+import ScreenshotFigure from '@site/src/components/docs/ScreenshotFigure';
 
 Pipelines are where connected data becomes operational logic inside StreamPipes. They let you take one or more live streams, combine them with processors and sinks, and turn that flow into something useful: filtering, enrichment, alerting, routing, storage, or analytics.
 
@@ -30,9 +31,12 @@ The `Pipeline Editor` is where you design or change the flow. The `Pipeline Over
 
 This split is useful because it matches how people actually work. You usually build in the editor, operate from the overview, and investigate in the details view.
 
-<DocVisualPlaceholder
-  title="Pipeline editor overview"
-  purpose="Show the current editor with element catalog, assembly canvas, and top action bar before the user starts building."
+<ScreenshotFigure
+  src="/img/2026/pipeline-editor-example.png"
+  alt="Pipeline editor with element catalog, pipeline canvas, and save toolbar"
+  title="Pipeline Editor"
+  eyebrow="Pipeline Workspace"
+  caption="The editor combines the element catalog, the assembly canvas, and validation-aware save actions in one guided workspace."
 />
 
 ## Build the pipeline from left to right
@@ -120,9 +124,24 @@ This is the place to go when the pipeline should be understood, not just operate
 
 The details toolbar also includes `View pipeline as code`, which makes the underlying compact representation visible. That is useful for inspection, comparison across environments, and programmatic reuse.
 
-<DocVisualPlaceholder
-  title="Pipeline details view"
-  purpose="Show the current details view with visual pipeline preview, logs, status, actions, and the pipeline-as-code entry point."
+<ScreenshotComparison
+  title="Operate and Inspect Pipelines"
+  eyebrow="Pipeline Operations"
+  summary="The grouped overview is the fastest place to manage many pipelines, while the details view is the place to inspect one pipeline more deeply."
+  items={[
+    {
+      src: '/img/2026/pipeline-overview-grouped.png',
+      alt: 'Grouped pipeline overview',
+      title: 'Pipeline Overview',
+      caption: 'Use the overview to scan status, open actions, and operate several pipelines efficiently.',
+    },
+    {
+      src: '/img/2026/pipeline-details.png',
+      alt: 'Pipeline details view',
+      title: 'Pipeline Details',
+      caption: 'Open one pipeline in detail when you need to inspect structure, logs, metrics, or code-oriented information.',
+    },
+  ]}
 />
 
 ## Treat templates as a standardization tool
diff --git a/docs/06_configure-operate-extension-services.md b/docs/06_configure-operate-extension-services.md
index 321582553..c468c8279 100644
--- a/docs/06_configure-operate-extension-services.md
+++ b/docs/06_configure-operate-extension-services.md
@@ -4,32 +4,29 @@ title: Extension Services
 sidebar_label: Extension Services
 ---
 
+import ScreenshotFigure from '@site/src/components/docs/ScreenshotFigure';
+
 The `Extension Services` tab in `Configuration` is the operational view for the services behind StreamPipes extensions. While the `Extensions` tab controls which adapters and pipeline elements are installed, `Extension Services` shows which services are currently registered, which service-level settings they expose, and how OPC UA certificates are handled.
 
 This page focuses on the current `Configuration > Extension Services` screen.
 
-> [Image placeholder: Extension Services page with the sections Registered services, Service configurations, and Certificates]
+<ScreenshotFigure
+  src="/img/2026/settings-extension-services.png"
+  alt="Extension Services page with registered services, service configurations, and certificates"
+  title="Extension Services"
+  eyebrow="Configuration"
+  caption="The Extension Services tab brings service registration, service-level configuration, and OPC UA certificate handling together in one operational view."
+/>
 
 ## What the Extension Services tab is for
 
-Use this page when you want to:
-
-- inspect which extension services are currently registered in the instance
-- review service health at a glance
-- open technical details of a registered service
-- update service-level configuration values
-- manage trusted and rejected OPC UA certificates
-
-This tab is aimed at platform operators and administrators, not end users building adapters or pipelines.
+This page is for operational work on the services behind the extension catalog. It is the place to confirm that a service is registered, check its health, inspect its identity and location, update service-level runtime settings, and manage trusted or rejected OPC UA certificates. In other words, it is aimed at platform operators, not at end users creating adapters or pipelines.
 
 ## Understand the difference between Extensions and Extension Services
 
 The two configuration tabs are related, but they solve different problems.
 
-- `Extensions` controls which installable items such as adapters, processors, and sinks are available in the instance.
-- `Extension Services` controls the services that provide those items and the configuration values those services need at runtime.
-
-In practice, you go to `Extensions` when something should become available to users, and to `Extension Services` when you need to inspect or configure the underlying service behavior.
+`Extensions` decides which installable items such as adapters, processors, and sinks are available in the instance. `Extension Services` deals with the services that provide those items and the configuration those services need at runtime. In practice, you go to `Extensions` when something should become available to users, and to `Extension Services` when you need to inspect or influence the service behavior behind that feature.
 
 ## Open the page
 
@@ -38,32 +35,15 @@ To open the screen:
 1. Go to `Configuration`.
 2. Open the `Extension Services` tab.
 
-The current page contains three sections:
-
-- `Registered services`
-- `Service configurations`
-- `Certificates`
+The page is organized into three sections: `Registered services`, `Service configurations`, and `Certificates`. Read from top to bottom, they move from service presence to service behavior and then to protocol trust management.
 
 ## Inspect registered services
 
-The `Registered services` section provides an overview of the services that are currently known to the StreamPipes instance.
-
-The table shows:
-
-- `Status`
-- `Service ID`
-- `Service Group`
-
-Each row also provides an action to open the service details.
+The `Registered services` section is the fastest health and inventory view for the service layer. The table shows the health state, the service ID, and the service group for every service currently known to the instance. Each row can also be opened in more detail, which is useful when the short row no longer gives enough context.
 
 ### Read the service status
 
-The status column uses a simple health indicator.
-
-- a green indicator means the service is `HEALTHY`
-- a non-healthy state is shown with a critical indicator
-
-Use this view as a first diagnostic step when a service-backed feature is missing or behaving unexpectedly.
+The status column uses a deliberately simple health indicator. A green marker means the service is `HEALTHY`; other states are shown as critical. That makes this section the natural first stop when a service-backed feature is missing or behaves unexpectedly.
 
 Example:
 If a set of adapters is installed but not behaving as expected, checking the registration and health state of the providing service is a sensible first step before editing adapters themselves.
@@ -89,30 +69,14 @@ To inspect one service:
 2. Find the service in `Registered services`.
 3. Click the details action on the right side of the row.
 
-The details dialog shows:
-
-- `Service ID`
-- `Service Group`
-- `Location`
-- `Tags`
-
-This is useful when you need to understand which service instance is registered, where it is running, and how it identifies itself to StreamPipes.
+The details dialog exposes the service identity more clearly, including fields such as `Service ID`, `Service Group`, `Location`, and `Tags`. This is the place to go when you need to understand which instance is actually registered, where it runs, and how it identifies itself to StreamPipes.
 
 Example:
 If multiple services are present, the dialog helps distinguish them by location and tags instead of relying only on a short row in the overview.
 
-> [Image placeholder: Registered services table with status indicators and the service details dialog open]
-
 ## Update service configurations
 
-The `Service configurations` section is where StreamPipes exposes configurable settings for core and extension services.
-
-The table shows:
-
-- `Service Group`
-- `Service Name`
-
-Each row includes an edit action that expands the configuration details inline.
+The `Service configurations` section is where StreamPipes exposes runtime settings for core and extension services. The table stays compact at first, showing only the service group and service name. Configuration details appear only when you expand one row, which keeps the page readable even when several services exist side by side.
 
 ### Open a configuration row
 
@@ -123,22 +87,11 @@ To edit a service configuration:
 3. Find the service you want to change.
 4. Click the edit icon in the row.
 
-The row expands and shows the available configuration keys for that service.
-
-Use this area when a service requires runtime configuration values, for example connection settings, feature toggles, or other service-specific parameters.
+The expanded row reveals the configuration keys for that specific service. Use this area whenever a service needs runtime values such as connection details, feature toggles, or other service-specific operational parameters.
 
 ### Understand the configuration form
 
-Inside an expanded row, StreamPipes renders the fields based on the type of the configuration item.
-
-Depending on the configuration, you may see:
-
-- text fields
-- number fields
-- boolean checkboxes
-- password fields
-
-For text and boolean values, the current UI can show a help tooltip with the configuration description. Use that tooltip when the key name alone is not enough to understand the setting.
+Inside an expanded row, StreamPipes renders fields according to their type. Depending on the service, this can mean text inputs, number inputs, boolean checkboxes, or password fields. The form is therefore not decorative; it is a typed representation of the service contract. Where a help tooltip exists, use it. It often contains the operational explanation that the raw key name alone cannot provide.
 
 ### Update a service configuration
 
@@ -149,60 +102,18 @@ To save changes for one service:
 3. Change the relevant values.
 4. Click `Update` at the bottom of the expanded form.
 
-After saving, the page reloads the configuration list.
-
-This means the section is designed around service-by-service updates rather than one global save for the whole page.
+After saving, the page reloads the configuration list. This reinforces the intended working model: update one service deliberately, verify the effect, then move on to the next one if necessary.
 
 ### How to work with different field types
 
-The exact fields depend on the service, but the interaction pattern is consistent.
-
-For text settings:
-
-1. Expand the service row.
-2. Click into the text field.
-3. Enter or replace the value.
-4. Use the help icon if a description is available.
-5. Click `Update`.
-
-For number settings:
-
-1. Expand the service row.
-2. Enter the numeric value in the number field.
-3. Click `Update`.
-
-For boolean settings:
-
-1. Expand the service row.
-2. Enable or disable the checkbox.
-3. Use the help icon if you need the description.
-4. Click `Update`.
-
-For password settings:
-
-1. Expand the service row.
-2. Click into the password field.
-3. Enter the new value.
-4. Click `Update`.
-
-Because these values can directly affect the behavior of a service, make changes deliberately and verify the related functionality afterwards.
+The exact fields differ from service to service, but the interaction pattern stays consistent: expand the row, change the relevant value, use the help text when needed, and update the configuration explicitly. Because these settings can directly affect runtime behavior, they should be treated as operational changes rather than as harmless metadata edits.
 
 Example:
 If a service-level setting controls access to an external dependency, change the configuration here and then validate the feature that depends on that service instead of assuming the update is correct.
 
-> [Image placeholder: Expanded service configuration row showing text, number, boolean, and password fields plus the Update button]
-
 ## Manage OPC UA certificates
 
-The `Certificates` section is dedicated to OPC UA certificate handling.
-
-In the current UI, the section is described as the place to configure trusted and rejected OPC UA certificates.
-
-The table shows certificates together with:
-
-- `Issuer`
-- `Expires`
-- actions for `Details`, `Trust` or `Reject`, and `Delete`
+The `Certificates` section is the trust-management area for OPC UA communication. It lists certificates together with their issuer, their expiry information, and the actions needed to inspect, trust, reject, or delete them.
 
 ### Refresh the certificate list
 
@@ -222,7 +133,7 @@ To inspect one certificate:
 2. Find the certificate in the table.
 3. Click `Details`.
 
-This opens the certificate details dialog so you can inspect the certificate before deciding whether to trust, reject, or remove it.
+This opens the certificate details dialog so you can inspect the certificate before deciding whether to trust it, reject it, or remove it entirely.
 
 ### Trust or reject a certificate
 
@@ -235,9 +146,7 @@ To change the state:
 3. Find the certificate.
 4. Click `Trust` if it is currently rejected, or `Reject` if it is currently trusted.
 
-After the action, StreamPipes updates the certificate state and reloads the table.
-
-Use this when an OPC UA connection depends on whether a certificate is accepted.
+After the action, StreamPipes updates the certificate state and reloads the table. This is the normal way to resolve trust decisions without deleting the historical certificate entry from the system.
 
 ### Delete a certificate
 
@@ -247,9 +156,7 @@ To remove a certificate entry:
 2. Find the certificate you want to remove.
 3. Click `Delete`.
 
-Use deletion carefully. Trust or reject is often the better operational action when the certificate should remain known to the system but with a controlled state.
-
-> [Image placeholder: Certificates table showing Details, Trust or Reject, and Delete actions]
+Use deletion carefully. In many cases, `Trust` or `Reject` is the better operational choice because the certificate remains known to the system, only with a controlled trust state.
 
 ## Typical workflows
 
@@ -279,7 +186,4 @@ Use deletion carefully. Trust or reject is often the better operational action w
 
 ## Common pitfalls
 
-- Do not confuse installed extensions with registered services. One tab manages catalog items, the other manages the services behind them.
-- Do not change service-level settings without validating the dependent functionality afterwards.
-- Use the service details dialog when a row alone does not provide enough context.
-- Treat certificate deletion carefully because it removes the entry instead of just changing its state.
+The most common mistake is to confuse installed extensions with registered services. One tab manages catalog items, the other manages the service layer behind them. The second common mistake is to change service-level settings and assume the job is done without validating the dependent feature afterwards. And finally, certificate deletion should be used more carefully than trust-state changes, because deletion removes the entry entirely instead of simply moving it between trusted and rej [...]
diff --git a/docs/06_configure-operate-extensions.md b/docs/06_configure-operate-extensions.md
index 98a769315..d01b6b6f9 100644
--- a/docs/06_configure-operate-extensions.md
+++ b/docs/06_configure-operate-extensions.md
@@ -4,25 +4,23 @@ title: Manage Extensions
 sidebar_label: Manage Extensions
 ---
 
+import ScreenshotFigure from '@site/src/components/docs/ScreenshotFigure';
+
 The `Extensions` tab in `Configuration` is the administrative catalog for installable StreamPipes functionality. This is where administrators review which adapters and pipeline elements are available to the instance, install new ones, uninstall existing ones, update installed items, and manage their permissions.
 
 This page focuses on the current `Configuration > Extensions` screen.
 
-> [Image placeholder: Extensions settings page with bulk actions, filters, search, and extension cards]
+<ScreenshotFigure
+  src="/img/2026/settings-extensions.png"
+  alt="Extensions catalog with bulk actions, search, filters, and extension cards"
+  title="Extensions Catalog"
+  eyebrow="Configuration"
+  caption="The Extensions tab is the installation catalog for adapters, streams, processors, and sinks that should become available in the instance."
+/>
 
 ## What the Extensions tab is for
 
-The `Extensions` tab is not where users create adapters or build pipelines. It controls which extension items are available in the instance in the first place.
-
-Use this page when you want to:
-
-- inspect the extension catalog available to the instance
-- install adapters or pipeline elements that users need
-- uninstall items that should no longer be available
-- update installed extension items
-- manage permissions for installed items
-
-In practice, this page is part of operating StreamPipes as a platform. Teams use adapters, processors, and sinks later in areas such as `Connect` and `Pipelines`, but administrators decide here which of those building blocks are installed.
+The `Extensions` tab is not where users create adapters or build pipelines. It controls which extension items are available in the instance in the first place. Administrators use it to inspect the catalog, install adapters or pipeline elements, remove items that should no longer be offered, refresh installed items, and manage access to those installed capabilities. In other words, this page is part of running StreamPipes as a platform rather than using StreamPipes as an end user.
 
 ## Open the page
 
@@ -35,22 +33,7 @@ Only administrators should manage installations here.
 
 ## Understand the screen layout
 
-The current page has three main parts:
-
-- bulk action controls at the top
-- filters and search controls
-- extension cards in the main catalog area
-
-Each extension card shows:
-
-- the extension name
-- a short description
-- its type
-- whether it is available
-- whether it is installed
-- the actions that are currently possible
-
-This layout is designed for two different tasks: browsing the catalog and operating the installation lifecycle.
+The screen is organized around three tasks. At the top sit the bulk-action controls for multi-item operations. Next come the filters and search field, which narrow the catalog before you act. The main area is the card-based catalog itself. Each card shows the extension name, a short description, the extension type, the current state, and the actions that are currently possible. This makes the page equally usable for browsing and for lifecycle operations.
 
 ## Read the extension cards
 
@@ -58,26 +41,14 @@ Each card represents one installable extension item.
 
 ### Understand availability and installation state
 
-Two states matter most:
-
-- `Available`: the item is present in the catalog and can be discovered by StreamPipes
-- `Installed`: the item is already installed and can be used in the appropriate feature area
-
-An item can be available without being installed. That usually means the instance knows about it, but users cannot use it yet.
+Two states matter most. `Available` means the item exists in the catalog and can be discovered by StreamPipes. `Installed` means it is already active in the instance and can be used in the appropriate feature area. An item can therefore be available without being installed, which usually means the platform knows about it but users cannot yet work with it.
 
 Example:
 An adapter may appear in the catalog, but until it is installed it will not show up as a usable connector option in `Connect`.
 
 ### Understand extension types
 
-The current catalog groups items into four main categories:
-
-- `Adapters`
-- `Data Streams`
-- `Data Processors`
-- `Data Sinks`
-
-These categories help administrators focus on the part of the catalog relevant to the task at hand.
+The catalog groups items into four main categories: `Adapters`, `Data Streams`, `Data Processors`, and `Data Sinks`. These categories are not only cosmetic. They help operators narrow the catalog to the part that matches the current need, whether that is connectivity, stream sources, processing logic, or output targets.
 
 Example:
 If a team needs a new ingestion option for machine connectivity, start with `Adapters`. If they need a new calculation or filtering step in pipelines, look at `Data Processors`.
@@ -90,18 +61,10 @@ If a card is internally managed, you should treat it as part of the system-manag
 
 ## Filter and search the catalog
 
-The catalog is designed to be filtered before you act on it.
+The catalog is designed to be filtered before you act on it. That is important because installation work is easier and safer when the visible set already matches the use case you are working on.
 
 ### Filter by category
 
-Use the category dropdown to restrict the list to:
-
-- `All`
-- `Adapters`
-- `Data Streams`
-- `Data Processors`
-- `Data Sinks`
-
 To filter by category:
 
 1. Open the category dropdown at the top of the page.
@@ -114,28 +77,19 @@ When onboarding a new protocol or source system, filter to `Adapters` first inst
 
 ### Filter by installation status
 
-Use the installation-status filter to switch between:
-
-- `Available & Installed`
-- `Installed`
-- `Available`
-
 To use it:
 
 1. Open the installation-status dropdown.
 2. Select the state you want to review.
 
-This is useful in two common situations:
-
-- use `Installed` when you want to audit what is currently active in the instance
-- use `Available` when you want to find items that exist but are not installed yet
+This filter becomes especially useful in two situations. Use `Installed` when you want to audit what is currently active in the instance. Use `Available` when you want to find items that exist but are not installed yet.
 
 Example:
 If a user says a certain sink is missing in the pipeline editor, switch to `Available` and search for it. If it appears there, the problem is installation state, not product support.
 
 ### Search by name
 
-Use the `Find Element` search field when you know part of the extension name already.
+Use the `Find Element` search field when you already know part of the extension name. It is especially helpful when the category still contains many items and you want to move directly to one connector family or one processor type.
 
 To search:
 
@@ -143,8 +97,6 @@ To search:
 2. Enter part of the element name.
 3. Review the filtered cards.
 
-Search is especially useful when the category still contains many items.
-
 ### Reload the catalog
 
 Use the reload button to refresh the catalog state from the backend.
@@ -153,27 +105,14 @@ Do this after installation or uninstallation work, or whenever you suspect the d
 
 ## Select items for bulk actions
 
-The Extensions page supports bulk installation and bulk uninstallation.
-
-To select items:
-
-1. Click an editable extension card to add it to the selection.
-2. Click additional cards if you want to process several items together.
-3. Use `Select all` to select all editable items in the current category view.
-4. Use `Select none` to clear the selection.
-
-Only editable items can be selected.
-
-A useful detail in the current UI is that changing the search term or installation-status filter clears the current selection. This avoids accidental bulk actions on a list that no longer matches what you are looking at.
+The page supports bulk installation and bulk uninstallation. Select one editable card or several, use `Select all` when the current filtered view already matches the intended scope, and use `Select none` to clear the working set again. Only editable items can be selected. One useful safety feature is that changing the search term or installation-status filter clears the current selection automatically, which reduces the risk of applying a bulk action to the wrong visible set.
 
 Example:
 If you are preparing a new instance for a team and need several adapters at once, bulk selection is faster and less error-prone than opening each card individually.
 
-> [Image placeholder: Extensions page with several selected cards and the bulk install button highlighted]
-
 ## Install extensions
 
-You can install either one extension at a time or several selected extensions in one run.
+You can install either one extension at a time or several selected extensions in one run. The interaction differs slightly, but the underlying installation model stays the same.
 
 ### Install a single extension
 
@@ -194,18 +133,11 @@ To install several items together:
 1. Select the required extension cards.
 2. Click `Install selected`.
 
-This opens the same installation dialog, but with all selected items queued.
-
-Use this path when you are preparing an instance for a new team or use case and already know the set of required extensions.
+This opens the same installation dialog, but with all selected items queued. Use this path when you are preparing an instance for a new team or use case and already know the set of required extensions.
 
 ### Work through the installation dialog
 
-The current installation dialog has two stages:
-
-- a preview step
-- the installation step
-
-In the preview step, StreamPipes shows the list of elements that are about to be installed.
+The installation dialog is intentionally simple. It starts with a preview of the elements that are about to be installed and then moves into the actual installation step, where progress is shown per item.
 
 To complete the installation:
 
@@ -220,32 +152,18 @@ To complete the installation:
 
 The installation dialog includes the checkbox `Make available to all users with appropriate role`.
 
-Use this setting when the installed extension should be broadly available to users who already have the right role to use that extension family.
-
-Think of this as an availability decision at install time.
+Use this setting when the installed extension should be broadly available to users who already have the right role for that extension family. This is not only an installation choice; it is also an availability decision at install time.
 
 Example:
 If you install a commonly used sink that should be usable across multiple teams, leaving this option enabled is usually the right choice.
 
 ### Read the installation progress
 
-During installation, StreamPipes processes items one after another and shows a status for each one.
-
-In practice, you should expect statuses such as:
-
-- waiting
-- success
-- error
-
-If an installation fails, the dialog can show additional details for that specific item.
-
-This is important for bulk installs because some items may succeed while others fail.
-
-> [Image placeholder: Installation dialog showing the preview step, the public-element checkbox, and per-item status updates]
+During installation, StreamPipes processes items one after another and shows a status for each one. In practice, the important distinction is simply whether an item is still waiting, completed successfully, or failed with an error. That matters especially in bulk installs, because some items may succeed while others fail in the same run.
 
 ## Uninstall extensions
 
-The uninstall flow mirrors the install flow.
+The uninstall flow mirrors the install flow, but the operational risk is usually higher because removal can affect existing teams and editing workflows.
 
 ### Uninstall a single extension
 
@@ -284,9 +202,7 @@ To update an installed extension:
 3. Open the card menu.
 4. Click `Update`.
 
-Use this when the installed item should be refreshed from the available catalog source.
-
-This is a maintenance action rather than a normal end-user workflow.
+Use this when the installed item should be refreshed from the available catalog source. It is a maintenance action rather than a normal end-user workflow.
 
 ## Manage permissions for installed extensions
 
@@ -299,9 +215,7 @@ To open it:
 3. Open the card menu.
 4. Click `Manage permissions`.
 
-Use this when access to a specific installed extension should be controlled more explicitly.
-
-This is especially relevant in shared environments where not every team or user should use every available adapter or pipeline element.
+Use this when access to a specific installed extension should be controlled more explicitly. This matters most in shared environments where not every team or user should be able to use every available adapter or pipeline element just because it is technically installed.
 
 ## Typical workflows
 
@@ -331,8 +245,4 @@ This is especially relevant in shared environments where not every team or user
 
 ## Common pitfalls
 
-- Do not confuse installing an extension with using it. Installation only makes the item available in the instance.
-- Do not uninstall items before checking whether users still depend on them.
-- Use category and installation filters together to avoid acting on the wrong part of a large catalog.
-- Reload the catalog after changes so the displayed state is current.
-- Pay attention to per-item status messages during bulk operations because partial failures are possible.
+The most common mistake is to confuse installation with usage. Installing an extension only makes it available in the instance; it does not automatically mean the feature is already being used correctly downstream. The second common mistake is to uninstall items before checking whether users still depend on them. In larger catalogs, category and installation filters should be used together, and after changes the catalog should be reloaded so the visible state stays trustworthy. During bu [...]
diff --git a/docs/06_configure-operate-general-settings.md b/docs/06_configure-operate-general-settings.md
index e48243ba0..ec9802378 100644
--- a/docs/06_configure-operate-general-settings.md
+++ b/docs/06_configure-operate-general-settings.md
@@ -4,11 +4,19 @@ title: General Settings
 sidebar_label: General Settings
 ---
 
+import ScreenshotFigure from '@site/src/components/docs/ScreenshotFigure';
+
 The `General` tab in `Configuration` contains the instance-wide settings that shape how users experience StreamPipes. This is where administrators define the platform name, the public URL, self-service account behavior, visible help links, and the terms users may need to accept after login.
 
 This page focuses on the current `Configuration > General` screen.
 
-> [Image placeholder: Configuration page with the General tab selected and the sections Basic, Registration, Links, and Terms visible]
+<ScreenshotFigure
+  src="/img/2026/settings-general.png"
+  alt="General settings page with Basic, Registration, Links, and Terms sections"
+  title="General Settings"
+  eyebrow="Configuration"
+  caption="The General tab groups instance identity, registration behavior, support links, and terms acknowledgment on one administrator-facing page."
+/>
 
 ## What the General tab controls
 
diff --git a/docs/06_configure-operate-security.md b/docs/06_configure-operate-security.md
index baca9af20..72bcaa16b 100644
--- a/docs/06_configure-operate-security.md
+++ b/docs/06_configure-operate-security.md
@@ -4,36 +4,30 @@ title: Security & User Management
 sidebar_label: Security & User Management
 ---
 
+import ScreenshotComparison from '@site/src/components/docs/ScreenshotComparison';
+import ScreenshotFigure from '@site/src/components/docs/ScreenshotFigure';
+
 ## Introduction
 
 The `Security` section in StreamPipes is where administrators manage who can access the platform, which roles they receive, and how platform resources are shared. It combines account management, role-based access control, group assignment, service accounts, and JWT signing support in one place.
 
-Use this page together with:
+It is best read together with [General Settings](./06_configure-operate-general-settings.md), where self-registration and default roles are configured, and with [Environment Variables](./06_configure-operate-environment-variables.md), where the installation-time security settings live.
 
-- [General Settings](./06_configure-operate-general-settings.md) for self-registration, password recovery, and default roles for new users
-- [Environment Variables](./06_configure-operate-environment-variables.md) for installation-time security settings
+<ScreenshotFigure
+  src="/img/2026/security-overview.png"
+  alt="Security configuration page with user accounts, service accounts, groups, and roles"
+  title="Security Overview"
+  eyebrow="Configuration"
+  caption="The Security tab groups interactive accounts, service identities, groups, roles, and authentication-related administration into one operator-facing page."
+/>
 
 ## What the Security page contains
 
-The current `Security` page is organized into five sections:
-
-- `User Accounts`
-- `Service Accounts`
-- `Groups`
-- `Roles`
-- `Authentication`
-
-Each section supports a different part of the security model.
+The page is structured around five areas that reflect how access control actually works in operation. `User Accounts` and `Service Accounts` define who or what authenticates. `Groups` and `Roles` define how permissions are bundled and assigned. `Authentication` covers the technical material used for token signing and related trust configuration. Read together, these sections describe both the human and the technical side of platform access.
 
 ## Security model at a glance
 
-In practice, StreamPipes combines three layers:
-
-1. `Accounts` identify users or services.
-2. `Roles` define what those accounts are allowed to do.
-3. `Resource permissions` define who can access a specific pipeline, adapter, chart, dashboard, dataset, asset, or extension.
-
-That means a user does not only need the right global role, but may also need access to the individual resource.
+In practice, StreamPipes combines three layers. Accounts identify users or services. Roles define what those accounts are generally allowed to do. Resource permissions decide who may access one specific adapter, pipeline, chart, dashboard, dataset, asset, or extension. That distinction matters because a user can have the correct global role and still not see a concrete resource until that object has been shared explicitly.
 
 ## Installation-time security settings
 
@@ -57,15 +51,7 @@ For production systems, you should change the default credentials and secrets be
 
 ## User accounts
 
-`User Accounts` are interactive identities for people who sign in to StreamPipes through the UI or use the API as named users.
-
-The user table shows:
-
-- email address
-- provider type
-- full name
-- creation time
-- last login
+`User Accounts` are the interactive identities for people who sign in through the UI or use the API as named users. The table is designed as a quick operational view: it shows who the user is, where the identity comes from, when the account was created, and when it was used last. In daily administration, that is usually enough to answer the first questions immediately: Is this a local or external user, and is the account still active in practice?
 
 ### Create a user account
 
@@ -81,38 +67,25 @@ To create a local user:
 
 ### Edit a user account
 
-When you edit a local user, you can change:
-
-- email address
-- full name
-- assigned groups
-- assigned roles
-- enabled state
-- locked state
-
-If you change the email address of the currently signed-in user, StreamPipes requires a new login afterwards.
+Editing a local user is where identity and authorization come together. You can update the email address and full name, adjust direct role assignments, add or remove groups, and change whether the account is enabled or locked. If you change the email address of the currently signed-in user, StreamPipes requires a new login afterwards, which is operationally sensible because the signed-in identity itself has changed.
 
 ### External users
 
 StreamPipes can also show users that come from an external identity provider. In the table, these users are marked by their provider instead of `local`.
 
-For externally managed users:
+These accounts should be read differently from local ones. Identity fields are owned by the external system, parts of the form can therefore become read-only, and role information may also be mapped from the provider depending on the installation model. The UI makes that distinction explicit so administrators do not mistake an external identity for a normal local user that simply happens to be missing some fields.
 
-- identity fields are managed by the external system
-- some settings in StreamPipes are read-only
-- role assignments may also be externally managed, depending on the provider configuration
-
-The UI explicitly warns when externally managed user settings cannot be changed.
+<ScreenshotFigure
+  src="/img/2026/security-edit-user.png"
+  alt="Edit user dialog with basic fields, group assignment, and role assignment"
+  title="Edit a User Account"
+  eyebrow="User Management"
+  caption="Editing a local user combines identity data with the effective authorization inputs: direct roles and assigned groups."
+/>
 
 ## Service accounts
 
-`Service Accounts` are non-human accounts for automated communication with the core API. They are typically used by extension services and other technical integrations.
-
-Use a service account when:
-
-- an extension service needs to authenticate to the core
-- an automated integration should call the StreamPipes API
-- access should not be tied to an individual person
+`Service Accounts` are the non-human identities used for automated communication with the core API. They are the right tool whenever access should belong to an extension service, a script, or another integration instead of to an individual person. This keeps technical access stable over time and avoids coupling long-running integrations to one employee account.
 
 ### Create a service account
 
@@ -125,11 +98,11 @@ To create a service account:
 5. Assign the required groups and roles.
 6. Click `Save`.
 
-The client secret must meet the minimum length requirement enforced by the UI. In practice, service accounts should receive only the roles they actually need.
+The client secret must meet the minimum length requirement enforced by the UI. In practice, service accounts should stay tightly scoped. Give them only the roles they actually need, because they often become long-lived technical identities that are harder to notice than interactive users.
 
 ## Groups
 
-`Groups` are a practical way to assign the same role set to multiple users. Instead of assigning every role to every user individually, you assign roles to a group and then assign users to that group.
+`Groups` are the practical answer to repeated user management. Instead of assigning the same set of roles to many individuals again and again, you define the shared role set once on the group and then assign users to that group. This is usually the cleaner model as soon as several people work in the same function or team.
 
 ### Create a group
 
@@ -143,24 +116,19 @@ After that, edit users and enable the group checkboxes you want to assign.
 
 ### Alternate IDs for groups
 
-Groups also support `Alternate IDs`. These are useful when you want to map externally defined groups to a StreamPipes group. This is especially relevant in setups with external identity providers.
+Groups also support `Alternate IDs`. These are especially useful in external-identity setups, because they let you keep a stable StreamPipes group with its local role definition while still mapping it to the identifier used by the upstream identity provider.
 
-In practice:
-
-- the StreamPipes group keeps the local role definition
-- the alternate ID stores the external group identifier
-- external identities can then be aligned with the local authorization model
+<ScreenshotFigure
+  src="/img/2026/security-add-group.png"
+  alt="Add group dialog with role assignments and alternate IDs"
+  title="Create a Group"
+  eyebrow="Groups"
+  caption="Groups bundle reusable role assignments and can also carry alternate IDs for mapping external identity-provider groups."
+/>
 
 ## Roles
 
-`Roles` are the central access-control building block in StreamPipes. A role contains a set of privileges, and users or groups receive those privileges by assignment.
-
-The role overview distinguishes between:
-
-- `Default roles`, which are built into the platform
-- custom roles, which administrators create for their own operating model
-
-Default roles cannot be deleted.
+`Roles` are the central permission-building block in StreamPipes. A role contains a set of privileges, and those privileges become effective only when the role is assigned directly to a user or inherited through a group. The role overview therefore separates built-in default roles from custom roles created for the local operating model. Default roles remain part of the platform and cannot be deleted.
 
 ### Create a custom role
 
@@ -176,49 +144,39 @@ The role ID must start with `ROLE_` and use only uppercase letters and underscor
 
 ### Alternate IDs for roles
 
-Like groups, roles can also contain `Alternate IDs`. These are used to map externally defined roles to a StreamPipes role. This makes it possible to keep a stable local authorization model even when role names in the external system differ from the StreamPipes role ID.
+Like groups, roles can also carry `Alternate IDs`. This is the bridge between externally named roles and the local StreamPipes authorization model. It allows the local model to remain stable even when the upstream provider uses different names or identifiers.
+
+<ScreenshotComparison
+  title="Roles and Effective Authorization Inputs"
+  eyebrow="Role Management"
+  summary="Groups are the reusable assignment mechanism, while roles themselves define the concrete privilege set available to users and services."
+  items={[
+    {
+      src: '/img/2026/security-add-group.png',
+      alt: 'Add group dialog with assigned roles',
+      title: 'Assign Roles Through Groups',
+      caption: 'Groups are useful when several users should inherit the same business-oriented role set.',
+    },
+    {
+      src: '/img/2026/security-edit-roles.png',
+      alt: 'Edit role dialog with available and selected privileges',
+      title: 'Define the Role Privileges',
+      caption: 'Role editing is where the actual privilege list is composed and reviewed.',
+    },
+  ]}
+/>
 
 ## How users, groups, and roles work together
 
-The effective permissions of a user are the combination of:
-
-- roles assigned directly to the user
-- roles inherited from assigned groups
-
-This means groups are not a separate permission system. They are a role-assignment mechanism.
-
-A practical pattern is:
-
-- create a small number of business-oriented groups such as `Operations`, `Data Engineering`, or `Plant Supervisors`
-- assign the relevant roles to those groups
-- assign users to groups instead of distributing many direct role assignments
+The effective permissions of a user are the combination of direct role assignments and the roles inherited from assigned groups. That is why groups should be seen as a role-assignment mechanism, not as a second permission system. In most real installations, the cleanest pattern is to keep only a small number of business-oriented groups such as `Operations`, `Data Engineering`, or `Plant Supervisors`, attach the relevant roles there, and rely less on large numbers of direct per-user assignments.
 
 ## Resource permissions
 
-Roles control what a user is allowed to do in general. Resource permissions control which concrete objects a user or group can access.
-
-StreamPipes supports permissions dialogs for major resource types, including:
-
-- adapters
-- pipelines
-- datasets
-- charts
-- dashboards
-- assets
-- extensions
+Roles control what a user is allowed to do in general. Resource permissions decide which concrete objects that user or group can actually access. This model is used across the major resource types, including adapters, pipelines, datasets, charts, dashboards, assets, and extensions.
 
 ### How resource permissions work
 
-Each resource has:
-
-- an owner
-- a visibility model such as private or shared access
-- explicit user and group assignments in the permissions dialog
-
-In practice, this allows you to separate:
-
-- who may generally manage pipelines or dashboards
-- who may access one specific pipeline or dashboard
+Each resource has an owner, a visibility model such as private or shared access, and explicit assignments in its permissions dialog. This allows StreamPipes to separate two decisions that should remain separate: who may generally manage a type of object, and who may access one specific object of that type.
 
 ### Change permissions for a resource
 
@@ -234,14 +192,7 @@ This is the mechanism to use when one team should see or edit a specific object
 
 ## Authentication and JWT signing
 
-The `Authentication` section currently focuses on `JWT Signature`.
-
-In the UI, administrators can:
-
-- generate a new public/private key pair
-- download the generated files
-
-This is useful in setups where signed tokens and authenticated service communication should rely on an explicit key pair instead of only a shared secret.
+The `Authentication` section currently focuses on `JWT Signature`. In operational terms, this is the technical trust material for token-based communication. The UI can generate a new public/private key pair and make both files available for download, which is useful when signed tokens should rely on an explicit RSA key pair instead of only on a shared secret.
 
 ### Generate a key pair
 
@@ -251,27 +202,11 @@ This is useful in setups where signed tokens and authenticated service communica
 4. Store the downloaded files securely.
 5. Update the deployment configuration so the core and dependent services use the generated keys.
 
-The downloaded files are:
-
-- `public.key`
-- `private.pem`
-
-If you configure RSA-based JWT signing, make sure the deployment references the matching key locations through the appropriate environment variables.
+The generated bundle contains `public.key` and `private.pem`. If you configure RSA-based JWT signing, the deployment must reference those files through the matching environment variables. Without that final deployment step, generating the files in the UI alone does not change the effective signing behavior of the installation.
 
 ## Self-registration and default roles
 
-User self-registration is not configured in the `Security` page itself. It is configured in `General Settings`.
-
-There you can define:
-
-- whether self-registration is allowed
-- whether password recovery is allowed
-- which default roles newly registered users receive
-
-This distinction matters:
-
-- `Security` is where you manage concrete accounts, groups, roles, and technical authentication assets
-- `General Settings` is where you control how new users enter the system
+User self-registration is not configured in `Security` itself. It lives in `General Settings`, where you decide whether self-registration and password recovery are allowed and which default roles newly registered users should receive. The separation is intentional. `Security` is where you manage concrete identities, groups, roles, and technical authentication assets. `General Settings` is where you define how new users enter the system in the first place.
 
 ## OAuth and external identity providers
 
@@ -300,7 +235,7 @@ Examples:
 - `SP_OAUTH_PROVIDER_GITHUB_CLIENT_SECRET`
 - `SP_OAUTH_PROVIDER_KEYCLOAK_ISSUER_URI`
 
-The `PROVIDER_ID` identifies one configured provider. You can define multiple providers side by side by using different IDs.
+The `PROVIDER_ID` identifies one configured provider. Multiple providers can exist side by side by using different IDs, which makes it possible to support more than one identity source without inventing a separate configuration model for each one.
 
 ### Provider-specific settings
 
@@ -322,26 +257,11 @@ The current OAuth configuration parser supports the following provider settings:
 - `NAME`
 - `DEFAULT_ROLES`
 
-In practice, the most important ones are:
-
-- connection details such as `AUTHORIZATION_URI`, `TOKEN_URI`, `USER_INFO_URI`, `ISSUER_URI`, and `JWK_SET_URI`
-- client credentials such as `CLIENT_ID` and `CLIENT_SECRET`
-- user-attribute mapping such as `EMAIL_ATTRIBUTE_NAME`, `FULL_NAME_ATTRIBUTE_NAME`, and `USER_ID_ATTRIBUTE_NAME`
-- optional role mapping through `ROLE_ATTRIBUTE_NAME`
-- optional default role assignment through `DEFAULT_ROLES`
+In practice, the most important values fall into four groups: connection details such as `AUTHORIZATION_URI` or `ISSUER_URI`, client credentials such as `CLIENT_ID` and `CLIENT_SECRET`, user-attribute mapping such as `EMAIL_ATTRIBUTE_NAME` and `FULL_NAME_ATTRIBUTE_NAME`, and optional authorization mapping through `ROLE_ATTRIBUTE_NAME` or `DEFAULT_ROLES`.
 
 ### What the provider settings mean
 
-Use the settings as follows:
-
-- `NAME` is the display name shown for the login provider.
-- `CLIENT_NAME` is the client name used in the OAuth configuration.
-- `SCOPES` is a comma-separated list of requested scopes.
-- `EMAIL_ATTRIBUTE_NAME` maps the email claim from the provider to the StreamPipes user.
-- `FULL_NAME_ATTRIBUTE_NAME` maps the full-name claim.
-- `USER_ID_ATTRIBUTE_NAME` maps the external user identifier.
-- `ROLE_ATTRIBUTE_NAME` defines which claim contains externally provided role information.
-- `DEFAULT_ROLES` assigns StreamPipes roles to users from that provider if no explicit external mapping is used.
+At a practical level, `NAME` controls the label shown to users on the login screen, `CLIENT_NAME` identifies the OAuth client, and `SCOPES` defines which information should be requested from the provider. The attribute-mapping settings such as `EMAIL_ATTRIBUTE_NAME`, `FULL_NAME_ATTRIBUTE_NAME`, and `USER_ID_ATTRIBUTE_NAME` decide how StreamPipes translates external claims into a local user. `ROLE_ATTRIBUTE_NAME` is used when the provider sends role information directly. `DEFAULT_ROLES` i [...]
 
 ### Example structure
 
@@ -370,37 +290,8 @@ If you define more than one provider, keep `SP_OAUTH_ENABLED` and `SP_OAUTH_REDI
 
 ### Role mapping in OAuth-based setups
 
-OAuth-based installations can combine several mechanisms:
-
-- `DEFAULT_ROLES` in the provider configuration
-- `ROLE_ATTRIBUTE_NAME` if the provider sends role claims
-- `Alternate IDs` on roles and groups in the Security page
-
-This is the recommended mental model:
-
-- use provider configuration to establish authentication and basic claim mapping
-- use StreamPipes roles and groups to keep the local authorization model understandable
-- use alternate IDs when external role or group names should map to existing StreamPipes objects
-
-In external-login setups, the Security page remains important because it still shows the resulting users, role assignments, and externally managed status.
+OAuth-based installations can combine several mechanisms at once: `DEFAULT_ROLES` in the provider configuration, `ROLE_ATTRIBUTE_NAME` when the provider sends role claims directly, and `Alternate IDs` on groups or roles in the Security page. The clean mental model is to use provider configuration for authentication and claim mapping, and to keep the local StreamPipes roles and groups as the understandable authorization layer. In that model, alternate IDs are simply the bridge between bot [...]
 
 ## Recommended operating pattern
 
-For most teams, the following model works well:
-
-1. Set secure initial credentials and secrets during deployment.
-2. Create a dedicated service account for every technical integration or extension deployment.
-3. Use groups for team-level access management.
-4. Keep custom roles small and purpose-specific.
-5. Use resource permissions to share individual adapters, pipelines, charts, dashboards, datasets, assets, and extensions.
-6. Review externally managed users and role mappings carefully in OAuth-based installations.
-
-## Image placeholders
-
-`[Image placeholder: Security settings overview with the five sections User Accounts, Service Accounts, Groups, Roles, and Authentication]`
-
-`[Image placeholder: Edit user dialog showing local user fields, group assignment, role assignment, and account status]`
-
-`[Image placeholder: Role editor with available privileges, selected privileges, and alternate IDs]`
-
-`[Image placeholder: Permissions dialog for a resource such as a pipeline or dashboard]`
+For most teams, the most reliable model is simple: set secure initial credentials during deployment, create dedicated service accounts for technical integrations, use groups for team-level assignment, keep custom roles small and purpose-specific, and use resource permissions for sharing individual objects. In OAuth-based installations, add one more habit: review the resulting users and mappings in the Security page instead of assuming the external provider configuration already tells the [...]


(streampipes-website) 02/08: Remove old images, add new screenshots

Posted by ri...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dominikriemer pushed a commit to branch refactor-website
in repository https://gitbox.apache.org/repos/asf/streampipes-website.git

commit aebfdc092fd9876a18711bca5eb7176d1d849b73
Author: Dominik Riemer <do...@gmail.com>
AuthorDate: Tue Jun 2 17:00:27 2026 +0200

    Remove old images, add new screenshots
---
 docs/01_overview.md                                | 330 ++++----
 docs/02_quick-start-guide.md                       | 675 +++++++++--------
 docs/03_concepts-architecture.md                   | 288 ++++---
 docs/03_concepts-introduction.md                   | 193 +++--
 docs/03_concepts-terms.md                          | 200 ++++-
 docs/04_use-assets.md                              | 180 +++++
 docs/04_use-charts.md                              |  99 +--
 docs/04_use-connect.md                             | 839 +++++++++++++++++----
 docs/04_use-dashboards.md                          | 167 +++-
 docs/04_use-datasets.md                            | 319 ++++----
 docs/04_use-pipelines.md                           | 270 +++----
 docs/04_use-programmatic-access.md                 | 186 ++---
 docs/04_use-shortcuts.md                           |  44 +-
 docs/06_configure-operate-deployment.md            | 710 ++++++++---------
 docs/06_configure-operate-extension-services.md    | 280 +++++++
 docs/06_configure-operate-extensions.md            | 333 +++++++-
 docs/06_configure-operate-general-settings.md      | 277 ++++++-
 docs/06_configure-operate-security.md              | 498 ++++++++----
 .../src/components/docs/DocVisualPlaceholder.tsx   |  31 +
 website-v2/src/components/docs/FeatureList.tsx     |  32 +
 .../src/components/docs/ScreenshotComparison.tsx   |  65 ++
 .../src/components/docs/ScreenshotFigure.tsx       |  52 ++
 .../src/components/docs/ScreenshotSlideshow.tsx    | 113 +++
 website-v2/src/components/docs/StepFlow.tsx        |  35 +
 website-v2/src/components/docs/UseCaseExample.tsx  |  19 +
 website-v2/src/components/docs/docs.module.css     | 380 ++++++++++
 .../static/img/2026/asset-asset-link-create.png    | Bin 0 -> 225091 bytes
 .../static/img/2026/asset-asset-link-overview.png  | Bin 0 -> 183326 bytes
 website-v2/static/img/2026/asset-create.png        | Bin 0 -> 114074 bytes
 .../connect-create-adapter-settings-preview.png    | Bin 0 -> 197265 bytes
 .../img/2026/connect-create-adapter-settings.png   | Bin 0 -> 183100 bytes
 .../img/2026/connect-create-configure-adapter.png  | Bin 0 -> 187442 bytes
 .../img/2026/connect-create-configure-metadata.png | Bin 0 -> 243199 bytes
 .../2026/connect-create-configure-schema-empty.png | Bin 0 -> 176228 bytes
 .../connect-create-configure-schema-example.png    | Bin 0 -> 237405 bytes
 ...ct-create-configure-schema-measurement-unit.png | Bin 0 -> 259438 bytes
 .../img/2026/connect-create-opcua-browser.png      | Bin 0 -> 306234 bytes
 .../img/2026/connect-create-select-adapter.png     | Bin 0 -> 324100 bytes
 website-v2/static/img/2026/connect-overview.png    | Bin 0 -> 184797 bytes
 .../img/2026/dataset-download-data-dialog.png      | Bin 0 -> 211682 bytes
 .../img/2026/dataset-export-provider-dialog-s3.png | Bin 0 -> 215277 bytes
 website-v2/static/img/2026/dataset-overview.png    | Bin 0 -> 201716 bytes
 .../2026/dataset-upload-data-dialog-preview.png    | Bin 0 -> 260877 bytes
 website-v2/static/img/2026/home-asset-preview.png  | Bin 0 -> 219050 bytes
 website-v2/static/img/2026/home-map.png            | Bin 0 -> 878279 bytes
 website-v2/static/img/2026/home-table.png          | Bin 0 -> 179338 bytes
 website-v2/static/img/2026/login.png               | Bin 0 -> 29630 bytes
 .../static/img/2026/settings-site-create.png       | Bin 0 -> 591674 bytes
 .../configuration/01_configuration_overview.png    | Bin 144077 -> 0 bytes
 .../img/features/configuration/02_status.png       | Bin 166320 -> 0 bytes
 .../features/configuration/03_change_config.png    | Bin 169040 -> 0 bytes
 .../static/img/features/dashboard/01_dashboard.png | Bin 1178882 -> 0 bytes
 .../features/dashboard/02_new_visualisation.png    | Bin 619256 -> 0 bytes
 .../img/features/dashboard/03_select_gauge.png     | Bin 587208 -> 0 bytes
 .../img/features/dashboard/04_configure_gauge.png  | Bin 601541 -> 0 bytes
 .../img/features/dashboard/05_new_gauge_done.png   | Bin 757239 -> 0 bytes
 .../static/img/features/dashboard/06_add_new.png   | Bin 1144868 -> 0 bytes
 .../img/features/editor/10_shortcut_buttons.png    | Bin 341129 -> 0 bytes
 .../img/features/editor/11_compatible_elements.png | Bin 459988 -> 0 bytes
 .../img/features/editor/12_recommend_elements.png  | Bin 339972 -> 0 bytes
 .../static/img/features/editor/13_save_adjust.png  | Bin 534505 -> 0 bytes
 .../img/features/editor/14_save_dialogue.png       | Bin 424745 -> 0 bytes
 .../editor/15_pipeline_sucessfully_started.png     | Bin 302914 -> 0 bytes
 .../static/img/features/editor/1_data_streams.png  | Bin 308396 -> 0 bytes
 .../img/features/editor/2_processing_elements.png  | Bin 287149 -> 0 bytes
 .../static/img/features/editor/3_data_sinks.png    | Bin 251836 -> 0 bytes
 .../static/img/features/editor/4_text_filter.png   | Bin 231865 -> 0 bytes
 .../img/features/editor/5_category_drop_down.png   | Bin 329123 -> 0 bytes
 .../img/features/editor/6_category_filter.png      | Bin 243478 -> 0 bytes
 .../img/features/editor/7_connect_elements.png     | Bin 466042 -> 0 bytes
 .../img/features/editor/8_configure_element.png    | Bin 318625 -> 0 bytes
 .../img/features/editor/9_connection_error.png     | Bin 362247 -> 0 bytes
 .../features/file_download/01_file_download.png    | Bin 174370 -> 0 bytes
 .../features/file_download/02_file_download.png    | Bin 217949 -> 0 bytes
 .../features/file_download/03_file_downloaded.png  | Bin 203346 -> 0 bytes
 website-v2/static/img/features/home/home.png       | Bin 481717 -> 0 bytes
 website-v2/static/img/features/home/logout.png     | Bin 525699 -> 0 bytes
 website-v2/static/img/features/home/menu.png       | Bin 502059 -> 0 bytes
 website-v2/static/img/features/home/open_menu.png  | Bin 369375 -> 0 bytes
 .../install_elements/01_install_elements.png       | Bin 298475 -> 0 bytes
 .../install_elements/02_install_absence.png        | Bin 307351 -> 0 bytes
 .../install_elements/03_installed_absence.png      | Bin 301235 -> 0 bytes
 .../install_elements/04_abcense_in_editor.png      | Bin 291436 -> 0 bytes
 website-v2/static/img/features/login.png           | Bin 3807049 -> 0 bytes
 .../manage_pipelines/1_pipeline_overview.png       | Bin 167479 -> 0 bytes
 .../manage_pipelines/2_start_stop_pipeline.png     | Bin 178123 -> 0 bytes
 .../manage_pipelines/3_delete_pipeline.png         | Bin 200857 -> 0 bytes
 .../manage_pipelines/4_pipeline_deleted.png        | Bin 174762 -> 0 bytes
 .../manage_pipelines/5_pipeline_category.png       | Bin 198884 -> 0 bytes
 .../features/manage_pipelines/6_add_category.png   | Bin 218655 -> 0 bytes
 .../features/manage_pipelines/7_new_category.png   | Bin 233820 -> 0 bytes
 .../manage_pipelines/8_show_new_category.png       | Bin 202205 -> 0 bytes
 .../img/features/my_elements/01_my_elements.png    | Bin 359345 -> 0 bytes
 .../features/my_elements/02_my_elements_jsonls.png | Bin 384742 -> 0 bytes
 .../static/img/features/my_elements/03_jsonld.png  | Bin 960834 -> 0 bytes
 .../notification/01_select_notification_sink.png   | Bin 321877 -> 0 bytes
 .../notification/02_configure_notification.png     | Bin 338399 -> 0 bytes
 .../notification/03_use_event_properties.png       | Bin 348738 -> 0 bytes
 .../features/notification/04_new_notification.png  | Bin 164679 -> 0 bytes
 .../img/features/notification/05_mark_read.png     | Bin 169831 -> 0 bytes
 .../features/notification/06_marked_as_read.png    | Bin 145979 -> 0 bytes
 website-v2/static/img/features/pipeline_editor.png | Bin 508371 -> 0 bytes
 .../configuration/01_configuration_overview.png    | Bin 102276 -> 0 bytes
 .../configuration/02_change_config.png             | Bin 131473 -> 0 bytes
 .../connect/edit/01_edit_timestamp.png             | Bin 404742 -> 0 bytes
 .../connect/edit/02_change_unit.png                | Bin 396073 -> 0 bytes
 .../connect/edit/03_change_unit.png                | Bin 423403 -> 0 bytes
 .../img/features_0_62_0/connect/new/01_connect.png | Bin 453244 -> 0 bytes
 .../connect/new/02_mqtt_adapter.png                | Bin 516173 -> 0 bytes
 .../connect/new/03_configure_mqtt.png              | Bin 292878 -> 0 bytes
 .../connect/new/04_configure_format.png            | Bin 267462 -> 0 bytes
 .../connect/new/05_guess_schema.png                | Bin 265875 -> 0 bytes
 .../connect/new/06_edit_adapter.png                | Bin 275943 -> 0 bytes
 .../connect/new/07_start_adapter.png               | Bin 431935 -> 0 bytes
 .../connect/new/08_data_stream_in_editor.png       | Bin 353442 -> 0 bytes
 .../img/features_0_62_0/dashboard/01_dashboard.png | Bin 121346 -> 0 bytes
 .../dashboard/02_new_visualisation.png             | Bin 117696 -> 0 bytes
 .../features_0_62_0/dashboard/03_select_gauge.png  | Bin 124451 -> 0 bytes
 .../dashboard/04_configure_gauge.png               | Bin 115686 -> 0 bytes
 .../dashboard/05_new_gauge_done.png                | Bin 141348 -> 0 bytes
 .../features_0_62_0/editor/10_connection_error.png | Bin 156593 -> 0 bytes
 .../features_0_62_0/editor/11_shortcut_buttons.png | Bin 179341 -> 0 bytes
 .../editor/12_compatible_elements.png              | Bin 194148 -> 0 bytes
 .../editor/13_recommend_elements.png               | Bin 192328 -> 0 bytes
 .../img/features_0_62_0/editor/14_save_adjust.png  | Bin 175440 -> 0 bytes
 .../features_0_62_0/editor/15_save_dialogue.png    | Bin 163445 -> 0 bytes
 .../editor/16_pipeline_sucessfully_started.png     | Bin 113043 -> 0 bytes
 .../editor/17_pipeline_information.png             | Bin 132882 -> 0 bytes
 .../editor/1_PipelineEditor_DataSets.png           | Bin 95707 -> 0 bytes
 .../editor/2_PipelineEditor_DataStreams.png        | Bin 146667 -> 0 bytes
 .../editor/3_PipelineEditor_DataProcessors.png     | Bin 121321 -> 0 bytes
 .../editor/4_PipelineEditor_DataSinks.png          | Bin 108886 -> 0 bytes
 .../img/features_0_62_0/editor/5_text_filter.png   | Bin 54909 -> 0 bytes
 .../editor/6_category_drop_down.png                | Bin 141162 -> 0 bytes
 .../features_0_62_0/editor/7_category_filter.png   | Bin 117204 -> 0 bytes
 .../features_0_62_0/editor/8_connect_elements.png  | Bin 150320 -> 0 bytes
 .../features_0_62_0/editor/9_configure_element.png | Bin 142934 -> 0 bytes
 .../file_download/01_file_download.png             | Bin 80878 -> 0 bytes
 .../file_download/02_file_download.png             | Bin 99493 -> 0 bytes
 .../file_download/03_file_download.png             | Bin 88640 -> 0 bytes
 .../static/img/features_0_62_0/home/home.png       | Bin 342723 -> 0 bytes
 .../static/img/features_0_62_0/home/open_menu.png  | Bin 277217 -> 0 bytes
 .../install_elements/01_install_elements.png       | Bin 145499 -> 0 bytes
 .../02_install_countAggregation.png                | Bin 153560 -> 0 bytes
 .../03_installed_countAggregation.png              | Bin 150344 -> 0 bytes
 .../04_countAggregation_in_editor.png              | Bin 125934 -> 0 bytes
 website-v2/static/img/features_0_62_0/login.png    | Bin 501499 -> 0 bytes
 .../manage_pipelines/1_pipeline_overview.png       | Bin 112379 -> 0 bytes
 .../manage_pipelines/2_pipeline_information.png    | Bin 132882 -> 0 bytes
 .../manage_pipelines/3_delete_pipeline.png         | Bin 114315 -> 0 bytes
 .../manage_pipelines/4_pipeline_deleted.png        | Bin 105179 -> 0 bytes
 .../manage_pipelines/5_pipeline_category.png       | Bin 111154 -> 0 bytes
 .../manage_pipelines/6_add_category.png            | Bin 108536 -> 0 bytes
 .../manage_pipelines/7_new_category.png            | Bin 114286 -> 0 bytes
 .../manage_pipelines/8_show_new_category.png       | Bin 98449 -> 0 bytes
 .../features_0_62_0/my_elements/01_my_elements.png | Bin 190389 -> 0 bytes
 .../my_elements/02_my_elements_jsonid.png          | Bin 193762 -> 0 bytes
 .../notification/01_select_notification_sink.png   | Bin 140835 -> 0 bytes
 .../notification/02_configure_notification.png     | Bin 159162 -> 0 bytes
 .../notification/03_new_notification.png           | Bin 85457 -> 0 bytes
 .../static/img/features_0_62_0/pipeline_editor.png | Bin 508371 -> 0 bytes
 website-v2/static/img/oss_logo.png                 | Bin 4370 -> 0 bytes
 .../img/quickstart/elements/01_goto_elements.png   | Bin 305066 -> 0 bytes
 .../img/quickstart/elements/02_install_sources.png | Bin 332542 -> 0 bytes
 .../quickstart/elements/03_installed_sources.png   | Bin 310585 -> 0 bytes
 .../quickstart/elements/04_install_elements.png    | Bin 287478 -> 0 bytes
 .../quickstart/elements/05_installed_elements.png  | Bin 311860 -> 0 bytes
 .../img/quickstart/elements/06_install_sinks.png   | Bin 261602 -> 0 bytes
 .../img/quickstart/elements/07_installed_sinks.png | Bin 282340 -> 0 bytes
 .../elements/08_pipeline_editor_sources.png        | Bin 230704 -> 0 bytes
 .../elements/09_pipeline_editor_elements.png       | Bin 193061 -> 0 bytes
 .../elements/10_pipeline_editor_sinks.png          | Bin 193194 -> 0 bytes
 .../examples/01_PipelineEditor_DataStreams.png     | Bin 146667 -> 0 bytes
 .../img/quickstart/examples/01_example1_empty.png  | Bin 209790 -> 0 bytes
 .../img/quickstart/examples/02_example1_source.png | Bin 243302 -> 0 bytes
 .../examples/03_example1_pipeline_finished.png     | Bin 246297 -> 0 bytes
 .../img/quickstart/examples/04_example1_save.png   | Bin 280368 -> 0 bytes
 .../examples/05_example1_pipeline_started.png      | Bin 213901 -> 0 bytes
 .../examples/06_example01_live_visualisation.png   | Bin 174816 -> 0 bytes
 .../examples/07_example01_first_step.png           | Bin 199007 -> 0 bytes
 .../examples/08_example01_second_step.png          | Bin 202380 -> 0 bytes
 .../examples/09_example01_third_step.png           | Bin 216688 -> 0 bytes
 .../quickstart/examples/10_example1_finished.png   | Bin 217952 -> 0 bytes
 .../img/quickstart/examples/11_example2_start.png  | Bin 219702 -> 0 bytes
 .../quickstart/examples/12_example2_numerical.png  | Bin 253107 -> 0 bytes
 .../examples/13_example2_configure_numerical.png   | Bin 285352 -> 0 bytes
 .../quickstart/examples/14_example2_aggregate.png  | Bin 275546 -> 0 bytes
 .../examples/15_example2_configure_aggregate.png   | Bin 320690 -> 0 bytes
 .../quickstart/examples/16_example2_increase.png   | Bin 261436 -> 0 bytes
 .../examples/17_example2_configure1_increase.png   | Bin 298918 -> 0 bytes
 .../examples/18_example2_configure2_increase.png   | Bin 302194 -> 0 bytes
 .../quickstart/examples/19_example2_sequence.png   | Bin 276533 -> 0 bytes
 .../examples/20_example2_configure_sequence.png    | Bin 285365 -> 0 bytes
 .../examples/21_example2_notification.png          | Bin 308424 -> 0 bytes
 .../22_example2_configure_notification.png         | Bin 329655 -> 0 bytes
 .../examples/23_example2_dashboard_sink.png        | Bin 338525 -> 0 bytes
 .../img/quickstart/examples/24_example2_save.png   | Bin 297255 -> 0 bytes
 .../quickstart/examples/25_example2_started.png    | Bin 296071 -> 0 bytes
 .../examples/26_example2_visualisation.png         | Bin 336857 -> 0 bytes
 .../examples/27_example2_notification.png          | Bin 217297 -> 0 bytes
 .../01_PipelineEditor_DataStreams.png              | Bin 167152 -> 0 bytes
 .../examples_master/02_example1_source.png         | Bin 179021 -> 0 bytes
 .../03_example1_pipeline_finished.png              | Bin 178791 -> 0 bytes
 .../examples_master/04_example1_save.png           | Bin 164353 -> 0 bytes
 .../05_example1_pipeline_started.png               | Bin 97573 -> 0 bytes
 .../06_example01_live_visualisation.png            | Bin 63277 -> 0 bytes
 .../examples_master/07_example01_first_step.png    | Bin 92502 -> 0 bytes
 .../examples_master/08_example01_second_step.png   | Bin 102239 -> 0 bytes
 .../examples_master/09_example01_third_step.png    | Bin 97636 -> 0 bytes
 .../examples_master/10_example1_finished.png       | Bin 63922 -> 0 bytes
 .../examples_master/11_example2_start.png          | Bin 177520 -> 0 bytes
 .../examples_master/12_example2_numerical.png      | Bin 173569 -> 0 bytes
 .../13_example2_configure_numerical.png            | Bin 147410 -> 0 bytes
 .../examples_master/14_example2_aggregate.png      | Bin 180150 -> 0 bytes
 .../15_example2_configure_aggregate.png            | Bin 171549 -> 0 bytes
 .../15_example2_configure_aggregate_2.png          | Bin 154612 -> 0 bytes
 .../examples_master/16_example2_increase.png       | Bin 178321 -> 0 bytes
 .../17_example2_configure1_increase.png            | Bin 179200 -> 0 bytes
 .../examples_master/19_example2_sequence.png       | Bin 196734 -> 0 bytes
 .../20_example2_configure_sequence.png             | Bin 194842 -> 0 bytes
 .../examples_master/21_example2_notification.png   | Bin 202137 -> 0 bytes
 .../22_example2_configure_notification.png         | Bin 162731 -> 0 bytes
 .../examples_master/23_example2_dashboard_sink.png | Bin 204462 -> 0 bytes
 .../examples_master/25_example2_started.png        | Bin 196661 -> 0 bytes
 .../static/img/quickstart/interactive-tutorial.png | Bin 216613 -> 0 bytes
 .../img/quickstart/setup/01_register_user.png      | Bin 794371 -> 0 bytes
 .../static/img/quickstart/setup/02_user_set_up.png | Bin 813084 -> 0 bytes
 .../static/img/quickstart/setup/03_login.png       | Bin 1170831 -> 0 bytes
 website-v2/static/img/quickstart/setup/04_home.png | Bin 383364 -> 0 bytes
 website-v2/static/img/quickstart/setup/login.png   | Bin 3807049 -> 0 bytes
 .../static/img/quickstart/user-guide/01_home.png   | Bin 287453 -> 0 bytes
 .../img/quickstart/user-guide/02_pipelines.png     | Bin 322911 -> 0 bytes
 .../img/quickstart/user-guide/03_adapters.png      | Bin 306577 -> 0 bytes
 .../img/quickstart/user-guide/04_dashboard.png     | Bin 237782 -> 0 bytes
 .../img/quickstart/user-guide/05_data_explorer.png | Bin 259865 -> 0 bytes
 .../img/quickstart/user-guide/06_notifications.png | Bin 369414 -> 0 bytes
 .../user-guide/07_water_level_trend_pipeline.png   | Bin 363380 -> 0 bytes
 .../08_smart_machine_monitor_dashboard.png         | Bin 380944 -> 0 bytes
 .../user-guide/09_machine_running_data_view.png    | Bin 582239 -> 0 bytes
 .../static/img/screenshots/connect-customize.png   | Bin 79922 -> 0 bytes
 .../static/img/screenshots/live-dashboard.png      | Bin 87581 -> 0 bytes
 .../img/screenshots/pipeline-customization.png     | Bin 112000 -> 0 bytes
 .../static/img/screenshots/pipeline-details.png    | Bin 82822 -> 0 bytes
 .../static/img/screenshots/pipeline-editor-2.png   | Bin 137687 -> 0 bytes
 .../img/screenshots/pipeline-editor-sources.png    | Bin 95393 -> 0 bytes
 .../static/img/screenshots/pipeline-editor.png     | Bin 135643 -> 0 bytes
 .../screenshots/pipeline-element-marketplace.png   | Bin 76371 -> 0 bytes
 .../static/img/screenshots/pipeline-overview.png   | Bin 84199 -> 0 bytes
 website-v2/static/img/screenshots/sp-connect.png   | Bin 408029 -> 0 bytes
 .../static/img/slideshow/slideshow-config.png      | Bin 160919 -> 0 bytes
 .../static/img/slideshow/slideshow-connect.png     | Bin 198388 -> 0 bytes
 .../static/img/slideshow/slideshow-dashboard.png   | Bin 179762 -> 0 bytes
 website-v2/static/img/slideshow/slideshow-home.png | Bin 217760 -> 0 bytes
 .../img/slideshow/slideshow-installation.png       | Bin 131776 -> 0 bytes
 .../img/slideshow/slideshow-pipeline-view.png      | Bin 102351 -> 0 bytes
 .../static/img/slideshow/slideshow-pipeline.png    | Bin 211773 -> 0 bytes
 .../img/slideshow/slideshow-recommendation.png     | Bin 199717 -> 0 bytes
 .../img/tutorial-processors/pe-overview-flink.PNG  | Bin 30113 -> 0 bytes
 .../img/tutorial-processors/pe-rdf-geofencing.PNG  | Bin 70129 -> 0 bytes
 .../project-structure-processor.PNG                | Bin 13457 -> 0 bytes
 .../img/tutorial-sinks/project-structure-sinks.png | Bin 36216 -> 0 bytes
 .../version-0.95.1/user-guide-first-steps.md       |   2 -
 .../version-0.95.1/user-guide-for-quickstart.md    |   5 -
 .../version-0.95.1/user-guide-tour.md              | 305 --------
 .../version-0.97.0/user-guide-first-steps.md       |   2 -
 .../version-0.97.0/user-guide-tour.md              | 305 --------
 .../version-0.98.0/user-guide-first-steps.md       |   2 -
 .../version-0.98.0/user-guide-tour.md              | 305 --------
 268 files changed, 4712 insertions(+), 2829 deletions(-)

diff --git a/docs/01_overview.md b/docs/01_overview.md
index 29a059d4a..4cd8b60b2 100644
--- a/docs/01_overview.md
+++ b/docs/01_overview.md
@@ -4,131 +4,205 @@ title: Apache StreamPipes Documentation
 sidebar_label: Overview
 ---
 
-This is the documentation of Apache StreamPipes.
-
-<img class="docs-image docs-image-small docs-image-no-shadow" style={{padding: '10px'}} src="
-/img/01_try-overview/01_streampipes-overview.png" alt="StreamPipes Overview"/>
-
-
-<div class="container grid col-3">
-    <div class="column">
-        <div class="toc-box">
-            <div class="toc-header border-thin">
-                🚀 Try
-            </div>
-            <div class="toc-content">
-                <div class="toc-section-header"><b>Your first steps with Apache StreamPipes:</b></div>
-               <a href="../try-installation/">Install StreamPipes 🔗</a>
-            </div>
-        </div>
-    </div>
-    <div class="column">
-        <div class="toc-box">
-            <div class="toc-header border-thin">
-                💡 Concepts
-            </div>
-            <div class="toc-content">
-                <div class="toc-section-header"><b>Learn about some general concepts of StreamPipes:</b></div>
-                <a href="../concepts-overview/">Overview 🔗</a>
-            </div>
-        </div>
-    </div>
-    <div class="column">
-        <div class="toc-box">
-            <div class="toc-header border-thin">
-                🎓 Use
-            </div>
-            <div class="toc-content">
-                <div class="toc-section-header"><b>Learn how to use the various modules of StreamPipes:</b></div>
-                <a href="../use-connect/">StreamPipes Connect 🔗</a>, 
-                <a href="../use-pipeline-editor/">Pipeline Editor 🔗</a>, 
-                <a href="../use-managing-pipelines/">Managing Pipelines 🔗</a>, 
-                <a href="../use-live-dashboard/">Live Dashboard 🔗</a>, 
-                <a href="../use-data-explorer/">Data Explorer 🔗</a>, 
-                <a href="../use-notifications/">Notifications 🔗</a>
-            </div>
-        </div>
-    </div>
-    <div class="column">
-        <div class="toc-box">
-            <div class="toc-header border-thin">
-                📚 Pipeline Elements
-            </div>
-            <div class="toc-content">
-                <div class="toc-section-header"><b>Available pipeline elements in StreamPipes:</b></div>
-                <a href="../pe/org.apache.streampipes.connect.iiot.protocol.stream.kafka/">Adapters 🔗</a>, 
-                <a href="../pe/org.apache.streampipes.processors.transformation.jvm.booloperator.counter/">Data Processors 🔗</a>, 
-                <a href="../pe/org.apache.streampipes.sinks.databases.jvm.couchdb/">Data Sinks 🔗</a> 
-            </div>
-        </div>
-    </div>
-    <div class="column">
-        <div class="toc-box">
-            <div class="toc-header border-thin">
-                ⚡ Deploy 
-            </div>
-            <div class="toc-content">
-                <div class="toc-section-header"><b>How to set up StreamPipes in test and production environments:</b></div>
-                <a href="../deploy-docker/">Docker 🔗</a>, 
-                <a href="../deploy-kubernetes/">Kubernetes 🔗</a>, 
-                <a href="../deploy-use-ssl/">Use SSL 🔗</a>
-            </div>
-        </div>
-    </div>
-    <div class="column">
-        <div class="toc-box">
-            <div class="toc-header border-thin">
-                💻 Extend
-            </div>
-            <div class="toc-content">
-                <div class="toc-section-header"><b>Write your own pipeline elements for StreamPipes:</b></div>
-                <a href="../extend-setup/">Development Setup 🔗</a>, <a href="../extend-cli/">CLI 🔗</a>, <a href="../extend-archetypes/">Maven Archetypes 🔗</a>,
-                <a href="../extend-tutorial-data-sources/">Tutorial Data Sources 🔗</a>, 
-                <a href="../extend-tutorial-data-processors">Tutorial Data Processors 🔗</a>, 
-                <a href="../extend-tutorial-data-sinks/">Tutorial Data Sinks 🔗</a>,
-                <a href="../extend-sdk-event-model.html/">Event Model 🔗</a>, 
-                <a href="../extend-sdk-stream-requirements/">Stream Requirements 🔗</a>, 
-                <a href="../extend-sdk-static-properties/">Static Properties 🔗</a>,
-                <a href="../extend-sdk-output-strategies/">Output Strategies 🔗</a>
-            </div>
-        </div>
-    </div>
-    <div class="column">
-        <div class="toc-box">
-            <div class="toc-header border-thin">
-                🔧 Technicals
-            </div>
-            <div class="toc-content">
-                <div class="toc-section-header"><b>Learn about technical concepts behind the curtain:</b></div>
-                <a href="../technicals-architecture/">Architecture 🔗</a>, 
-                <a href="../technicals-user-guidance/">User Guidance 🔗 </a>, 
-                <a href="../technicals-runtime-wrappers/">Runtime Wrappers 🔗</a>,
-                <a href="../technicals-messaging/">Messaging 🔗</a>, 
-                <a href="../technicals-configuration/">Configuration 🔗</a>
-            </div>
-        </div>
-    </div>
-    <div class="column">
-        <div class="toc-box">
-            <div class="toc-header border-thin">
-                👪 Community
-            </div>
-            <div class="toc-content">
-                <div class="toc-section-header"><b>Get support and learn how to contribute to StreamPipes:</b></div>
-                <a href="../community-get-help/">Get Help 🔗</a>, 
-                <a href="../community-contribute/">Contribute 🔗</a>
-            </div>
-        </div>
-    </div>
-    <div class="column">
-        <div class="toc-box">
-            <div class="toc-header border-thin">
-                🐍 StreamPipes Python
-            </div>
-            <div class="toc-content">
-                <div class="toc-section-header"><b>Discover what we offer for the Python world:</b></div>
-                <a href="/docs/docs/python/latest/">Python Documentation 🔗</a>
-            </div>
-        </div>
-    </div>
-</div>
+import StepFlow from '@site/src/components/docs/StepFlow.tsx';
+import FeatureList from '@site/src/components/docs/FeatureList.tsx';
+import UseCaseExample from '@site/src/components/docs/UseCaseExample.tsx';
+import DocVisualPlaceholder from '@site/src/components/docs/DocVisualPlaceholder.tsx';
+
+Apache StreamPipes is an open-source IoT and industrial data platform for building complete data infrastructure on your own terms.
+It helps teams set up an on-premise, extensible environment for connecting machines and software systems, turning incoming events into reusable data streams, processing those streams in real time, persisting historical data, and building charts and dashboards on top.
+
+This page is the entry point to the documentation.
+It helps you understand what StreamPipes does, what the documentation covers, and where to start depending on your goal.
+
+## The most important facts
+
+<FeatureList
+  items={[
+    {
+      title: 'StreamPipes is an industrial data platform',
+      text: 'It is not only a pipeline editor. It is a complete IoT and industrial data platform that covers ingestion, stream processing, historical data, visualization, context modeling, and platform administration.',
+    },
+    {
+      title: 'It can serve as your open-source IoT data infrastructure',
+      text: 'StreamPipes is designed so teams can build and operate their own on-premise industrial data stack instead of stitching together separate proprietary tools for ingestion, storage, processing, and visualization.',
+    },
+    {
+      title: 'The main user flow starts with connected data',
+      text: 'In most cases, users begin in Connect, create or refine streams, optionally persist them as datasets, and then use them in pipelines, charts, dashboards, and assets.',
+    },
+    {
+      title: 'Live and historical data work together',
+      text: 'StreamPipes supports both data in motion and data at rest. A stream can drive live processing while also becoming a dataset for later exploration and visualization.',
+    },
+    {
+      title: 'The platform is built for industrial reuse',
+      text: 'Adapters, pipelines, datasets, charts, dashboards, assets, and extensions are managed as reusable platform resources rather than one-off scripts or isolated views.',
+    },
+    {
+      title: 'The platform is intentionally extensible',
+      text: 'You can start with the built-in capabilities and extend the platform later with custom adapters, processors, sinks, and UI modules when your infrastructure or domain requires it.',
+    },
+    {
+      title: 'The documentation is organized by task',
+      text: 'Use the Quick Start for first success, Concepts for the mental model, Features for day-to-day usage, Configure & Operate for administration, and Extend for development.',
+    },
+  ]}
+/>
+
+<DocVisualPlaceholder
+  title="Product overview"
+  purpose="Show the main StreamPipes modules such as Connect, Pipelines, Datasets, Charts, Dashboards, and Assets in one current product view."
+/>
+
+## What you can do with StreamPipes
+
+In practice, StreamPipes combines several jobs that are often spread across separate tools:
+
+<StepFlow
+  steps={[
+    {
+      title: 'Connect industrial and software sources',
+      body: 'Use adapters to bring machine data, broker data, file-based data, and other source events into the platform.',
+    },
+    {
+      title: 'Refine and govern event structures',
+      body: 'Inspect sample events, shape schemas, enrich field metadata, and normalize streams before other users rely on them.',
+    },
+    {
+      title: 'Process streams in real time',
+      body: 'Build pipelines with processors and sinks for filtering, enrichment, routing, notification, storage, and analytics.',
+    },
+    {
+      title: 'Store and explore historical data',
+      body: 'Persist streams as datasets so they can be inspected later, downloaded, governed, and reused in charts and dashboards.',
+    },
+    {
+      title: 'Build operational views',
+      body: 'Create charts from datasets and combine saved charts into dashboards for monitoring, analysis, and communication.',
+    },
+  ]}
+/>
+
+<UseCaseExample title="A typical StreamPipes workflow">
+  A team connects a machine source, refines the schema so the fields are meaningful, persists the stream as a dataset, creates a chart to validate the data, and then adds that chart to a dashboard used by operators and engineers.
+</UseCaseExample>
+
+## StreamPipes as infrastructure
+
+One of the most important points to understand is that StreamPipes is not only a convenient UI for selected data tasks.
+It can be used as the foundation of an open-source IoT and industrial data infrastructure that teams run themselves.
+
+This is especially relevant when you want to:
+
+- keep industrial data on-premise
+- control how ingestion, processing, storage, and visualization are combined
+- avoid building a fragmented toolchain around many separate products
+- establish one reusable platform for multiple plants, teams, or use cases
+
+In that role, StreamPipes provides a coherent operating model across:
+
+- source onboarding
+- real-time processing
+- historical persistence
+- visualization and monitoring
+- industrial context modeling
+- extension and administration
+
+The platform is also intentionally extensible.
+Teams can start with built-in functionality and later add custom adapters, processors, sinks, or user interface extensions when company-specific infrastructure or domain logic requires it.
+
+## How the documentation is organized
+
+The documentation is structured around the main stages of using and operating the platform.
+
+### Start here if you are new
+
+- [Quick Start Guide](02_quick-start-guide.md): install StreamPipes and get one complete first workflow running
+- [Introduction](03_concepts-introduction.md): understand what StreamPipes is and where it fits
+- [Terms](03_concepts-terms.md): learn the core platform objects such as adapters, streams, processors, sinks, assets, and datasets
+
+### Read these pages to use the product
+
+- [Connect IoT Data](04_use-connect.md): onboard and operate data sources
+- [Pipelines](04_use-pipelines.md): process live streams in real time
+- [Datasets](04_use-datasets.md): work with persisted historical data
+- [Charts](04_use-charts.md): query datasets and build visualizations
+- [Dashboards](04_use-dashboards.md): assemble saved charts into monitoring views
+- [Assets & Sites](04_use-assets.md): attach data to industrial structure and context
+
+### Read these pages to operate the platform
+
+- [General Settings](06_configure-operate-general-settings.md): configure instance-wide behavior
+- [Manage Extensions](06_configure-operate-extensions.md): install and manage adapters, processors, and sinks
+- [Extension Services](06_configure-operate-extension-services.md): inspect services, update service configuration, and manage certificates
+- [Security](06_configure-operate-security.md): manage access and security-related configuration
+
+### Read these pages to extend StreamPipes
+
+- [Setup](07_extend-setup.md): prepare a development environment
+- [CLI](07_extend-cli.md): scaffold and manage extension work
+- [First Processor](07_extend-first-processor.md): build a first extension step by step
+- [Customize UI](07_extend-customize-ui.md): extend the user interface
+
+## Where most users should begin
+
+If you are using StreamPipes for the first time, this is the recommended reading path:
+
+1. [Quick Start Guide](02_quick-start-guide.md)
+2. [Introduction](03_concepts-introduction.md)
+3. [Connect IoT Data](04_use-connect.md)
+4. [Datasets](04_use-datasets.md)
+5. [Charts](04_use-charts.md)
+6. [Dashboards](04_use-dashboards.md)
+7. [Pipelines](04_use-pipelines.md)
+
+This order works well because it follows the platform from ingestion to reuse instead of starting with the most complex modeling features first.
+
+## Who this documentation is for
+
+Different readers usually come to StreamPipes with different goals.
+
+<FeatureList
+  items={[
+    {
+      title: 'Operators and process experts',
+      text: 'You usually want to connect data, inspect it, and turn it into operational views without building a custom data stack from scratch.',
+      example: 'Start with Quick Start, Connect, Datasets, Charts, Dashboards, and Assets.',
+    },
+    {
+      title: 'Data and analytics teams',
+      text: 'You usually care about clean event structures, reusable historical data, and a governed path from raw machine signals to analysis-ready datasets.',
+      example: 'Start with Concepts, Connect, Datasets, Charts, and Pipelines.',
+    },
+    {
+      title: 'Platform and integration engineers',
+      text: 'You usually need to understand extension installation, service configuration, security, deployment, and how the platform fits into the broader OT and IT landscape.',
+      example: 'Start with Architecture, Configure & Operate, Extensions, and Extension Services.',
+    },
+    {
+      title: 'Developers extending the platform',
+      text: 'You usually need to understand the event model, extension points, SDK structure, and how custom adapters, processors, sinks, or UI modules fit into the system.',
+      example: 'Start with Extend and then use the SDK-related pages as reference.',
+    },
+  ]}
+/>
+
+## What StreamPipes is not
+
+It also helps to set expectations correctly.
+
+StreamPipes is not:
+
+- only a dashboard tool
+- only a pipeline editor
+- only a protocol adapter collection
+- only a storage layer for time-series data
+
+It becomes most useful when you use it as one connected platform for industrial data onboarding, processing, persistence, visualization, and governance.
+
+## Recommended next step
+
+If you want the fastest path to a first result, continue with the [Quick Start Guide](02_quick-start-guide.md).
+
+If you want the mental model first, continue with [Introduction](03_concepts-introduction.md).
diff --git a/docs/02_quick-start-guide.md b/docs/02_quick-start-guide.md
index 4a006e8e7..86712f030 100644
--- a/docs/02_quick-start-guide.md
+++ b/docs/02_quick-start-guide.md
@@ -5,376 +5,375 @@ sidebar_label: "🚀 Quick Start Guide"
 ---
 
 import DownloadSection from '@site/src/components/download/DownloadSection.tsx';
+import StepFlow from '@site/src/components/docs/StepFlow.tsx';
+import DocVisualPlaceholder from '@site/src/components/docs/DocVisualPlaceholder.tsx';
+import UseCaseExample from '@site/src/components/docs/UseCaseExample.tsx';
+import ScreenshotFigure from '@site/src/components/docs/ScreenshotFigure';
+import ScreenshotComparison from '@site/src/components/docs/ScreenshotComparison';
+import ScreenshotSlideshow from '@site/src/components/docs/ScreenshotSlideshow';
+
+This guide helps you get from a fresh installation to a first working result in StreamPipes.
+
+The guide begins with installation and then walks through one complete first-run flow in the product.
+
+## Before you start
+
+The easiest way to install StreamPipes is the Docker-based installation.
+
+<ScreenshotFigure
+src="/img/2026/home-map.png"
+alt="StreamPipes home page with the factory map overview"
+title="Quickstart Home Overview"
+caption="The quickstart home page highlights the main entry points and gives users a high-level overview of the available factory assets."
+/>
+
+<ScreenshotComparison
+  title="Comparison Example"
+  eyebrow="Style Check"
+  summary="Use this component when documentation needs to contrast two related screens, for example two dashboard states or two setup outcomes."
+  items={[
+    {
+      src: '/img/2026/home-map.png',
+      alt: 'Home page with the map-based overview',
+      title: 'Map-centric Overview',
+      caption: 'A broad landing view that emphasizes navigation and spatial context.',
+    },
+    {
+      src: '/img/2026/home-table.png',
+      alt: 'Home page with the table-based overview',
+      title: 'Table-centric Overview',
+      caption: 'A denser operational view that emphasizes records and structured status information.',
+    },
+  ]}
+/>
+
+<ScreenshotSlideshow
+  title="Slideshow Example"
+  eyebrow="Style Check"
+  badge="Preview"
+  items={[
+    {
+      src: '/img/2026/login.png',
+      alt: 'Login screen',
+      title: 'Login',
+      caption: 'The first step after installation is authenticating with the initial credentials.',
+    },
+    {
+      src: '/img/2026/home-map.png',
+      alt: 'Home page with map overview',
+      title: 'Home Overview',
+      caption: 'After sign-in, users land on the home screen and can orient themselves in the product.',
+    },
+    {
+      src: '/img/2026/settings-site-create.png',
+      alt: 'Site creation settings screen',
+      title: 'Initial Configuration',
+      caption: 'A later setup step can introduce more structured configuration views and forms.',
+    },
+  ]}
+/>
+
+
+### Prerequisites
+
+You need:
+
+- `Docker`
+- `Docker Compose`
+- a recent version of `Chrome`, `Firefox`, or `Edge`
+
+The Docker-based installation is supported on:
+
+- `Linux`
+- `macOS`
+- `Windows 10` and newer
 
-The easiest way to install StreamPipes is our Docker-based installation. For production-grade deployments, we also
-recommend looking at our Kubernetes support, which is also part of the installation kit.
+:::info Install Docker
+Go to [docs.docker.com](https://docs.docker.com/installation/) and follow the instructions for your operating system.
 
-## Prerequisites
+Make sure Docker can be started as a non-root user where required and verify the installation with a simple test such as `docker run hello-world`.
+:::
 
-The Docker-based installation requires **Docker** and **Docker Compose** to be installed on the target machine.
-Installation instructions can be found below.
+## Install StreamPipes
 
-:::info Install Docker
-Go to https://docs.docker.com/installation/ and follow the instructions to install Docker for your OS. Make sure
-docker can be started as a non-root user (described in the installation manual, don’t forget to log out and in
-again) and check that Docker is installed correctly by executing docker-run hello-world
-:::
+Use the installation package below to start a local or test instance.
 
-### Supported operating systems
+<DownloadSection version={'0.98.0'} releaseDate={'2025-12-15'}></DownloadSection>
 
-The Docker-based installation supports the operating systems **Linux**, **Mac OS X** and **Windows 10 upwards**. Older windows
-versions are not fully compatible with Docker. Linux VMs running under Windows might cause network problems with Docker,
-therefore some manual work might be needed to make StreamPipes run properly.
+For production-oriented setups, also review the Kubernetes-based deployment options that are part of the installation kit.
 
-### Web Browser
+## Complete the initial setup
 
-The StreamPipes application itself will be accessible through a web browser. We recommend a recent version of Chrome (
-best experience), Firefox or Edge.
+After starting StreamPipes and opening the provided URL in your browser, StreamPipes performs its initial installation flow.
 
-## Install StreamPipes
+To complete the first setup:
 
-<DownloadSection version={'0.98.0'} releaseDate={'2025-12-15'}></DownloadSection>
+1. Open the StreamPipes URL in your browser.
+2. Wait until the installation process finishes.
+3. Click `Go to login page`.
+4. Sign in with the credentials from your installation.
 
-## Setup StreamPipes
+After login, you are ready to work in the web interface.
 
-Once you've opened the browser at the URL given above, you should see the StreamPipes application as shown below. At
-initial startup, StreamPipes automatically performs an installation process.
-After the installation has finished, continue by clicking on "Go to login
-page", once all components are successfully configured.
+<DocVisualPlaceholder
+  title="First login and home screen"
+  purpose="Orient new users after installation and show that the main modules are ready to use."
+/>
 
-On the login page, enter your credentials, then you should be forwarded to the home page.
+:::danger If installation components do not start
+If the installation does not complete successfully, the most common reason is an underpowered local environment.
 
-Congratulations! You've successfully managed to install StreamPipes. Now we're ready to build our first pipeline!
+Check that:
 
-<div class="my-carousel docs-carousel">
-    <img src="/img/01_try-installation/04_home.png" alt="Home page"/>
-</div>
+- Docker has enough memory assigned
+- all required containers are running
+- you restarted the stack cleanly if the first startup failed
 
-:::danger Errors during the installation process
-In most cases, errors during the installation are due to an under-powered system.
-If there is a problem with any of the components, please restart the whole system (`docker-compose
-down` and eventually also delete the volumes).
-Please also make sure that you've assigned enough memory available to Docker.
+If necessary, stop the deployment, remove the containers, and start again with a clean state.
 :::
 
-## Tutorial
+## What you will build
+
+After installation, this quick start takes you through one simple end-to-end workflow:
+
+- create a sample adapter, ideally with a simulator source
+- persist the events so StreamPipes creates a dataset
+- create a chart from that dataset
+- add the chart to a dashboard
+
+The goal is not to explain every feature. The goal is to get one complete flow running so you understand how StreamPipes works as an industrial data platform.
+
+<StepFlow
+  steps={[
+    {
+      title: 'Connect a data source',
+      body: 'Create one adapter in Connect so StreamPipes can start receiving events.',
+    },
+    {
+      title: 'Create a reusable data stream',
+      body: 'Publish the source into the platform as a managed stream other features can use.',
+    },
+    {
+      title: 'Persist the data as a dataset',
+      body: 'Enable persistence so live events become durable operational data.',
+    },
+    {
+      title: 'Create a chart',
+      body: 'Query the dataset and confirm that the data can be visualized correctly.',
+    },
+    {
+      title: 'Place the chart on a dashboard',
+      body: 'Turn the first chart into a reusable operational view for monitoring.',
+    },
+  ]}
+/>
+
+If you complete these steps once, the rest of the platform becomes much easier to understand.
+
+<DocVisualPlaceholder
+  title="Quick start overview"
+  purpose="Show the first-run flow from Connect to Datasets, Charts, and Dashboards in one simple diagram."
+/>
+
+## Understand the first-run path
+
+A good first StreamPipes experience is not to start with a complex pipeline. Start with a simpler path that proves the platform is working:
+
+1. create one source in `Connect`
+2. persist its events
+3. confirm the dataset receives data
+4. build one chart
+5. add the chart to a dashboard
+
+This gives you a concrete result quickly and introduces the main objects of the platform in the right order.
+
+## Step 1: Connect a first data source
+
+Open `Connect` and create a new adapter.
+
+For a first test, a simulator adapter is usually the best choice because it lets you validate the platform flow without depending on an external machine or broker.
+
+<UseCaseExample title="Recommended first source">
+  Start with a simulator or sample-style adapter if one is available in your installation. It removes protocol and network uncertainty from the first run, so you can focus on learning the StreamPipes workflow itself.
+</UseCaseExample>
+
+To create the adapter:
+
+1. Open `Connect`.
+2. Click `New Adapter`.
+3. Choose a sample or simulator-style adapter if one is available in your installation.
+4. Configure the adapter parameters.
+5. Move through the creation wizard until the final step.
+
+If your preferred adapter is not visible, first install the required extension in `Configuration > Extensions`.
+
+### What to pay attention to during adapter creation
+
+While creating the adapter, do not rush through the wizard. The important idea is that StreamPipes does more than establish a connection.
+
+During onboarding, you can already:
+
+- validate incoming sample events
+- refine the schema
+- adjust field metadata
+- add transformations if needed
+- decide whether the stream should be persisted immediately
+
+For the quick start, keep the schema simple and focus on getting a clean, running stream.
+
+<DocVisualPlaceholder
+  title="Connect wizard"
+  purpose="Show adapter selection, sample preview, schema refinement, and start options in one current UI screenshot."
+/>
+
+## Step 2: Start the adapter and persist the events
+
+On the final adapter step, give the adapter a clear name and enable persistence.
+
+To do that:
+
+1. Enter a meaningful adapter name.
+2. Enable `Persist events`.
+3. Start the adapter.
+
+If your installation offers additional startup options such as asset linking or event-rate reduction, you can leave them at their defaults for the first run unless you already know you need them.
+
+### Why persistence matters in the quick start
+
+Persistence creates a dataset from the incoming events. That dataset becomes the basis for charts and dashboards.
+
+Without persistence, you may still have a live stream, but you will not get the full chart and dashboard workflow that best demonstrates the current StreamPipes product model.
+
+### What success looks like
+
+After the adapter starts successfully:
+
+- the stream is available in StreamPipes
+- events begin to flow
+- a dataset is created and starts filling with records
+
+If no data appears later in the quick start, come back to this step first and verify that the adapter is actually running and persistence was enabled.
+
+## Step 3: Check the dataset
+
+Next, confirm that the persisted data is available as a dataset.
+
+To do that:
+
+1. Open `Datasets`.
+2. Find the dataset created from your adapter.
+3. Check the event counters.
+4. Open the preview.
+
+You should see incoming records and a schema that matches the data you connected.
+
+This is the first important checkpoint in the quick start. Once data reaches a dataset, the rest of the workflow usually becomes straightforward.
+
+<DocVisualPlaceholder
+  title="Dataset overview and preview"
+  purpose="Show where users confirm that persisted events are arriving and inspect the resulting schema."
+/>
+
+## Step 4: Create a chart
+
+Now create a visualization from the dataset.
+
+To create your first chart:
+
+1. Open `Charts`.
+2. Create a new chart.
+3. Select the dataset from the dropdown.
+4. Choose a query type such as `Raw`, `Aggregated`, or `Single`.
+5. Configure the fields needed for the chart.
+6. Use the preview to confirm the query result.
+7. Choose a visualization type.
+8. Save the chart.
+
+For a first run:
+
+- use `Single` when you want one current value
+- use `Raw` when you want to see individual incoming events
+- use `Aggregated` when you want to summarize values over time
+
+### A simple first chart
+
+If your sample data contains a numeric measurement such as temperature, pressure, speed, or fill level, start with a simple line chart or value view. These are the fastest visualizations to validate.
+
+The goal here is not to build the perfect visualization. The goal is to confirm that the dataset can be queried and rendered correctly.
+
+<DocVisualPlaceholder
+  title="First chart creation"
+  purpose="Show dataset selection, query preview, and visualization choice in the current chart workflow."
+/>
+
+## Step 5: Add the chart to a dashboard
+
+Dashboards in the current StreamPipes version are built from saved charts.
+
+To create a dashboard:
+
+1. Open `Dashboards`.
+2. Create a new dashboard.
+3. Configure the basic dashboard settings.
+4. Open the chart panel on the right side.
+5. Add the chart you saved in the previous step.
+6. Arrange the chart on the grid.
+7. Save the dashboard.
+
+At this point, you have completed a full first-use flow: from data onboarding to a reusable dashboard view.
+
+### Why this matters
 
-Once you've installed StreamPipes and see the home screen, you'll see a number of modules that are part of the StreamPipes toolbox.
-As a first step, you might be interested in taking the interactive tutorial that helps you create your first pipeline.
-Switch to the **Pipeline Editor** and you will see a dialog that asks you for the start of the interactive tutorial:
+This is the moment where StreamPipes usually becomes clear to new users:
 
-<img className="docs-image" src="/img/01_try-tutorial/01_tutorial-welcome.png" alt="Tutorial Welcome Page"/>
+- `Connect` creates usable data streams
+- `Datasets` preserve the data
+- `Charts` query and visualize it
+- `Dashboards` combine saved visualizations into an operational view
 
-Click **Start Tour** to start the tour. In this tour, you'll build a simple pipeline that monitors (simulated) live data from a water tank system.
-Within the tour, perform the actions as recommended and click **Next** to trigger the next steps. Some tour steps won't require to select **Next**, but wait for you to take the recommended action.
-You can cancel the tour anytime by clicking the **Exit Tour** button.
+<DocVisualPlaceholder
+  title="Dashboard editor with saved chart"
+  purpose="Show the current dashboard model where saved charts are added from the side panel."
+/>
 
-<img className="docs-image" src="/img/01_try-tutorial/02_tutorial-process.png" alt="Tutorial Welcome Page"/>
+## Optional next step: Build a pipeline
 
-Now after you've built your first pipeline, you might be interested in reading about some of our core [concepts](concepts-overview)
+Once the quick start flow above works, the next logical step is to create a pipeline that transforms or enriches your live stream before persisting or visualizing it.
 
+Open `Pipelines` when you want to:
 
-## Next Steps
+- filter noisy data
+- calculate KPIs
+- combine processing steps
+- send results to sinks
+- create curated downstream datasets
 
-That's it! Have a look at the usage guide to learn how to use Apache StreamPipes.
+For many users, pipelines make more sense after the basic source-to-visualization flow is already working.
 
+## If something is missing
 
-StreamPipes is a framework that enables domain experts to model and execute stream processing pipelines in a big data infrastructure.
-The graphical user interface of StreamPipes is a web application that provides an easy to use solution for domain experts.
-In this page, an overview of the many features of StreamPipes is given. We will tour through all features and explain what they do and how users can interact with them.
+If you cannot complete one of the steps, the most common reasons are:
 
-First of all, a user needs to log in to the system.
-The credentials for the user are specified during the installation process.
+- the required adapter or sink is not installed
+- the adapter is not running
+- `Persist events` was not enabled
+- no events are arriving from the source
+- the dataset is empty, so the chart query has nothing to show
 
-![StreamPipes Login](/img/features_0_62_0/login.png)
+Check these in order. Most first-run issues are resolved by going one step upstream.
 
-## Home
-After logging in, the user is redirected on to the home page.
-The home page gives an overview over the different features available in the StreamPipes UI.
+## Where to go next
 
-On the left, the navigation menu can be seen.
-You can either use the icons on the left side or click on the menu icon on the
-top left to open the details view of the navigation menu.
+After this quick start, continue with the feature guides for the areas you used:
 
-On the top right, a link refers to the documentation and the logout button is present.
+- [Connect](04_use-connect.md)
+- [Datasets](04_use-datasets.md)
+- [Charts](04_use-charts.md)
+- [Dashboards](04_use-dashboards.md)
+- [Pipelines](04_use-pipelines.md)
 
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/home/home.png" alt="Home"/>
-    <img src="/img/features_0_62_0/home/open_menu.png" alt="Open Menu"/>
-</div>
+If you want a better mental model before going deeper, read the concepts pages next:
 
-
-
-## Pipeline Editor
-The first feature we are going to explain is the Pipeline Editor.
-This is one of the central features of StreamPipes, since graphical modeling of pipelines takes place in this view.
-
-On the top we can see four tabs: __Data Sets__, __Data Streams__, __Processing Elements__, and __Data Sinks__.
-Each tab contains multiple pipeline elements, which can be installed at runtime.
-The installation of pipeline elements is explained later in section [Install Pipeline Elements](user-guide-tour.md#install-pipeline-elements).
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/2_PipelineEditor_DataStreams.png" alt="Data Streams"/>
-    <img src="/img/features_0_62_0/editor/3_PipelineEditor_DataProcessors.png" alt="Processing Elements"/>
-    <img src="/img/features_0_62_0/editor/4_PipelineEditor_DataSinks.png" alt="Data Sinks"/>
-    <img src="/img/features_0_62_0/editor/1_PipelineEditor_DataSets.png" alt="Data Sets"/>
-</div>
-
-There are multiple ways to search for a pipeline element.
-The easiest way is to enter a search term in the search field on the top left corner.
-The system filters the elements according to the search term and only presents the relevant ones.
-Another way is to select one of the categories from the drop down menu.
-The system then filters the elements according to the selected category.
-The category of an element is defined by its functionality.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/5_text_filter.png" alt="Text Filter"/>
-    <img src="/img/features_0_62_0/editor/6_category_drop_down.png" alt="Category Drop Down"/>
-    <img src="/img/features_0_62_0/editor/7_category_filter.png" alt="Category Filter"/>
-</div>
-
-Modelling of a pipeline starts with choosing one ore more data sources. Therefore a data stream or data set must be selected
-and moved into the editor via drag and drop.
-After adding a data stream, we can select a processing element to transform the events of the data stream.
-This is done again by dragging the processing element icon into our editor.
-The mouse can be used to connect the two elements.
-It is automatically checked in the background if the two elements are semantically compatible.
-If this check is successful, a configuration menu is shown. It contains the parameters that can be modified by the
-user. For all parameters, a description is provided and the system also prevents the user from entering parameters that
-are not correct, according to the semantic description of the element.
-It is also ensured that all required parameters are provided by the user, otherwise an error message is displayed.
-
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/8_connect_elements.png" alt="Connect Elements"/>
-    <img src="/img/features_0_62_0/editor/9_configure_element.png" alt="Configure Elements"/>
-</div>
-
-When the user tries to connect two elements that are not compatible, the system shows a __connection error__ message.
-The example illustrated below shows such a case. The user tried to connect a text filter to a light sensor.
-This is not possible since the text filter processing element requires at least one event property of type string, which is not provided by the light sensor.
-
-![Connection Error](/img/features_0_62_0/editor/10_connection_error.png)
-
-To further improve the usability, multiple ways are available to connect new elements besides the drag and drop option.
-Each processing element has multiple short-cut buttons to connect it with another element.
-The first one (eye icon) can be used to get a suggestion of all elements that are compatible with the current element.
-The second one (plus icon) gives a recommendation on the elements the user might want to connect, based on the usage of the component in
-other pipelines.
-There is also a button (question tag icon) to open the documentation of a selected element.
-Elements can be deleted by clicking the 'delete' button.
-Each element can also be re-configured at a later point in time using the configuration button.
-There is one important aspect about re-configuration of pipeline elements you need to be aware of: Only elements that are not yet connected to another element can be modified.
-The reason for this behaviour is that some of the following elements might rely on the configuration of previous elements.
-This way it is ensured that the user can not change the behaviour of the pipeline by accident.
-
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/11_shortcut_buttons.png" alt="Shortcut Buttons"/>
-    <img src="/img/features_0_62_0/editor/12_compatible_elements.png" alt="Compatible Elements"/>
-    <img src="/img/features_0_62_0/editor/13_recommend_elements.png" alt="Recommended elements"/>
-</div>
-
-
-After the pipeline is completely modelled, the editor looks similar to the first image below.
-Especially for larger pipelines, the auto layout button in the editor menu might be helpful.
-With this button, the pipeline will be beautifully aligned in the editor, helping users to get a better overview of the complete pipeline.
-On the top left corner of the editor, the 'save' button can be found.
-After the modelling of the pipeline is done, use this button to save and execute the pipeline.
-A save dialogue pops up when clicking the save button.
-The pipeline title must be entered and an additional description can be provided.
-It is recommended to always provide a description, because it makes it easier for other users to understand the meaning of the pipeline.
-In the save menu, the user can either just store the pipeline configuration or store it and immediately start the pipeline.
-Once the pipeline is executed, the user is redirected to the _Manage Pipeline_ view.
-In this view, the user gets immediate feedback whether all components did start correctly and the pipeline is up and running.
-This view also shows that individual elements might run in different environments on different servers.
-If there is an error during the execution, a notification containing a (hopefully) detailed error description is provided in this view.
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/14_save_adjust.png" alt="Save adjust delete"/>
-    <img src="/img/features_0_62_0/editor/15_save_dialogue.png" alt="Complete pipeline"/>
-    <img src="/img/features_0_62_0/editor/16_pipeline_sucessfully_started.png" alt="Pipeline sucessfully started"/>
-</div>
-
-## Connect new Data Sources
-With StreamPipes Connect it is possible to connect new data sources in StreamPipes with just a few clicks.
-Therefore, we provide a marketplace with a lot of different adapters that can be configured and executed to create new __Data Streams__ in the __Pipeline Editor__.
-With StreamPipes Connect it is possible to connect specific data sources - e.g. an adapter streaming the current location of the ISS (International Space Station).
-It is also possible to connect generic sources like message brokers or databases.
-If the event schema of the data source is unknown, the system tries to infer the schema by extracting some sample data and analysing it.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/connect/new/01_connect.png" alt="Market Place"/>
-    <img src="/img/features_0_62_0/connect/new/02_mqtt_adapter.png" alt="MQTT adapter"/>
-    <img src="/img/features_0_62_0/connect/new/03_configure_mqtt.png" alt="Configure MQTT adpater"/>
-    <img src="/img/features_0_62_0/connect/new/04_configure_format.png" alt="Guess event schema"/>
-    <img src="/img/features_0_62_0/connect/new/05_guess_schema.png" alt="Guess event schema"/>
-    <img src="/img/features_0_62_0/connect/new/06_edit_adapter.png" alt="Edit adapter"/>
-    <img src="/img/features_0_62_0/connect/new/07_start_adapter.png" alt="Start adapter"/>
-    <img src="/img/features_0_62_0/connect/new/08_data_stream_in_editor.png" alt="New data stram in pipeline editor"/>
-</div>
-
-Additionally to connecting new sources, data can be cleaned, transformed, and enriched with meta-information.
-Therefore, the event schema can be changed or enriched in step 3 (Define Event Schema).
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/connect/edit/01_edit_timestamp.png" alt="Edit a property to timestamp"/>
-    <img src="/img/features_0_62_0/connect/edit/02_change_unit.png" alt="Change Unit of property"/>
-    <img src="/img/features_0_62_0/connect/edit/03_change_unit.png" alt="Change Unit of property"/>
-</div>
-
-## Manage Pipelines
-The _Manage Pipelines_ view provides an overview of all existing pipelines.
-Existing pipelines can be managed using this view.
-For instance, users can start and stop pipelines or delete them when they are not longer needed.
-Pipeline actions can be performed by clicking one of the buttons next to each pipeline.
-For each pipeline, the title and description is displayed in the table.
-By clicking the edit symbol an overview of the created pipline is shown. In this window you are able to analyze statistics, identify errors or edit the pipeline.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/manage_pipelines/1_pipeline_overview.png" alt="Pipeline Overview"/>
-    <img src="/img/features_0_62_0/manage_pipelines/2_pipeline_information.png" alt="Pipeline infomation"/>
-    <img src="/img/features_0_62_0/manage_pipelines/3_delete_pipeline.png" alt="Delete Pipelines"/>
-    <img src="/img/features_0_62_0/manage_pipelines/4_pipeline_deleted.png" alt="Delete Pipelines"/>
-</div>
-
-In a setting with many defined pipelines, it can get really hard to keep track of all pipelines.
-This is why we introduce categories.
-A category is a set of pipelines that can be defined by users in order to better organize pipelines.
-By clicking on the "Manage Categories" button on the top left, a new category can be added to StreamPipes.
-In this example, we create a new category named "New Demo Category".
-After saving a category, pipelines can be added to the newly created category.
-The new category is then presented as a tab in the _Pipeline Management_ view.
-This tab contains all previously defined pipelines.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/manage_pipelines/5_pipeline_category.png" alt="Pipeline Category"/>
-    <img src="/img/features_0_62_0/manage_pipelines/6_add_category.png" alt="Add Pipeline Category"/>
-    <img src="/img/features_0_62_0/manage_pipelines/7_new_category.png" alt="New Category"/>
-    <img src="/img/features_0_62_0/manage_pipelines/8_show_new_category.png" alt="Show new Category"/>
-</div>
-
-## Live Dashboard
-The live dashboard can be used for multiple use cases.
-It is a good way to live monitor a running system in a dashboard, but it can also be used during the pipeline development to get a fast feedback from newly created pipelines.
-Below is a screenshot of an example dashboard showing the current value of pressure, which further shows a line chart and a trafficlight for a water level pipeline.
-All pipelines that contain the "Dashboard Sink" can be visualized in this view.
-To add a new visualisation, click on the "Add visualisation" button on the top left corner.
-Afterwards, a three-step configuration menu is shown.
-The first step is to select the pipeline that should be visualized.
-In the second step, the type of visualization can be defined.
-Currently 10 different types are available, including line charts, various map visualizations and data tables.
-After selecting the type (in our example "Gauge"), you can select the specific measurement values of the data stream that should be displayed.
-In the example below, the water level value should be monitored and the gauge value should range from 0 to 100.
-Once all steps are completed, the new visualization is placed on the dashboard and live data is presented as soon as it becomes available.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/dashboard/01_dashboard.png" alt="Screenshot of live dashboard"/>
-    <img src="/img/features_0_62_0/dashboard/02_new_visualisation.png" alt="Select Pipeline to visualize"/>
-    <img src="/img/features_0_62_0/dashboard/03_select_gauge.png" alt="Select Visualization Type"/>
-    <img src="/img/features_0_62_0/dashboard/04_configure_gauge.png" alt="Configure  Visualzation"/>
-    <img src="/img/features_0_62_0/dashboard/05_new_gauge_done.png" alt="Show new Visualzation"/>
-</div>
-
-## File Download
-With the file download,  it is possible to download stored files directly from Elasticsearch.
-This can be very useful for example when a data dumb is needed for a specific time range.
-All data that is written into Elasticsearch using the _Elasticsearch Sink_ can be accessed by the file downloader.
-A common use case is to download data for offline analysis and to train a machine learning algorithm.
-First, an index must be defined, afterwards, the time range must be set.
-A date picker helps users to enter the time range.
-When a user clicks the "Create File" button the file is created.
-All files stored on the server can be downloaded via the download button.
-If the files are not longer needed, they can be deleted by clicking the delete button.
-This will remove the file from the server.
-Since data is stored in Elasticsearch anyways. it is recommended not to store the files for a longer period of time on the server.
-When a file is needed again at a later point in time it is easy to create it again.
-This way a lot of disk space on the server can be saved, especially when the files are rather large.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/file_download/01_file_download.png" alt="File Download"/>
-    <img src="/img/features_0_62_0/file_download/02_file_download.png" alt="File Download with selected time range"/>
-    <img src="/img/features_0_62_0/file_download/03_file_download.png" alt="File Download with new File"/>
-</div>
-
-## Notifications
-Notifications are a good solution to notify someone when a urgent situation occurs.
-A notification can be created by using the notification sink in the pipeline editor.
-When using such a sink a configuration dialogue is presented to the user.
-In this dialogue the user must provide enough information to resolve the solution when it occurs.
-The message can be nicely configured in the message editor.
-It is also possible to embed values of the event that triggered the notification.
-This can be done with the #property# notation.
-All available properties are presented in the notification configurator.
-When the notification is triggered the #property# template is replaced with the actual value of the property.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/notification/01_select_notification_sink.png" alt="Select Notification"/>
-    <img src="/img/features_0_62_0/notification/02_configure_notification.png" alt="Configure Notification"/>
-</div>
-
-A pop up icon on the notification tab in the menu shows the user how many unread notifications currently are in the system.
-This icon also alerts users when new notifications occur.
-In the notification overview all notifications are listed.
-On the top are the new notifications that are not read yet.
-A user can mark them as read by clicking on the little envelope icon.
-Those notifications are then no longer in the unread section, but they remain in the "All Messages" view.
-This way it is possible to keep track of all notifications and have a look at them at a later point in time.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/notification/03_new_notification.png" alt="New Notification"/>
-</div>
-
-
-## Install Pipeline Elements
-StreamPipes is highly configurable and extensible.
-Pipeline elements can be added and removed during runtime.
-This can be done in the "Install Pipeline Elements" view.
-All available pipeline elements are shown here and can be selected to install or uninstall.
-It is also possible to select multiple or all of them and then install them all together.
-When a new element is installed by the user it is automatically available in the "Pipeline Editor" and can be used for pipelines.
-Elements that are uninstalled are removed from the system.
-They can not longer be used within pipelines.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/install_elements/01_install_elements.png" alt="Install Elements View"/>
-    <img src="/img/features_0_62_0/install_elements/02_install_countAggregation.png" alt="Insall new Element"/>
-    <img src="/img/features_0_62_0/install_elements/03_installed_countAggregation.png" alt="Installation Successful"/>
-    <img src="/img/features_0_62_0/install_elements/04_countAggregation_in_editor.png" alt="Show new installed element"/>
-</div>
-
-
-## My Elements
-The "My Elements" view gives a quick overview over all installed pipeline elements.
-Here they can be inspected and the description can be re-imported.
-In this view it is also possible to have a look at the JSON-LD representation of each element.
-This is not important for a user, but it is worth noting that the system uses this machine understandable format to support the user.
-For example all the information of the sources, like data schema or unit information is in the JSON-LD meta data.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/my_elements/01_my_elements.png" alt="My Elements Overview"/>
-    <img src="/img/features_0_62_0/my_elements/02_my_elements_jsonid.png" alt="View JSON-LD"/>
-</div>
-
-## Configuration
-The last feature is the _configuration view_.
-Here, it is possible to change the configuration parameters of installed components.
-All components containing processing elements automatically register in StreamPipes when they are started in the same network as the backend component.
-Once a container is registered it is represented in the configuration view.
-The green dot on the top left indicates that tha container is running properly.
-When there is a problem with a container the green dot changes to red and the user knows there is a problem.
-To configure the parameters the top right arrow of a configuration box must be clicked.
-Then the configuration menu pops up.
-Within there it is possible to change the parameters of a service.
-To make the changes persistent the "Update" button must be clicked.
-A user should keep in mind that sometimes it is necessary to restart a container when the parameters are changed.
-Sometimes it is also necessary to re-import the pipeline element description, either by uninstalling and re-installing them after the container restart or be reloading the description in the "My elements" view.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/configuration/01_configuration_overview.png" alt="Configuration Overview"/>
-    <img src="/img/features_0_62_0/configuration/02_change_config.png" alt="Change Configuration"/>
-</div>
-
-
-Congratulations! You've just finished your first tour of StreamPipes.
-Although there's still more to learn, we introduced most of the currently available features.
-On the next page, the different processing elements that come with the installation are explained.
+- [Introduction](03_concepts-introduction.md)
+- [Terms](03_concepts-terms.md)
+- [Architecture](03_concepts-architecture.md)
diff --git a/docs/03_concepts-architecture.md b/docs/03_concepts-architecture.md
index 1c1651b78..b1bd506fc 100644
--- a/docs/03_concepts-architecture.md
+++ b/docs/03_concepts-architecture.md
@@ -4,197 +4,241 @@ title: Architecture
 sidebar_label: Architecture
 ---
 
-## Architecture
+Apache StreamPipes is designed as a distributed industrial data platform.
+Its architecture supports sovereign deployments, real-time data processing, and extension points for company-specific integrations and analytics.
 
-<img className="docs-image" src="/img/07_technicals/architecture.png" alt="StreamPipes Architecture"/>
+This page explains the technical building blocks behind that platform model.
+If you are new to StreamPipes, read [Introduction](03_concepts-introduction.md) first for the overall positioning and [Terms](03_concepts-terms.md) for the core platform concepts.
 
-Apache StreamPipes implements a microservice architecture as shown in the figure above.
+## Architecture at a glance
 
-## StreamPipes Core
+<img className="docs-image" src="/img/07_technicals/architecture.png" alt="StreamPipes architecture overview"/>
 
-The StreamPipes Core is the central component to manage all StreamPipes resources.
-It delegates the management of adapters, pipeline elements, pipelines and functions to registered extensions services (see below) and monitors the execution of extensions.
-The Core also provides internal REST interfaces to communicate with the user interface, as well as public REST interfaces that can be used by external applications and StreamPipes clients.
+At a high level, a StreamPipes installation consists of:
 
-Configuration and user data are stored in an Apache CouchDB database.
+* one central **StreamPipes Core**
+* one or more **extension services**
+* a web-based **user interface**
+* bundled infrastructure components for **messaging**, **time-series storage**, and **configuration storage**
 
-## StreamPipes Extensions
+This architecture is intentionally distributed.
+It allows teams to run StreamPipes close to their data sources, split workloads across environments, and keep control over where industrial data is processed and stored.
 
-An Apache StreamPipes extensions service is a microservice which contains the implementation of specific adapters, data streams, data processors, data sinks and functions.
-Multiple extension services can be part of a single StreamPipes installation.
-Each service might provide its own set of extensions. Extensions services register at the StreamPipes Core at startup. Users are able to install all or a subset of extensions of each service.
-This allows StreamPipes to be extended at runtime by starting a new service with additional extensions.
+:::info Suggested image placeholder
+**Image idea:** Annotated architecture overview with labeled zones for UI, Core, Extension Services, Message Broker, Time-Series Database, and Configuration Storage.  
+**Purpose:** Give readers one clear mental model of the full deployment before the page goes into details.
+:::
 
-Extensions can be built using the SDK (see [Extending StreamPipes](07_extend-setup.md)).
-Extensions services can be provided either in Java or in Python.
+## Why the architecture looks this way
 
-:::info
+Industrial data platforms have to solve for more than throughput.
+They also need to handle protocol diversity, OT/IT boundaries, deployment constraints, and long-term maintainability.
 
-As of version 0.93.0, the Python SDK supports functions only. If you would like to develop pipeline elements in Python as well, let us know in a [Github discussions](https://github.com/apache/streampipes/discussions) comment, so that we can better prioritize development.
+StreamPipes addresses this with a microservice-oriented architecture that is:
 
-:::
+* **distributed**, so components can run where they fit operationally
+* **extensible**, so new protocols and logic can be added without changing the core
+* **event-driven**, so live machine data can move efficiently through the platform
+* **sovereign**, so organizations can keep control over infrastructure, deployment topology, and data ownership
 
+In practical terms, this means StreamPipes can serve both centralized and edge-near deployment scenarios.
 
-An extensions service interacts with the core by receiving control messages to invoke or detach an extension.
-In addition, the core regularly fetches monitoring and log data from each registered extensions service.
+## StreamPipes Core
+
+The **StreamPipes Core** is the central control plane of a StreamPipes installation.
+It manages the platform’s resources and coordinates the lifecycle of extensions and runtime artifacts.
 
+Core responsibilities include:
 
-## StreamPipes Client
+* managing metadata for streams, pipelines, assets, datasets, and related resources
+* coordinating adapters, processors, sinks, and functions provided by extension services
+* exposing REST APIs for the user interface and external applications
+* handling orchestration tasks such as registration, installation, and lifecycle management
+* providing the foundation for permissions, configuration, and platform-wide consistency
 
-The Apache StreamPipes Client is a lightweight library for Java and Python which can be used to interact with StreamPipes resources programmatically.
-For instance, users use the client to influence the control flow of pipelines, to download raw data from the data lake APIs or to realize custom applications with live data.
+The Core does not implement every protocol adapter or processing function itself.
+Instead, it acts as the central system that knows what is available, how components fit together, and how they should be operated as one platform.
 
+## Extension Services
 
-## Third-party systems
+**Extension services** are microservices that contribute functional building blocks to StreamPipes.
+They can provide:
 
-In addition to the core components, an Apache StreamPipes version uses several third-party services, which are part of the standard installation.
+* adapters
+* data processors
+* data sinks
+* functions
+* additional domain-specific logic
 
-* Configurations and user data is stored in an [Apache CouchDB](https://couchdb.apache.org) database.
-* Time-series data is stored in an [InfluxDB](https://github.com/influxdata/influxdb) database.
-* Events are exchanged over a messaging system. Users can choose from various messaging systems that StreamPipes supports. Currently, we support [Apache Kafka](https://kafka.apache.org), [Apache Pulsar](https://pulsar.apache.org), [MQTT](https://mqtt.org/) and [NATS](https://nats.io/). The selection of the right messaging system depends on the use case. See [Messaging](07_technicals-messaging.md) for more information.
+Multiple extension services can be registered in one installation.
+Each service can provide a different set of capabilities, which makes the platform modular and easy to grow over time.
 
-:::info
+This model is especially valuable in industrial environments.
+Instead of modifying a monolithic application, teams can add new services for proprietary machines, internal analytics logic, or site-specific integrations.
 
-Versions prior to 0.93.0 included Consul for service discovery and registration. Starting from 0.93.0 onwards, we switched to an internal service discovery mechanism.
+Extensions can be developed with the SDK and deployed independently from the core platform.
+See [Extending StreamPipes](07_extend-setup.md) for implementation details.
 
+:::info Suggested image placeholder
+**Image idea:** Diagram showing the Core in the center and multiple extension services around it, each contributing different adapters, processors, or sinks.  
+**Purpose:** Make the extension model tangible and reinforce the modular platform story.
 :::
 
-All mentioned third-party services are part of the default installation and are auto-configured during the installation process.
+## User Interface
 
-## Programming Languages
+The web-based **user interface** is the main entry point for platform users.
+It provides access to the operational and analytical capabilities of StreamPipes, such as:
 
-Apache StreamPipes is mainly written in Java.
-Services are based on Spring Boot.
-The included [Python integration](https://streampipes.apache.org/docs/docs/python/latest/) is written in Python.
+* configuring adapters and data sources
+* building and operating pipelines
+* exploring historical and live data
+* managing assets, datasets, and configuration
+* working with dashboards and platform administration features
 
-The user interface is mainly written in TypeScript using the Angular framework.
+From an architectural perspective, the UI is not a standalone tool layered loosely on top.
+It is a first-class part of the platform that interacts with the Core and exposes the capabilities registered by extension services.
 
+The UI also helps strengthen the data-platform positioning of StreamPipes: it makes industrial data accessible not only to developers, but also to engineers, analysts, and operations users.
 
-## Data Model
+## Messaging Layer
 
-Internally, Apache StreamPipes realizes a stream processing layer where events are continuously exchanged over a messaging system.
-When building a pipeline, data processors consume data from a topic assigned by the core and publish data back to another topic, which is also assigned by the core.
+StreamPipes uses an external **messaging layer** as the backbone for live event exchange.
+Adapters, processors, sinks, and other components communicate through this event-driven layer instead of relying on direct point-to-point coupling.
 
-At runtime, events have a flat and easily understandable data structure, consisting of key/value pairs. Events are serialized in JSON, although StreamPipes can be configured to use other (binary) message formats.
+Supported messaging systems include:
 
-This allows for easy integration with other systems which want to consume data from Streampipes, since an event could look as simple as this:
+* [NATS](https://nats.io/)
+* [Apache Kafka](https://kafka.apache.org)
+* [MQTT](https://mqtt.org/)
+* [Apache Pulsar](https://pulsar.apache.org)
 
-```json
-{
-  "timestamp": 1234556,
-  "deviceId": "ABC",
-  "temperature": 37.5
-}
-```
+For many installations, **NATS** is a strong default because it is lightweight and fits well into distributed and OT-adjacent deployments.
+Other brokers may be preferred when an organization already standardizes on them or needs specific messaging capabilities.
 
-However, this wouldn't be very expressive, right? To [assist users](07_technicals-user-guidance.md), StreamPipes provides a rich description layer for events. So under the hood, for the `temperature` field shown above StreamPipes can also store the following:
+The messaging layer is what allows StreamPipes to remain highly performant and focused on streaming data while keeping services decoupled.
 
-```json
-{
-  "label": "Temperature",
-  "description": "Measures the temperature during leakage tests",
-  "measurementUnit": "https://qudt.org/vocab/unit/DEG_C",
-  "runtimeName": "temperature",
-  "runtimeType": "xsd:float",
-  "semanticType": "https://my-company-vocabulary/leakage-test-temperature"
-}
-```
+## Storage Components
+
+In a standard StreamPipes installation, storage is split across dedicated infrastructure components that are deployed as part of the platform setup.
+StreamPipes separates different storage concerns instead of forcing all data into one subsystem.
 
-By dividing the description layer from the runtime representation, we get a good trade-off between expressivity, readability for humans and lightweight runtime message formats.
-The schema is stored in an internal schema registry and available to the client APIs and user interface views to improve validation and user guidance.
+The standard installation includes:
 
-StreamPipes also supports arrays and nested structures, although we recommend using flat events where possible to ease integration with downstream systems (such as time-series storage).
+* **InfluxDB** for time-series data
+* **Apache CouchDB** for configuration and user-related platform data
 
+This separation reflects the different roles of the stored data:
 
+* time-series storage supports historical analysis, charts, and monitoring
+* configuration storage supports platform state, metadata, and management tasks
 
-## Architecture
+These databases are not described here as optional side tools.
+They are part of the default StreamPipes installation architecture and provide the persistence layers the platform relies on for historical data, metadata, and configuration state.
 
-To exchange messages at runtime between individual [Extensions Services](07_technicals-architecture.md), StreamPipes uses external messaging systems.
-This corresponds to an event-driven architecture with a central message broker and decoupled services which consume and produce events from the messaging system.
+By combining these built-in storage components with a unified platform layer, StreamPipes provides a pragmatic architecture for industrial data workloads.
 
-There are many different open source messaging systems on the market, which each have individual strengths.
-To provide a flexible system which matches different needs, StreamPipes can be configured to use various messaging systems.
+## Deployment Across OT and IT Boundaries
 
-## Supported messaging systems
+A key strength of StreamPipes is that Core and extension services do not have to run in the same network segment.
+They can be deployed across OT and IT environments depending on operational and security requirements.
 
-The following messaging systems are currently supported:
+For example:
 
-* Apache Kafka
-* Apache Pulsar
-* MQTT
-* NATS
+* an extension service can run close to a machine or broker inside the OT network
+* the Core, UI, and storage components can run in a central IT environment
+* different sites can contribute extension services to one broader platform setup
 
-## Configure StreamPipes to use another messaging system
+This allows organizations to keep source-near integrations local while still building a shared industrial data platform at a higher level.
 
-Configuring StreamPipes for one of these messaging system is an installation-time configuration.
-We currently do not recommend to change the configuration at runtime.
+:::info Suggested image placeholder
+**Image idea:** OT/IT deployment diagram with an extension service in the OT network and Core/UI/storage in the IT network.  
+**Purpose:** Show how StreamPipes supports secure, realistic industrial deployment topologies.
+:::
 
-The protocol can be configured with the environment variable `SP_PRIORITIZED_PROTOCOL` assigned to the core with one of the following values:
+## Communication Modes
 
-```bash
-SP_PRIORITIZED_PROTOCOL=kafka # Use Kafka as protocol
-SP_PRIORITIZED_PROTOCOL=pulsar # Use Pulsar as protocol
-SP_PRIORITIZED_PROTOCOL=mqtt # Use MQTT as protocol
-SP_PRIORITIZED_PROTOCOL=nats # Use NATS as protocol
-```
+Communication between the Core and extension services supports different transport modes, including **HTTP** and **NATS**.
 
-Note that each extension service can support an arbitrary number of protocols. For instance, you can have a lightweight extension service which only supports NATS, but have another, cloud-centered service which supports Kafka, both registered at the Core.
-To select a protocol when multiple protocols are supported by two pipeline elements, StreamPipes selects a protocol based on a priority, which can be configured in the [Configuration View](06_configure-operate-general-settings.md).
-StreamPipes ensures that only pipeline elements which have a commonly supported protocol can be connected.
+This matters in real deployments.
+In some OT environments, opening inbound ports to extension services is undesirable or impossible.
+Using NATS-based communication can reduce that requirement and make it easier to deploy services in restricted networks.
 
-Note that you might need to change the installation files. For the `Docker-Compose` based installation, we provide various compose file for different messaging setups. For the `Kubernetes` installation, we provide variables which can be set in the helm chart's `values.yaml` file.
+This flexibility is another reason StreamPipes works well in industrial settings where network boundaries are part of the system design, not an afterthought.
 
-### Configure broker addresses
+## Data Model and Schema Layer
 
-By default, StreamPipes assumes that the messaging system is started from its own environment, e.g., the system configured in the selected `Docker-Compose` file.
+At runtime, StreamPipes works with lightweight event payloads that are easy to transport and integrate with downstream systems.
+An event might look as simple as this:
 
-Besides that, it is also possible to let StreamPipes connect to an externally provided messaging system. For this purpose, various environment variables exist.
+```json
+{
+  "timestamp": 1234556,
+  "deviceId": "ABC",
+  "temperature": 37.5
+}
+```
 
-* `SP_PRIORITIZED_PROTOCOL` to set the prioritized protocol to either `kafka`, `mqtt`, `nats` or `pulsar`
+What makes StreamPipes more than a transport layer is the additional schema and semantic description managed by the platform.
+For a field such as `temperature`, StreamPipes can also keep metadata such as:
 
-* `SP_KAFKA_HOST`, `SP_KAFKA_PORT` to configure Kafka access
-* `SP_MQTT_HOST`, `SP_MQTT_PORT` to configure MQTT access
-* `SP_NATS_HOST`, `SP_NATS_PORT` to configure NATS access
-* `SP_PULSAR_URL` to configure Pulsar access
+```json
+{
+  "label": "Temperature",
+  "description": "Measures the temperature during leakage tests",
+  "measurementUnit": "https://qudt.org/vocab/unit/DEG_C",
+  "runtimeName": "temperature",
+  "runtimeType": "xsd:float",
+  "semanticType": "https://my-company-vocabulary/leakage-test-temperature"
+}
+```
 
+This separation between runtime payload and descriptive schema is important:
 
-Most settings can also be set in the UI under `Settings->Messaging`.
+* runtime events stay compact and integration-friendly
+* users still benefit from rich semantics, validation, and better guidance in the UI
+* clients and extensions can work with data that is not only available, but also understandable
 
-:::warning Installation-time configurations
-Although it is currently possible to change messaging settings in the user interface, we do not support dynamic modification of messaging systems.
-Choosing a proper system is considered an installation-time setting which should not be changed afterwards.
-Already existing Adapters and pipeline elements are not properly updated after changes of the messaging layer.
-:::
+In other words, StreamPipes treats industrial data as structured information, not just message traffic.
 
+## APIs, SDKs, and Developer Access
 
-## Overview
+StreamPipes is not only operated through the browser.
+It also provides developer-facing access through:
 
-In general, StreamPipes has an exchangeable runtime layer, e.g., the actual processing of incoming events can be delegated to a third-party stream processing system such as Kafka Streams or Apache Flink.
+* REST APIs
+* SDKs for building pipeline elements and extensions
+* client libraries for programmatic access
 
-The default runtime wrapper is the StreamPipes Native Wrapper, called the `StandaloneWrapper`.
+This supports use cases such as:
 
-Although not recommended for production, we invite interested developers to check out our experimental wrappers:
+* integrating StreamPipes into internal applications
+* automating pipeline lifecycle operations
+* developing custom adapters, processors, and sinks
+* building data analytics workflows around live or historical machine data
 
-* Kafka Streams runtime wrapper at [https://github.com/apache/streampipes/tree/dev/streampipes-wrapper-kafka-streams](https://github.com/apache/streampipes/tree/dev/streampipes-wrapper-kafka-streams)
-* Apache Flink runtime wrapper at [https://github.com/apache/streampipes/tree/dev/streampipes-wrapper-flink](https://github.com/apache/streampipes/tree/dev/streampipes-wrapper-flink)
+The platform is primarily implemented in Java, the UI is built with TypeScript and Angular, and Python support enables data-science-oriented workflows around StreamPipes.
 
-## Assigning a runtime wrapper to an extension service
+## Third-Party Components in Context
 
-Runtime wrappers can be assigned in the `Service Definition` of the `Init` class of an extension service:
+StreamPipes intentionally builds on proven third-party infrastructure instead of reimplementing those layers itself.
+A standard installation therefore includes infrastructure components alongside the StreamPipes services, such as:
 
-```java
+* a message broker
+* a time-series database
+* a configuration database
 
-  @Override
-  public SpServiceDefinition provideServiceDefinition(){
-    return SpServiceDefinitionBuilder.create("org.apache.streampipes.extensions.all.jvm",
-    "StreamPipes Extensions (JVM)",
-    "",8090)
-    ...
-    .registerRuntimeProvider(new StandaloneStreamPipesRuntimeProvider())
-    ...
-    .build();
-  }
+These components are part of the installed platform architecture, even though they are separate technologies.
+This architecture gives teams flexibility without losing the benefits of one integrated platform experience.
+Users work with StreamPipes as a coherent system, while operators can still align deployments with existing infrastructure standards.
 
-```
+## What this architecture enables
+
+Taken together, the architecture enables StreamPipes to act as a sovereign industrial data platform:
+
+* live machine data can be ingested and processed close to the source
+* data flows can be governed centrally across teams and sites
+* extensions can evolve independently of the core platform
+* messaging and storage infrastructure can be aligned with enterprise requirements
+* users and developers can work against one consistent platform model
 
-Please let us know through our communication channels if you are interested in this feature and if you are willing to contribute!
+The result is an architecture that is not only technically scalable, but also operationally realistic for industrial environments.
diff --git a/docs/03_concepts-introduction.md b/docs/03_concepts-introduction.md
index 5b845ebfe..53e14d972 100644
--- a/docs/03_concepts-introduction.md
+++ b/docs/03_concepts-introduction.md
@@ -4,82 +4,117 @@ title: Introduction
 sidebar_label: Introduction
 ---
 
-## What is StreamPipes?
-
-Apache StreamPipes is a self-service Industrial IoT toolbox to enable non-technical users to connect, analyze and
-explore IoT data streams. The main goal of StreamPipes is to help users bridging the gap between operational
-technology (OT) and information technology (IT). This is achieved by providing a set of tools which help to make
-industrial data accessible for downstream tasks such as data analytics and condition monitoring.
-When working with industrial data and especially when building upon an open source stack for such tasks, users are often
-faced with the management and integration of a variety of different tools for data connectivity, messaging &
-integration, data enrichment, data storage, visualization and analytics. This results in an increasing operational
-complexity and hardly manageable software stacks.
-
-Apache StreamPipes addresses this problem: It provides a complete toolbox with a variety of different tools to easily
-gather data from OT systems such as Programmatic Logic Controllers (PLCs), industrial protocols (e.g., OPC-UA or
-Modbus), IT protocols (e.g., MQTT) and others. Data is integrated in the form of live data streams. Based on connected
-data, StreamPipes provides another module called the pipeline editor, which can be used to apply real-time analytics
-algorithms on connected data stream. To this end, a library of pre-defined algorithms can be used. Out of the box,
-StreamPipes provides more than 100 pipeline elements tailored at manufacturing data analytics. This includes simple
-rule-based algorithms (e.g., flank detection, peak detection, boolean timers), as well as the possibility to integrate
-more sophisticated ML-based algorithms. Finally, the pipeline editor allows to integrate with third-party systems by
-using a variety of data sinks (e.g., to forward data to messaging brokers such as Apache Kafka, MQTT or RocketMQ, to
-store data in databases such as PostgreSQL or Redis or to trigger notifications). Besides pipelines, an included data
-explorer allows to visually analyze industrial IoT data. For this purpose, a number of visualizations are integrated
-that allow non-technical users to quickly get first insights. Examples are correlations between several sensor values,
-value heatmaps, distributions or time-series visualizations. Further tools include a dashboard used for real-time
-monitoring, e.g., for visualizing live KPIs at shopfloor level.
-
-But StreamPipes is much more than just the user interface and an orchestration system for pipelines: It can be used as a
-whole developer platform for Industrial IoT application. Apache StreamPipes is made for extensibility - it provides
-several extension points, which allow the definition of custom algorithms, additional interfaces to third-party tools
-and proprietary data sources.
-
-StreamPipes includes developer support for Java and Python, making it easy to integrate custom-trained machine learning
-models into the data processing environment. With the built-in Python support, it is also possible to run online machine
-learning methods directly on data streams gathered by StreamPipes.
-
-## Where does StreamPipes help?
-
-Being positioned in the industrial IoT domain, the overall goal of StreamPipes is to help manufacturing companies to
-quickly build up an industrial IoT infrastructure and to analyse IIoT data without the need for manual programming.
-Oftentimes, StreamPipes is compared to other tools in this area such as Node-RED for visually wiring of pipelines, which
-is often used together with Grafana for data visualization and InfluxDB for time-series storage. The disadvantage of
-such architectures is the system complexity beyond the first prototype, especially when it comes to production
-deployments. Maintaining and securing multiple software instances is often a hard task requiring for substantial
-development effort. In addition, implementing single-sign-on and providing a unified user experience is another hurdle.
-This is where StreamPipes, as a single integrated tool with production-critical features such as access and role
-management, provides many advantages.
-StreamPipes has already a wide user range from the manufacturing domain. It helps users to quickly do the first steps
-related to industrial analytics but can also be used for monitoring whole production facilities, analysing data streams
-from multiple plants and sensors in real time using the integrated algorithm toolbox. Customization to individual use
-cases is easy due to several extension points:
-
-* Software development kit for adapters, data processors and sinks: The functionality of StreamPipes can be extending by
-  using the integrated SDK. For instance, it is possible to integrate custom-tailored algorithms for proprietary sensors
-  or models into the toolbox. Additional algorithms and data sinks can be installed at runtime.
-* Additional user interface plugins: StreamPipes allows to extend the default installation with additional UI views,
-  making use of a micro frontend approach. For instance, users can extend the system with custom-tailored views for a
-  specific machine or plant. Developers can use a platform API to communicate with the core StreamPipes instance.
-* UI customization: To ensure a consistent look and feel, StreamPipes can be customized to the company’s corporate
-  identity.
-
-## How does StreamPipes technically work in a nutshell?
-
-
-<img className="docs-image docs-image-no-shadow" src="/img/architecture/streampipes-architecture-components.png" alt="Overview StreamPipes Architecture"/>
-
-
-To foster extensibility, Apache StreamPipes is based on a microservice architecture as illustrated above. The main
-services provided or used by StreamPipes are the a) user interface, b) the core, c) a time-series storage, d) a
-publish/subscribe messaging layer and e) extensions services. Adapters are created over the user interface using an
-intuitive configuration wizard and connect to the underlying source systems. Raw events coming from adapters can be
-pre-processed (e.g., measurement unit conversions or datatype conversions). Afterwards, events are sent to the message
-broker, which is the central backbone to provide IIoT data to internal and external applications. 
-
-Besides adapters, extensions microservices can also integrate additional business logic in form of data processors and
-data sinks. StreamPipes comes with over 100 built-in processors and sinks, covering basic use cases out-of-the-box. The StreamPipes core cares about orchestration of these pipeline elements and communicates with the user
-interface. In addition, a time-series storage ensures persistence and can be used by any extensions service to write
-data into the internal storage. The StreamPipes core provides a query interface to access historical data, which is, for
-instance, used by the data explorer UI component. The user interface itself provides several built-in modules but can
-also be extended with additional micro frontends. 
+## What is Apache StreamPipes?
+
+Apache StreamPipes is an open-source platform for working with industrial data in motion.
+It helps teams connect machines, sensors, brokers, and software systems, turn incoming events into structured data streams, and build processing flows without starting from a custom integration stack.
+
+In practice, StreamPipes combines several tasks that are often spread across multiple tools:
+
+* connecting to OT and IT systems
+* modeling and validating event schemas
+* transforming and enriching live data
+* forwarding data to databases, brokers, and business systems
+* storing and exploring historical time-series data
+* building dashboards and visual monitoring views
+
+This makes StreamPipes especially useful when you want to move from isolated machine data to a maintainable data product that operators, engineers, and developers can all work with.
+
+:::info Suggested image placeholder
+**Image idea:** Product overview screenshot that shows the main modules in one view, for example Connect, Pipelines, Charts, and Dashboards.  
+**Purpose:** Give new readers an immediate visual impression of StreamPipes as one integrated platform.
+:::
+
+## What problem does StreamPipes solve?
+
+Industrial data projects usually start with a simple question: "How do we get data from machines into applications that can use it?"
+The difficult part is not only reading the data source.
+The real effort is typically in everything around it:
+
+* handling many protocols and source formats
+* creating a stable event structure
+* enriching raw values with context
+* routing data to the right downstream systems
+* making data accessible to users who are not software developers
+* operating the resulting stack securely and consistently
+
+Without an integrated platform, these tasks are often split across protocol adapters, message brokers, custom scripts, dashboards, storage systems, and alerting tools.
+That can work for prototypes, but it becomes expensive to maintain once multiple plants, teams, or use cases are involved.
+
+StreamPipes reduces this integration overhead by providing one platform for the full path from ingestion to action.
+
+## Who is StreamPipes for?
+
+StreamPipes is designed for teams that work with industrial or machine-related event data and need both usability and extensibility.
+Typical users include:
+
+* operations and process experts who want to configure data flows without writing everything from scratch
+* data and analytics teams who need clean, reusable event streams for downstream analysis
+* platform and integration engineers who want a structured way to connect industrial assets
+* developers who need extension points for custom adapters, processors, sinks, or UI modules
+
+The platform is therefore not only a user interface for pipelines.
+It is also a developer platform that can be adapted to company-specific infrastructure and domain logic.
+
+## How StreamPipes fits into the data flow
+
+At a high level, StreamPipes supports the full lifecycle of industrial event data:
+
+1. **Connect data sources** using adapters for protocols, devices, brokers, or custom integrations.
+2. **Normalize and describe events** so that data arrives with a clear structure and metadata.
+3. **Process streams in real time** with filters, enrichments, transformations, and analytics logic.
+4. **Deliver results** to storage systems, brokers, notifications, dashboards, or external applications.
+5. **Explore and monitor data** through built-in visual tools and live views.
+
+This flow is reflected in the core concepts of StreamPipes, which are described in more detail in the [Terms](03_concepts-terms.md) section:
+
+* **Adapters** ingest data from external systems.
+* **Data Streams** represent structured event streams inside StreamPipes.
+* **Data Processors** transform or analyze those streams.
+* **Data Sinks** persist, forward, or visualize the results.
+* **Pipelines** connect these building blocks into executable flows.
+
+:::info Suggested image placeholder
+**Image idea:** Simple left-to-right lifecycle diagram: Source System -> Adapter -> Data Stream -> Processor -> Sink -> Dashboard/Database.  
+**Purpose:** Help readers understand the basic execution model before they see detailed terminology.
+:::
+
+## Where StreamPipes helps most
+
+StreamPipes is a strong fit when you need to build repeatable industrial data workflows, not just one-off integrations.
+Common scenarios include:
+
+* connecting PLCs, MQTT brokers, OPC UA servers, and similar systems to a shared data platform
+* enriching raw telemetry before it is stored or forwarded
+* implementing rule-based monitoring and event-driven reactions
+* preparing live data for dashboards, analytics, or machine learning
+* giving multiple teams a shared environment for ingestion, processing, and exploration
+
+Compared with loosely coupled toolchains, StreamPipes offers a more consistent operating model.
+Security, user management, pipeline lifecycle management, and extension handling can be managed within one platform instead of being assembled separately around each use case.
+
+## StreamPipes as a platform
+
+One of the key ideas behind StreamPipes is extensibility.
+The platform includes many built-in pipeline elements, but it is not limited to them.
+You can adapt StreamPipes to your domain in several ways:
+
+* build custom adapters for proprietary devices or protocols
+* add custom data processors and sinks for company-specific logic
+* integrate Python- or Java-based functionality into processing workflows
+* extend the user interface with additional views or micro frontends
+* tailor the platform to internal branding and operational requirements
+
+This allows teams to start with standard building blocks and gradually move toward specialized solutions without replacing the platform.
+
+:::info Suggested image placeholder
+**Image idea:** Extension map or annotated screenshot showing built-in elements plus custom extensions.  
+**Purpose:** Communicate that StreamPipes is both ready to use and intentionally extensible.
+:::
+
+## What to read next
+
+After this introduction, the best next steps are:
+
+* [Terms](03_concepts-terms.md) to understand the platform building blocks such as adapters, streams, assets, and datasets
+* [Architecture](03_concepts-architecture.md) to understand how StreamPipes implements these concepts technically
diff --git a/docs/03_concepts-terms.md b/docs/03_concepts-terms.md
index e85ec995a..f670329aa 100644
--- a/docs/03_concepts-terms.md
+++ b/docs/03_concepts-terms.md
@@ -4,43 +4,185 @@ title: Terms
 sidebar_label: Terms
 ---
 
-To understand how StreamPipes works, it is helpful to understand a few core concepts, which are illustrated below.
-These encompass the entire data journey within StreamPipes: Starting with data collection ([adapters](#adapter)),
-through data exchange ([data streams](#data-stream)) and data processing ([data processors](#data-processor) and [pipelines](#pipeline)),
-to data persistence and distribution ([data sinks](#data-sink)).
+To use StreamPipes effectively, it helps to think of it as an industrial data platform with a few core building blocks.
+Some of these building blocks bring data into the platform, some process or store it, and others add context so that machine data becomes useful across teams and use cases.
 
-<img src="/img/02_concepts-overview/components-overview.png" alt="Overview of concepts"/>
+This page introduces the most important terms you will encounter throughout the documentation and in the StreamPipes user interface.
+
+<img src="/img/02_concepts-overview/components-overview.png" alt="Overview of StreamPipes concepts"/>
+
+:::info Suggested image placeholder
+**Image idea:** Updated platform concepts diagram that includes Assets and Datasets in addition to Adapters, Data Streams, Data Processors, Data Sinks, and Pipelines.  
+**Purpose:** Show that StreamPipes is not only about stream processing, but also about organizing industrial context and reusable data resources.
+:::
+
+## How the concepts fit together
+
+At a high level, StreamPipes turns industrial source data into usable, governed, and reusable data products:
+
+1. **Adapters** connect external systems and ingest raw machine or process data.
+2. **Data Streams** provide the structured live event model inside the platform.
+3. **Data Processors** transform, enrich, or analyze live streams.
+4. **Data Sinks** deliver results to storage, dashboards, notifications, or external systems.
+5. **Pipelines** combine these runtime building blocks into executable flows.
+6. **Assets** add operational context such as machines, lines, or sites.
+7. **Datasets** capture reusable data collections for analysis, export, or downstream consumption.
+
+Together, these concepts position StreamPipes as more than an ingestion or rule engine.
+They define the platform model that StreamPipes uses to manage industrial data from source connection to downstream reuse.
+
+## Extensions
+
+Several core capabilities in StreamPipes are provided through extensions.
+Extensions make the platform adaptable to different protocols, data models, analytics tasks, and target systems.
+
+The most visible extension types are:
+
+* **Adapters**, which connect external sources
+* **Data Processors**, which apply logic to live streams
+* **Data Sinks**, which persist, forward, or visualize results
+
+This extension model is important because industrial environments are heterogeneous.
+No platform can predict every machine, protocol, or processing requirement in advance.
+StreamPipes therefore combines built-in functionality with a clear path for adding company-specific integrations and logic.
+
+:::info Suggested image placeholder
+**Image idea:** Marketplace or pipeline element catalog screenshot grouped by extension type.  
+**Purpose:** Show that adapters, processors, and sinks are modular platform capabilities rather than hardcoded features.
+:::
 
 ## Adapter
-An adapter connects to any external data source (e.g., OPC-UA, MQTT, S7 PLC, Modbus) and forwards the events it receives to the internal StreamPipes system.
-Adapters can either be created by using a predefined adapter for a data source available in our marketplace [StreamPipes Connect](04_use-connect.md).
-An overview of all available adapters can be found under the menu bar **📚 Pipeline Elements**.
-When you select one of these adapters, you can easily connect to the data source using an intuitive and convenient UI dialog (see the Connect section for more details).
-Alternatively, you can define your own adapter by [using the provided Software Development Kit (SDK)](05_how-to-custom-adapter.md).
-Creating an adapter is always the first step when you want to get data into StreamPipes and process it further.
+
+An **adapter** connects StreamPipes to an external data source and translates incoming data into the StreamPipes event model.
+Typical sources include PLCs, OPC UA servers, MQTT brokers, Modbus devices, REST endpoints, and proprietary machine interfaces.
+
+Adapters are usually the starting point of a data flow.
+They are responsible for bringing raw events into the platform in a structured and reusable way.
+Depending on the source and configuration, an adapter can also help normalize values, define schemas, and prepare the data for downstream processing.
+
+Adapters can be created in different ways:
+
+* by using built-in adapters from the platform catalog
+* by configuring sources interactively in [StreamPipes Connect](04_use-connect.md)
+* by implementing custom adapters with the [SDK](05_how-to-custom-adapter.md)
+
+In a platform context, adapters are what turn isolated machine interfaces into shareable data resources.
 
 ## Data Stream
-**Data streams** are the primary source for working with events in StreamPipes.
-A stream is an ordered sequence of events, where an event typically consists of one or more observation values and additional metadata.
-The `structure` (or `schema` as we call it) of an event provided by a data stream is stored in StreamPipes' internal semantic schema registry.
-Data streams are primarily created by adapters, but can also be created by a [StreamPipes Function](07_extend-sdk-functions.md).
+
+A **data stream** is the central runtime concept for live data in StreamPipes.
+It represents an ordered sequence of events that share a defined structure.
+
+Each event typically contains:
+
+* one or more measured or derived values
+* timestamps
+* identifiers or dimension fields
+* semantic metadata that helps describe the meaning of the data
+
+The schema of a data stream is managed inside StreamPipes and is used to validate compatibility between pipeline elements.
+This means StreamPipes does not only move bytes from one place to another, it keeps track of how data is structured and how it can be reused.
+
+Data streams are typically created by adapters, but they can also be generated by other platform components such as functions or processing results.
 
 ## Data Processor
-**Data processors** in StreamPipes transform one or more input streams into an output stream.
-Such transformations can be simple, such as filtering based on a predefined rule, or more complex, such as applying rule-based or learning-based algorithms to the data.  
-Data processors can be applied to any data stream that meets the input requirements of a processor.
-In addition, most processors can be configured by providing custom parameters directly in the user interface.
-Processing elements define stream requirements, which are a set of minimum characteristics that an incoming event stream must provide.
-Data processors can maintain state or perform stateless operations.
+
+A **data processor** consumes one or more input data streams and produces a new output stream.
+Processors are used to apply logic to live machine data while it is flowing through the platform.
+
+Typical processor tasks include:
+
+* filtering events based on rules or thresholds
+* converting or normalizing values
+* enriching events with derived fields
+* correlating multiple streams
+* detecting patterns or anomalies
+* applying custom analytics or machine learning logic
+
+Processors define input requirements so that they can only be connected to compatible streams.
+This helps users build correct pipelines and promotes reuse across different industrial data sources.
+
+Some processors are stateless and act on each event independently.
+Others maintain state over time, which is useful for aggregations, timers, counters, and temporal analytics.
 
 ## Data Sink
-**Data sinks** consume event streams similar to data processors, but do not provide an output data stream.
-As such, data sinks typically perform some action or trigger a visualization as a result of a stream transformation.
-Similar to data processors, sinks also require the presence of specific input requirements from each bound data stream and can be customized.
-StreamPipes provides several internal data sinks, for example, to generate notifications, visualize live data, or persist historical data from incoming streams.
-In addition, StreamPipes provides several data sinks to forward data streams to external systems such as databases.
+
+A **data sink** consumes a data stream without producing another stream as output.
+Its role is to deliver the processed data to a destination or trigger an action.
+
+Common examples include sinks that:
+
+* store data in internal or external databases
+* forward data to brokers or APIs
+* trigger notifications or alerts
+* feed dashboards or live visual components
+
+In platform terms, sinks connect StreamPipes to the systems where data is ultimately used.
+They close the loop between live processing and operational action.
 
 ## Pipeline
-A pipeline in Apache StreamPipes describes the transformation process from a data stream to a data sink.
-Typically, a pipeline consists of at least one data stream, zero or more data processors, and at least one data sink.
-Pipelines are created graphically by users using the [Pipeline Editor](04_use-pipelines.md) and can be started and stopped at any time.
+
+A **pipeline** is an executable flow that combines streams, processors, and sinks into a runtime graph.
+It describes how data moves through StreamPipes from ingestion to transformation to delivery.
+
+A pipeline typically contains:
+
+* at least one input data stream
+* zero or more data processors
+* one or more data sinks
+
+Pipelines are usually created visually in the [Pipeline Editor](04_use-pipelines.md), where users can connect compatible elements, configure them, and start or stop the resulting flow.
+
+Pipelines are important because they turn reusable building blocks into concrete industrial applications such as monitoring flows, quality checks, event routing, or real-time enrichment.
+
+:::info Suggested image placeholder
+**Image idea:** Example pipeline screenshot that shows one machine stream, two processors, and one sink.  
+**Purpose:** Make the relationship between streams, processors, and sinks immediately tangible.
+:::
+
+## Asset
+
+An **asset** represents a real-world industrial object or organizational entity that gives data business context.
+Examples include machines, lines, workstations, plants, buildings, or logical equipment groups.
+
+Assets matter because industrial data is rarely useful in isolation.
+Users usually want to answer questions such as:
+
+* Which machine produced this data?
+* Which production line does this stream belong to?
+* Which assets share the same type or location?
+* Which dashboards, pipelines, or datasets relate to a specific site?
+
+By modeling assets, StreamPipes can organize machine data around the actual structure of an industrial environment instead of treating every stream as an isolated technical artifact.
+
+## Dataset
+
+A **dataset** is a reusable collection of data that can be consumed beyond the original live processing flow.
+While data streams represent events in motion, datasets represent data prepared for analysis, sharing, retention, export, or downstream reuse.
+
+Depending on the use case, a dataset can help teams:
+
+* preserve relevant historical data
+* expose curated data for analytics workflows
+* share stable data collections across teams or tools
+* separate long-term data usage from the original live stream
+
+This distinction is important because not all industrial use cases are purely real-time.
+Many require a combination of live processing and persistent, reusable data collections that can be explored later or exported into other systems.
+
+:::info Suggested image placeholder
+**Image idea:** Conceptual comparison graphic: live stream on one side, persistent dataset on the other.  
+**Purpose:** Clarify the difference between data in motion and curated or retained data collections.
+:::
+
+## Why these terms matter
+
+These concepts are not only documentation vocabulary.
+They define the operating model of the platform:
+
+* **Extensions** make the platform adaptable.
+* **Streams, processors, sinks, and pipelines** define the live execution model.
+* **Assets and datasets** make data easier to organize, understand, and reuse over time.
+
+Taken together, they describe what exists inside StreamPipes as a platform.
+The [Architecture](03_concepts-architecture.md) page explains how these concepts are implemented technically across the Core, extension services, messaging, and storage components.
diff --git a/docs/04_use-assets.md b/docs/04_use-assets.md
index cd5c3a296..eb3642ab5 100644
--- a/docs/04_use-assets.md
+++ b/docs/04_use-assets.md
@@ -3,3 +3,183 @@ id: use-assets
 title: Assets & Sites
 sidebar_label: Assets & Sites
 ---
+
+import UseCaseExample from '@site/src/components/docs/UseCaseExample.tsx';
+import StepFlow from '@site/src/components/docs/StepFlow.tsx';
+import DocVisualPlaceholder from '@site/src/components/docs/DocVisualPlaceholder.tsx';
+
+Assets and sites give StreamPipes industrial context. They let you describe machines, lines, stations, and plants as real-world objects and then connect adapters, datasets, charts, dashboards, and pipelines to those objects.
+
+Without this layer, many resources remain technically correct but operationally isolated. With it, StreamPipes becomes easier to navigate as an industrial data platform because users can move from the machine or line they care about to the resources that belong to it.
+
+## Understand the model first
+
+The asset feature combines three ideas that work together.
+
+`Sites` describe reusable location structures. `Assets` describe the industrial objects themselves. `Asset links` connect those objects to StreamPipes resources.
+
+This separation matters. A site is not the same thing as a machine or a line. A site is shared location context. An asset is the industrial object you actually operate. Links are what make that object visible across the platform.
+
+<UseCaseExample title="Why this model matters">
+  A team may have several charts, datasets, and dashboards for one packaging line. Without assets, users need to remember names or search technically. With assets, they can open the line itself and find the related resources from there.
+</UseCaseExample>
+
+## Sites are shared location context
+
+Site data is managed centrally in `Configuration > Sites`. In practice, sites are useful when several assets share the same location structure and should reference it instead of duplicating it manually.
+
+Think of sites as the reusable geography of the system: plant, building, hall, or area. The asset editor then references that shared structure rather than inventing its own local copy every time.
+
+This is especially valuable in larger installations. If ten machines belong to the same factory site and production hall, you define the site once and assign it where needed. That keeps the model cleaner and easier to maintain.
+
+## Assets are the industrial objects
+
+An asset is the real-world object users care about operationally. That can be a plant, a production line, one machine, one station, a subsystem, or another meaningful equipment grouping.
+
+Assets can be nested, and this hierarchy is one of the most useful parts of the feature. A plant can contain lines, a line can contain machines, and a machine can contain subassemblies or sensor groups. The point is not only structural neatness. The hierarchy becomes a navigation and interpretation aid across the platform.
+
+## Asset links make the model operational
+
+An asset becomes truly useful once it is linked to resources. This is what turns the model from documentation into active platform context.
+
+In the current platform, assets can link to resources such as adapters, pipelines, datasets, charts, dashboards, and data streams. Once linked, those resources can be discovered in asset context instead of only through their technical names.
+
+## Start from the asset overview
+
+Open `Assets` from the main navigation to reach the overview. The overview lists the root asset models stored in the system. From there you can create new asset models, open them, edit them, manage permissions, or delete them.
+
+The overview is intentionally simple. The interesting structure appears once you open one asset model and begin to navigate or edit its hierarchy.
+
+<DocVisualPlaceholder
+  title="Asset overview"
+  purpose="Show the root asset table with actions for opening, editing, managing permissions, and deleting asset models."
+/>
+
+## Create the asset model before you fill in the details
+
+Creating a new asset starts by creating a new root model. Open `Assets`, click `New asset`, and StreamPipes creates a root asset that becomes the starting point for the hierarchy. After the creation dialog closes, the editor opens so you can complete the actual structure.
+
+The important mental shift is that the root asset is usually not the most detailed object. It is the top of one meaningful industrial structure. For one organization that might be a whole plant. For another it might be one production line. The right choice depends on how users should navigate the system later.
+
+## Work with the two asset screens deliberately
+
+Assets have a `view` mode and an `edit` mode, and they serve different kinds of work.
+
+The view screen is for consumption. It shows the selected asset or subasset together with its descriptive metadata, location information, and linked resources. This is the screen users open when they want to understand context.
+
+The edit screen is for modeling. It shows the hierarchy on the left and the details of the selected asset on the right. This is where the structure, metadata, location assignments, and links are maintained.
+
+Keeping these roles separate is useful because it prevents the asset model from feeling like an editing form all the time. Users who only want to browse context can stay in view mode.
+
+## Build the hierarchy first
+
+The hierarchy editor on the left side of the edit view is one of the most important parts of the whole asset feature. It is not only a navigation tree. It is the structural definition of the industrial model.
+
+<StepFlow
+  steps={[
+    {
+      title: 'Create the root asset',
+      body: 'Start with the top-level industrial object that should anchor the model, such as a plant or one production line.',
+    },
+    {
+      title: 'Add subassets where users think in real life',
+      body: 'Add child assets such as machines, stations, or subsystems below the root so the structure mirrors operational reality.',
+    },
+    {
+      title: 'Select one node at a time',
+      body: 'Use the left tree to select the asset you want to edit and then maintain its details on the right side of the screen.',
+    },
+    {
+      title: 'Save the whole model',
+      body: 'Changes to the hierarchy are part of the full asset model and are only persisted once the asset is saved.',
+    },
+  ]}
+/>
+
+This means the tree should be designed around how users understand the equipment. If a packaging line is normally thought of as `Filler`, `Capper`, and `Labeler`, that is a sensible structure. If maintenance teams think first in terms of subsystems such as `Pump System` and `Dosing Unit`, the subasset structure should reflect that.
+
+One practical detail matters here: the current UI distinguishes between the root asset and nested assets, and some settings such as site assignment are handled at the root level.
+
+## Fill in the asset basics as stable identity, not as decoration
+
+On the right side of the editor, the `Basics` section captures the selected asset’s identity: `Name`, `Description`, `Asset ID`, and `Asset Type`.
+
+These fields should be treated as operational identifiers, not as cosmetic labels. The name should be the short identity users recognize immediately. The description should explain the object in one or two helpful sentences. The asset ID should be stable and usually align with whatever internal naming or external equipment convention your organization already uses.
+
+The asset type helps make the structure readable at scale. Because the UI uses ISA-95-oriented categories, choosing the correct type improves consistency and helps other users interpret the model faster.
+
+## Use labels and custom fields for domain context
+
+The basics area also supports `Labels & custom fields`. These are most useful when the standard asset fields are not enough to express the local domain context.
+
+Labels are good for lightweight tags such as `critical`, `testbench`, or `maintenance-zone`. They help with interpretation and filtering without introducing a rigid data model.
+
+Custom fields are better when the information is structured and should remain explicit over time, for example vendor, serial number, commissioning date, or a CMMS reference. If every machine needs a supplier code or maintenance owner, custom fields are a better fit than putting that information into the description text.
+
+## Assign reusable site and area context
+
+Site assignment happens in the `Sites` section of the asset editor. Open the root asset, select the site from the dropdown, choose an area if the site defines one, and save the model.
+
+This is the point where the asset stops being only an equipment object and becomes part of the larger plant context. Because sites are shared definitions, you do not need to recreate that context for every asset manually.
+
+The UI also includes a `Manage Sites` action and a refresh action for the site list. That makes it possible to switch directly to the central site configuration when the required location does not exist yet.
+
+## Add an exact location only when precision matters
+
+In addition to the shared site assignment, the current UI can store an exact location for an asset. This is useful when an individual asset needs more precise positioning than the site alone provides.
+
+The distinction is simple but important. The site gives reusable general location context. The exact location gives the position of one specific asset. If you do not need that precision, the site is often enough. If you do need it, enable `Add exact location`, define it in the location editor, and save the asset.
+
+This is a good example of how the model stays flexible. Not every machine needs a precise map point. But the ones that do can have one without forcing the same detail level onto every other asset.
+
+## Link resources once the model is meaningful
+
+The `Asset links` section is what makes the asset model valuable across the rest of StreamPipes. In edit mode, you can add one link at a time or open the broader link-management flow when several resources should be attached together.
+
+This is where a machine asset can become the entry point for its adapter, its persisted dataset, the chart showing its current behavior, the dashboard used by operators, and the pipeline computing KPIs from its stream.
+
+<UseCaseExample title="A useful linked machine asset">
+  One compressor asset may link to the adapter that ingests its data, the dataset storing its history, a chart for current pressure, a dashboard used in operations, and a pipeline that derives efficiency KPIs. Once these links exist, users can navigate from the machine to everything that matters around it.
+</UseCaseExample>
+
+In view mode, the `Linked Resources` section presents these connections directly. If nothing has been linked yet, the UI makes that explicit instead of pretending the absence of context is meaningful.
+
+## Use assets as the navigation backbone
+
+The real strength of assets appears when the model is used beyond the asset screen itself. Properly linked assets become navigation context for adapters, pipelines, datasets, charts, dashboards, and asset-centric views. Instead of searching manually for the right dashboard or dataset, a user can begin from the industrial object and move outward from there.
+
+This is the point where the feature starts to feel less like metadata management and more like a practical part of the user experience.
+
+## Permissions and deletion
+
+Assets support permission management directly from the overview. Use `Manage permissions` when different teams should see or edit different parts of the asset model. This matters especially in shared installations where one industrial structure may belong to several organizational groups.
+
+Deletion should be treated carefully because an asset may contain hierarchy and several linked resources. In practice, it is usually worth reviewing the structure and links before deleting the model entirely.
+
+## How to work well with assets and sites
+
+The cleanest working style is to model the industrial hierarchy first, assign site context second, and link technical resources third. That order tends to produce the most coherent result because the structure exists before the individual platform objects are attached to it.
+
+The most common mistake is to build many useful charts, datasets, and dashboards but leave them unlinked. In that situation, StreamPipes still works, but much of the contextual value of the platform is lost. Assets are what turn those isolated resources into something users can navigate naturally.
+
+## Image placeholders
+
+<DocVisualPlaceholder
+  title="Asset model and hierarchy"
+  purpose="Show one industrial hierarchy with a root asset, subassets, and linked resources such as adapters, datasets, charts, dashboards, and pipelines."
+/>
+
+<DocVisualPlaceholder
+  title="Asset editor"
+  purpose="Show edit mode with the hierarchy tree on the left and the selected asset details on the right."
+/>
+
+<DocVisualPlaceholder
+  title="Site and exact location"
+  purpose="Show the site assignment section together with the exact-location controls in the asset editor."
+/>
+
+<DocVisualPlaceholder
+  title="Linked resources view"
+  purpose="Show one machine asset in view mode with its linked resources section populated."
+/>
diff --git a/docs/04_use-charts.md b/docs/04_use-charts.md
index 1498e1819..7e4cf4db8 100644
--- a/docs/04_use-charts.md
+++ b/docs/04_use-charts.md
@@ -4,99 +4,100 @@ title: Charts
 sidebar_label: Charts
 ---
 
-The data explorer can be used to visualize and explore data streams that are persisted by using the **Data Lake** sink.
+Charts are where persisted industrial data becomes something a user can actually read and act on. In StreamPipes, a chart starts with an existing dataset, turns that dataset into a query result, and then presents that result in a visualization that matches the analytical question.
 
-<img className="docs-image" src="/img/03_use-data-explorer/01_data-explorer-overview.png" alt="StreamPipes Data Explorer Overview"/>
+This is an important distinction from `Connect` and `Pipelines`. Those features bring data into StreamPipes and prepare it. Charts work one step later. They assume that the data already exists and help you ask questions such as: What happened over time? What is the current value? How are two measurements related? Which states occurred most often?
 
-It provides a canvas (i.e. a data view) where various visualizations from multiple pipelines can be placed. For each data view, you can set a date and time range for the configured visualizations.
+> [Image placeholder: chart overview and chart editor with toolbar, designer panel, chart canvas, and data preview]
 
-## Using the data explorer
+## Before you create a chart
 
-### Get the data 
+Charts only work on persisted datasets. In practice, these datasets usually come from a running adapter, a persisted pipeline result, or a CSV import. If no datasets are available, the chart editor will tell you that directly and offer shortcuts back to `Connect` or `Pipelines`.
 
-In the data explorer, any pipeline that uses the so-called **Data Lake** sink can be explored in the data explorer. Switch to the pipeline editor and add the data lake sink to a data processor or stream.
-The sink requires an index name as a configuration parameter, which is used as an identifier in the data explorer.
+That also explains how to think about charts in the wider platform. A chart is not the place to fix ingestion or modeling problems. If timestamps are wrong, units are inconsistent, or fields are missing, the better fix is usually upstream in the adapter or pipeline. The chart should be the place where the data is already good enough to analyze.
 
-### Data Views & Widgets
+## Understand the current chart workflow
 
-After your data is stored in the data lake, you can switch over to the data-explorer tab to create a novel data view and the widgets of your choice. In StreamPipes, a data view organizes a set of related widgets (i.e. data visualizations or plots) and gets assigned a single date and time range. The standard date and time range consists of the last 15 minutes of the current date and time. You can select predefined ranges (e.g. day or month) or configure the exact date and time range you w [...]
+The chart feature has two parts. The `Charts` overview is where you manage existing charts. The editor is where you design or refine one chart.
 
-<img className="docs-image" src="/img/03_use-data-explorer/02_data-explorer-overview-2.png" alt="StreamPipes Data Explorer Component"/>
+The overview lets you open, edit, clone, share, and delete charts. It also warns you when a chart is outdated. Two cases matter here. Older `legacy multi-source charts` still exist, but the current editor is built around one dataset per chart. In addition, StreamPipes can tell you when a chart `requires attention` because the schema of the underlying dataset has changed. Both warnings are useful because they tell you that the problem is not cosmetic. In those situations, the chart defini [...]
 
-First create and name your data view and select the edit icon to proceed. In your data view, you can now add a new widget congiguration (plus icon) to configure and create your first widget. The widget configuration consists of (i) data, where the individual data sources in the data lake are selected, the properties for the widget are chosen and filters on the data sources are defined and applied, (ii) visualization, where the type of widget is chosen and the respective configuration for [...]
+Inside the editor, the work usually follows the same order every time. First select the dataset. Then decide which query result you want. Only after the data preview looks right does it make sense to choose the chart type and adjust appearance. Users who reverse that order often spend time tweaking a visualization when the real problem is still in the query.
 
-### Data Configuration
+## Start with the dataset
 
-The data configuration is the first step to define your widget. You can add several data sources (i.e. data sinks) and need to configure each added data source individually. This gives you sufficient freedom to combine the needed information, potentially consisting of different data resolutions, filters or types of information.
+To create a chart, open `Charts` and click `New chart`. The editor starts in the `Data` section because the dataset is the foundation of everything that follows.
 
-<img className="docs-image" src="/img/03_use-data-explorer/03_data-explorer-data.png" alt="StreamPipes Data Explorer Data Configuration"/>
+The current editor works with one dataset per chart. Select it in the `Dataset` section of the right-side designer panel. This may sound restrictive at first, but for documentation and day-to-day usage it is actually a strength: a chart stays easier to understand when it answers one question against one dataset clearly.
 
-After selecting the initial data source, you can choose if the underlying data query is to be performed raw, aggregated or single. Raw queries refer to using the data as-is, where you can define a limit on the number of events to guarantee performant usage in the application. In aggregated mode, you can choose among predefined aggregation granularites (e.g. day, minute, second). 
+When choosing the dataset, think less about where the data came from and more about what the chart is meant to say. If you want to verify the values exactly as they were stored from a source, choose the original persisted dataset. If you want to communicate a normalized KPI such as energy per part, choose the prepared dataset that already contains that KPI. A user looking for a suspicious alarm value should usually open the raw operational dataset. A user building a management dashboard  [...]
 
-In the next step, you can choose the fields (i.e. properties of your data source) you are interested in exploring. If you selected aggregation or single mode, you can also modify the type of aggregation to be performed on the selected property.
+## Build the query before you think about styling
 
-You can also filter your data source by adding conjunctive conditions.
+Once a dataset is selected, the next task is to shape the query. This is the real heart of the chart. The visualization only presents the result; it does not rescue a poor query.
 
-### Visualization Configuration
+The first decision is the query type. StreamPipes currently supports `Raw`, `Aggregated`, and `Single`. These are not merely technical options. They describe three different ways of looking at data.
 
-The visualization configuration is dependent on the visulization type, which needs to be selected first. The data-explorer currently supports the following types:
+`Raw` is the right choice when exact event rows matter. If an engineer wants to inspect the last 200 machine events exactly as they were stored, raw mode is appropriate. In that mode, `Limit` and `Page` matter because you are thinking in rows. Raw mode is especially useful for troubleshooting, detailed tables, and charts where every original event should remain visible.
 
-#### Table
+`Aggregated` is the right choice when the raw data is too dense or too noisy to be useful as-is. Industrial datasets often fall into this category. A vibration sensor or a rapidly sampled temperature stream can produce too many points for a meaningful multi-day chart. Aggregation solves that by summarizing the data. In the editor, you can let StreamPipes use `Auto-Aggregate` or disable it when you need explicit control. In practice, aggregation is often the mode that turns a technically  [...]
 
-The table view formats the selected properties in table format. 
+`Single` is the right choice when the chart should show one current state rather than a history. A gauge for current pressure, a status light for machine availability, or an indicator for current power draw are typical examples. In those cases, a time series would add noise instead of clarity.
 
-<img className="docs-image" src="/img/03_use-data-explorer/04_data-explorer-table.png" alt="StreamPipes Data Explorer Table"/>
+## Refine the result with fields, filters, grouping, and order
 
-#### Map
+After choosing the query type, continue refining the result itself. StreamPipes loads the dataset fields and preselects an initial set to get you started. Keep in mind that field selection is not just cosmetic. It changes what the chart can work with.
 
-The map allows to visualize and explore coordinates on the world map. The configuration requires to choose the property which comprises the coordinates, allows to choose the marker style, a zoom level as well as the tooltip content.
+In raw mode, selected fields are returned directly from the dataset. In aggregated or single mode, they take part in the summarization logic. A temperature field, for example, might become the basis for an average over time instead of a direct event-by-event series. That is why a good habit is to ask yourself: which fields are essential to answer the question, and which ones only add clutter? A troubleshooting table often benefits from several context fields. A focused time series often  [...]
 
-<img className="docs-image" src="/img/03_use-data-explorer/05_data-explorer-map.png" alt="StreamPipes Data Explorer Map"/>
+Filters come next. This is where a broad operational dataset becomes a dataset for one clear question. If a dataset contains values from several machines, several lines, or several orders, filtering is usually the first thing that makes the chart intelligible. A simple filter is often enough: one machine identifier, one status, one threshold, one product type. The `Advanced Filter` dialog becomes useful when the logic grows more precise, for example when one chart should show alarms for  [...]
 
-#### Heatmap
+Grouping and ordering complete the query shape. `Group by` is what makes one dataset split into several visible series or buckets, for example one series per machine or one bucket per state. `Order` matters most when the chart or table should emphasize recency or chronology. If a user wants the newest alarms first, descending order is natural. If the goal is to reconstruct a process in the order it happened, ascending order is better.
 
-The heatmap widget visualizes data in terms of the available intensity, where higher values are interpreted as being more intense. You only need to select the property which you want to visualize. Note that it might be interesting to aggregate the data in the data configuration to get more insights in your heatmap.
+At the bottom of the data configuration, StreamPipes also offers two small but practical switches: the browser overload warning and the missing-values option. These are not usually the main story of the chart, but they matter operationally. A large result set can make the browser heavy, and incomplete rows can distort multi-field charts. If a chart becomes unstable because one field is occasionally missing, ignoring incomplete events can be more useful than trying to style around the problem.
 
-<img className="docs-image" src="/img/03_use-data-explorer/06_data-explorer-heatmap.png" alt="StreamPipes Data Explorer Heatmap"/>
+## Use the data preview as your checkpoint
 
-#### Time Series
+The `Data preview` is one of the most important parts of the chart editor. It is the moment where the abstract query becomes visible as concrete rows. Users who learn to trust the preview usually build better charts faster.
 
-The time series widget allows you to do exploration and analysis for your numerical and boolean data properties. You can easily visualize your data properties in various styles (i.e. scatter, line, scattered line, bar or symbol) and colors, and configure a second y-axis for better interpretation of varying property ranges.
+Before spending time on chart type or appearance, look at the preview and ask a few basic questions. Did you select the correct dataset? Did the filter return the right subset? Did grouping create the result shape you expected? Does the result look like something the chosen chart type can represent well? Many chart problems are already obvious in the preview. If a pie chart seems wrong, the grouped values are often already wrong in the table. If a status chart looks confusing, the issue  [...]
 
-<img className="docs-image" src="/img/03_use-data-explorer/07_data-explorer-timeseries-1.png" alt="StreamPipes Data Explorer Time Series 1"/>
+> [Image placeholder: chart data preview showing the actual query result before visualization]
 
-<img className="docs-image" src="/img/03_use-data-explorer/08_data-explorer-timeseries-2.png" alt="StreamPipes Data Explorer Time Series 2"/>
+## Choose the chart type to match the question
 
-<img className="docs-image" src="/img/03_use-data-explorer/09_data-explorer-timeseries-3.png" alt="StreamPipes Data Explorer Time Series 3"/>
+Only after the query result looks right does it make sense to choose the visualization. The current chart registry includes `Gauge`, `Table`, `Traffic Light`, `Status`, `Map`, `Time-Series Heatmap`, `Status Heatmap`, `Time Series Chart`, `Image`, `Indicator`, `Scatter`, `Histogram`, `Pie`, and `Value Distribution Heatmap`.
 
-#### Image
+The simplest way to choose among them is not to memorize all options, but to think about the shape of the answer you need. A `Time Series Chart` is the natural choice when the main question is how values develop over time. `Gauge`, `Indicator`, `Traffic Light`, and `Status` are all good when the chart should communicate one current state quickly. A `Table` is better when the exact stored rows still matter more than visual summarization. `Pie`, `Histogram`, and `Value Distribution Heatmap [...]
 
-The image widget enables to integrate and visualize your image data.
+A few examples help. Machine temperature over the last eight hours is usually a `Time Series Chart`. Current tank fill level is a `Gauge`. Current compressed-air consumption as a KPI is an `Indicator`. The share of machine states during a shift is a `Pie`. The distribution of cycle times is a `Histogram`. The relationship between temperature and vibration is a `Scatter` plot. These are not hard rules, but they are reliable defaults.
 
-#### Indicator
+## Finish the chart in visualization and appearance
 
-The indiator widget lets you visualize a single numerical value as well as (optionally) the delta to another indicator. You only need to configure the respective properties.
+After selecting the chart type, the designer panel lets you refine `Visualization` and `Appearance`. The exact controls depend on the selected chart type, but the conceptual split stays the same: `Data` decides what is returned, `Visualization` decides how that result is interpreted, and `Appearance` controls presentation such as titles, colors, and formatting.
 
-<img className="docs-image" src="/img/03_use-data-explorer/11_data-explorer-indicator.png" alt="StreamPipes Data Explorer Indicator"/>
+This separation is worth keeping in mind because it prevents a common mistake. If the chart tells the wrong story, the problem is usually not in the appearance tab. It is usually in the query or in the chart type. Appearance should be the final polishing step, not the place where the analytical meaning is invented.
 
-#### 2D Correlation
+## Save, reuse, and manage the chart
 
-The correlation plot currently supports analyzing the relationship of two properties. Once selected, you can choose between a scatter view of the plotted data points or directly extract correlations in a density chart.
+The chart toolbar is deliberately small, but every action there matters. You can edit the `Chart Name`, `Save` the chart, `Add To Asset`, `Discard` changes, `Download data`, and change the time range.
 
-<img className="docs-image" src="/img/03_use-data-explorer/12_data-explorer-correlation-1.png" alt="StreamPipes Data Explorer Correlation 1"/>
+`Save` is what turns the current editor state into a reusable platform object. From that point on, the chart can be reopened, shared, linked to an asset, or added to a dashboard. `Download data` is useful when the query result should be validated outside StreamPipes or handed to someone else. `Add To Asset` matters when the chart belongs to a specific machine, line, or site and should be discoverable through the asset context.
 
-<img className="docs-image" src="/img/03_use-data-explorer/13_data-explorer-correlation-2.png" alt="StreamPipes Data Explorer Correlation 2"/>
+Back in the overview, you can open the chart again, edit it, clone it, manage permissions, or delete it. Cloning is especially useful because it lets you reuse a proven chart structure for another machine, another filter, or another visualization variant without rebuilding it from scratch. Permissions matter when a chart should be visible only to a specific group or team but still remain reusable in dashboards.
 
-#### Distribution
+## How charts fit into the rest of StreamPipes
 
-In the distribution widget, you can quickly get an overview of your data range and common data values. You can either choose a histrogram view, where a bar chart is used to show data the frequency of automatically extracted data ranges or a pie view, where you can also select the granularity of how your data is clustered in terms of frequency.
+Charts are best treated as reusable analytical building blocks. A chart should answer one question well. A dashboard can then combine several of those answers into one operational view. That is why the recommended workflow is to build and validate the chart first, save it, and only then add it to one or more dashboards.
 
-<img className="docs-image" src="/img/03_use-data-explorer/14_data-explorer-distribution-1.png" alt="StreamPipes Data Explorer Distribution 1"/>
+When users follow that approach, both features become easier to maintain. If one dashboard item looks wrong later, the place to fix it is often the source chart, not the dashboard itself.
 
-<img className="docs-image" src="/img/03_use-data-explorer/15_data-explorer-distribution-2.png" alt="StreamPipes Data Explorer Distribution 2"/>
+## Image placeholders
 
-### Appearance Configuration
+`[Image placeholder: chart overview with warnings for legacy multi-source charts and schema-change attention states]`
 
-Finally, you can change the title of your created widget as well as background and text colors in the appearance configuration. 
+`[Image placeholder: chart data configuration showing dataset selection, query type, filters, grouping, and ordering]`
 
-<img className="docs-image" src="/img/03_use-data-explorer/16_data-explorer-appearance.png" alt="StreamPipes Data Explorer Appearance"/>
+`[Image placeholder: chart type selector with current visualization options such as Time Series Chart, Gauge, Table, Pie, Scatter, and Status]`
+
+`[Image placeholder: finished chart editor with chart name, save, add-to-asset, download, time selector, and data preview]`
diff --git a/docs/04_use-connect.md b/docs/04_use-connect.md
index d4be57d6a..6ab698792 100644
--- a/docs/04_use-connect.md
+++ b/docs/04_use-connect.md
@@ -4,102 +4,711 @@ title: Connect IoT Data
 sidebar_label: Connect IoT Data
 ---
 
-StreamPipes Connect is the module to connect external data sources with Apache StreamPipes directly from the user interface. 
-StreamPipes Connect offers various adapters for common communication protocols and some specific sensors. Besides connecting data, StreamPipes Connect offers ways to pre-process data without the need to build pipelines and integrates a schema guesser that listens for incoming data and recommends the recognized event schema.
+import FeatureList from '@site/src/components/docs/FeatureList.tsx';
+import DocVisualPlaceholder from '@site/src/components/docs/DocVisualPlaceholder.tsx';
+import UseCaseExample from '@site/src/components/docs/UseCaseExample.tsx';
+
+Apache StreamPipes Connect is the entry point for bringing industrial and IoT data into the platform.
+It lets users create adapters from the web interface, inspect incoming events, refine schemas, and publish the resulting data streams for reuse across pipelines, dashboards, charts, assets, and datasets.
+
+This page explains the capabilities of StreamPipes Connect and the general workflow for connecting data.
+It intentionally does not cover protocol-specific configuration details. Those belong in the how-to section.
+
+## What StreamPipes Connect does
+
+StreamPipes Connect turns external machine and software interfaces into structured StreamPipes data streams.
+Instead of building custom ingestion services for every source, users can configure adapters directly in the UI and publish the result into the platform.
+
+<FeatureList
+  items={[
+    {
+      title: 'Select the right adapter',
+      text: 'Choose an integration that matches the source type instead of building custom ingestion logic from scratch.',
+    },
+    {
+      title: 'Validate live input',
+      text: 'Check that the source is reachable and inspect sample events before committing to a final stream.',
+    },
+    {
+      title: 'Refine schema and transformations',
+      text: 'Shape raw payloads into a cleaner StreamPipes event model with field metadata and optional scripts.',
+    },
+    {
+      title: 'Create an operated platform resource',
+      text: 'Turn the connection into a reusable source that can be started, edited, persisted, linked, and governed over time.',
+    },
+  ]}
+/>
+
+This makes Connect more than a connection dialog.
+It is the ingestion layer of the StreamPipes data platform.
+
+<DocVisualPlaceholder
+  title="Connect overview"
+  purpose="Show the adapter list, status indicators, and create action so Connect reads as an operational ingestion workspace."
+/>
+
+## Key features
+
+The current Connect experience provides a broader feature set than simply "configure source, then start adapter".
+The most important capabilities are easiest to understand through typical usage scenarios:
+
+<FeatureList
+  items={[
+    {
+      title: 'Adapter catalog',
+      text: 'Start from a matching source type instead of building a custom ingestion service.',
+      example: 'A team wants to connect a new machine simulator, file-based source, or broker feed and starts by selecting the closest matching adapter.',
+    },
+    {
+      title: 'Guided four-step configuration',
+      text: 'Keep onboarding repeatable and understandable for non-developers.',
+      example: 'A process engineer moves from connection settings to schema validation without switching tools or writing code.',
+    },
+    {
+      title: 'Live sample preview',
+      text: 'Confirm that the source is really sending the fields and timestamp shape you expect.',
+      example: 'Before creating an adapter, a user checks whether the payload contains temperature, pressure, and a usable time field.',
+    },
+    {
+      title: 'Schema refresh',
+      text: 'Adjust when source-side fields change instead of recreating the adapter from scratch.',
+      example: 'After a source update adds a new field, the user refreshes the schema and continues refining it.',
+    },
+    {
+      title: 'Field refinement',
+      text: 'Turn technically valid fields into stream definitions that are understandable downstream.',
+      example: 'Mark machine_id as a dimension, temperature as a measurement, and add a unit before the stream appears in charts or pipelines.',
+    },
+    {
+      title: 'Transformation logic',
+      text: 'Clean up or normalize raw events before they become part of the platform model.',
+      example: 'Parse a source timestamp, rename fields, or derive a cleaner output event from a noisy message payload.',
+    },
+    {
+      title: 'Templates',
+      text: 'Reuse recurring configuration and preprocessing patterns across similar sources.',
+      example: 'A team stores a shared broker setup as a configuration template and reuses one timestamp-parsing script as a transformation template.',
+    },
+    {
+      title: 'Persistence and asset linking',
+      text: 'Decide whether the source should become historical data and whether it belongs to a specific machine context.',
+      example: 'Persist raw machine events for later analysis and link the adapter to a specific filling machine asset.',
+    },
+    {
+      title: 'Lifecycle management and code export',
+      text: 'Operate adapters over time and turn validated UI setups into repeatable automation.',
+      example: 'A team edits a running adapter after a schema change and exports the working definition for another environment.',
+    },
+  ]}
+/>
+
+## How connecting data works
+
+Connecting data in StreamPipes follows a consistent workflow, independent of the underlying protocol or source type.
+
+### 1. Select an adapter
+
+The process starts in the adapter catalog.
+This view lists the adapters that are currently available in the installation and lets users filter for the right source type.
+
+An adapter represents the integration logic for a certain class of source system.
+Some adapters target common transport layers or message-based interfaces, while others target more specific machine or device integrations.
+
+The goal of this step is simple: choose the adapter that best matches the source you want to connect.
+
+<UseCaseExample title="A typical first decision">
+  A team wants to onboard one new machine feed. They do not start by thinking about downstream pipelines yet. They start by choosing the adapter that best matches the source they already have, because that determines the configuration options and the sample data StreamPipes can inspect next.
+</UseCaseExample>
+
+<img className="docs-image" src="/img/03_use-connect/01_connect-overview.png" alt="StreamPipes Connect adapter catalog"/>
+
+### 2. Configure source settings
+
+After selecting an adapter, StreamPipes opens a guided configuration flow.
+The first step is **Settings**.
+
+Here, you provide the source-specific connection parameters required by the selected adapter.
+Depending on the adapter, this can include endpoint details, authentication information, polling behavior, file settings, or format-specific options.
+
+For adapters that support multiple payload formats, StreamPipes also includes the format-related configuration as part of this stage.
+The exact fields differ by adapter, but the purpose stays the same: define how StreamPipes should connect to the source and read events from it.
+
+Example: imagine a team receives machine events from a broker in CSV format.
+In this step, they would define where the source is located, how StreamPipes should access it, and how the incoming payload should be interpreted before any schema work begins.
+
+<img className="docs-image" src="/img/03_use-connect/06_connect-create.png" alt="StreamPipes Connect adapter settings"/>
+
+<DocVisualPlaceholder
+  title="Adapter settings step"
+  purpose="Show current adapter-specific configuration fields together with the stepper to make the guided setup flow visible."
+/>
+
+### 3. Inspect and shape the incoming event structure
+
+The second step is **Configure schema**.
+At this point, StreamPipes uses the provided adapter settings to work with sample events from the source.
+
+This step supports several important tasks:
+
+* loading or refreshing a sample event
+* previewing the raw incoming payload
+* uploading a sample event when needed
+* running optional transformation scripts on the sample
+* comparing input and transformed output before the adapter is created
+
+This is where StreamPipes starts turning source-specific payloads into platform-ready event structures.
+Instead of blindly ingesting data, users can validate whether the input looks correct before continuing.
 
-The screenshot below illustrates the data marketplace, which shown after navigating to "StreamPipes Connect" and then clicking the "New adapter" button at the top.
+Example: if a machine emits timestamps in a custom field such as `input_timestamp`, users can inspect a sample event, test a transformation script, and verify the output before the stream is created.
 
-<img className="docs-image" src="/img/03_use-connect/01_connect-overview.png" alt="StreamPipes Connect Overview"/>
+<img className="docs-image" src="/img/03_use-connect/02_customize-format.png" alt="StreamPipes Connect schema configuration"/>
 
-## Connecting new data sources
+#### Using script-based transformations
 
-### Data Marketplace
-The data marketplace shows a list of all adapters that are currently installed in Apache StreamPipes. Each adapter offers various configuration options which depend on the specifics of the adapter.
-Adapters are distinguished a) by the data source concept they provide (data set or data stream) and b) the adapter type, where we distinguish between _generic adapters_, which usually implement a generic communication protocol such as MQTT or Apache Kafka or a specific sensor interface (e.g., for Netio power sockets).
-Several filter options are available to find a suitable adapter. The configuration of a new adapter starts with selecting one of the available adapters, which starts an assistant that supports the adapter generation.
+The transformation editor is the place where users can modify incoming events before they are turned into the final StreamPipes event structure.
+This is useful when the source payload is close to what you need, but not yet ready for reuse.
 
-### Protocol/Basic Settings
-In the first step, basic configurations need to be provided. For instance, for an Apache PLC4X adapter, the IP address of the PLC needs to be provided. In this example, we provide basic settings for connecting to an Apache Kafka broker. After all values are provided, the "Next" button opens the next step. 
+Typical reasons to use the editor include:
 
-<img className="docs-image" src="/img/03_use-connect/06_connect-create.png" alt="StreamPipes Connect Basic Settings"/>
+* parsing timestamps from custom source fields
+* renaming or dropping fields before they appear in the final schema
+* reshaping payloads into a cleaner output structure
+* deriving calculated values from raw source data
 
-### Format Specification
-The next step, format generation, is only available for generic adapters which support different message formats to be sent over the corresponding protocol. Think of a message broker that is able to consume messages in both JSON format or binary format.
-Currently supported formats include XML, various JSON representations, images and CSV. After a format has been selected, further format configurations can be provided (depending on the selected format) to further customize the incoming message format.
+The editor can be enabled directly in the schema step.
+Once enabled, StreamPipes shows:
 
-<img className="docs-image" src="/img/03_use-connect/02_customize-format.png" alt="StreamPipes Connect Format Selection"/>
+* a source preview with the incoming event
+* a code editor for the transformation script
+* a result preview with the transformed event
 
-### Schema Editor
-In the next step, based on the previously provided protocol and format settings, the system will either provide the fixed/pre-defined schema of the adapter or, in case of specific adapters, will connect to the underlying system and try to listen for incoming data. After a few seconds, the schema editor will appear that provides a list of detected fields from the incoming events (the schema).
+This setup is designed for iterative work: inspect a sample, edit the script, run it, and compare input and output until the structure looks correct.
 
-<img className="docs-image" src="/img/03_use-connect/03_schema-editor.png" alt="StreamPipes Connect Schema Editor"/>
+##### Supported languages
 
-In the toolbar, several configuration options are available which transform the original schema:
+The available script languages depend on the transformation engines installed in the StreamPipes environment.
+In the current StreamPipes source code, the transformation layer supports at least:
 
-* **Add Nested Property**. This option allows to modify the structure of the event by creating a nested structure. The schema can be simply changed by dragging and dropping fields into the nested structure.
-* **Add Static Value**. This option allows to add a field containing a static value (e.g., an identifier) to the event.
-* **Add Timestamp**. This options appends the current timestamp to each incoming event, useful in case the timestamp is not provided by the origin.
-* **Refresh**. Re-triggers the schema guessing.
-* **Delete field**. Select one or more fields by clicking the checkbox on the right and trigger the delete button.
-* **Property scope**. For each field, a property scope can be defined which is either _Measurement_, _Dimension_ or _Header_. These values are later be used in the pipeline editor to assist in configuring pipeline elements and do not have any functional consequence. 
-Use _Measurement_ to indicate the field measures a value (e.g., a temperature value from a sensor), use _Dimension_ for any identifier (e.g., the sensor ID) and use _Header_ for any other metadata such as timestamps.
+* **JavaScript**
+* **Groovy**
 
-For each field (also called event property) of the schema, additional configuration options are available by clicking the _Edit_ button:
+If multiple languages are available in your installation, the editor lets you switch between them from the language menu.
+When you switch languages, StreamPipes loads the default template for that language.
 
-* **Label**. Used to provide a human-readable label for the field, which will ease the identification of fields when building pipelines.
-* **Runtime Name.** This is the identifier of the field in the underlying message representation format (e.g., the JSON key). Renaming the runtime name will trigger a so-called _transformation rule_ which renames the incoming field name to the new field name before forwarding it to StreamPipes.
-* **Domain Property/Semantic Type**. To help StreamPipes better understand the value which is represented by the field, semantic type information can be given. Up from StreamPipes 0.68.0, the semantic type can be selected from a wide range of available options. Additionally, an URL can be manually provided that indicates the meaning of the value (e.g., http://schema.org/Temperature).
-* **Mark as Timestamp**. Indicates that the selected value represents a timestamp. When selected, a _timestamp converter_ can be configured which will convert incoming timestamps to the UNIX timestamp.
-* **Runtime Type**. Here, the data type can be changed  
-* **Unit**. Allows to specify the unit in which the value is measured. Once selected, you can also automatically convert the unit to a target unit, which will then be inserted into the data stream produced by the adapter (see screenshot below). 
+##### JavaScript skeleton
 
-<img className="docs-image" src="/img/03_use-connect/04_schema-editor-conversion.png" alt="StreamPipes Connect Unit Conversion"/>
+For JavaScript, the default script looks like this:
 
-Assigning a timestamp is mandatory and can be either done by adding a timestamp from the menu, or by choosing an existing field and marking it as timestamp.
+```javascript
+function transform(event, out, ctx) {
+  // You can use utils like utils.addTimestamp(event) for basic transformations
+  // To access the StreamPipesClient use ctx.client()
+  out.collect(event);
+}
+```
+
+The parts of this skeleton are:
+
+* `event`: the current input event as key/value data
+* `out`: the output collector used to emit transformed events
+* `ctx`: a context object that provides access to the StreamPipes client
+* `out.collect(event)`: emits the event that should become the transformation result
+
+If you keep the script unchanged, the event is passed through as-is.
+If you modify the event or construct a new object before calling `out.collect(...)`, the output preview and final schema will reflect those changes.
+
+##### Groovy syntax
+
+If Groovy is available, the default script is more compact:
+
+```groovy
+out.collect(input)
+```
+
+In Groovy, the current event is available as `input`.
+The same basic idea applies: modify the input or construct a new output object, then emit it through `out.collect(...)`.
+
+##### What users typically change in the script
+
+Most transformation scripts are short and focused.
+Typical patterns include:
+
+* **pass through the original event**
+
+```javascript
+function transform(event, out, ctx) {
+  out.collect(event);
+}
+```
+
+* **emit a cleaned-up event with renamed fields**
+
+```javascript
+function transform(event, out, ctx) {
+  out.collect({
+    machineId: event.machine,
+    temperature: event.sensor_value,
+    timestamp: event.ts,
+  });
+}
+```
+
+* **parse a timestamp before continuing**
+
+```javascript
+function transform(event, out, ctx) {
+  utils.parseTimestamp(event, "input_timestamp", "timestamp");
+  out.collect(event);
+}
+```
+
+* **derive new values**
+
+```javascript
+function transform(event, out, ctx) {
+  out.collect({
+    sensor: event.sensor,
+    temperatureF: (event.temperatureC * 9 / 5) + 32,
+  });
+}
+```
+
+##### Built-in helpers and editor support
+
+The transformation editor includes built-in documentation and helper functionality.
+From the current UI and source code, users can rely on:
+
+* **editor autocomplete** for available event field names
+* **`utils.addTimestamp(...)`** to add a timestamp field
+* **`utils.rename(...)`** to rename a field
+* **`utils.remove(...)`** to remove a field
+* **`utils.parseTimestamp(...)`** to convert source date fields into epoch timestamps
+* **`ctx.client()`** to access StreamPipes client APIs from inside the script
+
+This means the script editor is not only a raw code field.
+It is a supported transformation environment for practical preprocessing tasks.
+
+##### When to use scripts vs. field configuration
+
+Use the transformation script when the payload itself must change before StreamPipes derives the final schema.
+Use field configuration in the next step when the payload shape is already correct and you mainly want to improve metadata.
+
+As a rule of thumb:
+
+* use **scripts** for structural changes, renaming, parsing, calculated values, and event cleanup
+* use **field configuration** for labels, property scopes, timestamp marking, data types, units, and semantic enrichment
+
+##### Transformation templates
+
+The schema step also supports reusable **transformation templates**.
+These are useful when the same logic is applied to multiple adapters.
+
+A typical workflow is:
+
+1. write and test a script against a sample event
+2. save it as a transformation template
+3. apply that template in other adapters that need the same preprocessing
+
+Example: if several CSV exports from different production cells all contain the same custom timestamp field and naming scheme, a shared transformation template avoids rewriting the same script each time.
+
+### 4. Refine fields and metadata
+
+The third step is **Configure fields**.
+Here, StreamPipes exposes the resulting event schema and lets users enrich it field by field.
+At this point, the structural transformation work should already be done.
+This step is about making the resulting fields understandable and reusable across the platform.
+
+Typical refinement tasks include:
+
+* reviewing discovered event properties
+* changing data types where needed
+* marking a field as the timestamp
+* assigning labels and descriptions
+* defining property scopes such as measurement, dimension, or header
+* enriching fields with semantic meaning and units
+
+This step is critical because it determines how reusable the resulting data stream will be in the rest of the platform.
+A well-defined schema improves discoverability, validation, pipeline configuration, and downstream analytics.
+
+Assigning a timestamp is especially important, since time-aware storage, charts, and stream processing depend on it.
+
+Example: after a script has already normalized the payload, a stream might contain `temperature`, `machineId`, and `timestamp`.
+In this step, a user can mark `temperature` as a measurement, classify `machineId` as a dimension, mark `timestamp` as the event time, and attach the correct unit so later users do not have to guess what the fields mean.
+
+#### What this step is for
+
+The configure-fields step is the semantic cleanup stage of onboarding.
+The source payload already exists and the transformation script has already shaped it into the structure you want.
+Now the task is to make every field meaningful to other users and other parts of StreamPipes.
+
+This matters because the same stream will later appear in:
+
+* pipeline element configuration dialogs
+* charts and dashboards
+* historical storage and query results
+* asset-linked views and other user-facing features
+
+If the field definitions are clear here, the rest of the platform becomes easier to use later.
+
+#### Measurement, dimension, and header
+
+One of the most important decisions in this step is the **property scope** of a field.
+Property scopes help StreamPipes understand what role a field plays.
+
+In practice, the most important scopes are:
+
+* **Measurement** for actual observed or calculated values
+* **Dimension** for identifiers and contextual attributes
+* **Header** for technical or auxiliary metadata
+
+Use **Measurement** when a field represents the value you want to analyze.
+Typical examples are:
+
+* temperature
+* pressure
+* vibration
+* energy consumption
+* calculated KPIs such as average cycle time
+
+Use **Dimension** when a field helps describe where the event belongs, not what was measured.
+Typical examples are:
+
+* machine ID
+* line name
+* site
+* product type
+* batch number
+
+Use **Header** for technical metadata that is relevant for event handling, but usually not the primary subject of analysis.
+Typical examples are:
+
+* protocol metadata
+* transport-specific identifiers
+* helper timestamps that should stay available but are not the business event time
+
+This distinction mainly improves usability.
+For example, configuration and exploration views can guide users better when StreamPipes knows which fields are likely measurements and which are identifiers.
+
+To assign a property scope in the UI:
+
+1. open the **Configure fields** step
+2. locate the field you want to refine in the field list
+3. open the field editor for that property
+4. choose the appropriate property scope, such as `Measurement`, `Dimension`, or `Header`
+5. save the field configuration and verify the updated preview
+
+#### Units and unit conversion
+
+The field editor also lets users assign a unit to measurement fields and, where needed, convert it into another target unit.
+
+This is useful when:
+
+* the source already contains a physical unit, but it is not yet documented in the schema
+* different source systems report the same signal in different units
+* downstream users should work with one normalized unit across plants or machine types
+
+Example: one source reports temperature in degrees Celsius, while another team expects Fahrenheit for downstream reporting.
+Instead of forcing every downstream pipeline or dashboard to handle that conversion manually, StreamPipes can convert the field during onboarding so the resulting stream is already normalized.
+
+The practical workflow is:
+
+1. identify the field as a measurement
+2. open the field editor dialog for that property
+3. assign the source unit
+4. optionally define the target unit for conversion
+5. save the field configuration and review the resulting preview/schema
+
+This improves consistency across streams and reduces repeated conversion logic in later pipelines.
+
+In other words, unit conversion is configured per field, inside the field dialog.
+Users do not configure it globally for the whole adapter.
+
+#### Timestamp handling in this step
+
+This is also the step where a field is marked as the event timestamp if it was not already created in a transformation script.
+The timestamp field should represent the business time of the event whenever possible, not only the ingestion time.
+
+For example:
+
+* use the machine-provided event time when the source contains one
+* use an added timestamp during onboarding when the source has no reliable timestamp of its own
+
+This distinction becomes important for historical storage, charts, and any analysis that depends on the real event order.
+
+To mark a field as the timestamp in the UI:
+
+1. open the field editor for the field that represents event time
+2. enable the timestamp option for that field
+3. if needed, configure timestamp parsing or conversion so the value is stored in the expected format
+4. save the field and confirm that the stream now has a valid timestamp before moving on
+
+<img className="docs-image" src="/img/03_use-connect/03_schema-editor.png" alt="StreamPipes Connect field configuration"/>
+
+<img className="docs-image" src="/img/03_use-connect/04_schema-editor-conversion.png" alt="StreamPipes Connect field metadata and unit conversion"/>
+
+### 5. Create and start the adapter
+
+The final step is **Start adapter**.
+This is where the configured ingestion setup becomes a managed platform resource.
+
+At this stage, the connection details, transformation logic, and field definitions are already in place.
+The remaining task is to decide how the adapter should appear and behave once it becomes part of the running platform.
+
+In this step, users can:
+
+* define the adapter name and description
+* choose whether the adapter should start immediately
+* optionally link the adapter to one or more assets
+* optionally persist incoming events in the internal data store
+* enable event-rate reduction or duplicate filtering
+* inspect the generated adapter definition as code
+
+Once created, the adapter starts producing a data stream that becomes available throughout StreamPipes.
+From there, the stream can be used in pipelines, dashboards, charts, or other downstream workflows.
+
+Example: a production engineer may start the adapter immediately for live monitoring, while a data team may also enable persistence so the same source is available later for historical analysis.
+
+#### Name and description
+
+Every adapter should be given a clear name and, ideally, a short description.
+This matters because adapters become long-lived platform resources that appear in operational views and may later be edited, linked to assets, or reused by other teams.
+
+A good name usually identifies:
+
+* the source or machine
+* the signal or purpose
+* optionally the location or environment
+
+Example: `Filling Line 2 - Temperature Stream` is more useful than `Adapter 1`.
+
+#### Start adapter now
+
+The **Start adapter now** option determines whether the adapter should begin consuming data immediately after creation.
 
-### Adapter Generation
-Finally, the adapter is ready to be started. In the _Adapter Generation_ page, a name and description for the resulting data stream must be provided.
-Once started, StreamPipes creates your new adapter and displays a preview of the connected data, which refreshes about once per second.
-Afterwards, the newly created data stream is available in the pipeline editor for further usage.
+Use this option when:
 
-<img className="docs-image" src="/img/03_use-connect/05_adapter-generation.png" alt="StreamPipes Connect Adapter Generation"/>
+* the source is ready and reachable
+* you want to validate live operation right away
+* downstream users or pipelines should consume the stream immediately
 
-## Managing adapters
+Leave it disabled when:
 
-Currently running adapters are available in the "Running adapters" section of StreamPipes Connect. Existing adapters can be stopped and deleted. Currently, there is no mechanism to edit an existing adapter or to stop the adapter without deleting it.
+* the adapter is being prepared ahead of a go-live
+* source access is not yet available
+* you want to finish organizational steps, such as asset linking or permissions, before starting ingestion
 
-### Adapter Templates
-For frequently used configurations, adapter templates can be created. An adapter template is a pre-configured adapter which can be further customized by users. Created adapter templates are available in the marketplace similar to standard adapters.
+In practice, this option lets users decide whether the current task is “define the adapter” or “define and activate the adapter”.
 
+#### Add to Asset
 
-In Apache StreamPipes, adapters are typically created via the web interface.
-However, it is possible to create adapters programmatically using a compact YAML format and the StreamPipes REST API.
-Programmatic creation of adapters can be a useful feature in cases where many similar adapters have to be created.
-In this case, an externally managed YAMl file containing the full adapter configuration can be used and modified.
+If asset management is used in the installation, the adapter can be linked directly to one or more assets in this step.
+This is useful when the source belongs to a known machine, line, site, or other operational object.
 
-## Introduction
+Use asset linking when you want to:
 
-In StreamPipes, adapters are responsible for collecting data from various industrial data sources.
-While the UI simplifies this process, you can also manage adapters programmatically for better automation, integration with CI/CD pipelines, or infrastructure-as-code practices.
+* make the source easier to discover from the asset view
+* connect machine context and data source management
+* help users navigate from operational structure to the related adapters and streams
 
-This guide demonstrates how to define and create adapters using a YAML format and StreamPipes REST API, offering more flexibility to manage adapters programmatically.
+Example: when onboarding a vibration source for a motor, link the adapter directly to that motor asset so users can find the source from the operational context instead of only from the adapter list.
 
-## Adapter YAML Structure
+#### Persist events
 
-An adapter in StreamPipes can be defined using a YAML file, which contains a compact description of the adapter configuration.
-The basic structure of the YAML format for an adapter definition includes:
+The **Persist events** option stores all incoming events of this source in the internal data store.
+This is one of the most important decisions in the start step because it affects whether the source is used only for live processing or also for historical analysis.
 
-- **Name**: The name of the adapter.
-- **ID**: A unique ID for the adapter
-- **Description**: An additional description of the adapter
-- **AppID**: The adapter type
-- **Configuration**: Configuration details such as connection details, polling intervals, data format, and more
-- **Schema**: Schema refinements, e.g., additional label, description, semantic type and property scope
-- **Enrich**: Enrichment rules. Currently, only timestamp enrichment rules are supported in the YAML specification
-- **Transform**: Transformation rules. Currently, rename and measurement unit transforms are supported.
-- **CreateOptions**: Additional operations that are executed upon adapter generation.
+Use persistence when:
 
-Here’s a sample structure to define an OPC-UA adapter:
+* the source should be available in charts later
+* historical inspection or trend analysis is required
+* teams want to reuse the stream beyond live processing only
+
+When persistence is enabled, users also select the time field that should be used for storage.
+In most cases, this should be the business event timestamp that was defined earlier in the onboarding flow.
+
+Example: persist a machine status or process-value stream when quality or maintenance teams need to inspect past behavior, not only live events.
+
+#### Remove duplicates
+
+The **Remove duplicates** option helps when a source sends the same event repeatedly within a short interval.
+In this case, StreamPipes can suppress duplicate events inside a configured time window.
+
+Use this option when:
+
+* a device republishes unchanged values frequently
+* identical events would create unnecessary load in downstream systems
+* duplicates would make charts or event-driven logic harder to interpret
+
+The time window is configured in milliseconds.
+Within that interval, repeated identical events can be filtered before they are emitted further into the platform.
+
+Example: if a device sends the same machine status message many times in a few seconds, duplicate filtering can reduce noise before the data reaches storage or alerting logic.
+
+#### Reduce event rate
+
+The **Reduce event rate** option helps when the source sends events much faster than downstream users actually need.
+Instead of forwarding every event, StreamPipes can limit the emitted rate based on a configured time window.
+
+Use this option when:
+
+* a source publishes high-frequency values but dashboards only need a coarser stream
+* downstream systems should be protected from unnecessary volume
+* the live stream is useful, but not every raw event must be preserved in real time
+
+The time window is configured in milliseconds.
+This is especially useful for visualization-heavy scenarios where the source frequency is technically valid but operationally excessive.
+
+Example: a sensor may publish updates several times per second, while a dashboard only needs one representative event every few seconds.
+
+#### Show code
+
+The **Show code** option exposes the generated adapter definition in a programmatic form.
+This is useful for teams that want to move from interactive setup to repeatable deployment.
+
+Use this option when:
+
+* you want to inspect how the current adapter is represented internally
+* you want to reuse the configuration in another environment
+* the adapter should later be created through the API or automation
+
+In practice, this option bridges interactive onboarding and infrastructure-style reuse.
+
+#### How to use this step in the UI
+
+A common workflow in the final step is:
+
+1. enter a clear adapter name and description
+2. decide whether the adapter should start immediately
+3. optionally link it to the relevant asset
+4. decide whether the stream should also be persisted historically
+5. optionally enable duplicate filtering or event-rate reduction if the source behavior requires it
+6. optionally inspect the generated code before finishing
+7. create or update the adapter
+
+This is the point where StreamPipes turns a tested source configuration into an operational data source.
+
+<img className="docs-image" src="/img/03_use-connect/05_adapter-generation.png" alt="StreamPipes Connect start adapter configuration"/>
+
+:::info Suggested image placeholder
+**Image idea:** Current final step screenshot showing name, start option, persistence option, asset linking, and show-code option.  
+**Purpose:** Show that adapter creation includes operational decisions, not just connection details.
+:::
+
+## Transformation and schema features
+
+One of the most important strengths of StreamPipes Connect is that source onboarding does not stop at connectivity.
+Before an adapter is created, users can actively shape the incoming data so that it fits the platform better.
+
+The current feature set includes:
+
+* **script-based transformations** for custom event reshaping
+* **template-based script reuse** for recurring transformation logic
+* **schema refresh** when the source configuration changes
+* **event preview before and after transformation**
+* **timestamp selection and conversion**
+* **unit and metadata refinement** at field level
+
+This makes Connect useful even when the incoming source format is technically valid but not yet ready for reuse across teams or use cases.
+
+Two common examples are:
+
+* a source provides timestamps in a custom text format, so a transformation script parses the original field and writes a normalized event time before the data enters StreamPipes
+* a source provides temperatures in degrees Celsius, but a downstream team expects Fahrenheit, so the field configuration applies a unit conversion before the stream is used elsewhere
+
+In addition, templates help in two different places:
+
+* **configuration templates** in the settings step help you reuse adapter setup values
+* **transformation templates** in the schema step help you reuse tested preprocessing scripts
+
+This distinction is useful in practice:
+
+* save a **configuration template** when many sources share the same connection shape
+* save a **transformation template** when many sources share the same payload cleanup logic
+
+## Managing adapters after creation
+
+Connect is also the operational workspace for adapters after they have been created.
+The adapter overview shows all configured adapters and provides lifecycle and monitoring features.
+
+Users can:
+
+* start and stop adapters
+* inspect adapter details
+* edit adapter configurations
+* update schemas after configuration changes
+* migrate dependent pipelines when an edited adapter affects downstream logic
+* delete adapters
+* manage permissions
+* run bulk actions on multiple adapters
+* review basic runtime indicators such as message counts and last message timestamps
+
+This is important because data ingestion is rarely static.
+Machine interfaces change, schemas evolve, and downstream consumers need a controlled way to adapt.
+Connect therefore supports not only initial onboarding, but also ongoing maintenance.
+
+Example: if a source system adds or renames fields, the adapter can be edited, the schema can be refreshed, and dependent pipelines can be migrated instead of being manually rebuilt from scratch.
+
+:::info Suggested image placeholder
+**Image idea:** Screenshot of the adapter table with status, message count, last message, and action menu.  
+**Purpose:** Show that Connect includes runtime operations and governance after setup.
+:::
+
+## How Connect fits into the broader platform
+
+Once an adapter is running, the resulting data stream becomes a reusable platform resource.
+That means connected data can immediately be used in other areas of StreamPipes:
+
+* in **Pipelines** for filtering, enrichment, analytics, and routing
+* in **Charts** and dashboards for visualization
+* in **Assets** to tie machine data to operational context
+* in the internal data store for historical access
+
+This is why Connect should be understood as the ingestion layer of the overall StreamPipes data platform.
+Its role is not only to establish connectivity, but to create well-structured, governed, and reusable industrial data sources.
+
+Example: a vibration stream connected in Connect can later be persisted for trend analysis, linked to a specific motor asset, visualized in a dashboard, and reused in a pipeline that detects threshold violations.
+
+## Adapters as code
+
+Although adapters are usually created through the UI, StreamPipes also supports a compact programmatic representation for API-based deployment.
+This is useful when adapter creation should be automated or repeated across environments.
+
+Typical use cases include:
+
+* creating many similar adapters from managed configuration files
+* promoting tested adapter definitions from development to production
+* integrating adapter deployment into CI/CD or infrastructure automation
+
+### How the UI and code workflow fit together
+
+The easiest way to produce a valid adapter definition is the UI itself.
+In the final **Start adapter** step, the **Show code** option exposes the generated adapter definition in a compact form.
+
+This is the recommended workflow:
+
+1. configure and validate the adapter interactively in the UI
+2. use **Show code** to inspect the generated definition
+3. export or copy that definition
+4. reuse it through the API in another environment or deployment workflow
+
+This works well because the UI already performs the difficult parts of onboarding: connection setup, schema inspection, field refinement, and transformation testing.
+
+### What the compact adapter definition contains
+
+The compact representation describes the adapter in a way that is easier to manage programmatically than the full internal model.
+It typically contains:
+
+* adapter identity such as `name`, `id`, and `appId`
+* source-specific `configuration`
+* `schema` refinements for fields
+* `transform` logic such as renaming or unit conversion
+* `enrich` options such as adding timestamps
+* `createOptions` such as whether the adapter should start immediately or persist data
+
+In practice, it captures the same decisions users make in the UI, but in a portable text format.
+
+### Example adapter definition
 
 ```yaml
 name: My OPC Adapter
@@ -113,8 +722,8 @@ configuration:
     pulling_interval: 1000
   - access_mode: UNAUTHENTICATED
   - available_nodes:
-    - "ns=2;s=Leakage Test Station/temperature"
-    - "ns=2;s=Leakage Test Station/pressure"
+      - "ns=2;s=Leakage Test Station/temperature"
+      - "ns=2;s=Leakage Test Station/pressure"
 
 schema:
   temperature:
@@ -135,88 +744,42 @@ createOptions:
   start: true
 ```
 
-## Programmatically creating adapters
-
-Here is a walkthrough to create an adapter programmatically over the API:
-
-### Background: Internal adapter generation process
-
-The YAML definition file is a more compact notation of StreamPipes internal data format to represent an adapter.
-When creating an adapter over the user interface, StreamPipes requires some basic, adapter-specific settings.
-Afterwards, a `Guess Schema` step is executed. In this step, StreamPipes connects to the underlying data sources, receives some samples of live data, determines the exact schema of the data stream and provides user with the source schema.
-This schema can be further refined using `Transformation Rules`.
-
-When an adapter is created using the more compact YAML notation, the same process is applied. Based on the provided configuration, the API connects to the given data source and determines the schema.
-The transformation rules provided in the YAMl definition are then applied on the original schema.
-Therefore, it is important that the provided schema refinement and transformation steps fit the original schema.
-
-### Getting a valid definition file
-
-The easiest way to create a valid YAML file is the user interface. Within the StreamPipes Connect view, it is possible to export the YAML definition for all existing adapters.
-In addition, the adapter generation wizard also offers the option to view the adapter configuration before creating the adapter by clicking the `Code` checkbox:
-
-<img className="docs-image" src="/img/03_use-programmatically-create-adapters/01_adapter-generation-code.png" alt="StreamPipes Adapter Code View"/>
+This example shows the general structure, not a recommended protocol-specific setup for every case.
+The exact configuration keys depend on the selected adapter type.
 
-Another option is to open the adapter details view:
+### API endpoint
 
-<img className="docs-image" src="/img/03_use-programmatically-create-adapters/02_adapter-details-view-code.png" alt="StreamPipes Adapter Details Code View"/>
+To create a compact adapter over the API, send the definition to:
 
-You can copy this definition and modify it according to your needs.
-
-#### Configuration
-
-For each configuration option in the user interface, there is a mapping to the YAMl definition.
-
-A configuration value is a key/value pair, where the key corresponds to the internal name of the configuration and the value depends on the configuration type.
-
-#### Schema
-
-Schema definitions enhance the metadata of each field from the input stream.
-The following configurations are supported:
-
-* `label` to add an additional (human-readable) label to the field
-* `description` for an additional description
-* `propertyScope` to determine the type of the field (HEADER_PROPERTY, DIMENSION_PROPERTY or MEASUREMENT_PROPERTY)
-* `semanticType` to provide the semantic type of the field (e.g., `https://schema.org/temperature`)
-
-#### Enrich
-
-* `timestamp` defines that an additional field named timestamp is added to each incoming event containing the ingestion time as a UNIX timestamp.
-
-#### Transform
-
-Currently, the following transforms are supported:
-
-* `rename` defines renaming of individual fields from the input stream. A valid configuration consists of a key/value pair, where the key indicates the original field name and the value the target field name.
-* `measurementUnit` defines a value transformation between measurement units. A valid configuration consists of a key/value pair, where the key indicates the field name and the value the target measurement unit.
-
-#### CreateOptions
-
-Currently, two settings can be provided in the `CreateOptions` section:
-
-* `persist` indicates whether the data stream produced by the adapter should also be stored. In this case, a `Persist Pipeline` is automatically created.
-* `start` indicates whether the adapter should be immediately started after creation.
-
-### API
-
-To create a new adapter, call the StreamPipes API as follows:
-
-```
+```text
 POST /streampipes-backend/api/v2/connect/compact-adapters
-Content-type: application/yml
+Content-Type: application/yml
 Accept: application/yml
 ```
 
-You must provide valid credentials by either adding a Bearer token or an API key:
+You can also provide the specification as JSON by using `application/json`.
 
-```
+Authentication can be provided with an API user and API key:
+
+```text
 X-API-USER: your username
 X-API-KEY: your api key
 ```
 
-The body of the request should contain the YAML definition.
+### Practical advice
+
+In most cases, do not write compact adapter definitions from scratch unless you already know the exact structure.
+A better approach is:
+
+* create and verify the adapter in the UI first
+* export or inspect the generated code
+* adapt only the parts that need to vary, such as names, endpoints, or source-specific identifiers
+
+This keeps the programmatic workflow grounded in a configuration that is already known to work.
 
-:::info
-It is also possible to provide the adapter specification as a JSON document. In this case, change the `Content-type` to `application/json`.
+## What this page does not cover
 
+This page focuses on the general Connect workflow and feature set.
+It does not explain how to configure specific adapters or industrial protocols.
 
+For protocol-specific instructions, continue with the how-to guides for the relevant source type.
diff --git a/docs/04_use-dashboards.md b/docs/04_use-dashboards.md
index cd2f5818e..6efddaa10 100644
--- a/docs/04_use-dashboards.md
+++ b/docs/04_use-dashboards.md
@@ -4,63 +4,152 @@ title: Dashboards
 sidebar_label: Dashboards
 ---
 
-The live dashboard can be used to visualize live data of data streams using a set of visualizations
-The entry page of the live dashboard lists all created dashboards as in the screenshot below:
+Dashboards are the place where individual charts become a shared operational view. In the current StreamPipes product, dashboards are no longer built from a separate widget framework. Instead, they reuse the charts you already created in `Charts` and arrange them into one screen for monitoring, analysis, or presentation.
 
-<img className="docs-image" src="/img/03_use-dashboard/01_dashboard-overview.png" alt="StreamPipes Dashboard Overview"/>
+That design is important because it keeps the responsibilities clear. A chart answers one analytical question well. A dashboard combines several of those answers so a user can understand a machine, a line, or a whole process at a glance.
 
-## Visualizing Data Streams
+> [Image placeholder: dashboard overview and dashboard panel showing multiple saved charts reused in one layout]
 
-To visualize data streams in the live dashboard, a pipeline must be created that makes use of the so-called **Data Lake** sink.
-Any data stream or data processor can serve as an input of the data lake sink. Switch to the pipeline editor, create a pipeline and configure the data lake sink. The visualization name is used to identify the sink in case multiple data lake sinks are used within a single pipeline.
+## Before you build a dashboard
 
-## Managing Dashboards
-Multiple dashboards can be created, e.g., to organize different assets in a single dashboard view.
+Dashboards depend on existing charts. They do not start from raw data, and they do not replace the chart editor. That means the best dashboards are usually built from charts that have already been validated carefully: the dataset is correct, the query makes sense, and the visualization already communicates something useful on its own.
 
-A new dashboard can be created by clicking the _New Dashboard_ button, which opens a dialog that requires basic dashboard settings such as the title and description of the new dashboard.
-Once created, the dashboard will be shown in the overview. Here, the following dashboard actions are available:
+If no charts exist yet, the dashboard editor will simply show an empty chart-selection state. This is not a limitation so much as a design principle. It keeps dashboards focused on composition and monitoring instead of turning them into a second chart-builder.
 
-* **Show** opens the dashboard.
-* **Window** opens the dashboard in a new window with reduced controls, e.g., without the StreamPipes navigation and toolbar. This is a useful view for standalone displays that should visualize key parameters.
-* **Settings** allows to modify the basic dashboard settings. 
-* **Edit** opens the dashboard in edit mode, where widgets can be added to the dashboard.
-+ **Delete** deletes the selected dashboard.
+## Understand the current dashboard model
 
-## Creating Visualizations
+The central idea is that each dashboard item references a saved chart. A dashboard therefore does not duplicate the data logic of that chart. It embeds and reuses it.
 
-Visualizations can be added to each dashboard in form of widgets. To add new visualizations, switch to the dashboard in _Edit_ mode.
-In edit mode, a button appears that allows to add a new visualization.
+This has practical advantages. One chart can be reused in several dashboards. A change to the chart definition improves every place where that chart is used. And the dashboard itself stays easier to maintain because it is concerned mainly with layout, time coordination, visibility, and operational context.
 
-Adding a new visualization is supported by a wizard consisting of three steps:
+A good example is a compressor temperature chart. That same chart can be useful in an asset-specific dashboard, a maintenance dashboard, and a broader operations dashboard. The query does not need to be rebuilt three times. Only the surrounding context changes.
 
-<img className="docs-image" src="/img/03_use-dashboard/02_add-widget.png" alt="StreamPipes Dashboard Pipeline Selection"/>
+## Start from the dashboard overview
 
-* **Select pipeline** is the first step where a pipeline is selected on which the visualization is based. In this view, all pipelines are listed that have at least one **Dashboard Sink**. In case a pipeline contains multiple data lake sinks, the visualization name is listed below the pipeline name which eases discovering of the proper visualization.
-* **Select widget** is the next step where the visualization widget must be selected. StreamPipes automatically filters this list based on input requirements of widgets. For instance, image visualizations are only visible if the input data stream provides an image object.
-* **Configure widget** provides widget-specific settings to configure the visualization. In most cases, colors and titles of widgets can be modified. Additionally, chart-specific settings such as axis value ranges can be configured.
+Open `Dashboards` to reach the overview. This is the place where you manage existing dashboards and decide whether you want to open, edit, copy, or share one.
 
-<img className="docs-image" src="/img/03_use-dashboard/03_configure-widget.png" alt="StreamPipes Dashboard Widget Configuration"/>
+Each dashboard entry can be opened directly, and the action menu provides the most important operations: `Show`, `Edit`, `Clone`, `Kiosk mode`, `Settings`, `Manage permissions`, and `Delete`. The overview also shows basic metadata such as the dashboard name, description, creation date, last modification date, and asset context when assets are used.
 
-By clicking _Create_, the new widget is placed on the canvas. Size and positioning of visualizations can be flexibly changed based on the provided grid. To change the widget configuration, the _Settings_ button of each widget can be clicked to re-open the configuration dialog.
+From a documentation perspective, it helps to think of the overview as the management layer and the dashboard panel as the runtime layer. The overview is for deciding which dashboard you want to work with. The panel is where the dashboard actually lives.
 
-Once created, the dashboard provides a live view of all visualizations:
+## Create the dashboard shell first
 
-<img className="docs-image" src="/img/03_use-dashboard/04_live-dashboard.png" alt="StreamPipes Live Dashboard"/>
+To create a dashboard, open `Dashboards` and click `New dashboard`. Before you place any charts, StreamPipes opens the dashboard settings dialog. This is the moment where you define what kind of screen the dashboard is supposed to become.
 
+The settings dialog starts with the obvious fields: `Dashboard title` and `Description`. Those matter more than they sometimes seem to. A dashboard is often consumed by users who did not build it, so a clear title and short description help set expectations immediately.
 
-Before the dashboard is closed, make sure to click the _Save_ button to persist the updated dashboard. Changes can be discarded by clicking the _Discard_ button.
+From there, the more structural decisions follow: `Default view mode`, `Grid columns`, `Grid row height (px)`, `Use global time settings instead of chart time settings`, and `Hide chart toolboxes in this dashboard`. If you have asset permissions, you can also add the dashboard to an existing asset directly from this dialog.
 
+> [Image placeholder: dashboard settings dialog with title, description, view mode, grid configuration, global time, toolbox setting, and asset link option]
 
-## Available widgets
+## Decide how the dashboard should be read
 
-The following visualizations are available in the latest release:
+One of the first meaningful choices is the default view mode. StreamPipes currently supports `Grid view` and `Slide view`, and they correspond to two different reading experiences.
 
-* Area Chart
-* Gauge
-* HTML page (renders HTML markup)
-* Image  
-* Line Chart
-* Raw (displays the raw JSON input for debugging purposes)
-* Single Value (displays a single measurement)
-* Table
-* Traffic Light
+`Grid view` is the familiar operational dashboard. Several charts are visible at once, and the viewer can compare them side by side. This is the right mode when correlation matters. A production-line dashboard, for example, may show throughput, energy, alarms, and machine status together because the viewer should be able to connect those signals quickly.
+
+`Slide view` changes that reading pattern. Instead of showing many charts simultaneously, it presents them one at a time. This is useful when screen space is limited, when each chart deserves more space, or when the dashboard is intended for sequential presentation rather than parallel monitoring. A meeting-room screen or a narrow kiosk display is often a better fit for slides than for a dense grid.
+
+Neither mode is inherently better. The better mode is the one that matches the audience and the screen. If users need cross-comparison, use grid view. If they need focus and readability, slide view is often the better choice.
+
+## Shape the layout to the screen
+
+The layout settings, especially `Grid columns` and `Grid row height (px)`, are what make the dashboard feel appropriate for its target display.
+
+More columns allow denser horizontal placement. A larger row height gives charts more vertical room and often improves readability for larger trend views. This is not just cosmetic tuning. It changes whether a dashboard feels like a cramped collection of cards or a deliberate operational screen.
+
+When deciding these values, think about the actual environment in which the dashboard will be used. A wallboard for a production area needs different proportions than a desktop dashboard used by an engineer. A dashboard full of compact KPI tiles benefits from a different grid than one that contains two or three large trend charts.
+
+## Decide whether time should be shared
+
+The setting `Use global time settings instead of chart time settings` is one of the most important design choices in the entire dashboard.
+
+When global time is enabled, the dashboard behaves like one coordinated analytical view. All charts follow the same time window, and the toolbar can expose one shared time selector for the whole screen. This is often what users expect from a shift dashboard or an operations dashboard. They want all charts to answer the same time-scoped question.
+
+When global time is disabled, each dashboard item can keep the time settings of its saved chart. This is useful when the dashboard intentionally mixes horizons. One chart might show the last 15 minutes of alarms, another the last 24 hours of throughput, and another the last 7 days of energy consumption. In that case, a single shared time range would actually reduce clarity.
+
+The rule of thumb is simple: if the dashboard is meant to tell one coordinated story about one time window, use global time. If the dashboard is meant to combine short-term and long-term views intentionally, keep chart-level time.
+
+## Decide how much chart-level UI should remain visible
+
+The option `Hide chart toolboxes in this dashboard` determines whether the embedded charts keep their own toolboxes when viewed inside the dashboard.
+
+This has a strong effect on the feel of the final screen. Leaving the toolboxes visible makes the dashboard more interactive and locally inspectable. Hiding them makes it calmer and more presentation-oriented. For operator displays, wallboards, and kiosk-style screens, hiding the toolboxes is often the cleaner choice. For engineering or analysis workstations, keeping them visible may be more helpful.
+
+## Add the dashboard to an asset when context matters
+
+If assets are used in your installation and you have the right permissions, the settings dialog lets you attach the dashboard to an existing asset. This is valuable when the dashboard belongs clearly to one machine, one line, one site, or one equipment hierarchy.
+
+Attaching the dashboard to an asset is not just an organizational detail. It changes how users discover the dashboard. Instead of navigating to it only from the dashboard overview, they can also reach it from the asset context where it often makes more sense operationally.
+
+## Open the dashboard and understand the panel
+
+Once created, a dashboard opens in the dashboard panel. This is the runtime surface where the charts are actually shown and where most users will spend their time.
+
+The toolbar is small, but it defines how the dashboard behaves. In edit mode, it shows `Save` and `Discard`. In both edit and view mode, it lets you switch between `Grid` and `Slides`. If global time is enabled, it can show the shared time selector. It also provides access to the dashboard live refresh settings and an options menu for actions such as `Edit dashboard`, showing or hiding the time selector, and deleting the dashboard.
+
+This split between the panel and the settings dialog is useful. Settings define what the dashboard should be. The panel is where users experience that decision in practice.
+
+> [Image placeholder: dashboard panel with toolbar, time selector, options menu, chart canvas, and right-side chart selection panel in edit mode]
+
+## Move into edit mode when the composition should change
+
+To change the content or layout of a dashboard, open it and switch into edit mode. You can do that either from the overview or from the dashboard panel itself through the options menu.
+
+In edit mode, the dashboard becomes a composition surface. The toolbar exposes `Save` and `Discard`, and the right-side chart-selection panel becomes available. This is the current mechanism for building the dashboard body.
+
+The panel itself is intentionally simple. It lists the saved charts that can be reused. If the panel is collapsed, expand it first. Then browse the chart list and add the chart you want to place on the dashboard. When you do this, StreamPipes creates a dashboard item that points to the existing chart. The chart is not copied into the dashboard as a separate analytical object.
+
+That detail matters because it explains how to maintain dashboards later. If a chart’s logic needs to change, the right fix is usually to update the chart, not to treat the dashboard item as an isolated object.
+
+## Think of dashboard design as composition, not recreation
+
+When adding charts, resist the temptation to use the dashboard as a place to “finish” unfinished chart work. A dashboard works best when each included chart is already strong on its own. The dashboard then becomes a composition task: deciding which charts belong together, how large each one should be, and what sequence or spatial arrangement makes the operational story easiest to read.
+
+In `Grid view`, this means arranging the dashboard so the most important relationships become obvious. A large trend chart with smaller KPI or status charts around it is often effective. So is a left-to-right flow that follows the physical process. The right layout depends on the mental model you want the user to apply in a few seconds.
+
+If a chart should no longer appear in the dashboard, removing it only removes the dashboard item. The underlying chart still exists in `Charts`. This is an important distinction. Changing the dashboard layout is not the same as deleting the reusable analytical building block.
+
+## Use slide view deliberately
+
+When the dashboard is shown in `Slide view`, the reading experience changes from comparison to sequence. One chart is visible at a time, and the viewer moves through the set of dashboard items more like a presentation.
+
+This is especially useful when the audience should focus on each chart individually or when the display area is too limited for several charts to stay readable at once. A narrow screen in a meeting room, a presentation monitor, or a kiosk-oriented installation can all benefit from this mode.
+
+The key is to use it intentionally. If users need to compare charts against each other constantly, slide view will frustrate them. If they need one chart at a time with maximum readability, it can be the better experience.
+
+## Coordinate time and refresh in real operation
+
+Dashboards are not only about layout. They also add an operational layer on top of charts through shared time handling and live refresh behavior.
+
+If global time is enabled, the toolbar can expose one time selector for the whole dashboard. This allows the viewer to change the time window once and immediately see every chart update into the same context. This is one of the most powerful reasons to use a dashboard instead of opening several charts separately.
+
+The options menu can also show or hide the time selector. This sounds minor, but it matters on large displays. A wallboard that should remain visually quiet may benefit from hiding it. A working dashboard used interactively by engineers may benefit from keeping it visible all the time.
+
+Live refresh is the other operational dimension. Dashboards often remain open for long periods, especially on operations screens. In those cases, automatic refresh is part of the dashboard’s usefulness, not an afterthought. A dashboard that never refreshes is more like a report. A dashboard that updates steadily is closer to a monitoring surface.
+
+## Save, clone, share, and present
+
+When you save a dashboard, StreamPipes stores the selected charts, the current layout, the chosen view mode, and the dashboard-level settings such as global time and toolbox visibility. Saving therefore preserves both structure and behavior.
+
+Cloning is useful when the current dashboard is almost right for another machine, line, or site. Instead of rebuilding it, you create a copy and change only the few charts or settings that differ. This is one of the easiest ways to build a consistent dashboard family across similar assets or production units.
+
+Permissions matter when a dashboard should be available only to certain teams, roles, or groups. This is often the right approach when the underlying charts may be broadly reusable, but the assembled dashboard should remain specific to one audience.
+
+`Kiosk mode` is best understood as a presentation-focused runtime option. Use it when the dashboard is meant for a screen that is observed rather than actively operated.
+
+## How dashboards fit into the wider workflow
+
+Charts and dashboards are tightly related, but they solve different problems. A chart answers one analytical question well. A dashboard combines several saved charts into one operational context. This is why the cleanest working style is to refine the chart first, save it, and then reuse it in one or more dashboards.
+
+If something looks wrong later, the right fix is often not in the dashboard layout at all. It is in the source chart. Once users understand that distinction, both features become much easier to use well.
+
+## Image placeholders
+
+`[Image placeholder: dashboard overview with actions for show, edit, clone, kiosk mode, settings, permissions, and delete]`
+
+`[Image placeholder: dashboard settings dialog with grid and slide options, global time, grid columns, row height, and hide-toolbox option]`
+
+`[Image placeholder: dashboard edit mode with right-side chart selection panel and a button to add saved charts]`
+
+`[Image placeholder: one dashboard shown in grid view and slide view to explain the difference between the two modes]`
diff --git a/docs/04_use-datasets.md b/docs/04_use-datasets.md
index a6ff6eb4c..922b6d5e7 100644
--- a/docs/04_use-datasets.md
+++ b/docs/04_use-datasets.md
@@ -4,205 +4,160 @@ title: Datasets
 sidebar_label: Datasets
 ---
 
+import StepFlow from '@site/src/components/docs/StepFlow.tsx';
+import UseCaseExample from '@site/src/components/docs/UseCaseExample.tsx';
+import DocVisualPlaceholder from '@site/src/components/docs/DocVisualPlaceholder.tsx';
 
-This page provides instructions on how to enable and test the Datalake retention feature. The Datalake retention feature automates the process of deleting and saving the contents of the Datalake to either a local filesystem or a cloud provider (currently, only S3-compatible providers are supported) at predefined intervals. Retention actions are carried out as scheduled CRON jobs, executing at specified times.
+A dataset in StreamPipes is stored operational data. It is the point where live machine events stop being only transient stream traffic and become something users can inspect later, analyze in charts, reuse in dashboards, export for other systems, and govern over time.
 
-## Prerequisites
+This makes datasets an important part of the platform story. Adapters and pipelines produce data in motion. Datasets represent data at rest. If you want historical analysis, auditability, exports, or chart-based exploration, you usually end up working with datasets.
 
-To use a cloud provider, you must have an existing S3-compatible provider, along with the necessary authentication key, secret, and bucket. Alternatively, you can use the test settings provided below.
+## Understand where datasets come from
 
-## Settings
+Datasets are not created in isolation. They are usually the result of one of three workflows.
 
-### Deployment Setting
+The first is live persistence. A team creates an adapter or a pipeline, enables persistence, and lets StreamPipes store the resulting events continuously. The dataset then becomes the historical record of that live source.
 
-To enable the usage of the retention feature depending on the exact setting, two environment variables need to be set during streampipes deployment.
+The second is processed persistence. A pipeline cleans, enriches, or aggregates raw input and writes the result as a dataset. In practice, these datasets are often the best source for dashboards because they already contain business-ready fields instead of raw machine payloads.
 
-```yaml
+The third is CSV import. A team already has historical data in files and wants to start with analysis immediately, even before a live connection is available.
 
-    "SP_RETENTION_LOCAL_DIR":"/output",
-    "SP_DATALAKE_SCHEDULER_CRON":"0 1 0 * * 6"
+<UseCaseExample title="Think of datasets as durable context">
+  A raw machine stream may be useful for live processing, but a persisted dataset is what lets another team come back tomorrow, open the same data again, build charts on top of it, and compare current behavior with last week.
+</UseCaseExample>
 
-```
+<DocVisualPlaceholder
+  title="Dataset overview"
+  purpose="Show how persisted adapters, persisted pipelines, and imported CSV files all result in datasets that appear in one operational workspace."
+/>
 
-The `SP_DATALAKE_SCHEDULER_CRON` environment variable defines when the CRON job will run. By default, the job runs every Saturday at 00:01 (using the cron expression "0 1 0 * * 6"). For development environments, shorter intervals are often more useful. For example, setting it to "0 */2 * * * *" will execute the job every two minutes.
+## Open the dataset workspace
 
-When using local file storage, you can specify the storage directory via the `SP_RETENTION_LOCAL_DIR` variable. If you need the data to be accessible outside the Docker container, an additional volume mapping will be required in the backend.
+Open `Datasets` from the main navigation. The table gives a compact operational view of what is stored in the system and whether the stored data is still active.
 
-```yaml
-[...]
-  backend:
-    [...]
-    volumes:
-      - ./output/:/output
+The most useful habit is to read the table as a quick health and scale view. `Name` tells you what you are looking at. `Related Pipeline` helps explain the origin or relation of the dataset. `# Events (7d)` answers whether fresh data arrived recently. `# Events (total)` tells you how large the dataset is overall. `Retention` shows whether long-term cleanup or export has been configured. The action menu is where preview, download, permissions, truncation, and deletion live.
 
-[...]
-```
+If your installation uses assets, datasets can also be understood in industrial context rather than only by technical name. That becomes important once several lines or machines produce similar measurements and users want to navigate by equipment instead of by table rows.
 
-### Configure Retention for a Measure
+## Start with two basic checks: freshness and size
 
-The retention configuration must be set individually for each desired DataLake. To configure retention settings:
+When users open datasets for the first time, they usually want to answer one of two questions. Is data still arriving, and how much data is stored already?
 
-1. Navigate to **Configuration > DataLake**.
-2. Click on the **Retention Rate** icon in the corresponding column.
-3. A dialog will appear, allowing you to configure the following options:
-    - **Data to Retain**: Select which data should be retained.
-    - **Retention Action**: Choose the retention action:
-        - **Delete**
-        - **Save**
-        - **Save and Delete**
+### Check recent activity
 
-If **Save** is selected, you can also configure:
+The `# Events (7d)` column answers the first question. It shows how many events arrived during the last seven days and is therefore the fastest way to see whether a dataset is still active.
 
-- **Export Format**: Specify the format in which the data will be exported.
-- **Export Destination**: Choose the destination for the saved data:
-    - **Folder**: No further configuration needed.
-    - **S3**: Requires an existing Export Provider to be set up (see the section below for details).
+Use this when you want to confirm that a machine is still sending data, verify that persistence is still enabled, or check whether a processing flow has stopped upstream.
 
-To create a new export provider go to `Configuration > DataLake`, click on `+` and provide the access key, secret, endpoint, bucket name, and region.
-
-<img className="docs-image" src="/img/05_deploy-retention-config/NewExportProvider.png" alt="New Export Provider"/>
+If the number stays at zero even though the source should be active, the problem is usually not the dataset itself. It is more likely that the adapter is disconnected, the pipeline is stopped, or the persistence step is no longer writing data.
 
-For the Test Setting below this might be:
-- **Access Key**: test
-- **Access Secret**: test
-- **Endpoint**: http://0.0.0.0:4566
-- **Bucket**: random
-- **Region**: us-east-1
-
-
-
-
-
-## Test Setting
-For Testing and Developing S3-based Export Provider it is possible to rely on locally hosted docker container e.g., localstack.
-```yaml
-services:
-  localstack:
-    image: localstack/localstack:latest
-    container_name: localstack_main
-    environment:
-      - DOCKER_HOST=unix:///var/run/docker.sock
-      - AWS_ACCESS_KEY_ID=test
-      - AWS_SECRET_ACCESS_KEY=test
-      - DEFAULT_REGION=us-east-1
-      - SERVICES=s3  
-    ports:
-      - "4566:4566"
-    volumes:
-      - "/var/run/docker.sock:/var/run/docker.sock" 
-      - "localstack_data:/var/lib/localstack" 
-volumes:
-  localstack_data:
-    driver: local
-```
-
-For local testing start the container `docker compose up`, create a new bucket with the following java script:
-
-```java
-
-import java.net.URI;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-
-import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
-import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
-import software.amazon.awssdk.regions.Region;
-import software.amazon.awssdk.services.s3.S3Client;
-import software.amazon.awssdk.services.s3.model.*;
-
-public class S3TestClean {
-
-    private static final String ACCESS_KEY = "test";
-    private static final String SECRET_KEY = "test";
-    private static final String ENDPOINT = "http://0.0.0.0:4566";
-    private static final Region REGION = Region.US_EAST_1;
-    private static final String BUCKET_NAME = "random";
-
-
-    public static void main(String[] args) {
-        System.setProperty("software.amazon.awssdk.enableDefaultMetrics", "true");
-
-        try (S3Client s3 = createS3Client()) {
-            createBucketIfNotExists(s3, BUCKET_NAME);
-            listBuckets(s3);
-            listObjects(s3);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    private static S3Client createS3Client() {
-        return S3Client.builder()
-                .endpointOverride(URI.create(ENDPOINT))
-                .region(REGION)
-                .credentialsProvider(
-                        StaticCredentialsProvider.create(
-                                AwsBasicCredentials.create(ACCESS_KEY, SECRET_KEY)
-                        )
-                )
-                .build();
-    }
-
-        private static void createBucketIfNotExists(S3Client s3, String bucketName) {
-        System.out.println("Checking if bucket exists: " + bucketName);
-        try {
-            ListBucketsResponse response = s3.listBuckets();
-            boolean exists = response.buckets().stream()
-                    .anyMatch(bucket -> bucket.name().equals(bucketName));
-
-            if (!exists) {
-                System.out.println("Bucket does not exist. Creating: " + bucketName);
-                s3.createBucket(CreateBucketRequest.builder().bucket(bucketName).build());
-            } else {
-                System.out.println("Bucket already exists: " + bucketName);
-            }
-        } catch (S3Exception e) {
-            System.err.println("Failed to check/create bucket: " + e.awsErrorDetails().errorMessage());
-        }
-    }
-
-    private static void listBuckets(S3Client s3) {
-        System.out.println("Listing S3 buckets:");
-        try {
-            ListBucketsResponse response = s3.listBuckets();
-            response.buckets().forEach(bucket -> System.out.println(" - " + bucket.name()));
-        } catch (S3Exception e) {
-            System.err.println("Failed to list buckets: " + e.awsErrorDetails().errorMessage());
-        }
-    }
-
-    private static void listObjects(S3Client s3) {
-        System.out.println("Listing objects in bucket: " + BUCKET_NAME);
-        try {
-            ListObjectsV2Request request = ListObjectsV2Request.builder()
-                    .bucket(BUCKET_NAME)
-                    .build();
-
-            ListObjectsV2Response response = s3.listObjectsV2(request);
-            response.contents().forEach(obj -> System.out.println("File: " + obj.key()));
-        } catch (S3Exception e) {
-            System.err.println("Failed to list objects: " + e.awsErrorDetails().errorMessage());
-        }
-    }
-
-  
-}
-
-```
-Pom.xml dependencies:
-
-```xml
- <dependency>
-        <groupId>software.amazon.awssdk</groupId>
-        <artifactId>s3</artifactId>
-        <version>2.25.14</version> <!-- Use latest -->
-    </dependency>
-
-    <dependency>
-        <groupId>org.slf4j</groupId>
-        <artifactId>slf4j-api</artifactId>
-        <version>2.0.17</version>  
-    </dependency>
-
-
-```
+### Load the full size on demand
+
+The `# Events (total)` column answers the second question, but StreamPipes loads that number only when you ask for it. Counting all events can be expensive on large datasets, so the UI starts with `Click to load`.
+
+To load the total, open `Datasets`, find the row, and click `Click to load` in the total-count column. After the spinner disappears, StreamPipes shows the full number of stored events.
+
+This is the right check before exporting large datasets, validating whether a historical import completed as expected, or comparing the relative size of several retained stores.
+
+## Preview the dataset before you build on it
+
+Before a dataset is used in charts or shared with other teams, it is worth opening the preview once. The preview action shows a representative stored event so you can confirm that fields, timestamps, and transformations look the way you expect.
+
+To open the preview, open `Datasets`, find the row, and click the preview action. This is especially useful after an import, after a schema adjustment in the source adapter, or after a pipeline change that may have added, removed, or renamed fields.
+
+<UseCaseExample title="Preview is a cheap validation step">
+  A team imports one week of machine history from CSV and sees the row count they expected. That still does not prove the timestamp column was interpreted correctly. One preview is usually enough to catch that kind of problem before the data reaches charts and dashboards.
+</UseCaseExample>
+
+<DocVisualPlaceholder
+  title="Dataset preview"
+  purpose="Show one stored event with a timestamp, dimensions, and measurements so users understand what the preview action validates."
+/>
+
+## Import CSV data when the live connection is not the starting point
+
+CSV import is the fastest way to create datasets from historical machine data, vendor exports, test data, or migrated records from another system. The import flow is deliberately guided so users can validate the file structure before anything is written permanently.
+
+You would typically use CSV import when a machine vendor provides data history as files, when dashboards should be prepared before the live source exists, or when legacy historian exports need to be brought into StreamPipes for comparison and reuse.
+
+<StepFlow
+  steps={[
+    {
+      title: 'Upload the file and choose the target',
+      body: 'Open `Datasets`, click `Import CSV`, upload the file, and decide whether StreamPipes should create a new dataset or append to an existing one.',
+    },
+    {
+      title: 'Validate parsing in the preview',
+      body: 'Adjust delimiter, decimal separator, and header handling until the preview table matches the actual file structure.',
+    },
+    {
+      title: 'Assign the timestamp column',
+      body: 'Mark the column that represents event time and, if needed, provide the timestamp pattern so StreamPipes can parse string values correctly.',
+    },
+    {
+      title: 'Upload and verify the result',
+      body: 'Start the upload, then confirm the import by checking the event count and opening the dataset preview.',
+    },
+  ]}
+/>
+
+One decision matters more than it may seem at first: whether to import into a new dataset or into an existing one. Create a new dataset when the file represents a different measurement or a different business object. Append to an existing dataset only when the schema is genuinely the same and the new file continues that exact history.
+
+When importing into an existing dataset, StreamPipes validates the incoming file against the current schema. That protects downstream charts and dashboards from silent schema drift. If the existing dataset expects `timestamp` and the new file provides `event_time`, StreamPipes warns you instead of quietly mixing incompatible structures.
+
+## Download datasets when data must leave the platform
+
+Datasets are also a handover point to external consumers. Sometimes a process engineer wants to inspect values in a spreadsheet, sometimes a data scientist needs an offline sample, and sometimes one team needs to share an extract for incident analysis.
+
+To download a dataset, open the row action menu, click `Download`, configure the export dialog, and start the export. The exact export shape depends on the dialog options, but the operational idea is simple: StreamPipes remains the source of truth while still letting data move into external workflows when required.
+
+## Configure retention when stored data keeps growing
+
+Retention is where dataset operation becomes long-term platform operation. Machine data often grows continuously, and not every dataset should remain in the active store forever. A retention rule lets you decide what should happen to older data after a certain age.
+
+Open `Datasets`, find the row, and click the history icon in the `Retention` column. The dialog lets you define which data age is affected, how often the rule runs, and which action should happen.
+
+The three actions are straightforward. `Delete` removes old data from the active dataset. `Save` exports older data but keeps it in the active store. `Save and Delete` exports it first and then removes it from the active store.
+
+The right choice depends on the purpose of the dataset. High-frequency operational telemetry may only need a rolling in-platform window. Compliance-related data may need export without deletion. Long-running machine history often benefits from archive-first cleanup.
+
+If the action includes saving data, the same dialog also requires export settings such as output format and provider. In the UI, select `Save` or `Save and Delete`, choose the export format, configure the CSV delimiter if relevant, select the export provider, and then save the rule with `Start Sync`.
+
+Once a rule exists, the same dialog can be used operationally. `Run Sync Now` executes the configured rule immediately, which is useful for testing, and `Delete Sync` removes the stored retention configuration.
+
+<DocVisualPlaceholder
+  title="Retention configuration"
+  purpose="Show the retention dialog with age threshold, interval, action, export settings, provider selection, and run-now controls."
+/>
+
+## Use export providers as shared retention infrastructure
+
+Export providers define where retained data should be sent when a retention rule includes `Save` or `Save and Delete`. In the current UI, provider management appears in the lower area of the datasets page and is typically an administrator task rather than a daily user task.
+
+The practical pattern is to configure the provider once, test it, and then reuse it across several dataset rules. That keeps retention predictable and avoids copy-pasting infrastructure details into every single dataset workflow.
+
+## Know the difference between truncating data and deleting the dataset
+
+StreamPipes distinguishes between clearing stored events and removing the dataset itself, and that distinction matters.
+
+Use `Truncate data` when the dataset identity should remain but the stored events should be cleared. This is common in test systems, demos, or repeated commissioning workflows. To do it, open the row action menu, click `Truncate data`, and confirm the dialog.
+
+Use `Delete dataset` when the dataset should disappear completely. Open the same action menu, click `Delete dataset`, and confirm the dialog. StreamPipes protects you here by blocking deletion when a running pipeline still depends on the dataset.
+
+## Manage permissions at the dataset level
+
+Datasets often sit between several roles. One team may own ingestion, another may consume charts, and a third may be responsible for audit or export. For that reason, permission management is available directly from the dataset row.
+
+Open the action menu, click `Manage permissions`, and update access in the dialog. This keeps ownership and consumption separate without duplicating the stored data itself.
+
+## Typical ways teams use datasets
+
+The simplest workflow starts in `Connect`: a team creates an adapter, enables persistence, opens `Datasets` to confirm the new store appears, checks the recent count, previews one event, and then builds charts on top of the result.
+
+Another common workflow starts with historical files: open `Datasets`, click `Import CSV`, upload the file, validate parsing and timestamps, finish the upload, confirm the total event count, and then move directly into chart creation.
+
+A more operational workflow appears later in production: once a high-volume dataset grows steadily, the team adds a retention rule, selects `Save and Delete`, assigns the export provider, and monitors the retention log to make sure old data is archived as intended.
+
+## Work with datasets deliberately
+
+The most useful mindset is to treat datasets as governed operational stores, not only as technical byproducts of persistence. Check freshness before assuming the source is healthy. Preview before building a chart on top of imported or transformed data. Append CSV files only when the schema truly matches. Use retention once storage growth becomes part of daily operation, and use permissions when the same data must serve several roles with different responsibilities.
diff --git a/docs/04_use-pipelines.md b/docs/04_use-pipelines.md
index 906a8a3a0..24a2d69db 100644
--- a/docs/04_use-pipelines.md
+++ b/docs/04_use-pipelines.md
@@ -4,205 +4,142 @@ title: Pipelines
 sidebar_label: Pipelines
 ---
 
-The pipeline editor module supports building pipelines that transform a data stream using a set of resuable data processors and data sinks.
-The empty pipeline editor looks similar to the illustration below after a new installation.
+import StepFlow from '@site/src/components/docs/StepFlow.tsx';
+import UseCaseExample from '@site/src/components/docs/UseCaseExample.tsx';
+import DocVisualPlaceholder from '@site/src/components/docs/DocVisualPlaceholder.tsx';
 
-<img className="docs-image" src="/img/03_use-pipeline-editor/01_pipeline-editor-overview.png" alt="StreamPipes Pipeline Editor Overview"/>
+Pipelines are where connected data becomes operational logic inside StreamPipes. They let you take one or more live streams, combine them with processors and sinks, and turn that flow into something useful: filtering, enrichment, alerting, routing, storage, or analytics.
 
-## Pipeline Elements
-The four main concepts data sets, data streams, data processors and data sinks are available at the top of the pipeline editor. By switching the tabs, the individual pipeline elements for each category can be found.
-By clicking the questionmark symbol, which appears when hovering over an element, additional information can be viewed (e.g., for data streams a live preview of incoming data and the documentation of the pipeline element for data processors and sinks).
+This is why pipelines matter so much in daily work. `Connect` brings data into the platform. Pipelines decide what should happen to that data next.
 
-<img className="docs-image" src="/img/03_use-pipeline-editor/02_pipeline-element-info.png" alt="StreamPipes Pipeline Element Info"/>
+## What a pipeline is for
 
-## Creating Pipelines
-Pipelines are built by dragging data streams, processors and sinks into the pipeline assembly area. Typically, a pipeline is built step-by-step starting with a data soure (stream or set). 
-Afterwards, data processors and sinks are subsequently added to the pipeline. Connections between pipeline elements are made by selecting the gray connector of the source and moving it to the target pipeline element.
-Once a connection is made, StreamPipes performs a quick validation step and, in case two pipeline elements are compatible, automatically opens a configuration window.
+A pipeline usually starts with a live stream, adds zero or more processing steps, and ends in one or more sinks. That sounds abstract at first, but in practice most pipelines serve straightforward industrial goals. A pipeline may keep only events above a threshold, enrich raw measurements with labels or derived values, forward selected events to another system, or persist curated results separately from the raw source data.
 
-### Configuring Pipeline Elements
-The configuration depends on the selected pipeline element and looks similar to the screenshot below.
-In general, pipeline elements are configured by providing the required values. Once the pipeline element is fully configured, the _Save_ button activates and can be used to save the configuration for the pipeline element.
+In other words, pipelines are not just an “advanced analytics” feature. They are the main place where a team shapes live industrial data into reusable behavior.
 
-<img className="docs-image" src="/img/03_use-pipeline-editor/03_configure-pipeline-element.png" alt="StreamPipes Pipeline Element Configuration"/>
+<UseCaseExample title="A typical operational pipeline">
+  A team receives machine temperature values as a live stream. They filter for high readings, enrich the event with a severity label, and send the result to both a notification sink and a persisted dataset. The pipeline is not an experiment; it is a maintained operational flow.
+</UseCaseExample>
 
-In addition, the following options are available in the pipeline element configuration menu:
-* **Show documentation** extends the view and displays the pipeline element's documentation next to the configuration view.
-* **Show only recommended settings** filters the list of available fields provided by the connected input data stream based on the _property scope_, e.g., so that only measurement values are displayed and dimension fields from the input stream are not available for selection. If deactivated, selections contain the full list of available fields that match the input requirement of the data processor.
+## Understand the current pipeline workspace
 
-### Pipeline Element Options
-Further options for a pipeline element can be displayed by hovering over a pipeline element in the assembly area, so that additional buttons appear around the pipeline element:
+The pipeline feature is split across three places, and each one has a different job.
 
-* **Configure element** re-opens the configuration view to update the pipeline element configuration (only available for data processors and sinks)
-* **Delete element** removes the pipeline element from the pipeline  
-* **Help** opens the pipeline element's documentation
-* **Compatible element** opens a dialog which shows all pipeline elements that are compatible to the current element's output data stream. The dialog offers an alternative to selecting pipeline elements directly from the pipeline element selection in the top.
-* **Pipeline Element Recommendation** opens a dialog which shows all recommended pipeline elements that are compatible the current element's output data stream. The recommendation is based on previously connected pipeline elements and is displayed below.
+The `Pipeline Editor` is where you design or change the flow. The `Pipeline Overview` is where you operate many pipelines at once. The `Pipeline Details` view is where you inspect one pipeline more deeply, including its structure, status, metrics, logs, and code view.
 
-### Pipeline Editor Options
-Several pipeline editor options are available in the menu bar of the pipeline assembly:
+This split is useful because it matches how people actually work. You usually build in the editor, operate from the overview, and investigate in the details view.
 
-<img className="docs-image" src="/img/03_use-pipeline-editor/05_pipeline-editor-options.png" alt="StreamPipes Pipeline Editor Options"/>
+<DocVisualPlaceholder
+  title="Pipeline editor overview"
+  purpose="Show the current editor with element catalog, assembly canvas, and top action bar before the user starts building."
+/>
 
-* **Save pipeline** opens the save dialog (see below)
-* **Pan** allows to pan within the assembly area, useful for larger pipelines that do not fit in the screen
-* **Select** is visible if pan mode is active and switches back to the default select mode
-* **Zoom in/out** triggers the zoom in the pipeline assembly
-* **Auto Layout** layouts the pipeline in a much more beautiful way than you are able to do by yourself ;-)
-* **All pipeline modification saved** is displayed if the current pipeline has been cached. Cache updates are triggered after every change of the pipeline so that changes are not lost after reloading the window.
-* **Hints** are shown to display current errors (e.g., incomplete pipelines). Details can be opened by clicking the hint button.
-* **Clear assembly** clears the assembly and removes the current pipeline.
+## Build the pipeline from left to right
 
-### Saving a pipeline
-To save a pipeline, press the _save pipeline_ button. A dialog pops up where a name and description of the pipeline can be entered (only name is mandatory).
-Additionally, a pipeline can be directly started after it has been stored by checking the corresponding button.
+The editor combines an element catalog on the left with the assembly canvas on the right. The catalog contains the installed streams, processors, and sinks that are available in the current StreamPipes installation.
 
-<img className="docs-image" src="/img/03_use-pipeline-editor/06_save-pipeline.png" alt="StreamPipes Save Pipeline Dialog"/>
+Most pipelines are easiest to build from left to right. Start with the source stream, connect a processor or sink, and continue from there until the flow matches the use case.
 
+<StepFlow
+  steps={[
+    {
+      title: 'Place the input stream',
+      body: 'Start with the live stream that should feed the pipeline. This is the source that defines the first schema users will work with.',
+    },
+    {
+      title: 'Add processors or sinks',
+      body: 'Continue the flow by connecting processors and sinks that match the desired behavior, such as filtering, enrichment, storage, or notification.',
+    },
+    {
+      title: 'Configure in context',
+      body: 'Whenever a new element is connected, StreamPipes opens its configuration against the actual upstream schema so the user can map fields with confidence.',
+    },
+    {
+      title: 'Validate before saving',
+      body: 'Use preview and validation features while the pipeline is still in the editor so the final saved flow already reflects real live data behavior.',
+    },
+  ]}
+/>
 
-The pipeline view lists all created pipelines and provides several views and actions to manage the lifecycle of pipelines.
+Elements can be added by dragging them from the catalog into the canvas or by using `Add pipeline element` in the toolbar. The toolbar also includes `Add from template`, which is useful when a team already has a standard pipeline fragment or a recurring structural pattern.
 
-In the entry screen, an overview of all created pipelines is shown:
+## Let compatibility checks guide the design
 
-<img className="docs-image" src="/img/03_use-managing-pipelines/01_pipeline-overview.png" alt="StreamPipes Pipeline Overview"/>
+One of the most important usability features in the editor is that StreamPipes validates connections as you build. When you connect two elements, the platform checks whether the output of the first element is compatible with the input requirements of the second one. If the connection is valid, the configuration dialog opens immediately.
 
-## Pipeline Actions
-Within the pipeline overview, for each pipeline several actions are available:
-* **Start/Stop pipeline** Starts or stops the selected pipeline. Once clicked, StreamPipes will trigger the selected action for all pipeline elements and open a success or error dialog as illustrated below.
-* **Show details** opens the pipeline detail view (see below).
-* **Modify pipeline** opens the pipeline in the pipeline editor, where the pipeline can be modified. Note that this button is only visible if the pipeline is not running.
-* **Delete pipeline** opens a confirm dialog, which subsequently deletes the selected pipeline.
+This means users do not need to guess whether an element combination should work. The editor helps steer them toward valid flows early, before they spend time configuring something impossible.
 
-The screenshot below shows the status of a pipeline after it has been successfully started. By clicking the _Show details_ button, more information on the status of each corresponding pipeline element microservice becomes available. In case of failures, the failure reason will be shown for each pipeline element that has failed to start.
+The same idea appears again later through `Compatible Elements`. Once an element is on the canvas, users can inspect which processors or sinks fit that element next. This is especially useful when someone knows the data they have at a certain point in the flow but has not yet decided which operation should follow.
 
-<img className="docs-image" src="/img/03_use-managing-pipelines/02_pipeline-start-dialog.png" alt="StreamPipes Pipeline Start Dialog"/>
+## Configure each element in the context of the real schema
 
-## Organizing Pipelines into Categories
-Pipelines can be organized into categories, which is a useful feature in case a larger amount of pipelines is created.
-All categories will be shown as separate tabs in the pipeline overview. The same pipeline can be assigned to multiple categories.
+After connecting a processor or sink, StreamPipes opens the element configuration dialog. This is where the editor becomes most helpful for real users, because the configuration is not shown in isolation. It is shown in the context of the actual upstream schema.
 
-To add a new category or to add a new pipeline to an existing category, click the _Manage Categories_ button and configured the category and assigned pipelines in the dialog.
+The dialog can expose the input schema directly, show the element documentation next to the settings, reduce visual noise with `Show only recommended settings`, and reuse or create configuration templates for recurring patterns.
 
-## Pipeline Details
-The pipeline details view can be opened by clicking the _Show details_ button in the pipeline overview panel.
+That combination matters because it reduces one of the biggest sources of pipeline errors: mapping the wrong field simply because the user had to remember the schema mentally instead of seeing it.
 
-<img className="docs-image" src="/img/03_use-managing-pipelines/03_pipeline-details.png" alt="StreamPipes Pipeline Details"/>
+<UseCaseExample title="Why input schema context matters">
+  A processor expects a measurement field, but the incoming stream also contains identifiers, timestamps, and several dimensions. Seeing the input schema in the configuration dialog makes it much easier to choose the real measurement field instead of guessing from field names alone.
+</UseCaseExample>
 
-### Overview
-The overview section displays the graphical structure of the pipeline and provides some statistics about recent pipeline actions. Additionally, pipelines can be directly started, stopped, modified and deletes within this view.
+When the incoming schema is large, `Show only recommended settings` can be a practical guide. It is not a limitation; it is a way to focus first on the fields StreamPipes considers most likely to be relevant. If the relevant field is not in that subset, the user can simply switch back to the full view.
 
-### Monitoring
-Monitoring features will become available in version 0.68.0.
+## Use editor features as working tools, not ornaments
 
-### Errors
-Monitoring of failures and logs will become available in version 0.69.0.
+The top toolbar contains a small set of features that matter during actual pipeline work.
 
-### QuickEdit
-The quick edit feature (only available for pipelines that are not running) is a quick and convenient way to modify some pipeline element configurations without opening the pipeline in the pipeline editor.
-To use the quick edit feature, switch to the _QuickEdit_ tab, which will display the selected pipeline.
+`Save` is the obvious one, but it only becomes available once the current flow passes validation. `Enable live preview` is more important than it may sound because it lets users check the behavior of a flow while still editing it. `Auto Layout` helps once a canvas has been rearranged several times and is harder to read. `Clear assembly` is mainly useful when starting over from scratch.
 
-By clicking a pipeline element from the preview canvas, available configuration options of the selected pipeline element can be modified. Note that only modifications that do not affect the pipeline structure (e.g., different output streams) can be changed.
+These are not just convenience buttons. They support the working style that produces better pipelines: build a little, preview a little, fix assumptions early, and save only once the flow reflects the intended behavior.
 
-<img className="docs-image" src="/img/03_use-managing-pipelines/04_pipeline-quick-edit.png" alt="StreamPipes Pipeline Quick Edit"/>
+## Save the pipeline deliberately
 
-After a configuration value was changed, make sure to click the _Update Pipeline_ button to save the changes.
+When the flow is ready, the save dialog defines how it should become a platform resource. This is where the visual design turns into an operational artifact.
 
+The save flow lets you set the pipeline name and description, decide whether the pipeline should start immediately, decide whether to navigate to the overview afterwards, optionally link the pipeline to assets, and inspect the pipeline configuration as code.
 
-In Apache StreamPipes, pipelines represent the flow of data from sources (streams), through processors (filters, transformations, etc.), and finally to sinks (third-party-systems, storage, notifications).
-Traditionally, pipelines are created through the web-based user interface.
-However, they can also be defined programmatically as code, offering the flexibility to manage pipelines using Infrastructure as Code (IaC) practices.
+If you are editing an existing pipeline, StreamPipes also distinguishes between `Update pipeline` and `Create new pipeline`. This is an important operational distinction. Updating changes the existing artifact. Creating a new pipeline preserves the previous version and stores the modified flow separately.
 
-This guide explains how to define and create pipelines programmatically using a YAML structure.
+That makes it practical to test a new thresholding or enrichment strategy without overwriting the current production pipeline immediately.
 
-## Introduction
+## Operate pipelines from the overview
 
-Defining pipelines as code allows you to automate the creation, management, and deployment of StreamPipes pipelines.
-This is especially useful for managing multiple StreamPipes instances across environments.
-Pipelines are written in a YAML format (or alternatively as JSON) and can be deployed programmatically via the StreamPipes REST API.
+Once a pipeline exists, the `Pipeline Overview` becomes the main operational entry point. It lists the existing pipelines and exposes their current state in a compact way. In practice, users come here to answer questions such as: Which pipelines are running? Which ones are stopped? Which ones require attention? Which ones should be started or stopped right now?
 
-This guide provides an overview of how to structure pipeline definitions in YAML and deploy them using the API.
+The overview is also where lifecycle management becomes efficient. You can start and stop pipelines directly without opening each one individually. For users with write privileges, bulk actions make this even more useful when several related pipelines must be activated or paused together.
 
-## Pipeline YAML Structure
+The important thing to understand is that a pipeline can exist even when it is not currently healthy or operationally valid. Upstream schema changes, missing dependencies, or other inconsistencies can put a pipeline into a state where it needs review. The overview is designed to surface exactly that kind of situation quickly.
 
-A pipeline in YAML consists of several key sections:
+## Use the details view when the overview is no longer enough
 
-- **ID**: A unique identifier for the pipeline.
-- **Name and Description**: Optional fields to describe the pipeline.
-- **Pipeline Elements**: The components that make up the pipeline, including streams (data sources), processors (data transformations), and sinks (output destinations).
-- **Create Options**: Specifies how and when to start the pipeline (e.g., `start: false` means the pipeline won't start automatically).
+The `Pipeline Details` view is where one pipeline can be inspected more deeply. It combines a visual representation of the pipeline with operational panels such as logs, status, actions, and code view.
 
-Here’s a high-level breakdown of the structure:
+This is the place to go when the pipeline should be understood, not just operated. If a pipeline is marked as requiring attention, the details view is usually the right place to investigate why. You can inspect logs, refresh metrics, enable live preview, and look at the pipeline structure in one screen.
 
-```yaml
-id: my-pipeline
-name: ""
-description: ""
-pipelineElements:  # Define pipeline components here
-  - type: stream     # Data source
-    ref: <reference> # Unique reference ID
-    id: <data-stream-id> # ID of the stream
-
-  - type: processor  # Data transformation
-    ref: <reference> # Unique reference ID
-    id: <processor-id> # ID of the processor
-    connectedTo:     # Previous pipeline element reference(s)
-      - <reference>
-    configuration:   # Processor-specific configurations
-      - <configuration-option>
-
-  - type: sink       # Data sink (output)
-    ref: <reference> # Unique reference ID
-    id: <sink-id>    # ID of the sink
-    connectedTo:     # Previous pipeline element reference(s)
-      - <reference>
-    configuration:   # Sink-specific configurations
-      - <configuration-option>
-
-createOptions:
-  start: <true|false>  # Whether to start the pipeline immediately
-```
-
-## Pipeline Elements
-
-### Building blocks
+The details toolbar also includes `View pipeline as code`, which makes the underlying compact representation visible. That is useful for inspection, comparison across environments, and programmatic reuse.
 
-The key building blocks of a pipeline include:
+<DocVisualPlaceholder
+  title="Pipeline details view"
+  purpose="Show the current details view with visual pipeline preview, logs, status, actions, and the pipeline-as-code entry point."
+/>
 
-#### Stream
-A stream represents a data source in the pipeline, such as a sensor feed, API, or message queue. It is referenced by a unique ID that identifies the data stream.
+## Treat templates as a standardization tool
 
-#### Processor
-A processor transforms, filters, or enriches the data coming from a stream or another processor. Each processor has configuration parameters that control its behavior, such as filtering criteria or mapping options.
+Templates appear in several parts of the current pipeline experience. You can start a flow from a pipeline-level template or reuse element-level configuration templates inside individual dialogs.
 
-#### Sink
-A sink sends the processed data to a final destination, such as a database, file storage, or another service. Sinks may also have configuration options that specify where and how the data should be sent.
+The real value of templates is not only speed. It is consistency. When teams repeatedly build the same notification flow, the same sink configuration, or the same enrichment pattern, templates reduce manual repetition and lower the risk of small configuration differences that later become operational problems.
 
-A pipeline element is selected by providing its ID. For processors and sinks, the ID  refers to the `appId` of the pipeline element, e.g., `org.apache.streampipes.processors.filters.jvm.numericalfilter`.
-For data streams, the ID refers to the `elementId` of the data stream.
+## Pipelines as code
 
-To define connections between pipeline elements, the `ref` and `connectedTo` fields can be used.
-`ref` can be a short string (e.g., `stream01` or `processor01`) which will be used as an internal identifier of the pipeline element.
-Within the `connectedTo` list, connections to other pipeline elements can be defined.
-Each item of the list should relate to an existing `ref`.
+Pipelines can also be represented in a compact text format and created over the API. This is useful when pipeline definitions should be versioned, reviewed, promoted between environments, or generated programmatically.
 
-### Configuration
+The current UI exposes this compact representation in two helpful places: during save through `Show pipeline configuration as code`, and later in the details view through `View pipeline as code`. That makes the UI the best starting point for most users. Build the pipeline visually first, validate it, and only then reuse the compact definition for automation.
 
-In the `configuration` section, which only applies for data processors and sinks, the pipeline element configuration can be applied.
-The configuration options depend on the pipeline element and have the same structure as the adapter configuration (see [Adapters as Code](use-programmatically-create-adapters))
-The easiest way to determine a valid configuration is the web interface.
+The compact model represents the same decisions users already made in the editor: pipeline identity, the ordered elements, how those elements are connected, element-specific configuration, and create options such as whether the pipeline should start immediately.
 
-After creating a pipeline in the web interface and clicking on `Save pipeline`, the option `Show pipeline configuration as code` shows the current pipeline configuration in YAML or JSON format:
-
-<img className="docs-image" src="/img/03_use-programmatically-create-pipelines/01_pipeline-editor-pipeline-as-code.png" alt="StreamPipes Pipeline Editor Code View"/>
-
-Another option is to view the pipeline details for an existing pipeline. Here, the YAMl definition of the pipeline can be viewed by clicking the `View pipeline as code` button:
-
-<img className="docs-image" src="/img/03_use-programmatically-create-pipelines/02_pipeline-details-pipeline-as-code.png" alt="StreamPipes Pipeline Editor Code View"/>
-
-
-## Example pipeline as Code
-
-Here's an example of a pipeline written in YAML format:
+### Example pipeline definition
 
 ```yaml
 id: my-pipeline
@@ -237,32 +174,35 @@ createOptions:
   start: false
 ```
 
-Stream: The pipeline begins with a data stream (sp:spdatastream:GWWzMD) referenced by stream01. This is the source of the data.
-
-Processor: The data is passed through a numerical filter processor (org.apache.streampipes.processors.filters.jvm.numericalfilter) which checks if the field s0::density is less than 12. The filter is connected to the stream via reference stream01.
+To create such a compact pipeline over the API, send it to:
 
-Sink: The filtered data is then sent to a data lake (org.apache.streampipes.sinks.internal.jvm.datalake). The sink is configured with several parameters including the mapping of the timestamp (s0::timestamp) and schema update options. The sink is connected to the processor via reference processor01.
-
-Create Options: The pipeline is set to not start automatically (start: false).
-
-## API
-
-To create a new pipeline, call the StreamPipes API as follows:
-
-```
+```text
 POST /streampipes-backend/api/v2/compact-pipelines
-Content-type: application/yml
+Content-Type: application/yml
 Accept: application/yml
 ```
 
-You must provide valid credentials by either adding a Bearer token or an API key:
+You can also send JSON by using `application/json`. Authentication is provided through:
 
-```
+```text
 X-API-USER: your username
 X-API-KEY: your api key
 ```
 
-The body of the request should contain the YAML definition.
+The most reliable workflow is still to validate the pipeline visually first, then reuse the generated compact model. That keeps “pipeline as code” grounded in a pipeline that already works.
+
+## How to work well with pipelines
+
+In practice, good pipeline work usually follows a predictable pattern. Start with one clear input stream. Add only the processors that the use case truly needs. Configure each element against the actual upstream schema. Use preview early. Save with a name and description that make operational sense. Only then start the flow against real data.
+
+That style keeps pipelines understandable later. A pipeline should not feel like a temporary experiment nobody wants to touch. It should feel like a maintained part of the data platform.
+
+## Image placeholders
+
+`[Image placeholder: pipeline editor showing catalog, assembly canvas, compatible elements, and toolbar actions]`
+
+`[Image placeholder: pipeline element configuration dialog with input schema, documentation toggle, recommended settings, and template actions]`
+
+`[Image placeholder: pipeline overview showing status, health, warnings, start/stop actions, and bulk operations]`
 
-:::info
-It is also possible to provide the pipeline specification as a JSON document. In this case, change the `Content-type` to `application/json`.
+`[Image placeholder: pipeline details view showing logs, status, actions, live preview, and pipeline-as-code access]`
diff --git a/docs/04_use-programmatic-access.md b/docs/04_use-programmatic-access.md
index 83eb1b120..514ce1bdd 100644
--- a/docs/04_use-programmatic-access.md
+++ b/docs/04_use-programmatic-access.md
@@ -4,201 +4,143 @@ title: Programmatic Access
 sidebar_label: Programmatic Access
 ---
 
+import UseCaseExample from '@site/src/components/docs/UseCaseExample.tsx';
 
-:::info Looking for Python support?
+Programmatic access is the right choice when StreamPipes should be controlled or queried from an external application instead of only from the web interface. Typical examples include lifecycle automation for pipelines, inventory or metadata queries, and live consumption of data streams from another service.
 
-This section explains how to use the Apache StreamPipes Java Client. Please read the Python docs to find out how to use
-the client for Python.
+This page focuses on the Java client. If you are looking for Python support, use the dedicated Python documentation instead.
 
-:::
+## When programmatic access makes sense
 
-## About the StreamPipes client
+Not every integration with StreamPipes needs a custom extension. Sometimes the easier and more maintainable option is to keep StreamPipes as the platform and let an external application interact with it over the client API.
 
-Sometimes you don't want to write your own extensions to StreamPipes, but want to interact with StreamPipes from
-external application.
-One example is to influence the lifecycle of pipelines - think of a feature which automatically starts or stops specific
-pipelines that monitor the production of a specific product.
+<UseCaseExample title="A practical automation scenario">
+  A manufacturing application knows which product is currently being produced and starts or stops the corresponding monitoring pipelines automatically. The application does not need to implement StreamPipes functionality itself. It only needs to interact with the platform programmatically.
+</UseCaseExample>
 
-Another example is to gather live data from Apache StreamPipes, e.g., to consume data that has been previously connected
-by an external, standalone application.
+Other common scenarios are collecting live data from a stream inside another service, listing available streams or pipelines, or reusing platform metadata such as templates and sink definitions.
 
-For such use cases, we provide the StreamPipes client, which is currently available in Python and Java. This section
-covers the usage of the Java client.
+## Start with the correct client version
 
-## Using the StreamPipes client
-
-:::info Choosing the right version
-
-Your client library version should match the installed Apache StreamPipes version. Replace `${streampipes.version}` with
-the version of your installation, e.g., `0.92.0`.
-
-:::
-
-In your Java project, add the following dependency to your pom file:
+The client library version should match the installed StreamPipes version. When you add the Java dependency, replace `${streampipes.version}` with the version of the StreamPipes installation you are working against.
 
 ```xml
-
 <dependency>
     <groupId>org.apache.streampipes</groupId>
     <artifactId>streampipes-client</artifactId>
     <version>${streampipes.version}</version>
 </dependency>
-
 ```
 
-## Obtaining an API token
+This version alignment matters because the client and the server should agree on the available API surface and data structures.
 
-<img className="docs-image" src="/img/screenshots/streampipes-profile-token.png" alt="Overview StreamPipes Architecture"/>
+## Decide how the client should authenticate
 
-To communicate with Apache StreamPipes, you need to provide proper credentials. There are two ways to obtain
-credentials:
+To communicate with StreamPipes, the client needs valid credentials. In practice, there are two common choices.
 
-* An API token, which is bound to a user. The API token can be generate from the UI clicking on the user icon and then
-  navigate to `Profile/API`.
-* A service user, which can be created by users with role `Admin`.
+An API token is tied to one user account and inherits that user’s permissions. A service account is separate from a person and is usually the better choice for automation or long-running integrations because it can be governed independently.
 
-Service users can have their own permissions, while API tokens inherit all permissions from the corresponding user.
+To obtain an API token in the UI, open the user menu and navigate to `Profile/API`. Administrators can create service accounts in the `Security` section.
 
-## Connecting to StreamPipes
+The rule of thumb is simple: if the integration is personal and temporary, an API token may be acceptable. If the integration is operational and should outlive individual users, a service account is usually the better design.
 
-Once you have your API token and configured your dependencies, you can connect to an Apache StreamPipes instance as
-follows:
-
-```java
+## Connect the client to StreamPipes
 
-CredentialsProvider credentials=StreamPipesCredentials
-    .withApiKey("admin@streampipes.apache.org","YOUR_API_KEY");
+Once the dependency and credentials are in place, the Java client can be created directly:
 
-// Create an instance of the StreamPipes client
-    StreamPipesClient client=StreamPipesClient
-    .create("localhost",8082,credentials,true);
+```java
+CredentialsProvider credentials = StreamPipesCredentials
+    .withApiKey("admin@streampipes.apache.org", "YOUR_API_KEY");
 
+StreamPipesClient client = StreamPipesClient
+    .create("localhost", 8082, credentials, true);
 ```
 
-The following configurations are required:
-
-* The `withApiKey` method expects the username and the API key. Alternatively, use the `withServiceToken` method to
-  authenticate as a service user.
-* The client instance requires the hostname or IP address of your running StreamPipes instance. In addition, you need to
-  provide the port, the credentials object and a flag which needs to be set in case the StreamPipes instance is not
-  served over HTTPS.
-* There are short-hand convenience options to create a client instance.
+The credentials block can also be created with a service token instead of an API key. The client itself needs the host, the port, the credentials object, and the HTTPS flag. StreamPipes also provides convenience creation options, but the important point is that the client should connect to the same public address and protocol configuration your users would use in the browser.
 
-## Working with the client
+## Use the client for metadata and lifecycle work
 
-Here are some examples how you can work with the StreamPipes client:
+Once connected, the client can inspect streams, pipelines, sinks, and templates, and it can also trigger lifecycle operations such as starting or stopping pipelines.
 
 ```java
+List<SpDataStream> streams = client.streams().all();
 
-// Get streams
-List<SpDataStream> streams=client.streams().all();
-
-// Get a specific stream
-    Optional<SpDataStream> stream=client.streams().get("STREAM_ID");
-
-// see the schema of a data stream
-    EventSchema schema=stream.get().getEventSchema();
-
-// print the list of fields of this stream
-    List<EventProperty> fields=schema.getEventProperties();
-
-// Get all pipelines
-    List<Pipeline> pipelines=client.pipelines().all();
-
-// Start a pipeline
-    PipelineOperationStatus status=client.pipelines().start(pipelines.get(0));
-
-// Stop a pipeline with providing a pipeline Id
-    PipelineOperationStatus status=client.pipelines().stop("PIPELINE_ID");
+Optional<SpDataStream> stream = client.streams().get("STREAM_ID");
+EventSchema schema = stream.get().getEventSchema();
+List<EventProperty> fields = schema.getEventProperties();
 
-// Get all pipeline element templates
-    List<PipelineElementTemplate> templates=client.pipelineElementTemplates().all();
+List<Pipeline> pipelines = client.pipelines().all();
+PipelineOperationStatus startStatus = client.pipelines().start(pipelines.get(0));
+PipelineOperationStatus stopStatus = client.pipelines().stop("PIPELINE_ID");
 
-// Get all data sinks
-    List<DataSinkInvocation> dataSinks=client.sinks().all();
+List<PipelineElementTemplate> templates = client.pipelineElementTemplates().all();
+List<DataSinkInvocation> dataSinks = client.sinks().all();
+```
 
+The most useful way to think about these calls is not as isolated snippets, but as a client-side view into the same platform objects users see in the UI. Streams expose schema, pipelines expose lifecycle, templates expose reusable configuration, and sinks expose available targets.
 
-```
+## Consume live data from streams
 
-## Consuming live data
+If the goal is not only to query metadata but also to consume live stream data, the client needs support for the messaging protocol used inside the StreamPipes installation.
 
-StreamPipes supports a variety of messaging protocols to internally handle data streams. If you plan to gather live data
-from the client library, you also need to add one or more of the supported messaging
-protocols to the pom file. The default protocol depends on the StreamPipes configuration and is set in the `.env` file
-in your installation folder.
+Depending on the installation, that can mean adding support for Kafka, NATS, or MQTT:
 
 ```xml
-
-<!-- For Kafka support -->
 <dependency>
     <groupId>org.apache.streampipes</groupId>
     <artifactId>streampipes-messaging-kafka</artifactId>
     <version>${streampipes.version}</version>
 </dependency>
 
-        <!-- For Nats support -->
 <dependency>
-<groupId>org.apache.streampipes</groupId>
-<artifactId>streampipes-messaging-nats</artifactId>
-<version>${streampipes.version}</version>
+    <groupId>org.apache.streampipes</groupId>
+    <artifactId>streampipes-messaging-nats</artifactId>
+    <version>${streampipes.version}</version>
 </dependency>
 
-
-        <!-- For MQTT support -->
 <dependency>
-<groupId>org.apache.streampipes</groupId>
-<artifactId>streampipes-messaging-mqtt</artifactId>
-<version>${streampipes.version}</version>
+    <groupId>org.apache.streampipes</groupId>
+    <artifactId>streampipes-messaging-mqtt</artifactId>
+    <version>${streampipes.version}</version>
 </dependency>
-
 ```
 
-In addition, add the message format that is used internally by StreamPipes. The default message format used by
-StreamPipes is JSON, so let's include the dependency as well:
+The client also needs the matching internal data format. JSON is the standard default:
 
 ```xml
-
-<!-- For JSON support -->
 <dependency>
     <groupId>org.apache.streampipes</groupId>
     <artifactId>streampipes-dataformat-json</artifactId>
     <version>${streampipes.version}</version>
 </dependency>
-
 ```
 
-Once you've imported the dependencies, it is easy to consume live data. First, register the protocols and formats in
-your client instance:
+After that, register the protocol and data format in the client:
 
 ```java
-
 client.registerProtocol(new SpKafkaProtocolFactory());
 
-// or Nats:
-    client.registerProtocol(new SpNatsProtocolFactory());
-
-// data format:
-    client.registerDataFormat(new JsonDataFormatFactory());
+// or NATS:
+client.registerProtocol(new SpNatsProtocolFactory());
 
+client.registerDataFormat(new JsonDataFormatFactory());
 ```
 
-Then, you are ready to consume data:
+Then you can subscribe to a stream:
 
 ```java
-
-client.streams().subscribe(dataStreams.get(0),new EventProcessor() {
-@Override
-public void onEvent(Event event) {
-    // example
-    MapUtils.debugPrint(System.out,"event",event.getRaw());
-    }
-    });
-
+client.streams().subscribe(dataStreams.get(0), new EventProcessor() {
+  @Override
+  public void onEvent(Event event) {
+    MapUtils.debugPrint(System.out, "event", event.getRaw());
+  }
+});
 ```
 
-:::tip
+This is the point where the client moves from platform automation into live stream consumption. The important operational question is therefore not only “does the Java code compile?” but also “does the chosen protocol match the actual StreamPipes installation?”
+
+## How to work well with the client
 
-There are many more options to work with the StreamPipes Client - e.g., you can trigger emails directly from the API.
-Just explore the various classes and interfaces provided by the client!
+The most reliable pattern is to use the client for clearly scoped tasks: read platform metadata, automate lifecycle operations, or consume live stream data in a controlled way. A service account with appropriately limited permissions is usually the best basis for that work.
 
-:::
+It is also worth keeping the responsibilities clear. The client is a way to interact with StreamPipes, not to reimplement it. If your application needs the platform’s stream, pipeline, or dataset behavior, it is usually better to let StreamPipes remain the owner of that logic and use the client as the integration surface.
diff --git a/docs/04_use-shortcuts.md b/docs/04_use-shortcuts.md
index d61f3054a..bc7c866a2 100644
--- a/docs/04_use-shortcuts.md
+++ b/docs/04_use-shortcuts.md
@@ -4,30 +4,40 @@ title: Shortcuts
 sidebar_label: Shortcuts
 ---
 
-This page lists keyboard shortcuts available in StreamPipes.
+Keyboard shortcuts in StreamPipes are intentionally small in number, but they are useful in the places where users work repeatedly: editing pipelines, charts, and dashboards, filtering table content, and closing dialogs without leaving the keyboard.
 
-## General
+This page collects the shortcuts that are currently available in the UI.
 
-- `Ctrl/Cmd + S` in chart/dashboard/pipeline edit view
-  - Saves the current state.
+## General shortcuts
 
-- `E` in dashboard/pipeline panel
-  - Enters edit mode.
+| Context | Shortcut | Effect |
+|---|---|---|
+| Chart, dashboard, or pipeline edit view | `Ctrl/Cmd + S` | Saves the current state |
+| Dashboard or pipeline panel | `E` | Enters edit mode |
 
-## Pipeline Assembly
+These are the shortcuts most users notice first because they fit the main edit workflows of the platform.
 
-- `Delete` and `Backspace` in pipeline editor
-  - Deletes the currently hovered pipeline element.
+## Pipeline editor
 
-## Table Widget
+| Context | Shortcut | Effect |
+|---|---|---|
+| Pipeline assembly | `Delete` or `Backspace` | Deletes the currently hovered pipeline element |
 
-- `Ctrl/Cmd + F` in table widget filter dropdown (chart type -> table)
-  - Focuses/selects the filter search input.
+This is useful when refining a pipeline quickly without moving back to the element action controls.
 
-## Dialog Behavior
+## Table widget
 
-- `Escape`
-  - Closes shared overlay dialogs.
+| Context | Shortcut | Effect |
+|---|---|---|
+| Table widget filter dropdown | `Ctrl/Cmd + F` | Focuses the filter search input |
 
-- `Enter`
-  - Confirms.
+This is most helpful in chart views that use the `Table` visualization and have many fields or filter options.
+
+## Dialog behavior
+
+| Context | Shortcut | Effect |
+|---|---|---|
+| Shared overlay dialogs | `Escape` | Closes the dialog |
+| Shared overlay dialogs | `Enter` | Confirms the dialog |
+
+These shortcuts are simple, but they make repeated configuration work much faster once they become muscle memory.
diff --git a/docs/06_configure-operate-deployment.md b/docs/06_configure-operate-deployment.md
index ca1f74339..27d6b45ea 100644
--- a/docs/06_configure-operate-deployment.md
+++ b/docs/06_configure-operate-deployment.md
@@ -4,429 +4,467 @@ title: Deployment options
 sidebar_label: Deployment options
 ---
 
-
 ## Introduction
 
-StreamPipes comes with many different options to customize a deployment. This section introduces the various options you can choose from when installing StreamPipes.
-
-You can choose between various **deployment modes**, choose from two different core packages and several extension packages, wich are described below.
+StreamPipes supports several deployment models, from a simple single-host installation to distributed industrial setups with extension services running close to machines. This page explains how to deploy StreamPipes with Docker Compose or Kubernetes, how broker and transport choices affect the setup, and which configuration options are available in the current Helm chart.
 
-## Deployment Mode
+At a high level, every deployment contains the same main parts:
 
-For the deployment model, you choose between a standard multi-container `Docker-Compose` installation and the `Kubernetes` installation.
-we provide several `Docker-Compose` files for the various options shown here and a `helm chart`. 
-See [Docker Deployment](06_deploy-docker.md) and [Kubernetes Deployment](06_deploy-kubernetes.md) for more details.
+- `Core` and `UI` provide the central platform services and browser interface.
+- `CouchDB` stores metadata, configuration, users, pipelines, adapters, dashboards, assets, and other platform objects.
+- `InfluxDB` stores persisted event data and datasets.
+- One or more `extension services` provide adapters, processors, and sinks.
+- A broker such as `NATS`, `Kafka`, or `Pulsar` transports events between runtime components.
 
-### Running StreamPipes in a non-containerized environment
+## Deployment models
 
-Of course, it is also possible to launch StreamPipes in a non-containerized environment. 
-You will need to build your own executable binaries by running `mvn package`.
-In addition, it is required to install the required 3rd party services (see [Architecture](07_technicals-architecture.md)) and configure the environment variables as described in [Environment Variables](06_configure-operate-environment-variables.md).
+Choose the deployment model based on where StreamPipes runs and how much operational control you need:
 
-## Core Service
+- `Docker Compose` is the fastest way to install StreamPipes on one host. It is a good fit for evaluation, demos, local environments, and smaller installations.
+- `Kubernetes` is the right option when you need cluster-level operations, service management, persistent storage classes, ingress control, and more explicit infrastructure configuration.
+- `Distributed deployments` are useful when extension services should run outside the central data center, for example in the OT network or on edge systems close to industrial machines.
 
-We provide two different pre-packaged versions of core services. The default `streampipes-service-core` is a packaged JAR file which includes client libraries for the various messaging systems StreamPipes supports at the cost of a larger file size.
-In case you plan to run StreamPipes on less resource-intensive hardware, we recommend to switch to the `streampipes-service-core-minimal` package, which only includes support for MQTT and NATS, but has a smaller file size and slightly improved startup performance.
+## Docker Compose deployment
 
-## Extension Services
+The repository contains several ready-to-run Compose presets in the StreamPipes source tree:
 
-Similar to the core, we provide several pre-packaged extension services which differ mainly by their file size, number of supported adapters and pipeline elements and messaging systems.
+- [docker-compose.yml](https://github.com/apache/streampipes/blob/dev/installer/compose/docker-compose.yml)
+- [docker-compose.kafka.yml](https://github.com/apache/streampipes/blob/dev/installer/compose/docker-compose.kafka.yml)
+- [docker-compose.minimal.yml](https://github.com/apache/streampipes/blob/dev/installer/compose/docker-compose.minimal.yml)
+- [docker-compose.nats-auth.yml](https://github.com/apache/streampipes/blob/dev/installer/compose/docker-compose.nats-auth.yml)
+- [docker-compose.minimal.nats-auth.yml](https://github.com/apache/streampipes/blob/dev/installer/compose/docker-compose.minimal.nats-auth.yml)
+- [Compose README](https://github.com/apache/streampipes/blob/dev/installer/compose/README.md)
 
-The following packages exist:
+### Default Compose setup
 
-* `streampipes-extensions-all-jvm` is the largest package and includes all official StreamPipes adapters and pipeline elements. It also includes support for all messaging systems Streampipes currently supports.
-* `streampipes-extensions-all-iiot` is a subset of the aforementioned package and excludes adapters and pipeline elements which are often not relevant for IIoT use cases. For instance, the package excludes text mining-related pipeline elements.
-* `streampipes-extensions-iiot-minimal` is a subset of the aforementioned package and includes only support for the lightweight messaging systems MQTT and NATS.
+The default preset is [`docker-compose.yml`](https://github.com/apache/streampipes/blob/dev/installer/compose/docker-compose.yml). It installs:
 
-Generally said, in cases where you plan to deploy StreamPipes on a resource-limited edge device, we recommend a combination of the `streampipes-service-core-minimal` and `streampipes-extensions-iiot-minimal` package. This could, for instance, be a device with less than 4GB memory.
-In other cases, it depends on the use case and if you need all adapters and pipeline elements or are ok with the IIoT-related extensions.
+- `backend`
+- `ui`
+- `couchdb`
+- `influxdb`
+- `nats`
+- `extensions-all-iiot`
 
-## Messaging System
+This is the recommended starting point for new installations. It uses `NATS` as the internal event broker and the standard IIoT-focused extension package.
 
-StreamPipes can be configured to use different messaging systems for exchanging events between adapters and pipeline elements.
-The section [Messaging](07_technicals-messaging.md) includes detailed information on the configuration of messaging systems. 
+Start it with:
 
+```bash
+docker-compose up -d
+```
 
-StreamPipes Compose is a simple collection of user-friendly `docker-compose` files that easily lets gain first-hand experience with Apache StreamPipes.
+Stop it with:
 
-> **NOTE**: We recommend StreamPipes Compose to only use for initial try-out and testing. If you are a developer and
-> want to develop new pipeline elements or core feature, use the [StreamPipes CLI](07_extend-cli.md).
+```bash
+docker-compose down
+```
 
-#### TL;DR: A one-liner to rule them all :-)
+Remove the persisted volumes as well:
 
 ```bash
-docker-compose up -d
+docker-compose down -v
 ```
-Go to http://localhost to finish the installation in the browser. Once finished, switch to the pipeline editor and start the interactive tour or check the [online tour](https://streampipes.apache.org/docs/user-guide-tour/) to learn how to create your first pipeline!
 
-## Prerequisites
-* Docker >= 17.06.0
-* Docker-Compose >= 1.17.0 (Compose file format: 3.4)
-* Google Chrome (recommended), Mozilla Firefox, Microsoft Edge
+### Kafka-based Compose setup
 
-Tested on: **macOS, Linux, Windows 10 upwards** (CMD, PowerShell, GitBash)
+If your environment already standardizes on Kafka, use [`docker-compose.kafka.yml`](https://github.com/apache/streampipes/blob/dev/installer/compose/docker-compose.kafka.yml). This variant replaces NATS with Kafka and configures StreamPipes accordingly.
 
-**macOS** and **Windows** users can easily get Docker and Docker-Compose on their systems by installing **Docker for Mac/Windows** (recommended).
+Start it with:
 
-> **NOTE**: On purpose, we disabled all port mappings except of http port **80** to access the StreamPipes UI to provide minimal surface for conflicting ports.
+```bash
+docker-compose -f docker-compose.kafka.yml up -d
+```
 
-## Usage
-We provide several options to get you going:
+### Minimal Compose setup
 
-- **default**: Default docker-compose file, called `docker-compose.yml`.
-- **nats**: The standard installation which uses Nats as message broker,called `docker-compose.nats.yml`.
-- **full**: Contains experimental Flink wrappers, called `docker-compose.full.yml`.
+[`docker-compose.minimal.yml`](https://github.com/apache/streampipes/blob/dev/installer/compose/docker-compose.minimal.yml) is the leanest preset. It uses the minimal IIoT extension service and is useful when you want a smaller footprint and do not need the full catalog of adapters and pipeline elements.
 
-:::info
+Start it with:
 
-Other options include configurations for the internally used message broker. The current default is `Kafka`, but you can also start StreamPipes with `Nats`, `MQTT` or `Apache Pulsar`.
-Use one of the other provided docker-compose files.
+```bash
+docker-compose -f docker-compose.minimal.yml up -d
+```
 
-:::
+### Token-based NATS authentication
 
-**Starting** the **default** option is as easy as simply running:
-> **NOTE**: Starting might take a while since `docker-compose up` also initially pulls all Docker images from Dockerhub.
+If you want to protect internal NATS communication with a token, set `SP_NATS_TOKEN` and add the auth override file:
 
 ```bash
-docker-compose up -d
-# go to `http://localhost` after all services are started
+docker-compose -f docker-compose.yml -f docker-compose.nats-auth.yml up -d
 ```
-After all containers are successfully started just got to your browser and visit http://localhost to finish the installation. Once finished, switch to the pipeline editor and start the interactive tour or check the [online tour](https://streampipes.apache.org/docs/user-guide-tour/) to learn how to create your first pipeline!
 
-**Stopping** the **default** option is similarly easy:
-```bash
-docker-compose down
-# if you want to remove mapped data volumes, run:
-# docker-compose down -v
-```
+For the minimal setup:
 
-Starting the **nats** option is almost the same, just specify the `docker-compose.nats.yml` file:
-```bash
-docker-compose -f docker-compose.nats.yml up -d
-# go to `http://localhost` after all services are started
-```
-**Stopping** the **nats** option:
 ```bash
-docker-compose -f docker-compose.nats.yml down
+docker-compose -f docker-compose.minimal.yml -f docker-compose.minimal.nats-auth.yml up -d
 ```
 
+### When to use Compose
+
+Use Compose when you want:
+
+- a fast installation on one machine
+- a documented reference setup
+- a simple way to compare the `default`, `kafka`, and `minimal` variants
+- a development or test environment that closely matches the official installer
+
+## Kubernetes deployment
+
+The Kubernetes deployment is provided as a Helm chart in the StreamPipes source repository. The central configuration file is:
+
+- [installer/k8s/values.yaml](https://github.com/apache/streampipes/blob/dev/installer/k8s/values.yaml)
+
+Install the chart from the `installer/k8s` directory:
 
-Starting the **full** option is almost the same, just specify the `docker-compose.full.yml` file:
-```bash
-docker-compose -f docker-compose.full.yml up -d
-#go to `http://localhost` after all services are started
-```
-Stopping the **full** option:
 ```bash
-docker-compose -f docker-compose.nats.yml down
-#docker-compose -f docker-compose.nats.yml down -v
+helm install streampipes ./
 ```
 
-## Update services
-To actively pull the latest available Docker images use:
+Remove it again with:
+
 ```bash
-docker-compose pull
+helm uninstall streampipes
 ```
 
-## Upgrade
-To upgrade to another StreamPipes version, simply edit the `SP_VERSION` in the `.env` file.
-```
-SP_VERSION=<VERSION>
-```
+Kubernetes is the better choice when you need:
 
+- managed persistent volumes
+- ingress or Traefik-based routing
+- explicit service exposure rules
+- cluster operations and lifecycle management
+- flexible deployment of central services and extension services
 
-## Prerequisites
-Requires Helm (https://helm.sh/) and an actively running Kubernetes cluster.
+### Ingress and storage
 
-## Usage
-We provide helm chart options to get you going in the `installer/k8s`folder.
+The Helm chart supports both:
 
-**Starting** the default helm chart option is as easy as simply running the following command from the root of this folder:
-> **NOTE**: Starting might take a while since we also initially pull all Docker images from Dockerhub.
+- standard Kubernetes `Ingress`
+- Traefik `IngressRoute`
 
-```bash
-helm install streampipes ./
+It also supports storage customization through the `storageClassName` values for the persistent components.
+
+## Distributed deployments
+
+A central advantage of StreamPipes is that extension services do not have to run in the same place as the UI and core. In industrial environments, this matters because data sources often live in restricted OT networks or on edge systems close to production equipment.
+
+A common topology looks like this:
+
+- `Central IT environment`: UI, Core, CouchDB, InfluxDB, and usually the main broker
+- `OT or edge environment`: one or more extension services that connect to local machines, PLCs, brokers, or APIs
+
+This split is useful when:
+
+- machine data should stay inside a plant network as long as possible
+- adapter traffic should terminate close to the source
+- firewall rules allow controlled service-to-service communication but not full central access to machines
+- lower latency is needed for ingestion or preprocessing
+
+In practice, an extension service in the OT network can:
+
+- collect data from local sources
+- normalize or preprocess the events
+- expose adapters and pipeline elements to the central StreamPipes installation
+- forward stream events through the configured message broker
+
+This means StreamPipes can be operated as a central industrial data platform while still placing data collection and processing components near the edge.
+
+## Message brokers
+
+StreamPipes supports different brokers for transporting events between adapters, processors, and sinks. In deployment terms, the broker is a core runtime decision because it affects both the infrastructure you install and the broker-specific configuration values you provide.
+
+### NATS
+
+`NATS` is the recommended default for new installations. The current default Compose installer uses it, and the Helm chart also defaults to:
+
+```yaml
+preferredBroker: "nats"
 ```
-After a while, all containers should successfully started, indicated by the `Running` status.
 
-The `values.yaml` file contains several configuration options to customize your StreamPipes installation. See the section below for all configuration options.
+Use NATS when you want:
 
-## Ingress
+- the simplest current reference setup
+- a lightweight internal broker
+- an easy path into distributed deployments with StreamPipes extension services
 
-The helm chart provides several options to configure an Ingress or to define an Ingressroute that directly integrates with Traefik.
+### Kafka
 
-## Dynamic Volume Provisioning
+`Kafka` remains available and is a good choice when:
 
-You can override the `storageClassName` variable to configure StreamPipes for dynamic volume provisioning.
+- your organization already operates Kafka
+- event streams should integrate with an existing Kafka-based data platform
+- operational standards already assume Kafka tooling and operations
 
-## Parameters
+The Compose installer includes a dedicated Kafka preset, and the Helm chart keeps Kafka configuration values.
 
-Here is an overview of the supported parameters to configure StreamPipes.
+### Pulsar
 
-### Common parameters
+`Pulsar` is also part of the Kubernetes configuration model. It is relevant when your infrastructure already uses Pulsar or when you want StreamPipes to align with a Pulsar-based streaming environment.
 
-| Parameter Name                                   | Description                                             | Value                                   |
-|--------------------------------------------------|---------------------------------------------------------|-----------------------------------------|
-| deployment                                       | Deployment type (lite or full)                          | lite                                    |
-| preferredBroker                                  | Preferred broker for deployment                         | "nats"                                  |
-| monitoringSystem                                 | Enable monitoring system (true/false)                   | false                                   |
-| pullPolicy                                       | Image pull policy                                       | "Always"                                |
-| restartPolicy                                    | Restart policy for the container                        | Always                                  |
-| persistentVolumeReclaimPolicy                    | Reclaim policy for persistent volumes                   | "Delete"                                |
-| persistentVolumeAccessModes                      | Access mode for persistent volumes                      | "ReadWriteOnce"                         |
-| initialDelaySeconds                              | Initial delay for liveness and readiness probes         | 60                                      |
-| periodSeconds                                    | Interval between liveness and readiness probes          | 30                                      |
-| failureThreshold                                 | Number of consecutive failures for readiness probes     | 30                                      |
-| hostPath                                         | Host path for the application                           | ""                                      |
+Unlike NATS and Kafka, there is no dedicated Compose preset for Pulsar in the standard installer. In practice, Pulsar is therefore mainly a Kubernetes or custom-deployment topic.
 
-### StreamPipes common parameters
+## HTTP and NATS transport modes
 
-| Parameter Name                                  | Description                                             | Value                                    |
-|-------------------------------------------------|---------------------------------------------------------|------------------------------------------|
-| streampipes.version                             | StreamPipes version                                     | "0.93.0-SNAPSHOT"                        |
-| streampipes.registry                            | StreamPipes registry URL                                | "apachestreampipes"                      |
-| streampipes.auth.secretName                     | The secret name for storing secrets                     | "sp-secrets"                             |
-| streampipes.auth.users.admin.user               | The initial admin user                                  | "admin@streampipes.apache.org"           |
-| streampipes.auth.users.admin.password           | The initial admin password (leave empty for autogen)    | "admin"                                  |
-| streampipes.auth.users.service.user             | The initial service account user                        | "sp-service-client"                      |
-| streampipes.auth.users.service.secret           | The initial service account secret                      | empty (auto-generated)                   |
-| streampipes.auth.encryption.passcode            | Passcode for value encryption                           | empty (auto-generated)                   |
-| streampipes.core.appName                        | StreamPipes backend application name                    | "backend"                                |
-| streampipes.core.port                           | StreamPipes backend port                                | 8030                                     |
-| streampipes.core.persistence.storageClassName   | Storage class name for backend PVs                      | "hostpath"                               |
-| streampipes.core.persistence.storageSize        | Size of the backend PV                                  | "1Gi"                                    |
-| streampipes.core.persistence.claimName          | Name of the backend PersistentVolumeClaim               | "backend-pvc"                            |
-| streampipes.core.persistence.pvName             | Name of the backend PersistentVolume                    | "backend-pv"                             |
-| streampipes.core.service.name                   | Name of the backend service                             | "backend"                                |
-| streampipes.core.service.port                   | TargetPort of the StreamPipes backend service           | 8030                                     |
-| streampipes.ui.appName                          | StreamPipes UI application name                         | "ui"                                     |
-| streampipes.ui.resolverActive                   | Flag for enabling DNS resolver for Nginx proxy          | true                                     |
-| streampipes.ui.port                             | StreamPipes UI port                                     | 8088                                     |
-| streampipes.ui.resolver                         | DNS resolver for Nginx proxy                            | "kube-dns.kube-system.svc.cluster.local" |
-| streampipes.ui.service.name                     | Name of the UI service                                  | "ui"                                     |
-| streampipes.ui.service.type                     | Type of the UI service                                  | "ClusterIP"                              |
-| streampipes.ui.service.nodePort                 | Node port for the UI service                            | 8088                                     |
-| streampipes.ui.service.port                     | TargetPort of the StreamPipes UI service                | 8088                                     |
-| streampipes.ingress.active                      | Flag for enabling Ingress for StreamPipes               | false                                    |
-| streampipes.ingress.annotations                 | Annotations for Ingress                                 | {}                                       |
-| streampipes.ingress.host                        | Hostname for Ingress                                    | ""                                       |
-| streampipes.ingressroute.active                 | Flag for enabling IngressRoute for StreamPipes          | true                                     |
-| streampipes.ingressroute.annotations            | Annotations for IngressRoute                            | {}                                       |
-| streampipes.ingressroute.entryPoints            | Entry points for IngressRoute                           | ["web", "websecure"]                     |
-| streampipes.ingressroute.host                   | Hostname for IngressRoute                               | ""                                       |
-| streampipes.ingressroute.certResolverActive     | Flag for enabling certificate resolver for IngressRoute | true                                     |
-| streampipes.ingressroute.certResolver           | Certificate resolver for IngressRoute                   | ""                                       |
+It is important to distinguish two different communication paths:
 
+1. `Event transport`
+2. `Core-to-extension service transport`
 
-### Extensions common parameters
+These are related, but they are not the same.
 
-| Parameter Name                                  | Description                                             | Value                                    |
-|-------------------------------------------------|---------------------------------------------------------|------------------------------------------|
-| extensions.iiot.appName                         | IIoT extensions application name                        | extensions-all-iiot                      |
-| extensions.iiot.port                            | Port for the IIoT extensions application                | 8090                                     |
-| extensions.iiot.service.name                    | Name of the IIoT extensions service                     | extensions-all-iiot                      |
-| extensions.iiot.service.port                    | TargetPort of the IIoT extensions service               | 8090                                     |
+### Event transport
 
+Event transport is controlled primarily through `SP_PRIORITIZED_PROTOCOL` in the backend. This decides which messaging system StreamPipes should prioritize for exchanging events between runtime components.
 
-### External common parameters
+Examples:
 
-#### Couchdb common parameters
-
-| Parameter Name                                  | Description                                              | Value                                    |
-|-------------------------------------------------|----------------------------------------------------------|------------------------------------------|
-| external.couchdb.appName                        | CouchDB application name                                 | "couchdb"                                |
-| external.couchdb.version                        | CouchDB version                                          | 3.3.1                                    |
-| external.couchdb.user                           | CouchDB admin username                                   | "admin"                                  |
-| external.couchdb.password                       | CouchDB admin password                                   | empty (auto-generated)                   |
-| external.couchdb.port                           | Port for the CouchDB service                             | 5984                                     |
-| external.couchdb.service.name                   | Name of the CouchDB service                              | "couchdb"                                |
-| external.couchdb.service.port                   | TargetPort of the CouchDB service                        | 5984                                     |
-| external.couchdb.persistence.storageClassName   | Storage class name for CouchDB PVs                       | "hostpath"                               |
-| external.couchdb.persistence.storageSize        | Size of the CouchDB PV                                   | "1Gi"                                    |
-| external.couchdb.persistence.claimName          | Name of the CouchDB PersistentVolumeClaim                | "couchdb-pvc"                            |
-| external.couchdb.persistence.pvName             | Name of the CouchDB PersistentVolume                     | "couchdb-pv"                             |
-
-#### Influxdb common parameters
-
-| Parameter Name                                  | Description                                              | Value                                    |
-|-------------------------------------------------|----------------------------------------------------------|------------------------------------------|
-| external.influxdb.appName                       | InfluxDB application name                                | "influxdb"                               |
-| external.influxdb.version                       | InfluxDB version                                         | 2.6                                      |
-| external.influxdb.username                      | InfluxDB admin username                                  | "admin"                                  |
-| external.influxdb.password                      | InfluxDB admin password                                  | empty (auto-generated)                   |
-| external.influxdb.adminToken                    | InfluxDB admin token                                     | empty (auto-generated)                   |
-| external.influxdb.initOrg                       | InfluxDB initial organization                            | "sp"                                     |
-| external.influxdb.initBucket                    | InfluxDB initial bucket                                  | "sp"                                     |
-| external.influxdb.initMode                      | InfluxDB initialization mode                             | "setup"                                  |
-| external.influxdb.apiPort                       | Port number for the InfluxDB service (API)               | 8083                                     |
-| external.influxdb.httpPort                      | Port number for the InfluxDB service (HTTP)              | 8086                                     |
-| external.influxdb.grpcPort                      | Port number for the InfluxDB service (gRPC)              | 8090                                     |
-| external.influxdb.service.name                  | Name of the InfluxDB service                             | "influxdb"                               |
-| external.influxdb.service.apiPort               | TargetPort of the InfluxDB service for API               | 8083                                     |
-| external.influxdb.service.httpPort              | TargetPort of the InfluxDB service for HTTP              | 8086                                     |
-| external.influxdb.service.grpcPort              | TargetPort of the InfluxDB service for gRPC              | 8090                                     |
-| external.influxdb.persistence.storageClassName  | Storage class name for InfluxDB PVs                      | "hostpath"                               |
-| external.influxdb.persistence.storageSize       | Size of the InfluxDB PV                                  | "1Gi"                                    |
-| external.influxdb.persistence.storageSizeV1     | Size of the InfluxDB PV for v1 databases                 | "1Gi"                                    |
-| external.influxdb.persistence.claimName         | Name of the InfluxDBv2 PersistentVolumeClaim             | "influxdb2-pvc"                          |
-| external.influxdb.persistence.claimNameV1       | Name of the InfluxDBv1 PersistentVolumeClaim             | "influxdb-pvc"                           |
-| external.influxdb.persistence.pvName            | Name of the InfluxDBv2 PersistentVolume                  | "influxdb2-pv"                           |
-| external.influxdb.persistence.pvNameV1          | Name of the InfluxDBv1 PersistentVolume                  | "influxdb-pv"                            |
-
-
-#### Nats common parameters
-
-| Parameter Name                                  | Description                                              | Value                                    |
-|-------------------------------------------------|----------------------------------------------------------|------------------------------------------|
-| external.nats.appName                           | NATS application name                                    | "nats"                                   |
-| external.nats.port                              | Port for the NATS service                                | 4222                                     |
-| external.nats.version                           | NATS version                                             |                                          |
-| external.nats.service.type                      | Type of the NATS service                                 | "NodePort"                               |
-| external.nats.service.externalTrafficPolicy     | External traffic policy for the NATS service             | "Local"                                  |
-| external.nats.service.name                      | Name of the NATS service                                 | "nats"                                   |
-| external.nats.service.port                      | TargetPort of the NATS service                           | 4222                                     |
+- `nats` in the default Compose setup
+- `kafka` in the Kafka Compose setup
 
+### Core-to-extension service transport
 
-#### Kafka common parameters
+Core-to-extension communication is controlled separately. The relevant settings are:
 
-| Parameter Name                                  | Description                                              | Value                                    |
-|-------------------------------------------------|----------------------------------------------------------|------------------------------------------|
-| external.kafka.appName                          | Kafka application name                                   | "kafka"                                  |
-| external.kafka.version                          | Kafka version                                            | 2.2.0                                    |
-| external.kafka.port                             | Port for the Kafka service                               | 9092                                     |
-| external.kafka.external.hostname                | Name which will be advertised to external clients. Clients which use (default) port 9094       | "localhost"
-| external.kafka.service.name                     | Name of the Kafka service                                | "kafka"                                  |
-| external.kafka.service.port                     | TargetPort of the Kafka service                          | 9092                                     |
-| external.kafka.service.portOutside              | Port for Kafka client outside of the cluster | 9094                              |
-| external.kafka.persistence.storageClassName     | Storage class name for Kafka PVs                         | "hostpath"                               |
-| external.kafka.persistence.storageSize          | Size of the Kafka PV                                     | "1Gi"                                    |
-| external.kafka.persistence.claimName            | Name of the Kafka PersistentVolumeClaim                  | "kafka-pvc"                              |
-| external.kafka.persistence.pvName               | Name of the Kafka PersistentVolume                       | "kafka-pv"                               |
-|
-
-#### Zookeeper common parameters
-
-| Parameter Name                                  | Description                                              | Value                                    |
-|-------------------------------------------------|----------------------------------------------------------|------------------------------------------|
-| external.zookeeper.appName                      | ZooKeeper application name                               | "zookeeper"                              |
-| external.zookeeper.version                      | ZooKeeper version                                        | 3.4.13                                   |
-| external.zookeeper.port                         | Port for the ZooKeeper service                           | 2181                                     |
-| external.zookeeper.service.name                 | Name of the ZooKeeper service                            | "zookeeper"                              |
-| external.zookeeper.service.port                 | TargetPort of the ZooKeeper service                      | 2181                                     |
-| external.zookeeper.persistence.storageClassName | Storage class name for ZooKeeper PVs                     | "hostpath"                               |
-| external.zookeeper.persistence.storageSize      | Size of the ZooKeeper PV                                 | "1Gi"                                    |
-| external.zookeeper.persistence.claimName        | Name of the ZooKeeper PersistentVolumeClaim              | "zookeeper-pvc"                          |
-| external.zookeeper.persistence.pvName           | Name of the ZooKeeper PersistentVolume                   | "zookeeper-pv"                           |
+- `SP_CORE_EXTENSION_TRANSPORT_MODE` on the core side
+- `SP_EXTENSION_TRANSPORT_MODE` on the extension side
 
+The currently supported modes are:
 
-#### Pulsar common parameters
+- Core: `http`, `nats`, or `auto`
+- Extension service: `http`, `nats`, or `dual`
 
-| Parameter Name                                  | Description                                              | Value                                    |
-|-------------------------------------------------|----------------------------------------------------------|------------------------------------------|
-| external.pulsar.appName                         | pulsar application name                                  | "pulsar"                                 |
-| external.pulsar.version                         | pulsar version                                           | 3.0.0                                    |
-| external.pulsar.port                            | Port for the pulsar service                              | 6650                                     |
-| external.pulsar.service.name                    | Name of the pulsar service                               | "pulsar"                                 |
-| external.pulsar.service.port                    | TargetPort of the pulsar service                         | 6650                                     |
-| external.pulsar.persistence.storageClassName    | Storage class name for pulsar PVs                        | "hostpath"                               |
-| external.pulsar.persistence.storageSize         | Size of the pulsar PV                                    | "1Gi"                                    |
-| external.pulsar.persistence.claimName           | Name of the pulsar PersistentVolumeClaim                 | "pulsar-pvc"                             |
-| external.pulsar.persistence.pvName              | Name of the pulsar PersistentVolume                      | "pulsar-pv"                              |
+Use them as follows:
 
-### Monitoring common parameters
+- `HTTP` is the simplest direct model. Core sends requests directly to the extension service over HTTP.
+- `NATS` uses request/reply over NATS for core-to-extension communication.
+- `AUTO` on the core side prefers NATS when the service supports it and falls back to HTTP when necessary.
+- `DUAL` on the extension side allows a service to support both HTTP and NATS-based requests.
 
-#### Monitoring - Prometheus
-
-| Parameter Name                                  | Description                                              | Value                                    |
-|-------------------------------------------------|----------------------------------------------------------|------------------------------------------|
-| prometheus.appName                              | Prometheus application name                              | "prometheus"                             |
-| prometheus.version                              | Prometheus version                                       | 2.45.0                                   |
-| prometheus.port                                 | Prometheus port                                          | 9090                                     |
-| prometheus.service.name                         | Prometheus service name                                  | "prometheus"                             |
-| prometheus.service.port                         | Prometheus service port                                  | 9090                                     |
-| prometheus.persistence.storageClassName         | Prometheus storage class name                            | "hostpath"                               |
-| prometheus.persistence.storageSize              | Prometheus storage size                                  | "2Gi"                                    |
-| prometheus.persistence.claimName                | Prometheus PVC claim name                                | "prometheus-pvc"                         |
-| prometheus.persistence.pvName                   | Prometheus PV name                                       | "prometheus-pv"                          |
-| prometheus.persistence.tokenStorageSize         | Prometheus token storage size                            | "16Ki"                                   |
-| prometheus.config.scrapeInterval                | Prometheus scrape interval                               | 10s                                      |
-| prometheus.config.evaluationInterval            | Prometheus evaluation interval                           | 15s                                      |
-| prometheus.config.backendJobName                | Prometheus backend job name                              | "backend"                                |
-| prometheus.config.extensionsName                | Prometheus extensions job name                           | "extensions-all-iiot"                    |
-| prometheus.config.tokenFileName                 | Prometheus token file name                               | "token"                                  |
-| prometheus.config.tokenFileDir                  | Prometheus token file directory                          | "/opt/data"
-
-#### Monitoring - Grafana
-
-| Parameter Name                                  | Description                                              | Value                                    |
-|-------------------------------------------------|----------------------------------------------------------|------------------------------------------|
-| grafana.appName                                 | Grafana application name                                 | "grafana"                                |
-| grafana.version                                 | Grafana version                                          | 10.1.2                                   |
-| grafana.port                                    | Grafana port                                             | 3000                                     |
-| grafana.service.name                            | Grafana service name                                     | "grafana"                                |
-| grafana.service.port                            | Grafana service port                                     | 3000                                     |
-| grafana.persistence.storageClassName            | Grafana storage class name                               | "hostpath"                               |
-| grafana.persistence.storageSize                 | Grafana storage size                                     | "1Gi"                                    |
-| grafana.persistence.claimName                   | Grafana PVC claim name                                   | "grafana-pvc"                            |
-| grafana.persistence.pvName                      | Grafana PV name                                          | "grafana-pv"                             |
-
-
-## Auto-generation of parameters.
-
-The helm chart includes a `secrets.yaml` file which auto-generates several settings as follows:
+This distinction matters in distributed installations. For example:
 
-```yaml
+- You may use `NATS` as the event broker between runtime components.
+- At the same time, core may still reach an extension service over `HTTP`.
+- Or you may move both event transport and core-to-extension requests to `NATS` when that better fits a segmented or broker-centric network design.
 
-apiVersion: v1
-kind: Secret
-metadata:
-  name: sp-secrets
-  namespace: {{ .Release.Namespace | quote }}
-type: Opaque
-data:
-  sp-initial-admin-password: {{ ternary (randAlphaNum 10) .Values.streampipes.auth.users.admin.password (empty .Values.streampipes.auth.users.admin.password) | b64enc | quote }}
-  sp-initial-client-secret: {{ ternary (randAlphaNum 35) .Values.streampipes.auth.users.service.secret (empty .Values.streampipes.auth.users.service.secret) | b64enc | quote }}
-  sp-encryption-passcode:  {{ ternary (randAlphaNum 20) .Values.streampipes.auth.encryption.passcode (empty .Values.streampipes.auth.encryption.passcode) | b64enc | quote }}
-  sp-couchdb-password:  {{ ternary (randAlphaNum 20) .Values.external.couchdb.password (empty .Values.external.couchdb.password) | b64enc | quote }}
-  sp-ts-storage-password:  {{ ternary (randAlphaNum 20) .Values.external.influxdb.password (empty .Values.external.influxdb.password) | b64enc | quote }}
-  sp-ts-storage-token:  {{ ternary (randAlphaNum 20) .Values.external.influxdb.adminToken (empty .Values.external.influxdb.adminToken) | b64enc | quote }}
+The UI also needs to know where live adapter requests should be forwarded. In the Compose presets, this is configured through `SP_HTTP_SERVER_ADAPTER_ENDPOINT`, which points the UI proxy to the installed extension service.
 
-```
+## Choosing a deployment pattern
 
+Use the following rules of thumb:
 
-## Deleting the current helm chart deployment:
-```bash
-helm uninstall streampipes
-```
+- Start with `Docker Compose` if you want the quickest supported installation.
+- Choose the default `NATS` setup unless there is a clear reason to align with `Kafka`.
+- Use the `minimal` Compose preset for smaller installations or leaner edge-style setups.
+- Move to `Kubernetes` when you need cluster operations, ingress control, and persistent infrastructure management.
+- Place `extension services` in the OT network or at the edge when data sources should stay close to the machine network.
+- Use `HTTP` transport first if you want the most direct service wiring.
+- Use `NATS` or `AUTO` transport modes when broker-based service communication fits the deployment better.
 
+## Related configuration pages
 
-his page explains how SSL Certificates can be used to provide transport layer security between your Browser and the Streampipes Backend.
+For the detailed environment-variable reference, continue with [Environment Variables](./06_configure-operate-environment-variables.md). For the operational view of registered services and runtime service configuration, see [Extension Services](./06_configure-operate-extension-services.md).
 
-## Prerequisites
-You need a valid Certificate consisting of a Private and a Public Key. Both Keys must be in PEM Format. Please note that your Private Key should never be shared, otherwise the communication can not be considered secure.
+## Kubernetes configuration reference
 
-## Edit docker-compose.yml
-In order to use SSL you have to open port 443 on the nginx Service. Incoming insecure Traffic on Port 80 will be automatically rerouted to Port 443.
+The following tables summarize the Helm values that are currently exposed in the Kubernetes installer.
 
-The Environment-Variable NGINX_SSL must be set to "true".
+### Common parameters
 
-Finally you have to inject the Certificates into the Docker-Container. In the example below, the Certificates are placed in the directory /etc/ssl/private/ on the host machine. Please change the path according to the place where the Certificates are located on your machine. The path after the colon should not be changed!
-```yaml
-[...]
-  nginx:
-    image: apachestreampipes/ui
-    ports:
-      - "80:80"
-      - "443:443"
-    environment:
-      - NGINX_SSL=true
-    volumes:
-      - /etc/ssl/private/private.pem:/etc/nginx/ssl/ssl.pem
-      - /etc/ssl/private/public.pem:/etc/nginx/ssl/cert.pem
-    depends_on:
-      - backend
-    networks:
-      spnet:
-[...]
-```
+| Parameter Name                | Description                                         | Value           |
+|------------------------------|-----------------------------------------------------|-----------------|
+| deployment                   | Deployment type (`lite` or `full`)                  | lite            |
+| preferredBroker              | Preferred broker for deployment                     | `"nats"`        |
+| monitoringSystem             | Enable monitoring system (`true` or `false`)        | false           |
+| pullPolicy                   | Image pull policy                                   | `"Always"`      |
+| restartPolicy                | Restart policy for the container                    | Always          |
+| persistentVolumeReclaimPolicy| Reclaim policy for persistent volumes               | `"Delete"`      |
+| persistentVolumeAccessModes  | Access mode for persistent volumes                  | `"ReadWriteOnce"` |
+| initialDelaySeconds          | Initial delay for liveness and readiness probes     | 60              |
+| periodSeconds                | Interval between liveness and readiness probes      | 30              |
+| failureThreshold             | Number of consecutive failures for readiness probes | 30              |
+| hostPath                     | Host path for the application                       | `""`            |
+
+### StreamPipes common parameters
+
+| Parameter Name                                | Description                                             | Value                                    |
+|-----------------------------------------------|---------------------------------------------------------|------------------------------------------|
+| streampipes.version                           | StreamPipes version                                     | `"0.99.0-SNAPSHOT"`                      |
+| streampipes.registry                          | StreamPipes registry URL                                | `"apachestreampipes"`                    |
+| streampipes.auth.secretName                   | Secret name for storing secrets                         | `"sp-secrets"`                           |
+| streampipes.auth.users.admin.user             | Initial admin user                                      | `"admin@streampipes.apache.org"`         |
+| streampipes.auth.users.admin.password         | Initial admin password                                  | `"admin"`                                |
+| streampipes.auth.users.service.user           | Initial service account user                            | `"sp-service-client"`                    |
+| streampipes.auth.users.service.secret         | Initial service account secret                          | empty (auto-generated)                   |
+| streampipes.auth.encryption.passcode          | Passcode for value encryption                           | empty (auto-generated)                   |
+| streampipes.core.appName                      | StreamPipes backend application name                    | `"backend"`                              |
+| streampipes.core.port                         | StreamPipes backend port                                | 8030                                     |
+| streampipes.core.persistence.storageClassName | Storage class name for backend PVs                      | `"hostpath"`                             |
+| streampipes.core.persistence.storageSize      | Size of the backend PV                                  | `"1Gi"`                                  |
+| streampipes.core.persistence.claimName        | Name of the backend PersistentVolumeClaim               | `"backend-pvc"`                          |
+| streampipes.core.persistence.pvName           | Name of the backend PersistentVolume                    | `"backend-pv"`                           |
+| streampipes.core.service.name                 | Name of the backend service                             | `"backend"`                              |
+| streampipes.core.service.port                 | Target port of the StreamPipes backend service          | 8030                                     |
+| streampipes.ui.appName                        | StreamPipes UI application name                         | `"ui"`                                   |
+| streampipes.ui.resolverActive                 | Enable DNS resolver for the Nginx proxy                 | true                                     |
+| streampipes.ui.port                           | StreamPipes UI port                                     | 8088                                     |
+| streampipes.ui.resolver                       | DNS resolver for the Nginx proxy                        | `"kube-dns.kube-system.svc.cluster.local"` |
+| streampipes.ui.service.name                   | Name of the UI service                                  | `"ui"`                                   |
+| streampipes.ui.service.type                   | Type of the UI service                                  | `"ClusterIP"`                            |
+| streampipes.ui.service.nodePort               | Node port for the UI service                            | 8088                                     |
+| streampipes.ui.service.port                   | Target port of the StreamPipes UI service               | 8088                                     |
+| streampipes.ingress.active                    | Enable Ingress for StreamPipes                          | false                                    |
+| streampipes.ingress.annotations               | Annotations for Ingress                                 | `{}`                                     |
+| streampipes.ingress.host                      | Hostname for Ingress                                    | `""`                                     |
+| streampipes.ingressroute.active               | Enable IngressRoute for StreamPipes                     | true                                     |
+| streampipes.ingressroute.annotations          | Annotations for IngressRoute                            | `{}`                                     |
+| streampipes.ingressroute.entryPoints          | Entry points for IngressRoute                           | `["web", "websecure"]`                   |
+| streampipes.ingressroute.host                 | Hostname for IngressRoute                               | `""`                                     |
+| streampipes.ingressroute.certResolverActive   | Enable certificate resolver for IngressRoute            | true                                     |
+| streampipes.ingressroute.certResolver         | Certificate resolver for IngressRoute                   | `""`                                     |
+
+### Extensions common parameters
+
+| Parameter Name               | Description                              | Value                   |
+|-----------------------------|------------------------------------------|-------------------------|
+| extensions.iiot.appName     | IIoT extensions application name         | `extensions-all-iiot`   |
+| extensions.iiot.imageName   | Container image name for the extensions  | `extensions-all-jvm`    |
+| extensions.iiot.port        | Port for the IIoT extensions application | 8090                    |
+| extensions.iiot.service.name| Name of the IIoT extensions service      | `extensions-all-iiot`   |
+| extensions.iiot.service.port| Target port of the IIoT extensions service | 8090                  |
+
+### External common parameters
+
+#### CouchDB common parameters
+
+| Parameter Name                                | Description                               | Value              |
+|-----------------------------------------------|-------------------------------------------|--------------------|
+| external.couchdb.appName                      | CouchDB application name                  | `"couchdb"`        |
+| external.couchdb.version                      | CouchDB version                           | 3.3.1              |
+| external.couchdb.user                         | CouchDB admin username                    | `"admin"`          |
+| external.couchdb.password                     | CouchDB admin password                    | empty (auto-generated) |
+| external.couchdb.port                         | Port for the CouchDB service              | 5984               |
+| external.couchdb.service.name                 | Name of the CouchDB service               | `"couchdb"`        |
+| external.couchdb.service.port                 | Target port of the CouchDB service        | 5984               |
+| external.couchdb.persistence.storageClassName | Storage class name for CouchDB PVs        | `"hostpath"`       |
+| external.couchdb.persistence.storageSize      | Size of the CouchDB PV                    | `"1Gi"`            |
+| external.couchdb.persistence.claimName        | Name of the CouchDB PersistentVolumeClaim | `"couchdb-pvc"`    |
+| external.couchdb.persistence.pvName           | Name of the CouchDB PersistentVolume      | `"couchdb-pv"`     |
+
+#### InfluxDB common parameters
+
+| Parameter Name                                 | Description                                  | Value                 |
+|------------------------------------------------|----------------------------------------------|-----------------------|
+| external.influxdb.appName                      | InfluxDB application name                    | `"influxdb"`          |
+| external.influxdb.version                      | InfluxDB version                             | 2.6                   |
+| external.influxdb.username                     | InfluxDB admin username                      | `"admin"`             |
+| external.influxdb.password                     | InfluxDB admin password                      | `"sp-admin"`          |
+| external.influxdb.adminToken                   | InfluxDB admin token                         | empty (auto-generated) |
+| external.influxdb.initOrg                      | InfluxDB initial organization                | `"sp"`                |
+| external.influxdb.initBucket                   | InfluxDB initial bucket                      | `"sp"`                |
+| external.influxdb.initMode                     | InfluxDB initialization mode                 | `"setup"`             |
+| external.influxdb.apiPort                      | Port number for the InfluxDB API service     | 8083                  |
+| external.influxdb.httpPort                     | Port number for the InfluxDB HTTP service    | 8086                  |
+| external.influxdb.grpcPort                     | Port number for the InfluxDB gRPC service    | 8090                  |
+| external.influxdb.service.name                 | Name of the InfluxDB service                 | `"influxdb"`          |
+| external.influxdb.service.apiPort              | Target port of the InfluxDB API service      | 8083                  |
+| external.influxdb.service.httpPort             | Target port of the InfluxDB HTTP service     | 8086                  |
+| external.influxdb.service.grpcPort             | Target port of the InfluxDB gRPC service     | 8090                  |
+| external.influxdb.persistence.storageClassName | Storage class name for InfluxDB PVs          | `"hostpath"`          |
+| external.influxdb.persistence.storageSize      | Size of the InfluxDB PV                      | `"1Gi"`               |
+| external.influxdb.persistence.storageSizeV1    | Size of the InfluxDB PV for v1 databases     | `"1Gi"`               |
+| external.influxdb.persistence.claimName        | Name of the InfluxDB v2 PersistentVolumeClaim | `"influxdb2-pvc"`    |
+| external.influxdb.persistence.claimNameV1      | Name of the InfluxDB v1 PersistentVolumeClaim | `"influxdb-pvc"`     |
+| external.influxdb.persistence.pvName           | Name of the InfluxDB v2 PersistentVolume     | `"influxdb2-pv"`      |
+| external.influxdb.persistence.pvNameV1         | Name of the InfluxDB v1 PersistentVolume     | `"influxdb-pv"`       |
+
+#### NATS common parameters
+
+| Parameter Name                            | Description                          | Value         |
+|-------------------------------------------|--------------------------------------|---------------|
+| external.nats.appName                     | NATS application name                | `"nats"`      |
+| external.nats.port                        | Port for the NATS service            | 4222          |
+| external.nats.version                     | NATS version                         | empty         |
+| external.nats.service.type                | Type of the NATS service             | `"NodePort"`  |
+| external.nats.service.externalTrafficPolicy | External traffic policy for NATS   | `"Local"`     |
+| external.nats.service.name                | Name of the NATS service             | `"nats"`      |
+| external.nats.service.port                | Target port of the NATS service      | 4222          |
+
+#### Kafka common parameters
+
+| Parameter Name                                | Description                                               | Value         |
+|-----------------------------------------------|-----------------------------------------------------------|---------------|
+| external.kafka.appName                        | Kafka application name                                    | `"kafka"`     |
+| external.kafka.version                        | Kafka version                                             | 2.2.0         |
+| external.kafka.port                           | Port for the Kafka service                                | 9092          |
+| external.kafka.external.hostname              | Hostname advertised to external clients                   | `"localhost"` |
+| external.kafka.service.name                   | Name of the Kafka service                                 | `"kafka"`     |
+| external.kafka.service.port                   | Target port of the Kafka service                          | 9092          |
+| external.kafka.service.portOutside            | Port for Kafka clients outside of the cluster             | 9094          |
+| external.kafka.persistence.storageClassName   | Storage class name for Kafka PVs                          | `"hostpath"`  |
+| external.kafka.persistence.storageSize        | Size of the Kafka PV                                      | `"1Gi"`       |
+| external.kafka.persistence.claimName          | Name of the Kafka PersistentVolumeClaim                   | `"kafka-pvc"` |
+| external.kafka.persistence.pvName             | Name of the Kafka PersistentVolume                        | `"kafka-pv"`  |
+
+#### Pulsar common parameters
+
+| Parameter Name                               | Description                                | Value          |
+|----------------------------------------------|--------------------------------------------|----------------|
+| external.pulsar.appName                      | Pulsar application name                    | `"pulsar"`     |
+| external.pulsar.version                      | Pulsar version                             | 3.0.0          |
+| external.pulsar.port                         | Port for the Pulsar service                | 6650           |
+| external.pulsar.service.name                 | Name of the Pulsar service                 | `"pulsar"`     |
+| external.pulsar.service.port                 | Target port of the Pulsar service          | 6650           |
+| external.pulsar.persistence.storageClassName | Storage class name for Pulsar PVs          | `"hostpath"`   |
+| external.pulsar.persistence.storageSize      | Size of the Pulsar PV                      | `"1Gi"`        |
+| external.pulsar.persistence.claimName        | Name of the Pulsar PersistentVolumeClaim   | `"pulsar-pvc"` |
+| external.pulsar.persistence.pvName           | Name of the Pulsar PersistentVolume        | `"pulsar-pv"`  |
+
+### Monitoring common parameters
 
+#### Prometheus
+
+| Parameter Name                             | Description                           | Value              |
+|--------------------------------------------|---------------------------------------|--------------------|
+| monitoring.prometheus.appName              | Prometheus application name           | `"prometheus"`     |
+| monitoring.prometheus.version              | Prometheus version                    | 2.45.0             |
+| monitoring.prometheus.port                 | Prometheus port                       | 9090               |
+| monitoring.prometheus.service.name         | Prometheus service name               | `"prometheus"`     |
+| monitoring.prometheus.service.port         | Prometheus service port               | 9090               |
+| monitoring.prometheus.persistence.storageClassName | Prometheus storage class name | `"hostpath"`       |
+| monitoring.prometheus.persistence.storageSize | Prometheus storage size            | `"2Gi"`            |
+| monitoring.prometheus.persistence.claimName | Prometheus PVC claim name           | `"prometheus-pvc"` |
+| monitoring.prometheus.persistence.pvName   | Prometheus PV name                    | `"prometheus-pv"`  |
+| monitoring.prometheus.persistence.tokenStorageSize | Prometheus token storage size | `"16Ki"`        |
+| monitoring.prometheus.config.scrapeInterval | Prometheus scrape interval          | `10s`              |
+| monitoring.prometheus.config.evaluationInterval | Prometheus evaluation interval   | `15s`              |
+| monitoring.prometheus.config.backendJobName | Prometheus backend job name         | `backend`          |
+| monitoring.prometheus.config.extensionsName | Prometheus extensions job name      | `extensions-all-iiot` |
+| monitoring.prometheus.config.tokenFileName | Prometheus token file name           | `token`            |
+| monitoring.prometheus.config.tokenFileDir  | Prometheus token file directory       | `/opt/data`        |
+
+#### Grafana
+
+| Parameter Name                          | Description                  | Value            |
+|-----------------------------------------|------------------------------|------------------|
+| monitoring.grafana.appName              | Grafana application name     | `"grafana"`      |
+| monitoring.grafana.version              | Grafana version              | 10.1.2           |
+| monitoring.grafana.port                 | Grafana port                 | 3000             |
+| monitoring.grafana.service.name         | Grafana service name         | `"grafana"`      |
+| monitoring.grafana.service.port         | Grafana service port         | 3000             |
+| monitoring.grafana.persistence.storageClassName | Grafana storage class name | `"hostpath"` |
+| monitoring.grafana.persistence.storageSize | Grafana storage size      | `"1Gi"`          |
+| monitoring.grafana.persistence.claimName | Grafana PVC claim name     | `"grafana-pvc"`  |
+| monitoring.grafana.persistence.pvName   | Grafana PV name              | `"grafana-pv"`   |
+
+## Auto-generated secrets in Kubernetes
+
+The Helm chart generates several secret values automatically when they are left empty. This includes:
+
+- the initial admin password
+- the initial service account secret
+- the encryption passcode
+- the CouchDB password
+- the InfluxDB password
+- the InfluxDB admin token
+
+This behavior is implemented in the chart's `secrets.yaml` template and is useful for first installations. In managed environments, many teams still choose to provide those values explicitly through their deployment process.
diff --git a/docs/06_configure-operate-extension-services.md b/docs/06_configure-operate-extension-services.md
index d746ee46f..321582553 100644
--- a/docs/06_configure-operate-extension-services.md
+++ b/docs/06_configure-operate-extension-services.md
@@ -3,3 +3,283 @@ id: configure-operate-extension-services
 title: Extension Services
 sidebar_label: Extension Services
 ---
+
+The `Extension Services` tab in `Configuration` is the operational view for the services behind StreamPipes extensions. While the `Extensions` tab controls which adapters and pipeline elements are installed, `Extension Services` shows which services are currently registered, which service-level settings they expose, and how OPC UA certificates are handled.
+
+This page focuses on the current `Configuration > Extension Services` screen.
+
+> [Image placeholder: Extension Services page with the sections Registered services, Service configurations, and Certificates]
+
+## What the Extension Services tab is for
+
+Use this page when you want to:
+
+- inspect which extension services are currently registered in the instance
+- review service health at a glance
+- open technical details of a registered service
+- update service-level configuration values
+- manage trusted and rejected OPC UA certificates
+
+This tab is aimed at platform operators and administrators, not end users building adapters or pipelines.
+
+## Understand the difference between Extensions and Extension Services
+
+The two configuration tabs are related, but they solve different problems.
+
+- `Extensions` controls which installable items such as adapters, processors, and sinks are available in the instance.
+- `Extension Services` controls the services that provide those items and the configuration values those services need at runtime.
+
+In practice, you go to `Extensions` when something should become available to users, and to `Extension Services` when you need to inspect or configure the underlying service behavior.
+
+## Open the page
+
+To open the screen:
+
+1. Go to `Configuration`.
+2. Open the `Extension Services` tab.
+
+The current page contains three sections:
+
+- `Registered services`
+- `Service configurations`
+- `Certificates`
+
+## Inspect registered services
+
+The `Registered services` section provides an overview of the services that are currently known to the StreamPipes instance.
+
+The table shows:
+
+- `Status`
+- `Service ID`
+- `Service Group`
+
+Each row also provides an action to open the service details.
+
+### Read the service status
+
+The status column uses a simple health indicator.
+
+- a green indicator means the service is `HEALTHY`
+- a non-healthy state is shown with a critical indicator
+
+Use this view as a first diagnostic step when a service-backed feature is missing or behaving unexpectedly.
+
+Example:
+If a set of adapters is installed but not behaving as expected, checking the registration and health state of the providing service is a sensible first step before editing adapters themselves.
+
+### Refresh the service list
+
+The table header includes a refresh action.
+
+To reload the list:
+
+1. Open `Configuration > Extension Services`.
+2. In `Registered services`, click the refresh icon.
+
+Use this after deployment changes, service restarts, or whenever you expect the registration state to have changed.
+
+### Open service details
+
+Each row provides `View service details`.
+
+To inspect one service:
+
+1. Open `Configuration > Extension Services`.
+2. Find the service in `Registered services`.
+3. Click the details action on the right side of the row.
+
+The details dialog shows:
+
+- `Service ID`
+- `Service Group`
+- `Location`
+- `Tags`
+
+This is useful when you need to understand which service instance is registered, where it is running, and how it identifies itself to StreamPipes.
+
+Example:
+If multiple services are present, the dialog helps distinguish them by location and tags instead of relying only on a short row in the overview.
+
+> [Image placeholder: Registered services table with status indicators and the service details dialog open]
+
+## Update service configurations
+
+The `Service configurations` section is where StreamPipes exposes configurable settings for core and extension services.
+
+The table shows:
+
+- `Service Group`
+- `Service Name`
+
+Each row includes an edit action that expands the configuration details inline.
+
+### Open a configuration row
+
+To edit a service configuration:
+
+1. Open `Configuration > Extension Services`.
+2. Scroll to `Service configurations`.
+3. Find the service you want to change.
+4. Click the edit icon in the row.
+
+The row expands and shows the available configuration keys for that service.
+
+Use this area when a service requires runtime configuration values, for example connection settings, feature toggles, or other service-specific parameters.
+
+### Understand the configuration form
+
+Inside an expanded row, StreamPipes renders the fields based on the type of the configuration item.
+
+Depending on the configuration, you may see:
+
+- text fields
+- number fields
+- boolean checkboxes
+- password fields
+
+For text and boolean values, the current UI can show a help tooltip with the configuration description. Use that tooltip when the key name alone is not enough to understand the setting.
+
+### Update a service configuration
+
+To save changes for one service:
+
+1. Expand the service row.
+2. Review the available configuration keys.
+3. Change the relevant values.
+4. Click `Update` at the bottom of the expanded form.
+
+After saving, the page reloads the configuration list.
+
+This means the section is designed around service-by-service updates rather than one global save for the whole page.
+
+### How to work with different field types
+
+The exact fields depend on the service, but the interaction pattern is consistent.
+
+For text settings:
+
+1. Expand the service row.
+2. Click into the text field.
+3. Enter or replace the value.
+4. Use the help icon if a description is available.
+5. Click `Update`.
+
+For number settings:
+
+1. Expand the service row.
+2. Enter the numeric value in the number field.
+3. Click `Update`.
+
+For boolean settings:
+
+1. Expand the service row.
+2. Enable or disable the checkbox.
+3. Use the help icon if you need the description.
+4. Click `Update`.
+
+For password settings:
+
+1. Expand the service row.
+2. Click into the password field.
+3. Enter the new value.
+4. Click `Update`.
+
+Because these values can directly affect the behavior of a service, make changes deliberately and verify the related functionality afterwards.
+
+Example:
+If a service-level setting controls access to an external dependency, change the configuration here and then validate the feature that depends on that service instead of assuming the update is correct.
+
+> [Image placeholder: Expanded service configuration row showing text, number, boolean, and password fields plus the Update button]
+
+## Manage OPC UA certificates
+
+The `Certificates` section is dedicated to OPC UA certificate handling.
+
+In the current UI, the section is described as the place to configure trusted and rejected OPC UA certificates.
+
+The table shows certificates together with:
+
+- `Issuer`
+- `Expires`
+- actions for `Details`, `Trust` or `Reject`, and `Delete`
+
+### Refresh the certificate list
+
+To reload the certificate table:
+
+1. Open `Configuration > Extension Services`.
+2. Go to `Certificates`.
+3. Click the refresh icon in the table header.
+
+Use this after certificate-related changes or after connecting to systems that may introduce new certificates.
+
+### View certificate details
+
+To inspect one certificate:
+
+1. Open the `Certificates` section.
+2. Find the certificate in the table.
+3. Click `Details`.
+
+This opens the certificate details dialog so you can inspect the certificate before deciding whether to trust, reject, or remove it.
+
+### Trust or reject a certificate
+
+The current UI allows you to switch a certificate between trusted and rejected state directly from the table.
+
+To change the state:
+
+1. Open `Configuration > Extension Services`.
+2. Go to `Certificates`.
+3. Find the certificate.
+4. Click `Trust` if it is currently rejected, or `Reject` if it is currently trusted.
+
+After the action, StreamPipes updates the certificate state and reloads the table.
+
+Use this when an OPC UA connection depends on whether a certificate is accepted.
+
+### Delete a certificate
+
+To remove a certificate entry:
+
+1. Open the `Certificates` section.
+2. Find the certificate you want to remove.
+3. Click `Delete`.
+
+Use deletion carefully. Trust or reject is often the better operational action when the certificate should remain known to the system but with a controlled state.
+
+> [Image placeholder: Certificates table showing Details, Trust or Reject, and Delete actions]
+
+## Typical workflows
+
+### Investigate a service-backed feature problem
+
+1. Open `Configuration > Extension Services`.
+2. Check `Registered services` for the expected service and its health state.
+3. Open the service details to inspect location and tags.
+4. Review `Service configurations` if the feature depends on service-level settings.
+
+### Update a service-level runtime setting
+
+1. Open `Service configurations`.
+2. Find the correct service by group and name.
+3. Expand the row.
+4. Change the required value.
+5. Click `Update`.
+6. Verify the affected functionality afterwards.
+
+### Resolve an OPC UA certificate issue
+
+1. Open `Certificates`.
+2. Refresh the list.
+3. Inspect the certificate details.
+4. Trust or reject the certificate based on the expected connection.
+5. Delete the certificate only if it should be removed entirely.
+
+## Common pitfalls
+
+- Do not confuse installed extensions with registered services. One tab manages catalog items, the other manages the services behind them.
+- Do not change service-level settings without validating the dependent functionality afterwards.
+- Use the service details dialog when a row alone does not provide enough context.
+- Treat certificate deletion carefully because it removes the entry instead of just changing its state.
diff --git a/docs/06_configure-operate-extensions.md b/docs/06_configure-operate-extensions.md
index 0ac09ae59..98a769315 100644
--- a/docs/06_configure-operate-extensions.md
+++ b/docs/06_configure-operate-extensions.md
@@ -4,6 +4,335 @@ title: Manage Extensions
 sidebar_label: Manage Extensions
 ---
 
-## Install Pipeline Elements
+The `Extensions` tab in `Configuration` is the administrative catalog for installable StreamPipes functionality. This is where administrators review which adapters and pipeline elements are available to the instance, install new ones, uninstall existing ones, update installed items, and manage their permissions.
 
-(coming soon)
+This page focuses on the current `Configuration > Extensions` screen.
+
+> [Image placeholder: Extensions settings page with bulk actions, filters, search, and extension cards]
+
+## What the Extensions tab is for
+
+The `Extensions` tab is not where users create adapters or build pipelines. It controls which extension items are available in the instance in the first place.
+
+Use this page when you want to:
+
+- inspect the extension catalog available to the instance
+- install adapters or pipeline elements that users need
+- uninstall items that should no longer be available
+- update installed extension items
+- manage permissions for installed items
+
+In practice, this page is part of operating StreamPipes as a platform. Teams use adapters, processors, and sinks later in areas such as `Connect` and `Pipelines`, but administrators decide here which of those building blocks are installed.
+
+## Open the page
+
+To open the Extensions catalog:
+
+1. Go to `Configuration`.
+2. Open the `Extensions` tab.
+
+Only administrators should manage installations here.
+
+## Understand the screen layout
+
+The current page has three main parts:
+
+- bulk action controls at the top
+- filters and search controls
+- extension cards in the main catalog area
+
+Each extension card shows:
+
+- the extension name
+- a short description
+- its type
+- whether it is available
+- whether it is installed
+- the actions that are currently possible
+
+This layout is designed for two different tasks: browsing the catalog and operating the installation lifecycle.
+
+## Read the extension cards
+
+Each card represents one installable extension item.
+
+### Understand availability and installation state
+
+Two states matter most:
+
+- `Available`: the item is present in the catalog and can be discovered by StreamPipes
+- `Installed`: the item is already installed and can be used in the appropriate feature area
+
+An item can be available without being installed. That usually means the instance knows about it, but users cannot use it yet.
+
+Example:
+An adapter may appear in the catalog, but until it is installed it will not show up as a usable connector option in `Connect`.
+
+### Understand extension types
+
+The current catalog groups items into four main categories:
+
+- `Adapters`
+- `Data Streams`
+- `Data Processors`
+- `Data Sinks`
+
+These categories help administrators focus on the part of the catalog relevant to the task at hand.
+
+Example:
+If a team needs a new ingestion option for machine connectivity, start with `Adapters`. If they need a new calculation or filtering step in pipelines, look at `Data Processors`.
+
+### Internally managed items
+
+Some cards are marked as internally managed by StreamPipes. These items are not editable in the same way as normal catalog entries.
+
+If a card is internally managed, you should treat it as part of the system-managed installation state rather than something you can freely install or uninstall from this page.
+
+## Filter and search the catalog
+
+The catalog is designed to be filtered before you act on it.
+
+### Filter by category
+
+Use the category dropdown to restrict the list to:
+
+- `All`
+- `Adapters`
+- `Data Streams`
+- `Data Processors`
+- `Data Sinks`
+
+To filter by category:
+
+1. Open the category dropdown at the top of the page.
+2. Select the category you want to inspect.
+
+This is the fastest way to reduce noise when you already know what type of extension you are looking for.
+
+Example:
+When onboarding a new protocol or source system, filter to `Adapters` first instead of scanning the full catalog.
+
+### Filter by installation status
+
+Use the installation-status filter to switch between:
+
+- `Available & Installed`
+- `Installed`
+- `Available`
+
+To use it:
+
+1. Open the installation-status dropdown.
+2. Select the state you want to review.
+
+This is useful in two common situations:
+
+- use `Installed` when you want to audit what is currently active in the instance
+- use `Available` when you want to find items that exist but are not installed yet
+
+Example:
+If a user says a certain sink is missing in the pipeline editor, switch to `Available` and search for it. If it appears there, the problem is installation state, not product support.
+
+### Search by name
+
+Use the `Find Element` search field when you know part of the extension name already.
+
+To search:
+
+1. Click the `Find Element` field.
+2. Enter part of the element name.
+3. Review the filtered cards.
+
+Search is especially useful when the category still contains many items.
+
+### Reload the catalog
+
+Use the reload button to refresh the catalog state from the backend.
+
+Do this after installation or uninstallation work, or whenever you suspect the displayed state is stale.
+
+## Select items for bulk actions
+
+The Extensions page supports bulk installation and bulk uninstallation.
+
+To select items:
+
+1. Click an editable extension card to add it to the selection.
+2. Click additional cards if you want to process several items together.
+3. Use `Select all` to select all editable items in the current category view.
+4. Use `Select none` to clear the selection.
+
+Only editable items can be selected.
+
+A useful detail in the current UI is that changing the search term or installation-status filter clears the current selection. This avoids accidental bulk actions on a list that no longer matches what you are looking at.
+
+Example:
+If you are preparing a new instance for a team and need several adapters at once, bulk selection is faster and less error-prone than opening each card individually.
+
+> [Image placeholder: Extensions page with several selected cards and the bulk install button highlighted]
+
+## Install extensions
+
+You can install either one extension at a time or several selected extensions in one run.
+
+### Install a single extension
+
+To install one item:
+
+1. Open `Configuration > Extensions`.
+2. Filter or search until you find the required card.
+3. Click `Install` on that card.
+
+This opens the installation dialog for that single item.
+
+Use this path when you only need one additional adapter or pipeline element.
+
+### Install multiple extensions
+
+To install several items together:
+
+1. Select the required extension cards.
+2. Click `Install selected`.
+
+This opens the same installation dialog, but with all selected items queued.
+
+Use this path when you are preparing an instance for a new team or use case and already know the set of required extensions.
+
+### Work through the installation dialog
+
+The current installation dialog has two stages:
+
+- a preview step
+- the installation step
+
+In the preview step, StreamPipes shows the list of elements that are about to be installed.
+
+To complete the installation:
+
+1. Start the install action from the page or a card.
+2. Review the listed items in the dialog.
+3. Decide whether `Make available to all users with appropriate role` should stay enabled.
+4. Click `Next`.
+5. Watch the installation progress for each item.
+6. Click `Close` when the process finishes.
+
+### Decide whether to install as a public element
+
+The installation dialog includes the checkbox `Make available to all users with appropriate role`.
+
+Use this setting when the installed extension should be broadly available to users who already have the right role to use that extension family.
+
+Think of this as an availability decision at install time.
+
+Example:
+If you install a commonly used sink that should be usable across multiple teams, leaving this option enabled is usually the right choice.
+
+### Read the installation progress
+
+During installation, StreamPipes processes items one after another and shows a status for each one.
+
+In practice, you should expect statuses such as:
+
+- waiting
+- success
+- error
+
+If an installation fails, the dialog can show additional details for that specific item.
+
+This is important for bulk installs because some items may succeed while others fail.
+
+> [Image placeholder: Installation dialog showing the preview step, the public-element checkbox, and per-item status updates]
+
+## Uninstall extensions
+
+The uninstall flow mirrors the install flow.
+
+### Uninstall a single extension
+
+To uninstall one installed item:
+
+1. Open `Configuration > Extensions`.
+2. Find the installed card.
+3. Click `Uninstall`.
+4. Confirm the operation in the dialog.
+5. Review the progress and close the dialog.
+
+### Uninstall multiple extensions
+
+To uninstall several items together:
+
+1. Select the installed cards you want to remove.
+2. Click `Uninstall selected`.
+3. Review the preview in the dialog.
+4. Click `Next`.
+5. Wait until the statuses are complete.
+6. Close the dialog.
+
+Use uninstallation carefully because removing an extension affects what users can create or edit later.
+
+Example:
+If you remove a processor that teams still rely on for editing existing pipelines, the administrative cleanup may create confusion or block later changes.
+
+## Update installed extensions
+
+Installed cards provide a menu with additional actions. One of them is `Update`.
+
+To update an installed extension:
+
+1. Open `Configuration > Extensions`.
+2. Find the installed card.
+3. Open the card menu.
+4. Click `Update`.
+
+Use this when the installed item should be refreshed from the available catalog source.
+
+This is a maintenance action rather than a normal end-user workflow.
+
+## Manage permissions for installed extensions
+
+Installed cards also provide `Manage permissions`.
+
+To open it:
+
+1. Open `Configuration > Extensions`.
+2. Find the installed extension card.
+3. Open the card menu.
+4. Click `Manage permissions`.
+
+Use this when access to a specific installed extension should be controlled more explicitly.
+
+This is especially relevant in shared environments where not every team or user should use every available adapter or pipeline element.
+
+## Typical workflows
+
+### Prepare an instance for a new ingestion use case
+
+1. Open `Configuration > Extensions`.
+2. Filter to `Adapters`.
+3. Search for the required connector family.
+4. Install the relevant items.
+5. Reload the catalog.
+6. Confirm that the adapters are now available in `Connect`.
+
+### Prepare a pipeline workspace for a team
+
+1. Filter to `Data Processors` and `Data Sinks`.
+2. Search for the required processing and output elements.
+3. Select the needed items.
+4. Click `Install selected`.
+5. Review the installation statuses.
+6. Verify that users can now use them in the pipeline editor.
+
+### Audit what is already active
+
+1. Set the installation-status filter to `Installed`.
+2. Review the catalog.
+3. Use the card menu for `Update` or `Manage permissions` where needed.
+
+## Common pitfalls
+
+- Do not confuse installing an extension with using it. Installation only makes the item available in the instance.
+- Do not uninstall items before checking whether users still depend on them.
+- Use category and installation filters together to avoid acting on the wrong part of a large catalog.
+- Reload the catalog after changes so the displayed state is current.
+- Pay attention to per-item status messages during bulk operations because partial failures are possible.
diff --git a/docs/06_configure-operate-general-settings.md b/docs/06_configure-operate-general-settings.md
index d6fd002ed..e48243ba0 100644
--- a/docs/06_configure-operate-general-settings.md
+++ b/docs/06_configure-operate-general-settings.md
@@ -4,45 +4,278 @@ title: General Settings
 sidebar_label: General Settings
 ---
 
-The configuration section is an admin-only interface for system-wide settings.
+The `General` tab in `Configuration` contains the instance-wide settings that shape how users experience StreamPipes. This is where administrators define the platform name, the public URL, self-service account behavior, visible help links, and the terms users may need to accept after login.
 
-## General configuration
+This page focuses on the current `Configuration > General` screen.
 
-<img className="docs-image" src="/img/03_use-configurations/01_general-configuration.png" alt="General configuration"/>
+> [Image placeholder: Configuration page with the General tab selected and the sections Basic, Registration, Links, and Terms visible]
 
-The general configuration serves to provide basic system settings. The basic settings allow to configure the app name (which is used, e.g., for mails sent by StreamPipes). 
-Additionally, the externally available host and port can be set which is used by the mail system to add links to emails.
+## What the General tab controls
 
-Furthermore, self-registration and password recovery features can be activated in this view. Note that both features require a working email configuration.
+The `General` tab is not about pipelines, adapters, or runtime behavior. It defines the platform identity and the user-facing behavior around login, account onboarding, and support.
 
-## Datalake
+In the current UI, the page is organized into four sections:
 
-<img className="docs-image" src="/img/03_use-configurations/02_datalake-configuration.png" alt="Datalake configuration"/>
+- `Basic`
+- `Registration`
+- `Links`
+- `Terms`
 
-Here, stored data lake databases can be truncated or deleted. The view also gives information on the number of data points currently stored in a measurement series.
+These settings are usually configured early in a deployment and then adjusted when the instance becomes a shared platform for more users or teams.
 
-## Email configuration
+## Open the page
 
-<img className="docs-image" src="/img/03_use-configurations/03_email-configuration.png" alt="Email configuration"/>
+To open the General settings:
 
-In this section, the email configuration is set. The email configuration is used to send mails to users. Most standard mail server settings are supported. The configuration can be validated by triggering a test mail that is sent to a given recipient.
+1. Go to `Configuration`.
+2. Open the `General` tab.
 
-## Messaging
+Only administrators should manage these settings.
 
-<img className="docs-image" src="/img/03_use-configurations/04_messaging-configuration.png" alt="Messaging configuration"/>
+## Configure the basic instance information
 
-Messaging configuration is used to control parameters used for communication between pipeline elements. Individual Kafka settings can be configured, as well as the priority of selected message formats and protocols during pipeline creation.
+The `Basic` section defines how the instance identifies itself and how StreamPipes builds links that users receive or open later.
 
-## Pipeline Element Configuration
+### Set the app name
 
-<img className="docs-image" src="/img/03_use-configurations/05_pipeline-element-configuration.png" alt="Pipeline element configuration"/>
+The `App Name` is the platform name shown in user-facing places such as the login page and emails sent by StreamPipes.
 
-Individual configurations of extensions services are available in this view. The available configurations depend on the provided configuration variables in the service definition of each extensions service.
+To change it:
 
-## Security
+1. Open `Configuration > General`.
+2. In `Basic`, enter the new value in `App Name`.
+3. Click `Save`.
 
-<img className="docs-image" src="/img/03_use-configurations/06_security-configuration.png" alt="Messaging configuration"/>
+Use a name that makes sense to your users, especially when StreamPipes is part of a larger internal platform landscape.
 
-The security configuration allows to manage existing user accounts, service accounts and groups. New users can be added and roles can be assigned.
+Example:
+A production deployment may use `Factory Data Platform` while a test instance may use `Factory Data Platform - Staging` so users immediately understand which environment they are using.
 
-Please also read more about security [here](06_configure-operate-security.md).
+### Configure protocol, host, and port
+
+The `Host and Port` settings define the public address of the StreamPipes instance.
+
+The current UI includes:
+
+- `Protocol`
+- `Host`
+- `Port`
+
+To configure the public address:
+
+1. Open `Configuration > General`.
+2. In `Basic`, choose `http` or `https`.
+3. Enter the public host name in `Host`.
+4. Enter the public port in `Port`.
+5. Click `Save`.
+
+This matters because StreamPipes uses these values when it generates links for users, for example in emails.
+
+Example:
+If users should access the platform at `https://streampipes.example.com`, enter that external address information here instead of an internal container or cluster hostname.
+
+### Understand the default-values warning
+
+If StreamPipes still uses default values, the page shows an informational warning. This means the platform can display defaults, but features that depend on the stored instance URL, especially email-based flows, should not be considered fully configured yet.
+
+In practice, save the `Basic` section once with the correct values before you enable registration or password recovery.
+
+## Configure self-service registration and password recovery
+
+The `Registration` section controls whether users can create accounts themselves and whether they can recover their passwords without administrator intervention.
+
+These options are only useful when two prerequisites are already in place:
+
+- the public host and port are configured and saved
+- the mail server settings are configured and working
+
+If those prerequisites are missing, StreamPipes shows an informational banner explaining that self-registration requires valid mail and host settings.
+
+> [Image placeholder: Registration section showing the prerequisite info banner and the self-registration options]
+
+### Enable self-registration
+
+Use `Allow self-registration` when users should be able to create their own accounts from the login page.
+
+To enable it:
+
+1. Configure the public host, protocol, and port in `Basic`.
+2. Configure the mail server in `Configuration > Mail`.
+3. Return to `Configuration > General`.
+4. In `Registration`, enable `Allow self-registration`.
+5. Select the `Default roles for new users`.
+6. Click `Save`.
+
+This is useful when StreamPipes is operated as a shared internal platform and administrators should not have to create every user account manually.
+
+Example:
+If a plant engineering team should be able to onboard itself, self-registration reduces the operational overhead for the platform team.
+
+### Choose the default roles for new users
+
+Once self-registration is enabled, the page shows `Default roles for new users`.
+
+This setting determines which roles new users receive immediately after registration.
+
+To configure it:
+
+1. Enable `Allow self-registration`.
+2. Open the `Default roles for new users` selection field.
+3. Select the roles that new users should receive automatically.
+4. Save the configuration.
+
+Choose these roles conservatively. The goal is usually to give users enough access to start working without giving broader permissions than necessary.
+
+Example:
+If most users only need to create adapters, pipelines, charts, and dashboards, assign the standard working roles instead of administrative ones.
+
+### Enable self-service password recovery
+
+Use `Allow self-service password recovery` when users should be able to reset their own passwords through an email-based flow.
+
+To enable it:
+
+1. Make sure mail settings are already working.
+2. Open `Configuration > General`.
+3. In `Registration`, enable `Allow self-service password recovery`.
+4. Click `Save`.
+
+This is especially useful in larger deployments where users cannot rely on an administrator for every forgotten password.
+
+## Configure documentation and support links
+
+The `Links` section controls which helpful links StreamPipes exposes on the login page and in the user interface.
+
+The current UI includes:
+
+- `Documentation Link`
+- `Support Link`
+- visibility toggles for those links
+- a separate toggle for the API documentation link on the login page
+
+### Configure the documentation link
+
+Use the documentation link when users should be directed to a specific documentation target from inside StreamPipes.
+
+To configure it:
+
+1. Open `Configuration > General`.
+2. Go to `Links`.
+3. Enter the target URL in `Documentation Link`.
+4. Enable `Show documentation link on login page` if users should see it before signing in.
+5. Enable `Show documentation link in user menu` if signed-in users should be able to reach it later from the interface.
+6. Click `Save`.
+
+Example:
+If your organization maintains an internal documentation portal with deployment-specific procedures, point the documentation link there instead of sending users to a generic external page.
+
+### Show the API documentation link on the login page
+
+The `Links` section also provides `Show API documentation link on login page`.
+
+Enable this when technical users, developers, or integration teams should be able to discover the API documentation immediately.
+
+To use it:
+
+1. Open `Configuration > General`.
+2. In `Links`, enable `Show API documentation link on login page`.
+3. Save the configuration.
+
+This is useful when the platform is also used for automation, integration, or platform engineering work.
+
+### Configure the support link
+
+Use the support link when users should have a direct path to a helpdesk, ticket system, or internal support portal.
+
+To configure it:
+
+1. Open `Configuration > General`.
+2. In `Links`, enter the target URL in `Support Link`.
+3. Enable `Show support link on login page` if it should be visible before login.
+4. Click `Save`.
+
+Example:
+In an enterprise environment, this link can point to the internal OT or IT support portal so users know exactly where to report access issues or data problems.
+
+> [Image placeholder: Links section with documentation URL, support URL, and visibility toggles]
+
+## Require users to acknowledge terms
+
+The `Terms` section lets administrators require users to accept a text after login.
+
+This can be used for:
+
+- terms of use
+- compliance notices
+- internal security rules
+- data usage guidance
+
+### Enable terms acknowledgment
+
+To require users to accept terms after login:
+
+1. Open `Configuration > General`.
+2. In `Terms`, enable `Require users to accept terms after login`.
+3. Enter a `Dialog Title`.
+4. Enter the text in the `Terms` editor.
+5. Click `Save`.
+
+The current UI uses a rich-text editor, so you can format the text instead of entering plain unstructured content.
+
+### What users will experience
+
+After this feature is enabled, users are prompted with the configured dialog after login and must acknowledge the text before continuing.
+
+Example:
+A manufacturing company may require users to acknowledge that the instance contains production-related data and must be used according to internal governance and security rules.
+
+> [Image placeholder: Terms section with the acknowledgment toggle, dialog title field, and rich-text editor]
+
+## Save and verify your changes
+
+The General page uses one `Save` button at the bottom of the form.
+
+A practical workflow is:
+
+1. Update the `Basic` section first.
+2. Configure dependent sections such as `Registration`.
+3. Add user-facing links in `Links`.
+4. Configure `Terms` if required.
+5. Click `Save`.
+6. Verify the result in the relevant place, for example the login page or a test registration flow.
+
+This verification step matters because several settings affect what users see before they even start using adapters, pipelines, or dashboards.
+
+## Typical workflows
+
+### Prepare a new shared instance
+
+1. Set the `App Name`.
+2. Configure the public `Protocol`, `Host`, and `Port`.
+3. Save the page once so the instance no longer relies on defaults.
+4. Configure mail settings next if the instance should support email-based flows.
+
+### Enable self-service onboarding
+
+1. Configure the `Basic` section.
+2. Configure `Mail`.
+3. Enable `Allow self-registration`.
+4. Choose conservative default roles.
+5. Enable password recovery if required.
+6. Save and test the login page workflow.
+
+### Add organization-specific help and policy content
+
+1. Add the documentation link.
+2. Add the support link.
+3. Decide where those links should be visible.
+4. Enable terms acknowledgment if users must accept a policy after login.
+5. Save and validate the user-facing result.
+
+## Common pitfalls
+
+- Do not enable self-registration before host and mail settings are working.
+- Do not use internal-only hostnames if users receive externally visible links by email.
+- Choose default roles conservatively when enabling self-service onboarding.
+- Keep documentation and support links current because they become part of the login experience.
+- If you require terms acknowledgment, maintain the text like any other user-facing policy content.
diff --git a/docs/06_configure-operate-security.md b/docs/06_configure-operate-security.md
index 7101b36b4..baca9af20 100644
--- a/docs/06_configure-operate-security.md
+++ b/docs/06_configure-operate-security.md
@@ -4,175 +4,403 @@ title: Security & User Management
 sidebar_label: Security & User Management
 ---
 
-## Overriding default settings
+## Introduction
 
-At installation time, StreamPipes checks for available environment variables relevant for the securing the system. If they are not set, it will use the default values.
+The `Security` section in StreamPipes is where administrators manage who can access the platform, which roles they receive, and how platform resources are shared. It combines account management, role-based access control, group assignment, service accounts, and JWT signing support in one place.
 
-The following variables are checked by the core at installation time:
+Use this page together with:
 
-* SP_INITIAL_ADMIN_EMAIL The email address of the initial administrator.
-* SP_INITIAL_ADMIN_PASSWORD The password of the initial administrator.
-* SP_INITIAL_CLIENT_USER The initial client user, used by the extensions modules to make authenticated API requests to the core.
-* SP_INITIAL_CLIENT_SECRET The default password of the initial client user.
-* SP_SETUP_INSTALL_PIPELINE_ELEMENTS Indicates whether pipeline elements should be installed.
-* SP_ENCRYPTION_PASSCODE The encryption passcode, used for securely storing secrets (e.g., database connection strings).
-* SP_JWT_SECRET The JWT secret, used for signing JWT tokens.
+- [General Settings](./06_configure-operate-general-settings.md) for self-registration, password recovery, and default roles for new users
+- [Environment Variables](./06_configure-operate-environment-variables.md) for installation-time security settings
 
-In addition, all extensions services that perform requests to the core will need to have the following environment variables set:
+## What the Security page contains
 
-* SP_CLIENT_USER The client user, used by the extensions modules to make authenticated API requests to the core.
-* SP_CLIENT_SECRET The password of the client user.
+The current `Security` page is organized into five sections:
 
-Note that there are default values for all environment variables that are set at installation time - make sure to change these settings when moving to production!
+- `User Accounts`
+- `Service Accounts`
+- `Groups`
+- `Roles`
+- `Authentication`
 
-## Configuration
+Each section supports a different part of the security model.
 
-Most security-related settings can be set in the configuration section of StreamPipes. The *General* section allows to set self-service registration and password recovery (both are disabled by default and require a valid email configuration).
-In the *Security* section, users, service accounts, roles and groups can be configured.
+## Security model at a glance
 
+In practice, StreamPipes combines three layers:
 
-## User types
+1. `Accounts` identify users or services.
+2. `Roles` define what those accounts are allowed to do.
+3. `Resource permissions` define who can access a specific pipeline, adapter, chart, dashboard, dataset, asset, or extension.
 
-StreamPipes distinguishes between User Accounts (real users that interact with StreamPipes over the UI or an API) and Service Accounts (user-independent accounts which solely use StreamPipes over the API).
+That means a user does not only need the right global role, but may also need access to the individual resource.
 
-User accounts are typically used by extensions service that require API access to the core (e.g., to get a list of running pipelines).
+## Installation-time security settings
 
-## Permissions
+Before you start managing users in the UI, review the security-related environment variables of the installation. The most important installation-time settings are:
 
-StreamPipes v0.69.0 comes with more advanced mechanisms to manage permissions.
-For each major resource (pipeline elements, pipelines, StreamPipes Connect adapters, dashboards, data explorer views), permissions can be assigned individually to users and groups.
+- `SP_INITIAL_ADMIN_EMAIL`
+- `SP_INITIAL_ADMIN_PASSWORD`
+- `SP_INITIAL_SERVICE_USER`
+- `SP_INITIAL_SERVICE_USER_SECRET`
+- `SP_ENCRYPTION_PASSCODE`
+- `SP_JWT_SECRET`
+- `SP_JWT_SIGNING_MODE`
+- `SP_JWT_PRIVATE_KEY_LOC`
 
-To ease permission handling, StreamPipes comes with a default number of roles with pre-assigned privileges:
+For extension services that authenticate against the core, the relevant settings are:
 
-### Roles
+- `SP_CLIENT_USER`
+- `SP_CLIENT_SECRET`
 
-* Admin The administrator role has full access to all resources.
-* Service Admin The service administrator role has full access to all resources, but has no access to the UI.
-* Pipeline Admin has full control of pipelines (create, edit, delete, start, stop, pause, resume, etc.).
-* Pipeline User has limited control of pipelines (read only).
-* Dashboard Admin has full control of dashboards (create, edit, delete, etc.).
-* Dashboard User has limited control of dashboards (read only).
-* Data Explorer Admin has full control of data explorer views (create, edit, delete, etc.).
-* Data Explorer User has limited control of data explorer views (read only).
-* Connect Admin has full control of StreamPipes Connect adapters (create, edit, delete, etc.).
+For production systems, you should change the default credentials and secrets before exposing the installation to real users or connecting external systems.
 
-### Groups
+## User accounts
 
-Roles can be either assigned to specific users or groups. Any group can contain several members. 
-The permissions of a user are the union of the permissions of all roles assigned to the user and the groups to which the user belongs.
+`User Accounts` are interactive identities for people who sign in to StreamPipes through the UI or use the API as named users.
 
-### Changing permissions
+The user table shows:
 
-Any resource has a resource owner, which is the authority that created the resource. Resources can be either public or private. Public resources are available to all users, while the user role determines what the user can do with the resource.
-E.g., a public pipeline created by a user of role ROLE_ADMIN can be edited by all users with role PIPELINE_ADMIN, while the same pipeline can be read by all users with role PIPELINE_USER.
+- email address
+- provider type
+- full name
+- creation time
+- last login
 
-Permissions can only be changed by admin users currently.
-In the overview section of each resource (e.g., pipelines and dashboards), a permission dialog is available to users with role ROLE_ADMIN. The dialog allows to assign users and groups to the individual resource.
+### Create a user account
 
+To create a local user:
 
-## OAuth configuration
+1. Open `Configuration` > `Security`.
+2. In `User Accounts`, click `New`.
+3. Enter the user's email address and full name.
+4. In `Password`, either enter an initial password or, if email is configured, enable `Auto-create password and send to user`.
+5. Assign groups and roles.
+6. Decide whether the account should be `Enabled` and whether it should be `Locked`.
+7. Click `Save`.
 
-It is possible to connect StreamPipes to an external authentication provider such as Keycloak, Azure AD or GitHub.
-Multiple providers can be configured.
+### Edit a user account
 
-To enable login over OAuth, several environment variables are available 
+When you edit a local user, you can change:
 
-### General settings
+- email address
+- full name
+- assigned groups
+- assigned roles
+- enabled state
+- locked state
 
-* `SP_OAUTH_ENABLED` set to `true` to enable OAuth
-* `SP_OAUTH_REDIRECT_URI` set to the base URI where StreamPipes is running, e.g., `http://localhost:80`
+If you change the email address of the currently signed-in user, StreamPipes requires a new login afterwards.
 
-### Provider-specific settings
+### External users
+
+StreamPipes can also show users that come from an external identity provider. In the table, these users are marked by their provider instead of `local`.
+
+For externally managed users:
+
+- identity fields are managed by the external system
+- some settings in StreamPipes are read-only
+- role assignments may also be externally managed, depending on the provider configuration
+
+The UI explicitly warns when externally managed user settings cannot be changed.
+
+## Service accounts
+
+`Service Accounts` are non-human accounts for automated communication with the core API. They are typically used by extension services and other technical integrations.
+
+Use a service account when:
+
+- an extension service needs to authenticate to the core
+- an automated integration should call the StreamPipes API
+- access should not be tied to an individual person
+
+### Create a service account
+
+To create a service account:
+
+1. Open `Configuration` > `Security`.
+2. In `Service Accounts`, click `New`.
+3. Enter the username.
+4. Enter a `Client Secret`.
+5. Assign the required groups and roles.
+6. Click `Save`.
+
+The client secret must meet the minimum length requirement enforced by the UI. In practice, service accounts should receive only the roles they actually need.
+
+## Groups
+
+`Groups` are a practical way to assign the same role set to multiple users. Instead of assigning every role to every user individually, you assign roles to a group and then assign users to that group.
+
+### Create a group
+
+1. Open `Configuration` > `Security`.
+2. In `Groups`, click `New`.
+3. Enter a group name.
+4. Select one or more roles for the group.
+5. Click `Save`.
+
+After that, edit users and enable the group checkboxes you want to assign.
+
+### Alternate IDs for groups
+
+Groups also support `Alternate IDs`. These are useful when you want to map externally defined groups to a StreamPipes group. This is especially relevant in setups with external identity providers.
+
+In practice:
+
+- the StreamPipes group keeps the local role definition
+- the alternate ID stores the external group identifier
+- external identities can then be aligned with the local authorization model
+
+## Roles
+
+`Roles` are the central access-control building block in StreamPipes. A role contains a set of privileges, and users or groups receive those privileges by assignment.
+
+The role overview distinguishes between:
+
+- `Default roles`, which are built into the platform
+- custom roles, which administrators create for their own operating model
+
+Default roles cannot be deleted.
+
+### Create a custom role
+
+1. Open `Configuration` > `Security`.
+2. In `Roles`, click `New`.
+3. Enter a `Role ID`.
+4. Enter a `Role Name`.
+5. Add the required privileges from `Available Privileges` to `Selected Privileges`.
+6. Optionally add `Alternate IDs` if the role should map to externally defined roles.
+7. Click `Save`.
+
+The role ID must start with `ROLE_` and use only uppercase letters and underscores.
+
+### Alternate IDs for roles
+
+Like groups, roles can also contain `Alternate IDs`. These are used to map externally defined roles to a StreamPipes role. This makes it possible to keep a stable local authorization model even when role names in the external system differ from the StreamPipes role ID.
+
+## How users, groups, and roles work together
+
+The effective permissions of a user are the combination of:
+
+- roles assigned directly to the user
+- roles inherited from assigned groups
+
+This means groups are not a separate permission system. They are a role-assignment mechanism.
+
+A practical pattern is:
+
+- create a small number of business-oriented groups such as `Operations`, `Data Engineering`, or `Plant Supervisors`
+- assign the relevant roles to those groups
+- assign users to groups instead of distributing many direct role assignments
+
+## Resource permissions
+
+Roles control what a user is allowed to do in general. Resource permissions control which concrete objects a user or group can access.
+
+StreamPipes supports permissions dialogs for major resource types, including:
+
+- adapters
+- pipelines
+- datasets
+- charts
+- dashboards
+- assets
+- extensions
+
+### How resource permissions work
+
+Each resource has:
+
+- an owner
+- a visibility model such as private or shared access
+- explicit user and group assignments in the permissions dialog
+
+In practice, this allows you to separate:
 
-For each configured provider, individual settings can be provided. The scheme for environment variables is `SP_OAUTH_{PROVIDER_ID}.*`.
-For instance, if you want to define two providers Azure and GitHub, you can add an individual block `SP_OAUTH_PROVIDER_AZURE.*` and `SP_OAUTH_PROVIDER_GITHUB` to provide the individual authentication settings for each provider.
-
-The following provider-specific settings are available:
-
-* `SP_OAUTH_PROVIDER_{PROVIDER_ID}_AUTHORIZATION_URI`, the authorization URI
-* `SP_OAUTH_PROVIDER_{PROVIDER_ID}_CLIENT_ID`, the OAuth client id
-* `SP_OAUTH_PROVIDER_{PROVIDER_ID}_CLIENT_NAME`, the OAuth client name
-* `SP_OAUTH_PROVIDER_{PROVIDER_ID}_CLIENT_SECRET`, the OAuth client secret
-* `SP_OAUTH_PROVIDER_{PROVIDER_ID}_EMAIL_ATTRIBUTE_NAME`, the JWT attribute name for the email field, e.g., `email`
-* `SP_OAUTH_PROVIDER_{PROVIDER_ID}_FULL_NAME_ATTRIBUTE_NAME`, the JWT attribute name for the full username, e.g., `name`(optional)
-* `SP_OAUTH_PROVIDER_{PROVIDER_ID}_ISSUER_URI`, the OAuth issuer URI
-* `SP_OAUTH_PROVIDER_{PROVIDER_ID}_JWK_SET_URI`, the OAuth JWK Set URI
-* `SP_OAUTH_PROVIDER_{PROVIDER_ID}_NAME`, The provider name (used to display the login button in the UI), e.g. `Azure`
-* `SP_OAUTH_PROVIDER_{PROVIDER_ID}_SCOPES`, the requested OAuth scopes, comma-separated, e.g., `openid,profile,email`
-* `SP_OAUTH_PROVIDER_{PROVIDER_ID}_TOKEN_URI`, the OAuth token URI
-* `SP_OAUTH_PROVIDER_{PROVIDER_ID}_USER_ID_ATTRIBUTE_NAME`, the JWT attribute name for the user ID field, e.g. `sub`
-* `SP_OAUTH_PROVIDER_{PROVIDER_ID}_USER_INFO_URI`, the OIDC user info endpoint, e.g., `https://graph.microsoft.com/oidc/userinfo`
-
-### Example: Authentication with Azure AD
-
-This example shows how to configure Azure AD as an authentication backend. The example is provided as an IntelliJ env file as used by the StreamPipes core:
-Replace the placeholders and the `SP_OAUTH_REDIRECT_URI` with your individual settings.
-
-```xml
-<component name="ProjectRunConfigurationManager">
-  <configuration default="false" name="core" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
-    <envs>
-        <env name="SP_OAUTH_PROVIDER_AZURE_AUTHORIZATION_URI" value="https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0/authorize" />
-        <env name="SP_OAUTH_PROVIDER_AZURE_CLIENT_ID" value="{CLIENT_ID}" />
-        <env name="SP_OAUTH_PROVIDER_AZURE_CLIENT_NAME" value="{CLIENT_NAME}" />
-        <env name="SP_OAUTH_PROVIDER_AZURE_CLIENT_SECRET" value="{CLIENT_SECRET}" />
-        <env name="SP_OAUTH_PROVIDER_AZURE_EMAIL_ATTRIBUTE_NAME" value="email" />
-        <env name="SP_OAUTH_PROVIDER_AZURE_FULL_NAME_ATTRIBUTE_NAME" value="name" />
-        <env name="SP_OAUTH_PROVIDER_AZURE_ISSUER_URI" value="https://login.microsoftonline.com/{TENANT_ID}/v2.0" />
-        <env name="SP_OAUTH_PROVIDER_AZURE_JWK_SET_URI" value="https://login.microsoftonline.com/{TENANT_ID}/discovery/v2.0/keys" />
-        <env name="SP_OAUTH_PROVIDER_AZURE_NAME" value="Azure" />
-        <env name="SP_OAUTH_PROVIDER_AZURE_SCOPES" value="openid,profile,email" />
-        <env name="SP_OAUTH_PROVIDER_AZURE_TOKEN_URI" value="https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0/token" />
-        <env name="SP_OAUTH_PROVIDER_AZURE_USER_ID_ATTRIBUTE_NAME" value="sub" />
-        <env name="SP_OAUTH_PROVIDER_AZURE_USER_INFO_URI" value="https://graph.microsoft.com/oidc/userinfo" />
-        <env name="SP_OAUTH_REDIRECT_URI" value="http://localhost:8082" />
-        <env name="SP_OAUTH_ENABLED" value="true" />
-    </envs>
-    <module name="streampipes-service-core" />
-    <option name="SPRING_BOOT_MAIN_CLASS" value="org.apache.streampipes.service.core.StreamPipesCoreApplication" />
-    <method v="2">
-      <option name="Make" enabled="true" />
-    </method>
-  </configuration>
-</component>
+- who may generally manage pipelines or dashboards
+- who may access one specific pipeline or dashboard
+
+### Change permissions for a resource
+
+To change permissions, open the overview page of the corresponding resource type and use the permissions action for the item you want to manage. The exact button placement differs by feature, but the workflow is the same:
+
+1. Open the resource overview.
+2. Locate the item.
+3. Open the permissions dialog.
+4. Assign the required users or groups.
+5. Save the changes.
+
+This is the mechanism to use when one team should see or edit a specific object without making it broadly available to everyone with the same global role.
+
+## Authentication and JWT signing
+
+The `Authentication` section currently focuses on `JWT Signature`.
+
+In the UI, administrators can:
+
+- generate a new public/private key pair
+- download the generated files
+
+This is useful in setups where signed tokens and authenticated service communication should rely on an explicit key pair instead of only a shared secret.
+
+### Generate a key pair
+
+1. Open `Configuration` > `Security`.
+2. Scroll to `Authentication`.
+3. Click `Generate and download new key pair`.
+4. Store the downloaded files securely.
+5. Update the deployment configuration so the core and dependent services use the generated keys.
+
+The downloaded files are:
+
+- `public.key`
+- `private.pem`
+
+If you configure RSA-based JWT signing, make sure the deployment references the matching key locations through the appropriate environment variables.
+
+## Self-registration and default roles
+
+User self-registration is not configured in the `Security` page itself. It is configured in `General Settings`.
+
+There you can define:
+
+- whether self-registration is allowed
+- whether password recovery is allowed
+- which default roles newly registered users receive
+
+This distinction matters:
+
+- `Security` is where you manage concrete accounts, groups, roles, and technical authentication assets
+- `General Settings` is where you control how new users enter the system
+
+## OAuth and external identity providers
+
+StreamPipes can be connected to external authentication providers such as Keycloak, Azure AD, or GitHub. Provider configuration is done through environment variables, not through a full provider wizard in the UI.
+
+### Enable OAuth
+
+At minimum, enable OAuth with:
+
+- `SP_OAUTH_ENABLED`
+- `SP_OAUTH_REDIRECT_URI`
+
+`SP_OAUTH_REDIRECT_URI` must point to the public base URL of your StreamPipes installation.
+
+### Provider configuration pattern
+
+Every provider is configured with variables that follow this pattern:
+
+```text
+SP_OAUTH_PROVIDER_{PROVIDER_ID}_{SETTING}
 ```
 
-### Example: Authentication with GitHub
-
-Note that you need to provide the environment variables `SP_OAUTH_REDIRECT_URI` and `SP_OAUTH_ENABLED` only once in case you configure more than one provider.
-
-```xml
-<component name="ProjectRunConfigurationManager">
-  <configuration default="false" name="core" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
-    <envs>
-        <env name="SP_OAUTH_PROVIDER_GITHUB_AUTHORIZATION_URI" value="https://github.com/login/oauth/authorize" />
-        <env name="SP_OAUTH_PROVIDER_GITHUB_CLIENT_ID" value="{CLIENT_ID}" />
-        <env name="SP_OAUTH_PROVIDER_GITHUB_CLIENT_NAME" value="{CLIENT_NAME}" />
-        <env name="SP_OAUTH_PROVIDER_GITHUB_CLIENT_SECRET" value="{CLIENT_SECRET}" />
-        <env name="SP_OAUTH_PROVIDER_GITHUB_EMAIL_ATTRIBUTE_NAME" value="email" />
-        <env name="SP_OAUTH_PROVIDER_GITHUB_NAME" value="Github" />
-        <env name="SP_OAUTH_PROVIDER_GITHUB_SCOPES" value="read:email" />
-        <env name="SP_OAUTH_PROVIDER_GITHUB_TOKEN_URI" value="https://github.com/login/oauth/access_token" />
-        <env name="SP_OAUTH_PROVIDER_GITHUB_USER_ID_ATTRIBUTE_NAME" value="id" />
-        <env name="SP_OAUTH_PROVIDER_GITHUB_USER_INFO_URI" value="https://api.github.com/user" />
-        <env name="SP_OAUTH_REDIRECT_URI" value="http://localhost:8082" />
-        <env name="SP_OAUTH_ENABLED" value="true" />
-    </envs>
-    <module name="streampipes-service-core" />
-    <option name="SPRING_BOOT_MAIN_CLASS" value="org.apache.streampipes.service.core.StreamPipesCoreApplication" />
-    <method v="2">
-      <option name="Make" enabled="true" />
-    </method>
-  </configuration>
-</component>
+Examples:
+
+- `SP_OAUTH_PROVIDER_AZURE_CLIENT_ID`
+- `SP_OAUTH_PROVIDER_GITHUB_CLIENT_SECRET`
+- `SP_OAUTH_PROVIDER_KEYCLOAK_ISSUER_URI`
+
+The `PROVIDER_ID` identifies one configured provider. You can define multiple providers side by side by using different IDs.
+
+### Provider-specific settings
+
+The current OAuth configuration parser supports the following provider settings:
+
+- `AUTHORIZATION_URI`
+- `CLIENT_NAME`
+- `CLIENT_ID`
+- `CLIENT_SECRET`
+- `FULL_NAME_ATTRIBUTE_NAME`
+- `ISSUER_URI`
+- `JWK_SET_URI`
+- `SCOPES`
+- `TOKEN_URI`
+- `USER_INFO_URI`
+- `EMAIL_ATTRIBUTE_NAME`
+- `USER_ID_ATTRIBUTE_NAME`
+- `ROLE_ATTRIBUTE_NAME`
+- `NAME`
+- `DEFAULT_ROLES`
+
+In practice, the most important ones are:
+
+- connection details such as `AUTHORIZATION_URI`, `TOKEN_URI`, `USER_INFO_URI`, `ISSUER_URI`, and `JWK_SET_URI`
+- client credentials such as `CLIENT_ID` and `CLIENT_SECRET`
+- user-attribute mapping such as `EMAIL_ATTRIBUTE_NAME`, `FULL_NAME_ATTRIBUTE_NAME`, and `USER_ID_ATTRIBUTE_NAME`
+- optional role mapping through `ROLE_ATTRIBUTE_NAME`
+- optional default role assignment through `DEFAULT_ROLES`
+
+### What the provider settings mean
+
+Use the settings as follows:
+
+- `NAME` is the display name shown for the login provider.
+- `CLIENT_NAME` is the client name used in the OAuth configuration.
+- `SCOPES` is a comma-separated list of requested scopes.
+- `EMAIL_ATTRIBUTE_NAME` maps the email claim from the provider to the StreamPipes user.
+- `FULL_NAME_ATTRIBUTE_NAME` maps the full-name claim.
+- `USER_ID_ATTRIBUTE_NAME` maps the external user identifier.
+- `ROLE_ATTRIBUTE_NAME` defines which claim contains externally provided role information.
+- `DEFAULT_ROLES` assigns StreamPipes roles to users from that provider if no explicit external mapping is used.
+
+### Example structure
+
+The following example shows the structure of a provider configuration:
+
+```bash
+SP_OAUTH_ENABLED=true
+SP_OAUTH_REDIRECT_URI=https://streampipes.example.com
+
+SP_OAUTH_PROVIDER_AZURE_NAME=Azure
+SP_OAUTH_PROVIDER_AZURE_CLIENT_NAME=streampipes
+SP_OAUTH_PROVIDER_AZURE_CLIENT_ID=<client-id>
+SP_OAUTH_PROVIDER_AZURE_CLIENT_SECRET=<client-secret>
+SP_OAUTH_PROVIDER_AZURE_AUTHORIZATION_URI=https://login.microsoftonline.com/<tenant>/oauth2/v2.0/authorize
+SP_OAUTH_PROVIDER_AZURE_TOKEN_URI=https://login.microsoftonline.com/<tenant>/oauth2/v2.0/token
+SP_OAUTH_PROVIDER_AZURE_ISSUER_URI=https://login.microsoftonline.com/<tenant>/v2.0
+SP_OAUTH_PROVIDER_AZURE_JWK_SET_URI=https://login.microsoftonline.com/<tenant>/discovery/v2.0/keys
+SP_OAUTH_PROVIDER_AZURE_USER_INFO_URI=https://graph.microsoft.com/oidc/userinfo
+SP_OAUTH_PROVIDER_AZURE_SCOPES=openid,profile,email
+SP_OAUTH_PROVIDER_AZURE_EMAIL_ATTRIBUTE_NAME=email
+SP_OAUTH_PROVIDER_AZURE_FULL_NAME_ATTRIBUTE_NAME=name
+SP_OAUTH_PROVIDER_AZURE_USER_ID_ATTRIBUTE_NAME=sub
 ```
 
-### Notes
+If you define more than one provider, keep `SP_OAUTH_ENABLED` and `SP_OAUTH_REDIRECT_URI` once, and add one provider block per identity provider.
+
+### Role mapping in OAuth-based setups
+
+OAuth-based installations can combine several mechanisms:
+
+- `DEFAULT_ROLES` in the provider configuration
+- `ROLE_ATTRIBUTE_NAME` if the provider sends role claims
+- `Alternate IDs` on roles and groups in the Security page
+
+This is the recommended mental model:
+
+- use provider configuration to establish authentication and basic claim mapping
+- use StreamPipes roles and groups to keep the local authorization model understandable
+- use alternate IDs when external role or group names should map to existing StreamPipes objects
+
+In external-login setups, the Security page remains important because it still shows the resulting users, role assignments, and externally managed status.
+
+## Recommended operating pattern
+
+For most teams, the following model works well:
+
+1. Set secure initial credentials and secrets during deployment.
+2. Create a dedicated service account for every technical integration or extension deployment.
+3. Use groups for team-level access management.
+4. Keep custom roles small and purpose-specific.
+5. Use resource permissions to share individual adapters, pipelines, charts, dashboards, datasets, assets, and extensions.
+6. Review externally managed users and role mappings carefully in OAuth-based installations.
+
+## Image placeholders
+
+`[Image placeholder: Security settings overview with the five sections User Accounts, Service Accounts, Groups, Roles, and Authentication]`
 
-:::warning
-This feature should be considered experimental. Currently, there is no mapping between external users and StreamPipes roles and all newly registered users will be assigned the role `ROLE_ADMIN`.
-:::
+`[Image placeholder: Edit user dialog showing local user fields, group assignment, role assignment, and account status]`
 
-Roles can be assigned to users in the same way as default users. In the `Security` settings (see above), for each user the provider is shown. For local users (tagged with the `local` provider), all user settings can be changed.
-For other providers, only roles can be changed and it is not possible to modify the username or email, since these are managed by the external system.
+`[Image placeholder: Role editor with available privileges, selected privileges, and alternate IDs]`
 
+`[Image placeholder: Permissions dialog for a resource such as a pipeline or dashboard]`
diff --git a/website-v2/src/components/docs/DocVisualPlaceholder.tsx b/website-v2/src/components/docs/DocVisualPlaceholder.tsx
new file mode 100644
index 000000000..d0935b68e
--- /dev/null
+++ b/website-v2/src/components/docs/DocVisualPlaceholder.tsx
@@ -0,0 +1,31 @@
+import React from 'react';
+import styles from './docs.module.css';
+
+type DocVisualPlaceholderProps = {
+  title: string;
+  purpose?: string;
+};
+
+const DocVisualPlaceholder = ({
+  title,
+  purpose,
+}: DocVisualPlaceholderProps) => {
+  return (
+    <div className={styles.visualPlaceholder}>
+      <div className={styles.visualHeader}>
+        <span className={styles.visualIcon}>UI</span>
+        <h3 className={styles.visualTitle}>{title}</h3>
+      </div>
+      <div className={styles.visualBody}>
+        Place a screenshot or diagram here.
+        {purpose ? (
+          <span className={styles.visualPurpose}>
+            <strong>Purpose:</strong> {purpose}
+          </span>
+        ) : null}
+      </div>
+    </div>
+  );
+};
+
+export default DocVisualPlaceholder;
diff --git a/website-v2/src/components/docs/FeatureList.tsx b/website-v2/src/components/docs/FeatureList.tsx
new file mode 100644
index 000000000..68fb86547
--- /dev/null
+++ b/website-v2/src/components/docs/FeatureList.tsx
@@ -0,0 +1,32 @@
+import React from 'react';
+import styles from './docs.module.css';
+
+type FeatureItem = {
+  title: string;
+  text: string;
+  example?: string;
+};
+
+type FeatureListProps = {
+  items: FeatureItem[];
+};
+
+const FeatureList = ({ items }: FeatureListProps) => {
+  return (
+    <div className={styles.featureList}>
+      {items.map((item, index) => (
+        <div className={styles.featureItem} key={`${item.title}-${index}`}>
+          <h3 className={styles.featureTitle}>{item.title}</h3>
+          <p className={styles.featureText}>{item.text}</p>
+          {item.example ? (
+            <p className={styles.featureExample}>
+              <strong>Example:</strong> {item.example}
+            </p>
+          ) : null}
+        </div>
+      ))}
+    </div>
+  );
+};
+
+export default FeatureList;
diff --git a/website-v2/src/components/docs/ScreenshotComparison.tsx b/website-v2/src/components/docs/ScreenshotComparison.tsx
new file mode 100644
index 000000000..5d801604e
--- /dev/null
+++ b/website-v2/src/components/docs/ScreenshotComparison.tsx
@@ -0,0 +1,65 @@
+import React, { ReactNode } from 'react';
+import styles from './docs.module.css';
+
+type ScreenshotComparisonItem = {
+  src: string;
+  alt: string;
+  title: string;
+  caption?: ReactNode;
+};
+
+type ScreenshotComparisonProps = {
+  items: ScreenshotComparisonItem[];
+  title?: string;
+  eyebrow?: string;
+  badge?: string;
+  summary?: ReactNode;
+  layout?: 'two-column' | 'stacked';
+};
+
+const ScreenshotComparison = ({
+  items,
+  title,
+  eyebrow = 'Comparison',
+  badge,
+  summary,
+  layout = 'two-column',
+}: ScreenshotComparisonProps) => {
+  return (
+    <section className={styles.screenshotFrame}>
+      {(title || eyebrow || badge) ? (
+        <div className={styles.screenshotHeader}>
+          <div className={styles.screenshotHeaderMain}>
+            {eyebrow ? (
+              <span className={styles.screenshotEyebrow}>{eyebrow}</span>
+            ) : null}
+            {title ? <h3 className={styles.screenshotTitle}>{title}</h3> : null}
+          </div>
+          {badge ? <span className={styles.screenshotBadge}>{badge}</span> : null}
+        </div>
+      ) : null}
+      <div
+        className={`${styles.comparisonGrid} ${
+          layout === 'stacked' ? styles.comparisonStacked : ''
+        }`}
+      >
+        {items.map((item, index) => (
+          <article className={styles.comparisonItem} key={`${item.title}-${index}`}>
+            <div className={styles.comparisonItemHeader}>
+              <h4 className={styles.comparisonItemTitle}>{item.title}</h4>
+              {item.caption ? (
+                <div className={styles.comparisonItemCaption}>{item.caption}</div>
+              ) : null}
+            </div>
+            <div className={styles.screenshotMedia}>
+              <img className={styles.screenshotImage} src={item.src} alt={item.alt} />
+            </div>
+          </article>
+        ))}
+      </div>
+      {summary ? <div className={styles.comparisonSummary}>{summary}</div> : null}
+    </section>
+  );
+};
+
+export default ScreenshotComparison;
diff --git a/website-v2/src/components/docs/ScreenshotFigure.tsx b/website-v2/src/components/docs/ScreenshotFigure.tsx
new file mode 100644
index 000000000..59308182c
--- /dev/null
+++ b/website-v2/src/components/docs/ScreenshotFigure.tsx
@@ -0,0 +1,52 @@
+import React, { ReactNode } from 'react';
+import styles from './docs.module.css';
+
+type ScreenshotFigureProps = {
+  src: string;
+  alt: string;
+  title?: string;
+  caption?: ReactNode;
+  eyebrow?: string;
+  badge?: string;
+  href?: string;
+};
+
+const ScreenshotFigure = ({
+  src,
+  alt,
+  title,
+  caption,
+  eyebrow,
+  badge,
+  href,
+}: ScreenshotFigureProps) => {
+  const image = <img className={styles.screenshotImage} src={src} alt={alt} />;
+
+  return (
+    <figure className={styles.screenshotFrame}>
+      {(title || eyebrow || badge) ? (
+        <div className={styles.screenshotHeader}>
+          <div className={styles.screenshotHeaderMain}>
+            {eyebrow ? (
+              <span className={styles.screenshotEyebrow}>{eyebrow}</span>
+            ) : null}
+            {title ? <h3 className={styles.screenshotTitle}>{title}</h3> : null}
+          </div>
+          {badge ? <span className={styles.screenshotBadge}>{badge}</span> : null}
+        </div>
+      ) : null}
+      <div className={styles.screenshotMedia}>
+        {href ? (
+          <a className={styles.screenshotMediaLink} href={href}>
+            {image}
+          </a>
+        ) : (
+          image
+        )}
+      </div>
+      {caption ? <figcaption className={styles.screenshotCaption}>{caption}</figcaption> : null}
+    </figure>
+  );
+};
+
+export default ScreenshotFigure;
diff --git a/website-v2/src/components/docs/ScreenshotSlideshow.tsx b/website-v2/src/components/docs/ScreenshotSlideshow.tsx
new file mode 100644
index 000000000..420318b03
--- /dev/null
+++ b/website-v2/src/components/docs/ScreenshotSlideshow.tsx
@@ -0,0 +1,113 @@
+import React, { ReactNode, useState } from 'react';
+import { Swiper, SwiperSlide } from 'swiper/react';
+import { Autoplay, Navigation, Thumbs } from 'swiper/modules';
+import type { Swiper as SwiperInstance } from 'swiper';
+import styles from './docs.module.css';
+
+import 'swiper/css';
+import 'swiper/css/navigation';
+import 'swiper/css/thumbs';
+
+type ScreenshotSlide = {
+  src: string;
+  alt: string;
+  title?: string;
+  caption?: ReactNode;
+};
+
+type ScreenshotSlideshowProps = {
+  items: ScreenshotSlide[];
+  title?: string;
+  eyebrow?: string;
+  badge?: string;
+  autoplayDelay?: number;
+};
+
+const ScreenshotSlideshow = ({
+  items,
+  title,
+  eyebrow = 'Slideshow',
+  badge,
+  autoplayDelay = 3500,
+}: ScreenshotSlideshowProps) => {
+  const [thumbsSwiper, setThumbsSwiper] = useState<SwiperInstance | null>(null);
+  const [activeIndex, setActiveIndex] = useState(0);
+
+  return (
+    <section className={styles.screenshotFrame}>
+      {(title || eyebrow || badge) ? (
+        <div className={styles.screenshotHeader}>
+          <div className={styles.screenshotHeaderMain}>
+            {eyebrow ? (
+              <span className={styles.screenshotEyebrow}>{eyebrow}</span>
+            ) : null}
+            {title ? <h3 className={styles.screenshotTitle}>{title}</h3> : null}
+          </div>
+          {badge ? <span className={styles.screenshotBadge}>{badge}</span> : null}
+        </div>
+      ) : null}
+      <div className={styles.slideshowMain}>
+        <Swiper
+          className={styles.slideshowSwiper}
+          modules={[Autoplay, Navigation, Thumbs]}
+          navigation
+          loop={items.length > 1}
+          autoplay={
+            items.length > 1
+              ? {
+                  delay: autoplayDelay,
+                  pauseOnMouseEnter: true,
+                  disableOnInteraction: true,
+                }
+              : false
+          }
+          onSlideChange={(swiper) => setActiveIndex(swiper.realIndex)}
+          thumbs={{
+            swiper:
+              thumbsSwiper && !thumbsSwiper.destroyed ? thumbsSwiper : null,
+          }}
+        >
+          {items.map((item, index) => (
+            <SwiperSlide key={`${item.alt}-${index}`}>
+              <div className={styles.slideshowSlide}>
+                <img className={styles.screenshotImage} src={item.src} alt={item.alt} />
+              </div>
+            </SwiperSlide>
+          ))}
+        </Swiper>
+      </div>
+      {items.length > 1 ? (
+        <div className={styles.slideshowThumbs}>
+          <Swiper
+            onSwiper={setThumbsSwiper}
+            slidesPerView={Math.min(items.length, 4)}
+            spaceBetween={12}
+            watchSlidesProgress
+            modules={[Thumbs]}
+          >
+            {items.map((item, index) => (
+              <SwiperSlide
+                className={styles.slideshowThumbSlide}
+                key={`${item.alt}-thumb-${index}`}
+              >
+                <img className={styles.screenshotImage} src={item.src} alt={item.alt} />
+              </SwiperSlide>
+            ))}
+          </Swiper>
+        </div>
+      ) : null}
+      {items[activeIndex] && (items[activeIndex].title || items[activeIndex].caption) ? (
+        <div className={styles.slideshowMeta}>
+          {items[activeIndex].title ? (
+            <h4 className={styles.slideshowMetaTitle}>{items[activeIndex].title}</h4>
+          ) : null}
+          {items[activeIndex].caption ? (
+            <div className={styles.slideshowMetaCaption}>{items[activeIndex].caption}</div>
+          ) : null}
+        </div>
+      ) : null}
+    </section>
+  );
+};
+
+export default ScreenshotSlideshow;
diff --git a/website-v2/src/components/docs/StepFlow.tsx b/website-v2/src/components/docs/StepFlow.tsx
new file mode 100644
index 000000000..eed1fb913
--- /dev/null
+++ b/website-v2/src/components/docs/StepFlow.tsx
@@ -0,0 +1,35 @@
+import React from 'react';
+import styles from './docs.module.css';
+
+type StepItem = {
+  title: string;
+  body: string;
+  eyebrow?: string;
+};
+
+type StepFlowProps = {
+  steps: StepItem[];
+};
+
+const StepFlow = ({ steps }: StepFlowProps) => {
+  return (
+    <div className={styles.stepFlow}>
+      {steps.map((step, index) => (
+        <div className={styles.stepCard} key={`${step.title}-${index}`}>
+          <div className={styles.stepHeader}>
+            <span className={styles.stepIndex}>{index + 1}</span>
+            <div>
+              {step.eyebrow ? (
+                <span className={styles.stepEyebrow}>{step.eyebrow}</span>
+              ) : null}
+              <h3 className={styles.stepTitle}>{step.title}</h3>
+            </div>
+          </div>
+          <p className={styles.stepBody}>{step.body}</p>
+        </div>
+      ))}
+    </div>
+  );
+};
+
+export default StepFlow;
diff --git a/website-v2/src/components/docs/UseCaseExample.tsx b/website-v2/src/components/docs/UseCaseExample.tsx
new file mode 100644
index 000000000..94def93a4
--- /dev/null
+++ b/website-v2/src/components/docs/UseCaseExample.tsx
@@ -0,0 +1,19 @@
+import React, { ReactNode } from 'react';
+import styles from './docs.module.css';
+
+type UseCaseExampleProps = {
+  title: string;
+  children: ReactNode;
+};
+
+const UseCaseExample = ({ title, children }: UseCaseExampleProps) => {
+  return (
+    <div className={styles.exampleBox}>
+      <span className={styles.exampleLabel}>Use Case</span>
+      <h3 className={styles.exampleTitle}>{title}</h3>
+      <div className={styles.exampleBody}>{children}</div>
+    </div>
+  );
+};
+
+export default UseCaseExample;
diff --git a/website-v2/src/components/docs/docs.module.css b/website-v2/src/components/docs/docs.module.css
new file mode 100644
index 000000000..c0e6bb5d6
--- /dev/null
+++ b/website-v2/src/components/docs/docs.module.css
@@ -0,0 +1,380 @@
+.stepFlow {
+  display: grid;
+  gap: 1rem;
+  margin: 1.5rem 0 2rem;
+}
+
+.stepCard {
+  background: #ffffff;
+  border: 1px solid #dde7f0;
+  border-left: 4px solid #1b1464;
+  border-radius: 12px;
+  padding: 1rem 1.05rem 0.95rem;
+  position: relative;
+}
+
+.stepHeader {
+  align-items: center;
+  display: flex;
+  gap: 0.85rem;
+  margin-bottom: 0.6rem;
+}
+
+.stepIndex {
+  align-items: center;
+  background: #eef2f7;
+  border: 1px solid #d4dce6;
+  border-radius: 999px;
+  color: #1b1464;
+  display: inline-flex;
+  flex: 0 0 2rem;
+  font-size: 0.92rem;
+  font-weight: 700;
+  height: 2rem;
+  justify-content: center;
+  width: 2rem;
+}
+
+.stepEyebrow {
+  color: #557085;
+  display: block;
+  font-size: 0.72rem;
+  font-weight: 700;
+  letter-spacing: 0.08em;
+  margin-bottom: 0.18rem;
+  text-transform: uppercase;
+}
+
+.stepTitle {
+  color: #102a43;
+  font-size: 1.02rem;
+  font-weight: 700;
+  line-height: 1.25;
+  margin: 0;
+}
+
+.stepBody {
+  color: #334e68;
+  font-size: 0.95rem;
+  line-height: 1.6;
+  margin: 0;
+}
+
+.featureList {
+  display: grid;
+  gap: 0.9rem;
+  margin: 1.5rem 0 2rem;
+}
+
+.featureItem {
+  border-bottom: 1px solid #e6edf5;
+  padding-bottom: 0.95rem;
+}
+
+.featureItem:last-child {
+  border-bottom: 0;
+  padding-bottom: 0;
+}
+
+.featureTitle {
+  color: #102a43;
+  font-size: 1rem;
+  font-weight: 700;
+  margin: 0 0 0.45rem;
+}
+
+.featureText {
+  color: #334e68;
+  font-size: 0.94rem;
+  line-height: 1.55;
+  margin: 0;
+}
+
+.featureExample {
+  color: #486581;
+  font-size: 0.9rem;
+  line-height: 1.5;
+  margin-top: 0.45rem;
+}
+
+.exampleBox {
+  background: #fafcfe;
+  border: 1px solid #dbe7f2;
+  border-left: 4px solid #39b54a;
+  border-radius: 12px;
+  margin: 1.5rem 0 2rem;
+  padding: 1rem 1.1rem;
+}
+
+.exampleLabel {
+  color: #116530;
+  display: block;
+  font-size: 0.75rem;
+  font-weight: 700;
+  letter-spacing: 0.08em;
+  margin-bottom: 0.35rem;
+  text-transform: uppercase;
+}
+
+.exampleTitle {
+  color: #102a43;
+  font-size: 1rem;
+  font-weight: 700;
+  margin: 0 0 0.35rem;
+}
+
+.exampleBody {
+  color: #2f4858;
+  font-size: 0.95rem;
+  line-height: 1.6;
+  margin: 0;
+}
+
+.visualPlaceholder {
+  background: #fbfcfe;
+  border: 1px dashed #c7d3e0;
+  border-radius: 14px;
+  margin: 1.5rem 0 2rem;
+  overflow: hidden;
+}
+
+.visualHeader {
+  align-items: center;
+  background: #ffffff;
+  border-bottom: 1px dashed #d8e1ea;
+  display: flex;
+  gap: 0.7rem;
+  padding: 0.8rem 1rem;
+}
+
+.visualIcon {
+  align-items: center;
+  background: #eef2f7;
+  border: 1px solid #d4dce6;
+  border-radius: 10px;
+  color: #1b1464;
+  display: inline-flex;
+  flex: 0 0 2.25rem;
+  font-size: 1rem;
+  font-weight: 700;
+  height: 2.25rem;
+  justify-content: center;
+  width: 2.25rem;
+}
+
+.visualTitle {
+  color: #102a43;
+  font-size: 0.98rem;
+  font-weight: 700;
+  margin: 0;
+}
+
+.visualBody {
+  color: #486581;
+  font-size: 0.94rem;
+  line-height: 1.6;
+  padding: 0.95rem 1rem 1rem;
+}
+
+.visualPurpose {
+  color: #334e68;
+  display: block;
+  margin-top: 0.45rem;
+}
+
+.screenshotFrame {
+  background: #ffffff;
+  border: 1px solid #dbe7f2;
+  border-radius: 16px;
+  box-shadow: 0 16px 36px rgba(16, 42, 67, 0.08);
+  margin: 1.5rem 0 2rem;
+  overflow: hidden;
+}
+
+.screenshotHeader {
+  align-items: flex-start;
+  background: #ffffff;
+  border-bottom: 1px solid #e6edf5;
+  display: flex;
+  gap: 0.9rem;
+  justify-content: space-between;
+  padding: 0.95rem 1rem 0.85rem;
+}
+
+.screenshotHeaderMain {
+  min-width: 0;
+}
+
+.screenshotEyebrow {
+  color: #557085;
+  display: block;
+  font-size: 0.72rem;
+  font-weight: 700;
+  letter-spacing: 0.08em;
+  margin-bottom: 0.25rem;
+  text-transform: uppercase;
+}
+
+.screenshotTitle {
+  color: #102a43;
+  font-size: 1rem;
+  font-weight: 700;
+  line-height: 1.3;
+  margin: 0;
+}
+
+.screenshotBadge {
+  background: #e8f1fb;
+  border: 1px solid #c7dcf5;
+  border-radius: 999px;
+  color: #1b5fa7;
+  flex: 0 0 auto;
+  font-size: 0.74rem;
+  font-weight: 700;
+  line-height: 1;
+  padding: 0.42rem 0.7rem;
+  text-transform: uppercase;
+}
+
+.screenshotMedia {
+  display: block;
+  padding: 1rem;
+}
+
+.screenshotMediaLink {
+  color: inherit;
+  display: block;
+  text-decoration: none;
+}
+
+.screenshotImage {
+  border: 1px solid #d8e4ef;
+  border-radius: 12px;
+  box-shadow: 0 10px 24px rgba(16, 42, 67, 0.12);
+  display: block;
+  height: auto;
+  width: 100%;
+}
+
+.screenshotCaption {
+  color: #486581;
+  font-size: 0.94rem;
+  line-height: 1.6;
+  padding: 0 1rem 1rem;
+}
+
+.comparisonGrid {
+  display: grid;
+  gap: 1rem;
+  grid-template-columns: repeat(2, minmax(0, 1fr));
+  padding: 1rem;
+}
+
+.comparisonStacked {
+  grid-template-columns: 1fr;
+}
+
+.comparisonItem {
+  background: #ffffff;
+  border: 1px solid #e6edf5;
+  border-radius: 14px;
+  overflow: hidden;
+}
+
+.comparisonItemHeader {
+  background: #fbfcfe;
+  border-bottom: 1px solid #e6edf5;
+  padding: 0.8rem 0.9rem;
+}
+
+.comparisonItemTitle {
+  color: #102a43;
+  font-size: 0.95rem;
+  font-weight: 700;
+  margin: 0;
+}
+
+.comparisonItemCaption {
+  color: #486581;
+  font-size: 0.9rem;
+  line-height: 1.55;
+  margin-top: 0.35rem;
+}
+
+.comparisonSummary {
+  border-top: 1px solid #e6edf5;
+  color: #334e68;
+  font-size: 0.94rem;
+  line-height: 1.6;
+  padding: 0.9rem 1rem 1rem;
+}
+
+.slideshowMain {
+  padding: 1rem 1rem 0.75rem;
+}
+
+.slideshowSwiper {
+  --swiper-navigation-color: #1b1464;
+  --swiper-pagination-color: #1b1464;
+}
+
+.slideshowSlide {
+  background:
+    linear-gradient(135deg, rgba(215, 228, 241, 0.7), rgba(248, 251, 255, 0.95));
+  border-radius: 14px;
+  padding: 0.9rem;
+}
+
+.slideshowThumbs {
+  padding: 0 1rem 1rem;
+}
+
+.slideshowThumbSlide {
+  border: 2px solid transparent;
+  border-radius: 10px;
+  cursor: pointer;
+  opacity: 0.72;
+  overflow: hidden;
+  transition:
+    border-color 0.2s ease,
+    opacity 0.2s ease,
+    transform 0.2s ease;
+}
+
+.slideshowThumbSlide:hover {
+  opacity: 1;
+  transform: translateY(-1px);
+}
+
+:global(.swiper-slide-thumb-active).slideshowThumbSlide {
+  border-color: #1b1464;
+  opacity: 1;
+}
+
+.slideshowMeta {
+  border-top: 1px solid #e6edf5;
+  padding: 0.95rem 1rem 1rem;
+}
+
+.slideshowMetaTitle {
+  color: #102a43;
+  font-size: 0.96rem;
+  font-weight: 700;
+  margin: 0 0 0.35rem;
+}
+
+.slideshowMetaCaption {
+  color: #486581;
+  font-size: 0.93rem;
+  line-height: 1.6;
+}
+
+@media (max-width: 996px) {
+  .comparisonGrid {
+    grid-template-columns: 1fr;
+  }
+
+  .comparisonStacked {
+    grid-template-columns: 1fr;
+  }
+}
diff --git a/website-v2/static/img/2026/asset-asset-link-create.png b/website-v2/static/img/2026/asset-asset-link-create.png
new file mode 100644
index 000000000..df4259991
Binary files /dev/null and b/website-v2/static/img/2026/asset-asset-link-create.png differ
diff --git a/website-v2/static/img/2026/asset-asset-link-overview.png b/website-v2/static/img/2026/asset-asset-link-overview.png
new file mode 100644
index 000000000..989a74edb
Binary files /dev/null and b/website-v2/static/img/2026/asset-asset-link-overview.png differ
diff --git a/website-v2/static/img/2026/asset-create.png b/website-v2/static/img/2026/asset-create.png
new file mode 100644
index 000000000..d211c1fda
Binary files /dev/null and b/website-v2/static/img/2026/asset-create.png differ
diff --git a/website-v2/static/img/2026/connect-create-adapter-settings-preview.png b/website-v2/static/img/2026/connect-create-adapter-settings-preview.png
new file mode 100644
index 000000000..f8722e20e
Binary files /dev/null and b/website-v2/static/img/2026/connect-create-adapter-settings-preview.png differ
diff --git a/website-v2/static/img/2026/connect-create-adapter-settings.png b/website-v2/static/img/2026/connect-create-adapter-settings.png
new file mode 100644
index 000000000..539369bb9
Binary files /dev/null and b/website-v2/static/img/2026/connect-create-adapter-settings.png differ
diff --git a/website-v2/static/img/2026/connect-create-configure-adapter.png b/website-v2/static/img/2026/connect-create-configure-adapter.png
new file mode 100644
index 000000000..24f04ce0d
Binary files /dev/null and b/website-v2/static/img/2026/connect-create-configure-adapter.png differ
diff --git a/website-v2/static/img/2026/connect-create-configure-metadata.png b/website-v2/static/img/2026/connect-create-configure-metadata.png
new file mode 100644
index 000000000..9a45370fd
Binary files /dev/null and b/website-v2/static/img/2026/connect-create-configure-metadata.png differ
diff --git a/website-v2/static/img/2026/connect-create-configure-schema-empty.png b/website-v2/static/img/2026/connect-create-configure-schema-empty.png
new file mode 100644
index 000000000..120d9c205
Binary files /dev/null and b/website-v2/static/img/2026/connect-create-configure-schema-empty.png differ
diff --git a/website-v2/static/img/2026/connect-create-configure-schema-example.png b/website-v2/static/img/2026/connect-create-configure-schema-example.png
new file mode 100644
index 000000000..22aac47d5
Binary files /dev/null and b/website-v2/static/img/2026/connect-create-configure-schema-example.png differ
diff --git a/website-v2/static/img/2026/connect-create-configure-schema-measurement-unit.png b/website-v2/static/img/2026/connect-create-configure-schema-measurement-unit.png
new file mode 100644
index 000000000..439f18491
Binary files /dev/null and b/website-v2/static/img/2026/connect-create-configure-schema-measurement-unit.png differ
diff --git a/website-v2/static/img/2026/connect-create-opcua-browser.png b/website-v2/static/img/2026/connect-create-opcua-browser.png
new file mode 100644
index 000000000..c7295e43e
Binary files /dev/null and b/website-v2/static/img/2026/connect-create-opcua-browser.png differ
diff --git a/website-v2/static/img/2026/connect-create-select-adapter.png b/website-v2/static/img/2026/connect-create-select-adapter.png
new file mode 100644
index 000000000..67cca314a
Binary files /dev/null and b/website-v2/static/img/2026/connect-create-select-adapter.png differ
diff --git a/website-v2/static/img/2026/connect-overview.png b/website-v2/static/img/2026/connect-overview.png
new file mode 100644
index 000000000..3c61d2065
Binary files /dev/null and b/website-v2/static/img/2026/connect-overview.png differ
diff --git a/website-v2/static/img/2026/dataset-download-data-dialog.png b/website-v2/static/img/2026/dataset-download-data-dialog.png
new file mode 100644
index 000000000..6cae97979
Binary files /dev/null and b/website-v2/static/img/2026/dataset-download-data-dialog.png differ
diff --git a/website-v2/static/img/2026/dataset-export-provider-dialog-s3.png b/website-v2/static/img/2026/dataset-export-provider-dialog-s3.png
new file mode 100644
index 000000000..4fb5e556b
Binary files /dev/null and b/website-v2/static/img/2026/dataset-export-provider-dialog-s3.png differ
diff --git a/website-v2/static/img/2026/dataset-overview.png b/website-v2/static/img/2026/dataset-overview.png
new file mode 100644
index 000000000..fcac5962a
Binary files /dev/null and b/website-v2/static/img/2026/dataset-overview.png differ
diff --git a/website-v2/static/img/2026/dataset-upload-data-dialog-preview.png b/website-v2/static/img/2026/dataset-upload-data-dialog-preview.png
new file mode 100644
index 000000000..da4cf5df7
Binary files /dev/null and b/website-v2/static/img/2026/dataset-upload-data-dialog-preview.png differ
diff --git a/website-v2/static/img/2026/home-asset-preview.png b/website-v2/static/img/2026/home-asset-preview.png
new file mode 100644
index 000000000..5318d8057
Binary files /dev/null and b/website-v2/static/img/2026/home-asset-preview.png differ
diff --git a/website-v2/static/img/2026/home-map.png b/website-v2/static/img/2026/home-map.png
new file mode 100644
index 000000000..8f4d3b68b
Binary files /dev/null and b/website-v2/static/img/2026/home-map.png differ
diff --git a/website-v2/static/img/2026/home-table.png b/website-v2/static/img/2026/home-table.png
new file mode 100644
index 000000000..61538ca10
Binary files /dev/null and b/website-v2/static/img/2026/home-table.png differ
diff --git a/website-v2/static/img/2026/login.png b/website-v2/static/img/2026/login.png
new file mode 100644
index 000000000..d399ce9c2
Binary files /dev/null and b/website-v2/static/img/2026/login.png differ
diff --git a/website-v2/static/img/2026/settings-site-create.png b/website-v2/static/img/2026/settings-site-create.png
new file mode 100644
index 000000000..026660196
Binary files /dev/null and b/website-v2/static/img/2026/settings-site-create.png differ
diff --git a/website-v2/static/img/features/configuration/01_configuration_overview.png b/website-v2/static/img/features/configuration/01_configuration_overview.png
deleted file mode 100644
index fedce8484..000000000
Binary files a/website-v2/static/img/features/configuration/01_configuration_overview.png and /dev/null differ
diff --git a/website-v2/static/img/features/configuration/02_status.png b/website-v2/static/img/features/configuration/02_status.png
deleted file mode 100644
index 41a7f0abc..000000000
Binary files a/website-v2/static/img/features/configuration/02_status.png and /dev/null differ
diff --git a/website-v2/static/img/features/configuration/03_change_config.png b/website-v2/static/img/features/configuration/03_change_config.png
deleted file mode 100644
index eaa5cb214..000000000
Binary files a/website-v2/static/img/features/configuration/03_change_config.png and /dev/null differ
diff --git a/website-v2/static/img/features/dashboard/01_dashboard.png b/website-v2/static/img/features/dashboard/01_dashboard.png
deleted file mode 100644
index 8f634f389..000000000
Binary files a/website-v2/static/img/features/dashboard/01_dashboard.png and /dev/null differ
diff --git a/website-v2/static/img/features/dashboard/02_new_visualisation.png b/website-v2/static/img/features/dashboard/02_new_visualisation.png
deleted file mode 100644
index 20ccf9a52..000000000
Binary files a/website-v2/static/img/features/dashboard/02_new_visualisation.png and /dev/null differ
diff --git a/website-v2/static/img/features/dashboard/03_select_gauge.png b/website-v2/static/img/features/dashboard/03_select_gauge.png
deleted file mode 100644
index 2c825f00e..000000000
Binary files a/website-v2/static/img/features/dashboard/03_select_gauge.png and /dev/null differ
diff --git a/website-v2/static/img/features/dashboard/04_configure_gauge.png b/website-v2/static/img/features/dashboard/04_configure_gauge.png
deleted file mode 100644
index 8450da713..000000000
Binary files a/website-v2/static/img/features/dashboard/04_configure_gauge.png and /dev/null differ
diff --git a/website-v2/static/img/features/dashboard/05_new_gauge_done.png b/website-v2/static/img/features/dashboard/05_new_gauge_done.png
deleted file mode 100644
index a83e0fde4..000000000
Binary files a/website-v2/static/img/features/dashboard/05_new_gauge_done.png and /dev/null differ
diff --git a/website-v2/static/img/features/dashboard/06_add_new.png b/website-v2/static/img/features/dashboard/06_add_new.png
deleted file mode 100644
index a02c74960..000000000
Binary files a/website-v2/static/img/features/dashboard/06_add_new.png and /dev/null differ
diff --git a/website-v2/static/img/features/editor/10_shortcut_buttons.png b/website-v2/static/img/features/editor/10_shortcut_buttons.png
deleted file mode 100644
index 49319e0f6..000000000
Binary files a/website-v2/static/img/features/editor/10_shortcut_buttons.png and /dev/null differ
diff --git a/website-v2/static/img/features/editor/11_compatible_elements.png b/website-v2/static/img/features/editor/11_compatible_elements.png
deleted file mode 100644
index e3cf03634..000000000
Binary files a/website-v2/static/img/features/editor/11_compatible_elements.png and /dev/null differ
diff --git a/website-v2/static/img/features/editor/12_recommend_elements.png b/website-v2/static/img/features/editor/12_recommend_elements.png
deleted file mode 100644
index a8baba9ad..000000000
Binary files a/website-v2/static/img/features/editor/12_recommend_elements.png and /dev/null differ
diff --git a/website-v2/static/img/features/editor/13_save_adjust.png b/website-v2/static/img/features/editor/13_save_adjust.png
deleted file mode 100644
index d031ba18d..000000000
Binary files a/website-v2/static/img/features/editor/13_save_adjust.png and /dev/null differ
diff --git a/website-v2/static/img/features/editor/14_save_dialogue.png b/website-v2/static/img/features/editor/14_save_dialogue.png
deleted file mode 100644
index ea096e3f1..000000000
Binary files a/website-v2/static/img/features/editor/14_save_dialogue.png and /dev/null differ
diff --git a/website-v2/static/img/features/editor/15_pipeline_sucessfully_started.png b/website-v2/static/img/features/editor/15_pipeline_sucessfully_started.png
deleted file mode 100644
index ef6de0528..000000000
Binary files a/website-v2/static/img/features/editor/15_pipeline_sucessfully_started.png and /dev/null differ
diff --git a/website-v2/static/img/features/editor/1_data_streams.png b/website-v2/static/img/features/editor/1_data_streams.png
deleted file mode 100644
index 751da9702..000000000
Binary files a/website-v2/static/img/features/editor/1_data_streams.png and /dev/null differ
diff --git a/website-v2/static/img/features/editor/2_processing_elements.png b/website-v2/static/img/features/editor/2_processing_elements.png
deleted file mode 100644
index 925106141..000000000
Binary files a/website-v2/static/img/features/editor/2_processing_elements.png and /dev/null differ
diff --git a/website-v2/static/img/features/editor/3_data_sinks.png b/website-v2/static/img/features/editor/3_data_sinks.png
deleted file mode 100644
index 6e7c710ff..000000000
Binary files a/website-v2/static/img/features/editor/3_data_sinks.png and /dev/null differ
diff --git a/website-v2/static/img/features/editor/4_text_filter.png b/website-v2/static/img/features/editor/4_text_filter.png
deleted file mode 100644
index e71773f41..000000000
Binary files a/website-v2/static/img/features/editor/4_text_filter.png and /dev/null differ
diff --git a/website-v2/static/img/features/editor/5_category_drop_down.png b/website-v2/static/img/features/editor/5_category_drop_down.png
deleted file mode 100644
index 6f10053dc..000000000
Binary files a/website-v2/static/img/features/editor/5_category_drop_down.png and /dev/null differ
diff --git a/website-v2/static/img/features/editor/6_category_filter.png b/website-v2/static/img/features/editor/6_category_filter.png
deleted file mode 100644
index ad1ef29f0..000000000
Binary files a/website-v2/static/img/features/editor/6_category_filter.png and /dev/null differ
diff --git a/website-v2/static/img/features/editor/7_connect_elements.png b/website-v2/static/img/features/editor/7_connect_elements.png
deleted file mode 100644
index d624c3eb7..000000000
Binary files a/website-v2/static/img/features/editor/7_connect_elements.png and /dev/null differ
diff --git a/website-v2/static/img/features/editor/8_configure_element.png b/website-v2/static/img/features/editor/8_configure_element.png
deleted file mode 100644
index dfaf85d51..000000000
Binary files a/website-v2/static/img/features/editor/8_configure_element.png and /dev/null differ
diff --git a/website-v2/static/img/features/editor/9_connection_error.png b/website-v2/static/img/features/editor/9_connection_error.png
deleted file mode 100644
index d6e505093..000000000
Binary files a/website-v2/static/img/features/editor/9_connection_error.png and /dev/null differ
diff --git a/website-v2/static/img/features/file_download/01_file_download.png b/website-v2/static/img/features/file_download/01_file_download.png
deleted file mode 100644
index 17fb9dda4..000000000
Binary files a/website-v2/static/img/features/file_download/01_file_download.png and /dev/null differ
diff --git a/website-v2/static/img/features/file_download/02_file_download.png b/website-v2/static/img/features/file_download/02_file_download.png
deleted file mode 100644
index 8538ca434..000000000
Binary files a/website-v2/static/img/features/file_download/02_file_download.png and /dev/null differ
diff --git a/website-v2/static/img/features/file_download/03_file_downloaded.png b/website-v2/static/img/features/file_download/03_file_downloaded.png
deleted file mode 100644
index a919c892f..000000000
Binary files a/website-v2/static/img/features/file_download/03_file_downloaded.png and /dev/null differ
diff --git a/website-v2/static/img/features/home/home.png b/website-v2/static/img/features/home/home.png
deleted file mode 100644
index fadb2944d..000000000
Binary files a/website-v2/static/img/features/home/home.png and /dev/null differ
diff --git a/website-v2/static/img/features/home/logout.png b/website-v2/static/img/features/home/logout.png
deleted file mode 100644
index fee0ba675..000000000
Binary files a/website-v2/static/img/features/home/logout.png and /dev/null differ
diff --git a/website-v2/static/img/features/home/menu.png b/website-v2/static/img/features/home/menu.png
deleted file mode 100644
index c72d65e81..000000000
Binary files a/website-v2/static/img/features/home/menu.png and /dev/null differ
diff --git a/website-v2/static/img/features/home/open_menu.png b/website-v2/static/img/features/home/open_menu.png
deleted file mode 100644
index 0a50c22a3..000000000
Binary files a/website-v2/static/img/features/home/open_menu.png and /dev/null differ
diff --git a/website-v2/static/img/features/install_elements/01_install_elements.png b/website-v2/static/img/features/install_elements/01_install_elements.png
deleted file mode 100644
index 258010fa9..000000000
Binary files a/website-v2/static/img/features/install_elements/01_install_elements.png and /dev/null differ
diff --git a/website-v2/static/img/features/install_elements/02_install_absence.png b/website-v2/static/img/features/install_elements/02_install_absence.png
deleted file mode 100644
index 207799ebc..000000000
Binary files a/website-v2/static/img/features/install_elements/02_install_absence.png and /dev/null differ
diff --git a/website-v2/static/img/features/install_elements/03_installed_absence.png b/website-v2/static/img/features/install_elements/03_installed_absence.png
deleted file mode 100644
index 42b77f0b6..000000000
Binary files a/website-v2/static/img/features/install_elements/03_installed_absence.png and /dev/null differ
diff --git a/website-v2/static/img/features/install_elements/04_abcense_in_editor.png b/website-v2/static/img/features/install_elements/04_abcense_in_editor.png
deleted file mode 100644
index 08a7dc361..000000000
Binary files a/website-v2/static/img/features/install_elements/04_abcense_in_editor.png and /dev/null differ
diff --git a/website-v2/static/img/features/login.png b/website-v2/static/img/features/login.png
deleted file mode 100644
index 9e1099b7c..000000000
Binary files a/website-v2/static/img/features/login.png and /dev/null differ
diff --git a/website-v2/static/img/features/manage_pipelines/1_pipeline_overview.png b/website-v2/static/img/features/manage_pipelines/1_pipeline_overview.png
deleted file mode 100644
index 16f05dc56..000000000
Binary files a/website-v2/static/img/features/manage_pipelines/1_pipeline_overview.png and /dev/null differ
diff --git a/website-v2/static/img/features/manage_pipelines/2_start_stop_pipeline.png b/website-v2/static/img/features/manage_pipelines/2_start_stop_pipeline.png
deleted file mode 100644
index 57024836f..000000000
Binary files a/website-v2/static/img/features/manage_pipelines/2_start_stop_pipeline.png and /dev/null differ
diff --git a/website-v2/static/img/features/manage_pipelines/3_delete_pipeline.png b/website-v2/static/img/features/manage_pipelines/3_delete_pipeline.png
deleted file mode 100644
index a9676cf93..000000000
Binary files a/website-v2/static/img/features/manage_pipelines/3_delete_pipeline.png and /dev/null differ
diff --git a/website-v2/static/img/features/manage_pipelines/4_pipeline_deleted.png b/website-v2/static/img/features/manage_pipelines/4_pipeline_deleted.png
deleted file mode 100644
index aeb4d474c..000000000
Binary files a/website-v2/static/img/features/manage_pipelines/4_pipeline_deleted.png and /dev/null differ
diff --git a/website-v2/static/img/features/manage_pipelines/5_pipeline_category.png b/website-v2/static/img/features/manage_pipelines/5_pipeline_category.png
deleted file mode 100644
index f7c58f535..000000000
Binary files a/website-v2/static/img/features/manage_pipelines/5_pipeline_category.png and /dev/null differ
diff --git a/website-v2/static/img/features/manage_pipelines/6_add_category.png b/website-v2/static/img/features/manage_pipelines/6_add_category.png
deleted file mode 100644
index 200bbf989..000000000
Binary files a/website-v2/static/img/features/manage_pipelines/6_add_category.png and /dev/null differ
diff --git a/website-v2/static/img/features/manage_pipelines/7_new_category.png b/website-v2/static/img/features/manage_pipelines/7_new_category.png
deleted file mode 100644
index 42c62dd49..000000000
Binary files a/website-v2/static/img/features/manage_pipelines/7_new_category.png and /dev/null differ
diff --git a/website-v2/static/img/features/manage_pipelines/8_show_new_category.png b/website-v2/static/img/features/manage_pipelines/8_show_new_category.png
deleted file mode 100644
index c9c9090bc..000000000
Binary files a/website-v2/static/img/features/manage_pipelines/8_show_new_category.png and /dev/null differ
diff --git a/website-v2/static/img/features/my_elements/01_my_elements.png b/website-v2/static/img/features/my_elements/01_my_elements.png
deleted file mode 100644
index 1ff8f42a4..000000000
Binary files a/website-v2/static/img/features/my_elements/01_my_elements.png and /dev/null differ
diff --git a/website-v2/static/img/features/my_elements/02_my_elements_jsonls.png b/website-v2/static/img/features/my_elements/02_my_elements_jsonls.png
deleted file mode 100644
index ed03361d3..000000000
Binary files a/website-v2/static/img/features/my_elements/02_my_elements_jsonls.png and /dev/null differ
diff --git a/website-v2/static/img/features/my_elements/03_jsonld.png b/website-v2/static/img/features/my_elements/03_jsonld.png
deleted file mode 100644
index 4c10c99db..000000000
Binary files a/website-v2/static/img/features/my_elements/03_jsonld.png and /dev/null differ
diff --git a/website-v2/static/img/features/notification/01_select_notification_sink.png b/website-v2/static/img/features/notification/01_select_notification_sink.png
deleted file mode 100644
index 05c90d768..000000000
Binary files a/website-v2/static/img/features/notification/01_select_notification_sink.png and /dev/null differ
diff --git a/website-v2/static/img/features/notification/02_configure_notification.png b/website-v2/static/img/features/notification/02_configure_notification.png
deleted file mode 100644
index b6465b9c8..000000000
Binary files a/website-v2/static/img/features/notification/02_configure_notification.png and /dev/null differ
diff --git a/website-v2/static/img/features/notification/03_use_event_properties.png b/website-v2/static/img/features/notification/03_use_event_properties.png
deleted file mode 100644
index ffec8659f..000000000
Binary files a/website-v2/static/img/features/notification/03_use_event_properties.png and /dev/null differ
diff --git a/website-v2/static/img/features/notification/04_new_notification.png b/website-v2/static/img/features/notification/04_new_notification.png
deleted file mode 100644
index 8acd24a19..000000000
Binary files a/website-v2/static/img/features/notification/04_new_notification.png and /dev/null differ
diff --git a/website-v2/static/img/features/notification/05_mark_read.png b/website-v2/static/img/features/notification/05_mark_read.png
deleted file mode 100644
index 8d74fd7b8..000000000
Binary files a/website-v2/static/img/features/notification/05_mark_read.png and /dev/null differ
diff --git a/website-v2/static/img/features/notification/06_marked_as_read.png b/website-v2/static/img/features/notification/06_marked_as_read.png
deleted file mode 100644
index 00bd0c821..000000000
Binary files a/website-v2/static/img/features/notification/06_marked_as_read.png and /dev/null differ
diff --git a/website-v2/static/img/features/pipeline_editor.png b/website-v2/static/img/features/pipeline_editor.png
deleted file mode 100644
index 3b695c48d..000000000
Binary files a/website-v2/static/img/features/pipeline_editor.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/configuration/01_configuration_overview.png b/website-v2/static/img/features_0_62_0/configuration/01_configuration_overview.png
deleted file mode 100644
index 2dd2ef2fd..000000000
Binary files a/website-v2/static/img/features_0_62_0/configuration/01_configuration_overview.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/configuration/02_change_config.png b/website-v2/static/img/features_0_62_0/configuration/02_change_config.png
deleted file mode 100644
index 4619cb5e4..000000000
Binary files a/website-v2/static/img/features_0_62_0/configuration/02_change_config.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/connect/edit/01_edit_timestamp.png b/website-v2/static/img/features_0_62_0/connect/edit/01_edit_timestamp.png
deleted file mode 100644
index 2f277afdf..000000000
Binary files a/website-v2/static/img/features_0_62_0/connect/edit/01_edit_timestamp.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/connect/edit/02_change_unit.png b/website-v2/static/img/features_0_62_0/connect/edit/02_change_unit.png
deleted file mode 100644
index 40d5d80d8..000000000
Binary files a/website-v2/static/img/features_0_62_0/connect/edit/02_change_unit.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/connect/edit/03_change_unit.png b/website-v2/static/img/features_0_62_0/connect/edit/03_change_unit.png
deleted file mode 100644
index e19fc826b..000000000
Binary files a/website-v2/static/img/features_0_62_0/connect/edit/03_change_unit.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/connect/new/01_connect.png b/website-v2/static/img/features_0_62_0/connect/new/01_connect.png
deleted file mode 100644
index 26c18b0ab..000000000
Binary files a/website-v2/static/img/features_0_62_0/connect/new/01_connect.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/connect/new/02_mqtt_adapter.png b/website-v2/static/img/features_0_62_0/connect/new/02_mqtt_adapter.png
deleted file mode 100644
index 0003ded28..000000000
Binary files a/website-v2/static/img/features_0_62_0/connect/new/02_mqtt_adapter.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/connect/new/03_configure_mqtt.png b/website-v2/static/img/features_0_62_0/connect/new/03_configure_mqtt.png
deleted file mode 100644
index 47d8670ab..000000000
Binary files a/website-v2/static/img/features_0_62_0/connect/new/03_configure_mqtt.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/connect/new/04_configure_format.png b/website-v2/static/img/features_0_62_0/connect/new/04_configure_format.png
deleted file mode 100644
index 0ae0b0e27..000000000
Binary files a/website-v2/static/img/features_0_62_0/connect/new/04_configure_format.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/connect/new/05_guess_schema.png b/website-v2/static/img/features_0_62_0/connect/new/05_guess_schema.png
deleted file mode 100644
index 1689de58f..000000000
Binary files a/website-v2/static/img/features_0_62_0/connect/new/05_guess_schema.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/connect/new/06_edit_adapter.png b/website-v2/static/img/features_0_62_0/connect/new/06_edit_adapter.png
deleted file mode 100644
index a63ef0d3c..000000000
Binary files a/website-v2/static/img/features_0_62_0/connect/new/06_edit_adapter.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/connect/new/07_start_adapter.png b/website-v2/static/img/features_0_62_0/connect/new/07_start_adapter.png
deleted file mode 100644
index 2e92b19cb..000000000
Binary files a/website-v2/static/img/features_0_62_0/connect/new/07_start_adapter.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/connect/new/08_data_stream_in_editor.png b/website-v2/static/img/features_0_62_0/connect/new/08_data_stream_in_editor.png
deleted file mode 100644
index 59454562e..000000000
Binary files a/website-v2/static/img/features_0_62_0/connect/new/08_data_stream_in_editor.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/dashboard/01_dashboard.png b/website-v2/static/img/features_0_62_0/dashboard/01_dashboard.png
deleted file mode 100644
index baf8ee37f..000000000
Binary files a/website-v2/static/img/features_0_62_0/dashboard/01_dashboard.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/dashboard/02_new_visualisation.png b/website-v2/static/img/features_0_62_0/dashboard/02_new_visualisation.png
deleted file mode 100644
index 68d83de16..000000000
Binary files a/website-v2/static/img/features_0_62_0/dashboard/02_new_visualisation.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/dashboard/03_select_gauge.png b/website-v2/static/img/features_0_62_0/dashboard/03_select_gauge.png
deleted file mode 100644
index f8625dfd9..000000000
Binary files a/website-v2/static/img/features_0_62_0/dashboard/03_select_gauge.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/dashboard/04_configure_gauge.png b/website-v2/static/img/features_0_62_0/dashboard/04_configure_gauge.png
deleted file mode 100644
index e2498045e..000000000
Binary files a/website-v2/static/img/features_0_62_0/dashboard/04_configure_gauge.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/dashboard/05_new_gauge_done.png b/website-v2/static/img/features_0_62_0/dashboard/05_new_gauge_done.png
deleted file mode 100644
index ea8b91131..000000000
Binary files a/website-v2/static/img/features_0_62_0/dashboard/05_new_gauge_done.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/editor/10_connection_error.png b/website-v2/static/img/features_0_62_0/editor/10_connection_error.png
deleted file mode 100644
index caaeeda01..000000000
Binary files a/website-v2/static/img/features_0_62_0/editor/10_connection_error.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/editor/11_shortcut_buttons.png b/website-v2/static/img/features_0_62_0/editor/11_shortcut_buttons.png
deleted file mode 100644
index ec0e6ca45..000000000
Binary files a/website-v2/static/img/features_0_62_0/editor/11_shortcut_buttons.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/editor/12_compatible_elements.png b/website-v2/static/img/features_0_62_0/editor/12_compatible_elements.png
deleted file mode 100644
index 3422582d6..000000000
Binary files a/website-v2/static/img/features_0_62_0/editor/12_compatible_elements.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/editor/13_recommend_elements.png b/website-v2/static/img/features_0_62_0/editor/13_recommend_elements.png
deleted file mode 100644
index ee7af303b..000000000
Binary files a/website-v2/static/img/features_0_62_0/editor/13_recommend_elements.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/editor/14_save_adjust.png b/website-v2/static/img/features_0_62_0/editor/14_save_adjust.png
deleted file mode 100644
index 04758da9a..000000000
Binary files a/website-v2/static/img/features_0_62_0/editor/14_save_adjust.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/editor/15_save_dialogue.png b/website-v2/static/img/features_0_62_0/editor/15_save_dialogue.png
deleted file mode 100644
index 697e770b6..000000000
Binary files a/website-v2/static/img/features_0_62_0/editor/15_save_dialogue.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/editor/16_pipeline_sucessfully_started.png b/website-v2/static/img/features_0_62_0/editor/16_pipeline_sucessfully_started.png
deleted file mode 100644
index d5175df77..000000000
Binary files a/website-v2/static/img/features_0_62_0/editor/16_pipeline_sucessfully_started.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/editor/17_pipeline_information.png b/website-v2/static/img/features_0_62_0/editor/17_pipeline_information.png
deleted file mode 100644
index e9458e680..000000000
Binary files a/website-v2/static/img/features_0_62_0/editor/17_pipeline_information.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/editor/1_PipelineEditor_DataSets.png b/website-v2/static/img/features_0_62_0/editor/1_PipelineEditor_DataSets.png
deleted file mode 100644
index e79a7a759..000000000
Binary files a/website-v2/static/img/features_0_62_0/editor/1_PipelineEditor_DataSets.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/editor/2_PipelineEditor_DataStreams.png b/website-v2/static/img/features_0_62_0/editor/2_PipelineEditor_DataStreams.png
deleted file mode 100644
index 0fe1cf094..000000000
Binary files a/website-v2/static/img/features_0_62_0/editor/2_PipelineEditor_DataStreams.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/editor/3_PipelineEditor_DataProcessors.png b/website-v2/static/img/features_0_62_0/editor/3_PipelineEditor_DataProcessors.png
deleted file mode 100644
index 43892d01b..000000000
Binary files a/website-v2/static/img/features_0_62_0/editor/3_PipelineEditor_DataProcessors.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/editor/4_PipelineEditor_DataSinks.png b/website-v2/static/img/features_0_62_0/editor/4_PipelineEditor_DataSinks.png
deleted file mode 100644
index 6954691f8..000000000
Binary files a/website-v2/static/img/features_0_62_0/editor/4_PipelineEditor_DataSinks.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/editor/5_text_filter.png b/website-v2/static/img/features_0_62_0/editor/5_text_filter.png
deleted file mode 100644
index e5cea210b..000000000
Binary files a/website-v2/static/img/features_0_62_0/editor/5_text_filter.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/editor/6_category_drop_down.png b/website-v2/static/img/features_0_62_0/editor/6_category_drop_down.png
deleted file mode 100644
index 426a4e460..000000000
Binary files a/website-v2/static/img/features_0_62_0/editor/6_category_drop_down.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/editor/7_category_filter.png b/website-v2/static/img/features_0_62_0/editor/7_category_filter.png
deleted file mode 100644
index c3cfd4d5f..000000000
Binary files a/website-v2/static/img/features_0_62_0/editor/7_category_filter.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/editor/8_connect_elements.png b/website-v2/static/img/features_0_62_0/editor/8_connect_elements.png
deleted file mode 100644
index 5b48f54d2..000000000
Binary files a/website-v2/static/img/features_0_62_0/editor/8_connect_elements.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/editor/9_configure_element.png b/website-v2/static/img/features_0_62_0/editor/9_configure_element.png
deleted file mode 100644
index 34ada0803..000000000
Binary files a/website-v2/static/img/features_0_62_0/editor/9_configure_element.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/file_download/01_file_download.png b/website-v2/static/img/features_0_62_0/file_download/01_file_download.png
deleted file mode 100644
index 8772f69e3..000000000
Binary files a/website-v2/static/img/features_0_62_0/file_download/01_file_download.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/file_download/02_file_download.png b/website-v2/static/img/features_0_62_0/file_download/02_file_download.png
deleted file mode 100644
index 595022b23..000000000
Binary files a/website-v2/static/img/features_0_62_0/file_download/02_file_download.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/file_download/03_file_download.png b/website-v2/static/img/features_0_62_0/file_download/03_file_download.png
deleted file mode 100644
index de19e8d70..000000000
Binary files a/website-v2/static/img/features_0_62_0/file_download/03_file_download.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/home/home.png b/website-v2/static/img/features_0_62_0/home/home.png
deleted file mode 100644
index 43d6384d3..000000000
Binary files a/website-v2/static/img/features_0_62_0/home/home.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/home/open_menu.png b/website-v2/static/img/features_0_62_0/home/open_menu.png
deleted file mode 100644
index fdfef3a7d..000000000
Binary files a/website-v2/static/img/features_0_62_0/home/open_menu.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/install_elements/01_install_elements.png b/website-v2/static/img/features_0_62_0/install_elements/01_install_elements.png
deleted file mode 100644
index 08912ed7b..000000000
Binary files a/website-v2/static/img/features_0_62_0/install_elements/01_install_elements.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/install_elements/02_install_countAggregation.png b/website-v2/static/img/features_0_62_0/install_elements/02_install_countAggregation.png
deleted file mode 100644
index c56bb962c..000000000
Binary files a/website-v2/static/img/features_0_62_0/install_elements/02_install_countAggregation.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/install_elements/03_installed_countAggregation.png b/website-v2/static/img/features_0_62_0/install_elements/03_installed_countAggregation.png
deleted file mode 100644
index e4013f332..000000000
Binary files a/website-v2/static/img/features_0_62_0/install_elements/03_installed_countAggregation.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/install_elements/04_countAggregation_in_editor.png b/website-v2/static/img/features_0_62_0/install_elements/04_countAggregation_in_editor.png
deleted file mode 100644
index c0d06a352..000000000
Binary files a/website-v2/static/img/features_0_62_0/install_elements/04_countAggregation_in_editor.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/login.png b/website-v2/static/img/features_0_62_0/login.png
deleted file mode 100644
index 9547dcbc7..000000000
Binary files a/website-v2/static/img/features_0_62_0/login.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/manage_pipelines/1_pipeline_overview.png b/website-v2/static/img/features_0_62_0/manage_pipelines/1_pipeline_overview.png
deleted file mode 100644
index 9bfc58e78..000000000
Binary files a/website-v2/static/img/features_0_62_0/manage_pipelines/1_pipeline_overview.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/manage_pipelines/2_pipeline_information.png b/website-v2/static/img/features_0_62_0/manage_pipelines/2_pipeline_information.png
deleted file mode 100644
index e9458e680..000000000
Binary files a/website-v2/static/img/features_0_62_0/manage_pipelines/2_pipeline_information.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/manage_pipelines/3_delete_pipeline.png b/website-v2/static/img/features_0_62_0/manage_pipelines/3_delete_pipeline.png
deleted file mode 100644
index dedb8384b..000000000
Binary files a/website-v2/static/img/features_0_62_0/manage_pipelines/3_delete_pipeline.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/manage_pipelines/4_pipeline_deleted.png b/website-v2/static/img/features_0_62_0/manage_pipelines/4_pipeline_deleted.png
deleted file mode 100644
index 0fb98a722..000000000
Binary files a/website-v2/static/img/features_0_62_0/manage_pipelines/4_pipeline_deleted.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/manage_pipelines/5_pipeline_category.png b/website-v2/static/img/features_0_62_0/manage_pipelines/5_pipeline_category.png
deleted file mode 100644
index 4b35c765c..000000000
Binary files a/website-v2/static/img/features_0_62_0/manage_pipelines/5_pipeline_category.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/manage_pipelines/6_add_category.png b/website-v2/static/img/features_0_62_0/manage_pipelines/6_add_category.png
deleted file mode 100644
index 1afc6d36b..000000000
Binary files a/website-v2/static/img/features_0_62_0/manage_pipelines/6_add_category.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/manage_pipelines/7_new_category.png b/website-v2/static/img/features_0_62_0/manage_pipelines/7_new_category.png
deleted file mode 100644
index 9c249b615..000000000
Binary files a/website-v2/static/img/features_0_62_0/manage_pipelines/7_new_category.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/manage_pipelines/8_show_new_category.png b/website-v2/static/img/features_0_62_0/manage_pipelines/8_show_new_category.png
deleted file mode 100644
index e8e64daf5..000000000
Binary files a/website-v2/static/img/features_0_62_0/manage_pipelines/8_show_new_category.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/my_elements/01_my_elements.png b/website-v2/static/img/features_0_62_0/my_elements/01_my_elements.png
deleted file mode 100644
index 1ffeb1564..000000000
Binary files a/website-v2/static/img/features_0_62_0/my_elements/01_my_elements.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/my_elements/02_my_elements_jsonid.png b/website-v2/static/img/features_0_62_0/my_elements/02_my_elements_jsonid.png
deleted file mode 100644
index 87a1e633b..000000000
Binary files a/website-v2/static/img/features_0_62_0/my_elements/02_my_elements_jsonid.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/notification/01_select_notification_sink.png b/website-v2/static/img/features_0_62_0/notification/01_select_notification_sink.png
deleted file mode 100644
index 3e394cbd1..000000000
Binary files a/website-v2/static/img/features_0_62_0/notification/01_select_notification_sink.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/notification/02_configure_notification.png b/website-v2/static/img/features_0_62_0/notification/02_configure_notification.png
deleted file mode 100644
index 7d029fde9..000000000
Binary files a/website-v2/static/img/features_0_62_0/notification/02_configure_notification.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/notification/03_new_notification.png b/website-v2/static/img/features_0_62_0/notification/03_new_notification.png
deleted file mode 100644
index fd7f16de2..000000000
Binary files a/website-v2/static/img/features_0_62_0/notification/03_new_notification.png and /dev/null differ
diff --git a/website-v2/static/img/features_0_62_0/pipeline_editor.png b/website-v2/static/img/features_0_62_0/pipeline_editor.png
deleted file mode 100644
index 3b695c48d..000000000
Binary files a/website-v2/static/img/features_0_62_0/pipeline_editor.png and /dev/null differ
diff --git a/website-v2/static/img/oss_logo.png b/website-v2/static/img/oss_logo.png
deleted file mode 100644
index 8183e289b..000000000
Binary files a/website-v2/static/img/oss_logo.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/elements/01_goto_elements.png b/website-v2/static/img/quickstart/elements/01_goto_elements.png
deleted file mode 100644
index 860a5b9a9..000000000
Binary files a/website-v2/static/img/quickstart/elements/01_goto_elements.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/elements/02_install_sources.png b/website-v2/static/img/quickstart/elements/02_install_sources.png
deleted file mode 100644
index 468e5f410..000000000
Binary files a/website-v2/static/img/quickstart/elements/02_install_sources.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/elements/03_installed_sources.png b/website-v2/static/img/quickstart/elements/03_installed_sources.png
deleted file mode 100644
index 7eb138ce9..000000000
Binary files a/website-v2/static/img/quickstart/elements/03_installed_sources.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/elements/04_install_elements.png b/website-v2/static/img/quickstart/elements/04_install_elements.png
deleted file mode 100644
index 456de742e..000000000
Binary files a/website-v2/static/img/quickstart/elements/04_install_elements.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/elements/05_installed_elements.png b/website-v2/static/img/quickstart/elements/05_installed_elements.png
deleted file mode 100644
index 3209ac308..000000000
Binary files a/website-v2/static/img/quickstart/elements/05_installed_elements.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/elements/06_install_sinks.png b/website-v2/static/img/quickstart/elements/06_install_sinks.png
deleted file mode 100644
index 84138a608..000000000
Binary files a/website-v2/static/img/quickstart/elements/06_install_sinks.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/elements/07_installed_sinks.png b/website-v2/static/img/quickstart/elements/07_installed_sinks.png
deleted file mode 100644
index 674e11e23..000000000
Binary files a/website-v2/static/img/quickstart/elements/07_installed_sinks.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/elements/08_pipeline_editor_sources.png b/website-v2/static/img/quickstart/elements/08_pipeline_editor_sources.png
deleted file mode 100644
index db504a954..000000000
Binary files a/website-v2/static/img/quickstart/elements/08_pipeline_editor_sources.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/elements/09_pipeline_editor_elements.png b/website-v2/static/img/quickstart/elements/09_pipeline_editor_elements.png
deleted file mode 100644
index 50916f7c8..000000000
Binary files a/website-v2/static/img/quickstart/elements/09_pipeline_editor_elements.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/elements/10_pipeline_editor_sinks.png b/website-v2/static/img/quickstart/elements/10_pipeline_editor_sinks.png
deleted file mode 100644
index b92e9cd52..000000000
Binary files a/website-v2/static/img/quickstart/elements/10_pipeline_editor_sinks.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/01_PipelineEditor_DataStreams.png b/website-v2/static/img/quickstart/examples/01_PipelineEditor_DataStreams.png
deleted file mode 100644
index 0fe1cf094..000000000
Binary files a/website-v2/static/img/quickstart/examples/01_PipelineEditor_DataStreams.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/01_example1_empty.png b/website-v2/static/img/quickstart/examples/01_example1_empty.png
deleted file mode 100644
index 9a98cafaa..000000000
Binary files a/website-v2/static/img/quickstart/examples/01_example1_empty.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/02_example1_source.png b/website-v2/static/img/quickstart/examples/02_example1_source.png
deleted file mode 100644
index 9e63cf980..000000000
Binary files a/website-v2/static/img/quickstart/examples/02_example1_source.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/03_example1_pipeline_finished.png b/website-v2/static/img/quickstart/examples/03_example1_pipeline_finished.png
deleted file mode 100644
index 31121fa2c..000000000
Binary files a/website-v2/static/img/quickstart/examples/03_example1_pipeline_finished.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/04_example1_save.png b/website-v2/static/img/quickstart/examples/04_example1_save.png
deleted file mode 100644
index a5afa3b0e..000000000
Binary files a/website-v2/static/img/quickstart/examples/04_example1_save.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/05_example1_pipeline_started.png b/website-v2/static/img/quickstart/examples/05_example1_pipeline_started.png
deleted file mode 100644
index f3c404115..000000000
Binary files a/website-v2/static/img/quickstart/examples/05_example1_pipeline_started.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/06_example01_live_visualisation.png b/website-v2/static/img/quickstart/examples/06_example01_live_visualisation.png
deleted file mode 100644
index 154b0dd4d..000000000
Binary files a/website-v2/static/img/quickstart/examples/06_example01_live_visualisation.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/07_example01_first_step.png b/website-v2/static/img/quickstart/examples/07_example01_first_step.png
deleted file mode 100644
index f01d0969b..000000000
Binary files a/website-v2/static/img/quickstart/examples/07_example01_first_step.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/08_example01_second_step.png b/website-v2/static/img/quickstart/examples/08_example01_second_step.png
deleted file mode 100644
index d0812aa75..000000000
Binary files a/website-v2/static/img/quickstart/examples/08_example01_second_step.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/09_example01_third_step.png b/website-v2/static/img/quickstart/examples/09_example01_third_step.png
deleted file mode 100644
index 25c44ad40..000000000
Binary files a/website-v2/static/img/quickstart/examples/09_example01_third_step.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/10_example1_finished.png b/website-v2/static/img/quickstart/examples/10_example1_finished.png
deleted file mode 100644
index 6cbdb55c7..000000000
Binary files a/website-v2/static/img/quickstart/examples/10_example1_finished.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/11_example2_start.png b/website-v2/static/img/quickstart/examples/11_example2_start.png
deleted file mode 100644
index b7e5e609f..000000000
Binary files a/website-v2/static/img/quickstart/examples/11_example2_start.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/12_example2_numerical.png b/website-v2/static/img/quickstart/examples/12_example2_numerical.png
deleted file mode 100644
index fdf842229..000000000
Binary files a/website-v2/static/img/quickstart/examples/12_example2_numerical.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/13_example2_configure_numerical.png b/website-v2/static/img/quickstart/examples/13_example2_configure_numerical.png
deleted file mode 100644
index 669b369e9..000000000
Binary files a/website-v2/static/img/quickstart/examples/13_example2_configure_numerical.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/14_example2_aggregate.png b/website-v2/static/img/quickstart/examples/14_example2_aggregate.png
deleted file mode 100644
index 1cf28db0b..000000000
Binary files a/website-v2/static/img/quickstart/examples/14_example2_aggregate.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/15_example2_configure_aggregate.png b/website-v2/static/img/quickstart/examples/15_example2_configure_aggregate.png
deleted file mode 100644
index dcab0d77a..000000000
Binary files a/website-v2/static/img/quickstart/examples/15_example2_configure_aggregate.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/16_example2_increase.png b/website-v2/static/img/quickstart/examples/16_example2_increase.png
deleted file mode 100644
index 180299280..000000000
Binary files a/website-v2/static/img/quickstart/examples/16_example2_increase.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/17_example2_configure1_increase.png b/website-v2/static/img/quickstart/examples/17_example2_configure1_increase.png
deleted file mode 100644
index 16c1ddd90..000000000
Binary files a/website-v2/static/img/quickstart/examples/17_example2_configure1_increase.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/18_example2_configure2_increase.png b/website-v2/static/img/quickstart/examples/18_example2_configure2_increase.png
deleted file mode 100644
index 47b016848..000000000
Binary files a/website-v2/static/img/quickstart/examples/18_example2_configure2_increase.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/19_example2_sequence.png b/website-v2/static/img/quickstart/examples/19_example2_sequence.png
deleted file mode 100644
index 59d1b39cb..000000000
Binary files a/website-v2/static/img/quickstart/examples/19_example2_sequence.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/20_example2_configure_sequence.png b/website-v2/static/img/quickstart/examples/20_example2_configure_sequence.png
deleted file mode 100644
index bcf11798c..000000000
Binary files a/website-v2/static/img/quickstart/examples/20_example2_configure_sequence.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/21_example2_notification.png b/website-v2/static/img/quickstart/examples/21_example2_notification.png
deleted file mode 100644
index d93fdc6bb..000000000
Binary files a/website-v2/static/img/quickstart/examples/21_example2_notification.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/22_example2_configure_notification.png b/website-v2/static/img/quickstart/examples/22_example2_configure_notification.png
deleted file mode 100644
index 04911c0aa..000000000
Binary files a/website-v2/static/img/quickstart/examples/22_example2_configure_notification.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/23_example2_dashboard_sink.png b/website-v2/static/img/quickstart/examples/23_example2_dashboard_sink.png
deleted file mode 100644
index fb480141a..000000000
Binary files a/website-v2/static/img/quickstart/examples/23_example2_dashboard_sink.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/24_example2_save.png b/website-v2/static/img/quickstart/examples/24_example2_save.png
deleted file mode 100644
index 2143a2083..000000000
Binary files a/website-v2/static/img/quickstart/examples/24_example2_save.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/25_example2_started.png b/website-v2/static/img/quickstart/examples/25_example2_started.png
deleted file mode 100644
index 1601a32b0..000000000
Binary files a/website-v2/static/img/quickstart/examples/25_example2_started.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/26_example2_visualisation.png b/website-v2/static/img/quickstart/examples/26_example2_visualisation.png
deleted file mode 100644
index 645e46e61..000000000
Binary files a/website-v2/static/img/quickstart/examples/26_example2_visualisation.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples/27_example2_notification.png b/website-v2/static/img/quickstart/examples/27_example2_notification.png
deleted file mode 100644
index def1a2238..000000000
Binary files a/website-v2/static/img/quickstart/examples/27_example2_notification.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/01_PipelineEditor_DataStreams.png b/website-v2/static/img/quickstart/examples_master/01_PipelineEditor_DataStreams.png
deleted file mode 100644
index ff4fcc2e8..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/01_PipelineEditor_DataStreams.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/02_example1_source.png b/website-v2/static/img/quickstart/examples_master/02_example1_source.png
deleted file mode 100644
index 52d540f39..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/02_example1_source.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/03_example1_pipeline_finished.png b/website-v2/static/img/quickstart/examples_master/03_example1_pipeline_finished.png
deleted file mode 100644
index 76bd7730b..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/03_example1_pipeline_finished.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/04_example1_save.png b/website-v2/static/img/quickstart/examples_master/04_example1_save.png
deleted file mode 100644
index 71e7b9c57..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/04_example1_save.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/05_example1_pipeline_started.png b/website-v2/static/img/quickstart/examples_master/05_example1_pipeline_started.png
deleted file mode 100644
index dbe95412f..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/05_example1_pipeline_started.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/06_example01_live_visualisation.png b/website-v2/static/img/quickstart/examples_master/06_example01_live_visualisation.png
deleted file mode 100644
index d49514e79..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/06_example01_live_visualisation.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/07_example01_first_step.png b/website-v2/static/img/quickstart/examples_master/07_example01_first_step.png
deleted file mode 100644
index e789239d3..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/07_example01_first_step.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/08_example01_second_step.png b/website-v2/static/img/quickstart/examples_master/08_example01_second_step.png
deleted file mode 100644
index 3ccc1b54c..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/08_example01_second_step.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/09_example01_third_step.png b/website-v2/static/img/quickstart/examples_master/09_example01_third_step.png
deleted file mode 100644
index af187bb19..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/09_example01_third_step.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/10_example1_finished.png b/website-v2/static/img/quickstart/examples_master/10_example1_finished.png
deleted file mode 100644
index 1ad2c8fa0..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/10_example1_finished.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/11_example2_start.png b/website-v2/static/img/quickstart/examples_master/11_example2_start.png
deleted file mode 100644
index e64e67ed7..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/11_example2_start.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/12_example2_numerical.png b/website-v2/static/img/quickstart/examples_master/12_example2_numerical.png
deleted file mode 100644
index 4ea02dba4..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/12_example2_numerical.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/13_example2_configure_numerical.png b/website-v2/static/img/quickstart/examples_master/13_example2_configure_numerical.png
deleted file mode 100644
index 1311690ee..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/13_example2_configure_numerical.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/14_example2_aggregate.png b/website-v2/static/img/quickstart/examples_master/14_example2_aggregate.png
deleted file mode 100644
index 1bd606176..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/14_example2_aggregate.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/15_example2_configure_aggregate.png b/website-v2/static/img/quickstart/examples_master/15_example2_configure_aggregate.png
deleted file mode 100644
index 4af199cc6..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/15_example2_configure_aggregate.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/15_example2_configure_aggregate_2.png b/website-v2/static/img/quickstart/examples_master/15_example2_configure_aggregate_2.png
deleted file mode 100644
index 3b32bc9bd..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/15_example2_configure_aggregate_2.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/16_example2_increase.png b/website-v2/static/img/quickstart/examples_master/16_example2_increase.png
deleted file mode 100644
index 2ccca693e..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/16_example2_increase.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/17_example2_configure1_increase.png b/website-v2/static/img/quickstart/examples_master/17_example2_configure1_increase.png
deleted file mode 100644
index ee39f3a4b..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/17_example2_configure1_increase.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/19_example2_sequence.png b/website-v2/static/img/quickstart/examples_master/19_example2_sequence.png
deleted file mode 100644
index 77252866d..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/19_example2_sequence.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/20_example2_configure_sequence.png b/website-v2/static/img/quickstart/examples_master/20_example2_configure_sequence.png
deleted file mode 100644
index 3e1b297a8..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/20_example2_configure_sequence.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/21_example2_notification.png b/website-v2/static/img/quickstart/examples_master/21_example2_notification.png
deleted file mode 100644
index 047cb0b94..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/21_example2_notification.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/22_example2_configure_notification.png b/website-v2/static/img/quickstart/examples_master/22_example2_configure_notification.png
deleted file mode 100644
index b448112d8..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/22_example2_configure_notification.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/23_example2_dashboard_sink.png b/website-v2/static/img/quickstart/examples_master/23_example2_dashboard_sink.png
deleted file mode 100644
index 6f4394182..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/23_example2_dashboard_sink.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/examples_master/25_example2_started.png b/website-v2/static/img/quickstart/examples_master/25_example2_started.png
deleted file mode 100644
index 1500ff122..000000000
Binary files a/website-v2/static/img/quickstart/examples_master/25_example2_started.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/interactive-tutorial.png b/website-v2/static/img/quickstart/interactive-tutorial.png
deleted file mode 100644
index 8a96badaf..000000000
Binary files a/website-v2/static/img/quickstart/interactive-tutorial.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/setup/01_register_user.png b/website-v2/static/img/quickstart/setup/01_register_user.png
deleted file mode 100644
index c87721987..000000000
Binary files a/website-v2/static/img/quickstart/setup/01_register_user.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/setup/02_user_set_up.png b/website-v2/static/img/quickstart/setup/02_user_set_up.png
deleted file mode 100644
index 7cd9ba24c..000000000
Binary files a/website-v2/static/img/quickstart/setup/02_user_set_up.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/setup/03_login.png b/website-v2/static/img/quickstart/setup/03_login.png
deleted file mode 100644
index 148354823..000000000
Binary files a/website-v2/static/img/quickstart/setup/03_login.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/setup/04_home.png b/website-v2/static/img/quickstart/setup/04_home.png
deleted file mode 100644
index 81044194e..000000000
Binary files a/website-v2/static/img/quickstart/setup/04_home.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/setup/login.png b/website-v2/static/img/quickstart/setup/login.png
deleted file mode 100644
index 9e1099b7c..000000000
Binary files a/website-v2/static/img/quickstart/setup/login.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/user-guide/01_home.png b/website-v2/static/img/quickstart/user-guide/01_home.png
deleted file mode 100644
index 838e25fa4..000000000
Binary files a/website-v2/static/img/quickstart/user-guide/01_home.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/user-guide/02_pipelines.png b/website-v2/static/img/quickstart/user-guide/02_pipelines.png
deleted file mode 100644
index 4ba8df221..000000000
Binary files a/website-v2/static/img/quickstart/user-guide/02_pipelines.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/user-guide/03_adapters.png b/website-v2/static/img/quickstart/user-guide/03_adapters.png
deleted file mode 100644
index b8d5818b3..000000000
Binary files a/website-v2/static/img/quickstart/user-guide/03_adapters.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/user-guide/04_dashboard.png b/website-v2/static/img/quickstart/user-guide/04_dashboard.png
deleted file mode 100644
index 839a822ce..000000000
Binary files a/website-v2/static/img/quickstart/user-guide/04_dashboard.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/user-guide/05_data_explorer.png b/website-v2/static/img/quickstart/user-guide/05_data_explorer.png
deleted file mode 100644
index d0db1a898..000000000
Binary files a/website-v2/static/img/quickstart/user-guide/05_data_explorer.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/user-guide/06_notifications.png b/website-v2/static/img/quickstart/user-guide/06_notifications.png
deleted file mode 100644
index 0b3257060..000000000
Binary files a/website-v2/static/img/quickstart/user-guide/06_notifications.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/user-guide/07_water_level_trend_pipeline.png b/website-v2/static/img/quickstart/user-guide/07_water_level_trend_pipeline.png
deleted file mode 100644
index 1c282c02a..000000000
Binary files a/website-v2/static/img/quickstart/user-guide/07_water_level_trend_pipeline.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/user-guide/08_smart_machine_monitor_dashboard.png b/website-v2/static/img/quickstart/user-guide/08_smart_machine_monitor_dashboard.png
deleted file mode 100644
index 60ed6f521..000000000
Binary files a/website-v2/static/img/quickstart/user-guide/08_smart_machine_monitor_dashboard.png and /dev/null differ
diff --git a/website-v2/static/img/quickstart/user-guide/09_machine_running_data_view.png b/website-v2/static/img/quickstart/user-guide/09_machine_running_data_view.png
deleted file mode 100644
index aed944de1..000000000
Binary files a/website-v2/static/img/quickstart/user-guide/09_machine_running_data_view.png and /dev/null differ
diff --git a/website-v2/static/img/screenshots/connect-customize.png b/website-v2/static/img/screenshots/connect-customize.png
deleted file mode 100644
index ca0554428..000000000
Binary files a/website-v2/static/img/screenshots/connect-customize.png and /dev/null differ
diff --git a/website-v2/static/img/screenshots/live-dashboard.png b/website-v2/static/img/screenshots/live-dashboard.png
deleted file mode 100644
index 9691ec58b..000000000
Binary files a/website-v2/static/img/screenshots/live-dashboard.png and /dev/null differ
diff --git a/website-v2/static/img/screenshots/pipeline-customization.png b/website-v2/static/img/screenshots/pipeline-customization.png
deleted file mode 100644
index 0fe6db818..000000000
Binary files a/website-v2/static/img/screenshots/pipeline-customization.png and /dev/null differ
diff --git a/website-v2/static/img/screenshots/pipeline-details.png b/website-v2/static/img/screenshots/pipeline-details.png
deleted file mode 100644
index c8e440b91..000000000
Binary files a/website-v2/static/img/screenshots/pipeline-details.png and /dev/null differ
diff --git a/website-v2/static/img/screenshots/pipeline-editor-2.png b/website-v2/static/img/screenshots/pipeline-editor-2.png
deleted file mode 100644
index 4ad5ed3d6..000000000
Binary files a/website-v2/static/img/screenshots/pipeline-editor-2.png and /dev/null differ
diff --git a/website-v2/static/img/screenshots/pipeline-editor-sources.png b/website-v2/static/img/screenshots/pipeline-editor-sources.png
deleted file mode 100644
index 3b8a74bf2..000000000
Binary files a/website-v2/static/img/screenshots/pipeline-editor-sources.png and /dev/null differ
diff --git a/website-v2/static/img/screenshots/pipeline-editor.png b/website-v2/static/img/screenshots/pipeline-editor.png
deleted file mode 100644
index 58af18b74..000000000
Binary files a/website-v2/static/img/screenshots/pipeline-editor.png and /dev/null differ
diff --git a/website-v2/static/img/screenshots/pipeline-element-marketplace.png b/website-v2/static/img/screenshots/pipeline-element-marketplace.png
deleted file mode 100644
index 724cc1497..000000000
Binary files a/website-v2/static/img/screenshots/pipeline-element-marketplace.png and /dev/null differ
diff --git a/website-v2/static/img/screenshots/pipeline-overview.png b/website-v2/static/img/screenshots/pipeline-overview.png
deleted file mode 100644
index f4e6a5477..000000000
Binary files a/website-v2/static/img/screenshots/pipeline-overview.png and /dev/null differ
diff --git a/website-v2/static/img/screenshots/sp-connect.png b/website-v2/static/img/screenshots/sp-connect.png
deleted file mode 100644
index 92f87fec5..000000000
Binary files a/website-v2/static/img/screenshots/sp-connect.png and /dev/null differ
diff --git a/website-v2/static/img/slideshow/slideshow-config.png b/website-v2/static/img/slideshow/slideshow-config.png
deleted file mode 100644
index e12798cac..000000000
Binary files a/website-v2/static/img/slideshow/slideshow-config.png and /dev/null differ
diff --git a/website-v2/static/img/slideshow/slideshow-connect.png b/website-v2/static/img/slideshow/slideshow-connect.png
deleted file mode 100644
index 81499f674..000000000
Binary files a/website-v2/static/img/slideshow/slideshow-connect.png and /dev/null differ
diff --git a/website-v2/static/img/slideshow/slideshow-dashboard.png b/website-v2/static/img/slideshow/slideshow-dashboard.png
deleted file mode 100644
index 7e9919219..000000000
Binary files a/website-v2/static/img/slideshow/slideshow-dashboard.png and /dev/null differ
diff --git a/website-v2/static/img/slideshow/slideshow-home.png b/website-v2/static/img/slideshow/slideshow-home.png
deleted file mode 100644
index b564f8cbd..000000000
Binary files a/website-v2/static/img/slideshow/slideshow-home.png and /dev/null differ
diff --git a/website-v2/static/img/slideshow/slideshow-installation.png b/website-v2/static/img/slideshow/slideshow-installation.png
deleted file mode 100644
index d372b8178..000000000
Binary files a/website-v2/static/img/slideshow/slideshow-installation.png and /dev/null differ
diff --git a/website-v2/static/img/slideshow/slideshow-pipeline-view.png b/website-v2/static/img/slideshow/slideshow-pipeline-view.png
deleted file mode 100644
index 75bd01be4..000000000
Binary files a/website-v2/static/img/slideshow/slideshow-pipeline-view.png and /dev/null differ
diff --git a/website-v2/static/img/slideshow/slideshow-pipeline.png b/website-v2/static/img/slideshow/slideshow-pipeline.png
deleted file mode 100644
index 1aaa18351..000000000
Binary files a/website-v2/static/img/slideshow/slideshow-pipeline.png and /dev/null differ
diff --git a/website-v2/static/img/slideshow/slideshow-recommendation.png b/website-v2/static/img/slideshow/slideshow-recommendation.png
deleted file mode 100644
index 86e9f0210..000000000
Binary files a/website-v2/static/img/slideshow/slideshow-recommendation.png and /dev/null differ
diff --git a/website-v2/static/img/tutorial-processors/pe-overview-flink.PNG b/website-v2/static/img/tutorial-processors/pe-overview-flink.PNG
deleted file mode 100644
index 407f3822e..000000000
Binary files a/website-v2/static/img/tutorial-processors/pe-overview-flink.PNG and /dev/null differ
diff --git a/website-v2/static/img/tutorial-processors/pe-rdf-geofencing.PNG b/website-v2/static/img/tutorial-processors/pe-rdf-geofencing.PNG
deleted file mode 100644
index 0d94a7f8b..000000000
Binary files a/website-v2/static/img/tutorial-processors/pe-rdf-geofencing.PNG and /dev/null differ
diff --git a/website-v2/static/img/tutorial-processors/project-structure-processor.PNG b/website-v2/static/img/tutorial-processors/project-structure-processor.PNG
deleted file mode 100644
index 6380e0c8c..000000000
Binary files a/website-v2/static/img/tutorial-processors/project-structure-processor.PNG and /dev/null differ
diff --git a/website-v2/static/img/tutorial-sinks/project-structure-sinks.png b/website-v2/static/img/tutorial-sinks/project-structure-sinks.png
deleted file mode 100644
index 941246208..000000000
Binary files a/website-v2/static/img/tutorial-sinks/project-structure-sinks.png and /dev/null differ
diff --git a/website-v2/versioned_docs/version-0.95.1/user-guide-first-steps.md b/website-v2/versioned_docs/version-0.95.1/user-guide-first-steps.md
index e3c4b1a36..ca45313f7 100644
--- a/website-v2/versioned_docs/version-0.95.1/user-guide-first-steps.md
+++ b/website-v2/versioned_docs/version-0.95.1/user-guide-first-steps.md
@@ -14,8 +14,6 @@ Afterwards, this section contains two examples on how to create pipelines based
 ## Interactive Tutorial
 The easiest way to get started with StreamPipes is the interactive tutorial. Once you open the pipeline editor for the first time, you'll see a splash screen as shown below.
 Click **Start tour** to start the interactive tutorial, which will guide you through your first steps with StreamPipes.
- 
-![Interactive Tutorial](/img/quickstart/interactive-tutorial.png)  
 
 If the splash screen does not show up, make sure you've installed the following pipeline elements:
 * Flow rate (data stream)
diff --git a/website-v2/versioned_docs/version-0.95.1/user-guide-for-quickstart.md b/website-v2/versioned_docs/version-0.95.1/user-guide-for-quickstart.md
index ec4166a2f..ac772eb73 100644
--- a/website-v2/versioned_docs/version-0.95.1/user-guide-for-quickstart.md
+++ b/website-v2/versioned_docs/version-0.95.1/user-guide-for-quickstart.md
@@ -25,10 +25,6 @@ On the left, the navigation menu can be seen.
 You can either use the icons on the left side or click on the menu icon on the
 top left to open the details view of the navigation menu.
 
-<div class="my-carousel docs-carousel">
-    <img src="/img/quickstart/user-guide/01_home.png" alt="Home"/>
-</div>
-
 ## Connect
 The _Connect_ view provides an overview of all existing adapters to let StreamPipes connect data sources.
 
@@ -131,4 +127,3 @@ In Quickstart mode, StreamPipes have pre-defined several notification trigger in
 
 
 Congratulations! You've just finished Quickstart user guide of StreamPipes.
-
diff --git a/website-v2/versioned_docs/version-0.95.1/user-guide-tour.md b/website-v2/versioned_docs/version-0.95.1/user-guide-tour.md
deleted file mode 100644
index a6ae2f8ff..000000000
--- a/website-v2/versioned_docs/version-0.95.1/user-guide-tour.md
+++ /dev/null
@@ -1,305 +0,0 @@
----
-id: user-guide-tour
-title: Tour
-sidebar_label: Tour
----
-
-StreamPipes is a framework that enables domain experts to model and execute stream processing pipelines in a big data infrastructure.
-The graphical user interface of StreamPipes is a web application that provides an easy to use solution for domain experts.
-In this page, an overview of the many features of StreamPipes is given. We will tour through all features and explain what they do and how users can interact with them.
-
-First of all, a user needs to log in to the system.
-The credentials for the user are specified during the installation process.
-
-![StreamPipes Login](/img/features_0_62_0/login.png) 
-
-## Home
-After logging in, the user is redirected on to the home page.
-The home page gives an overview over the different features available in the StreamPipes UI.
-
-On the left, the navigation menu can be seen.
-You can either use the icons on the left side or click on the menu icon on the
-top left to open the details view of the navigation menu.
-
-On the top right, a link refers to the documentation and the logout button is present.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/home/home.png" alt="Home"/>
-    <img src="/img/features_0_62_0/home/open_menu.png" alt="Open Menu"/>
-</div>
-
-
-
-## Pipeline Editor
-The first feature we are going to explain is the Pipeline Editor.
-This is one of the central features of StreamPipes, since graphical modeling of pipelines takes place in this view.
-
-On the top we can see four tabs: __Data Sets__, __Data Streams__, __Processing Elements__, and __Data Sinks__.
-Each tab contains multiple pipeline elements, which can be installed at runtime.
-The installation of pipeline elements is explained later in section [Install Pipeline Elements](user-guide-tour.md#install-pipeline-elements).
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/2_PipelineEditor_DataStreams.png" alt="Data Streams"/>
-    <img src="/img/features_0_62_0/editor/3_PipelineEditor_DataProcessors.png" alt="Processing Elements"/>
-    <img src="/img/features_0_62_0/editor/4_PipelineEditor_DataSinks.png" alt="Data Sinks"/>
-    <img src="/img/features_0_62_0/editor/1_PipelineEditor_DataSets.png" alt="Data Sets"/>
-</div>
-
-There are multiple ways to search for a pipeline element. 
-The easiest way is to enter a search term in the search field on the top left corner.
-The system filters the elements according to the search term and only presents the relevant ones.
-Another way is to select one of the categories from the drop down menu.
-The system then filters the elements according to the selected category.
-The category of an element is defined by its functionality.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/5_text_filter.png" alt="Text Filter"/>
-    <img src="/img/features_0_62_0/editor/6_category_drop_down.png" alt="Category Drop Down"/>
-    <img src="/img/features_0_62_0/editor/7_category_filter.png" alt="Category Filter"/>
-</div>
-
-Modelling of a pipeline starts with choosing one ore more data sources. Therefore a data stream or data set must be selected
-and moved into the editor via drag and drop.
-After adding a data stream, we can select a processing element to transform the events of the data stream.
-This is done again by dragging the processing element icon into our editor.
-The mouse can be used to connect the two elements.
-It is automatically checked in the background if the two elements are semantically compatible.
-If this check is successful, a configuration menu is shown. It contains the parameters that can be modified by the
-user. For all parameters, a description is provided and the system also prevents the user from entering parameters that
-are not correct, according to the semantic description of the element.
-It is also ensured that all required parameters are provided by the user, otherwise an error message is displayed.
-
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/8_connect_elements.png" alt="Connect Elements"/>
-    <img src="/img/features_0_62_0/editor/9_configure_element.png" alt="Configure Elements"/>
-</div>
-
-When the user tries to connect two elements that are not compatible, the system shows a __connection error__ message.
-The example illustrated below shows such a case. The user tried to connect a text filter to a light sensor.
-This is not possible since the text filter processing element requires at least one event property of type string, which is not provided by the light sensor.
-
-![Connection Error](/img/features_0_62_0/editor/10_connection_error.png) 
-
-To further improve the usability, multiple ways are available to connect new elements besides the drag and drop option.
-Each processing element has multiple short-cut buttons to connect it with another element.
-The first one (eye icon) can be used to get a suggestion of all elements that are compatible with the current element.
-The second one (plus icon) gives a recommendation on the elements the user might want to connect, based on the usage of the component in
-other pipelines.
-There is also a button (question tag icon) to open the documentation of a selected element.
-Elements can be deleted by clicking the 'delete' button.
-Each element can also be re-configured at a later point in time using the configuration button.
-There is one important aspect about re-configuration of pipeline elements you need to be aware of: Only elements that are not yet connected to another element can be modified.
-The reason for this behaviour is that some of the following elements might rely on the configuration of previous elements.
-This way it is ensured that the user can not change the behaviour of the pipeline by accident.
- 
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/11_shortcut_buttons.png" alt="Shortcut Buttons"/>
-    <img src="/img/features_0_62_0/editor/12_compatible_elements.png" alt="Compatible Elements"/>
-    <img src="/img/features_0_62_0/editor/13_recommend_elements.png" alt="Recommended elements"/>
-</div>
-
-
-After the pipeline is completely modelled, the editor looks similar to the first image below.
-Especially for larger pipelines, the auto layout button in the editor menu might be helpful.
-With this button, the pipeline will be beautifully aligned in the editor, helping users to get a better overview of the complete pipeline.
-On the top left corner of the editor, the 'save' button can be found.
-After the modelling of the pipeline is done, use this button to save and execute the pipeline.
-A save dialogue pops up when clicking the save button. 
-The pipeline title must be entered and an additional description can be provided.
-It is recommended to always provide a description, because it makes it easier for other users to understand the meaning of the pipeline.
-In the save menu, the user can either just store the pipeline configuration or store it and immediately start the pipeline.
-Once the pipeline is executed, the user is redirected to the _Manage Pipeline_ view.
-In this view, the user gets immediate feedback whether all components did start correctly and the pipeline is up and running.
-This view also shows that individual elements might run in different environments on different servers.
-If there is an error during the execution, a notification containing a (hopefully) detailed error description is provided in this view.
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/14_save_adjust.png" alt="Save adjust delete"/>
-    <img src="/img/features_0_62_0/editor/15_save_dialogue.png" alt="Complete pipeline"/>
-    <img src="/img/features_0_62_0/editor/16_pipeline_sucessfully_started.png" alt="Pipeline sucessfully started"/>
-</div>
-
-## Connect new Data Sources
-With StreamPipes Connect it is possible to connect new data sources in StreamPipes with just a few clicks.
-Therefore, we provide a marketplace with a lot of different adapters that can be configured and executed to create new __Data Streams__ in the __Pipeline Editor__.
-With StreamPipes Connect it is possible to connect specific data sources - e.g. an adapter streaming the current location of the ISS (International Space Station).
-It is also possible to connect generic sources like message brokers or databases.
-If the event schema of the data source is unknown, the system tries to infer the schema by extracting some sample data and analysing it.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/connect/new/01_connect.png" alt="Market Place"/>
-    <img src="/img/features_0_62_0/connect/new/02_mqtt_adapter.png" alt="MQTT adapter"/>
-    <img src="/img/features_0_62_0/connect/new/03_configure_mqtt.png" alt="Configure MQTT adpater"/>
-    <img src="/img/features_0_62_0/connect/new/04_configure_format.png" alt="Guess event schema"/>
-    <img src="/img/features_0_62_0/connect/new/05_guess_schema.png" alt="Guess event schema"/>
-    <img src="/img/features_0_62_0/connect/new/06_edit_adapter.png" alt="Edit adapter"/>
-    <img src="/img/features_0_62_0/connect/new/07_start_adapter.png" alt="Start adapter"/>
-    <img src="/img/features_0_62_0/connect/new/08_data_stream_in_editor.png" alt="New data stram in pipeline editor"/>
-</div>
-
-Additionally to connecting new sources, data can be cleaned, transformed, and enriched with meta-information.
-Therefore, the event schema can be changed or enriched in step 3 (Define Event Schema).
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/connect/edit/01_edit_timestamp.png" alt="Edit a property to timestamp"/>
-    <img src="/img/features_0_62_0/connect/edit/02_change_unit.png" alt="Change Unit of property"/>
-    <img src="/img/features_0_62_0/connect/edit/03_change_unit.png" alt="Change Unit of property"/>
-</div>
-
-## Manage Pipelines
-The _Manage Pipelines_ view provides an overview of all existing pipelines.
-Existing pipelines can be managed using this view.
-For instance, users can start and stop pipelines or delete them when they are not longer needed.
-Pipeline actions can be performed by clicking one of the buttons next to each pipeline.
-For each pipeline, the title and description is displayed in the table.
-By clicking the edit symbol an overview of the created pipline is shown. In this window you are able to analyze statistics, identify errors or edit the pipeline.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/manage_pipelines/1_pipeline_overview.png" alt="Pipeline Overview"/>
-    <img src="/img/features_0_62_0/manage_pipelines/2_pipeline_information.png" alt="Pipeline infomation"/>
-    <img src="/img/features_0_62_0/manage_pipelines/3_delete_pipeline.png" alt="Delete Pipelines"/>
-    <img src="/img/features_0_62_0/manage_pipelines/4_pipeline_deleted.png" alt="Delete Pipelines"/>
-</div>
-
-In a setting with many defined pipelines, it can get really hard to keep track of all pipelines.
-This is why we introduce categories.
-A category is a set of pipelines that can be defined by users in order to better organize pipelines.
-By clicking on the "Manage Categories" button on the top left, a new category can be added to StreamPipes.
-In this example, we create a new category named "New Demo Category".
-After saving a category, pipelines can be added to the newly created category.
-The new category is then presented as a tab in the _Pipeline Management_ view.
-This tab contains all previously defined pipelines.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/manage_pipelines/5_pipeline_category.png" alt="Pipeline Category"/>
-    <img src="/img/features_0_62_0/manage_pipelines/6_add_category.png" alt="Add Pipeline Category"/>
-    <img src="/img/features_0_62_0/manage_pipelines/7_new_category.png" alt="New Category"/>
-    <img src="/img/features_0_62_0/manage_pipelines/8_show_new_category.png" alt="Show new Category"/>
-</div>
-
-## Live Dashboard
-The live dashboard can be used for multiple use cases.
-It is a good way to live monitor a running system in a dashboard, but it can also be used during the pipeline development to get a fast feedback from newly created pipelines.
-Below is a screenshot of an example dashboard showing the current value of pressure, which further shows a line chart and a trafficlight for a water level pipeline.
-All pipelines that contain the "Dashboard Sink" can be visualized in this view.
-To add a new visualisation, click on the "Add visualisation" button on the top left corner.
-Afterwards, a three-step configuration menu is shown.
-The first step is to select the pipeline that should be visualized.
-In the second step, the type of visualization can be defined.
-Currently 10 different types are available, including line charts, various map visualizations and data tables.
-After selecting the type (in our example "Gauge"), you can select the specific measurement values of the data stream that should be displayed.
-In the example below, the water level value should be monitored and the gauge value should range from 0 to 100.
-Once all steps are completed, the new visualization is placed on the dashboard and live data is presented as soon as it becomes available.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/dashboard/01_dashboard.png" alt="Screenshot of live dashboard"/>
-    <img src="/img/features_0_62_0/dashboard/02_new_visualisation.png" alt="Select Pipeline to visualize"/>
-    <img src="/img/features_0_62_0/dashboard/03_select_gauge.png" alt="Select Visualization Type"/>
-    <img src="/img/features_0_62_0/dashboard/04_configure_gauge.png" alt="Configure  Visualzation"/>
-    <img src="/img/features_0_62_0/dashboard/05_new_gauge_done.png" alt="Show new Visualzation"/>
-</div>
-
-## File Download
-With the file download,  it is possible to download stored files directly from Elasticsearch.
-This can be very useful for example when a data dumb is needed for a specific time range.
-All data that is written into Elasticsearch using the _Elasticsearch Sink_ can be accessed by the file downloader.
-A common use case is to download data for offline analysis and to train a machine learning algorithm.
-First, an index must be defined, afterwards, the time range must be set.
-A date picker helps users to enter the time range.
-When a user clicks the "Create File" button the file is created.
-All files stored on the server can be downloaded via the download button.
-If the files are not longer needed, they can be deleted by clicking the delete button.
-This will remove the file from the server.
-Since data is stored in Elasticsearch anyways. it is recommended not to store the files for a longer period of time on the server.
-When a file is needed again at a later point in time it is easy to create it again. 
-This way a lot of disk space on the server can be saved, especially when the files are rather large.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/file_download/01_file_download.png" alt="File Download"/>
-    <img src="/img/features_0_62_0/file_download/02_file_download.png" alt="File Download with selected time range"/>
-    <img src="/img/features_0_62_0/file_download/03_file_download.png" alt="File Download with new File"/>
-</div>
-
-## Notifications
-Notifications are a good solution to notify someone when a urgent situation occurs.
-A notification can be created by using the notification sink in the pipeline editor.
-When using such a sink a configuration dialogue is presented to the user.
-In this dialogue the user must provide enough information to resolve the solution when it occurs.
-The message can be nicely configured in the message editor.
-It is also possible to embed values of the event that triggered the notification.
-This can be done with the #property# notation.
-All available properties are presented in the notification configurator.
-When the notification is triggered the #property# template is replaced with the actual value of the property.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/notification/01_select_notification_sink.png" alt="Select Notification"/>
-    <img src="/img/features_0_62_0/notification/02_configure_notification.png" alt="Configure Notification"/>
-</div>
-
-A pop up icon on the notification tab in the menu shows the user how many unread notifications currently are in the system.
-This icon also alerts users when new notifications occur.
-In the notification overview all notifications are listed.
-On the top are the new notifications that are not read yet.
-A user can mark them as read by clicking on the little envelope icon.
-Those notifications are then no longer in the unread section, but they remain in the "All Messages" view.
-This way it is possible to keep track of all notifications and have a look at them at a later point in time.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/notification/03_new_notification.png" alt="New Notification"/>
-</div>
-
-
-## Install Pipeline Elements
-StreamPipes is highly configurable and extensible.
-Pipeline elements can be added and removed during runtime.
-This can be done in the "Install Pipeline Elements" view.
-All available pipeline elements are shown here and can be selected to install or uninstall.
-It is also possible to select multiple or all of them and then install them all together.
-When a new element is installed by the user it is automatically available in the "Pipeline Editor" and can be used for pipelines.
-Elements that are uninstalled are removed from the system. 
-They can not longer be used within pipelines.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/install_elements/01_install_elements.png" alt="Install Elements View"/>
-    <img src="/img/features_0_62_0/install_elements/02_install_countAggregation.png" alt="Insall new Element"/>
-    <img src="/img/features_0_62_0/install_elements/03_installed_countAggregation.png" alt="Installation Successful"/>
-    <img src="/img/features_0_62_0/install_elements/04_countAggregation_in_editor.png" alt="Show new installed element"/>
-</div>
-
-
-## My Elements
-The "My Elements" view gives a quick overview over all installed pipeline elements.
-Here they can be inspected and the description can be re-imported.
-In this view it is also possible to have a look at the JSON-LD representation of each element.
-This is not important for a user, but it is worth noting that the system uses this machine understandable format to support the user.
-For example all the information of the sources, like data schema or unit information is in the JSON-LD meta data.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/my_elements/01_my_elements.png" alt="My Elements Overview"/>
-    <img src="/img/features_0_62_0/my_elements/02_my_elements_jsonid.png" alt="View JSON-LD"/>
-</div>
-
-## Configuration
-The last feature is the _configuration view_.
-Here, it is possible to change the configuration parameters of installed components.
-All components containing processing elements automatically register in StreamPipes when they are started in the same network as the backend component.
-Once a container is registered it is represented in the configuration view.
-The green dot on the top left indicates that tha container is running properly.
-When there is a problem with a container the green dot changes to red and the user knows there is a problem.
-To configure the parameters the top right arrow of a configuration box must be clicked.
-Then the configuration menu pops up. 
-Within there it is possible to change the parameters of a service.
-To make the changes persistent the "Update" button must be clicked.
-A user should keep in mind that sometimes it is necessary to restart a container when the parameters are changed.
-Sometimes it is also necessary to re-import the pipeline element description, either by uninstalling and re-installing them after the container restart or be reloading the description in the "My elements" view.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/configuration/01_configuration_overview.png" alt="Configuration Overview"/>
-    <img src="/img/features_0_62_0/configuration/02_change_config.png" alt="Change Configuration"/>
-</div>
-
-
-Congratulations! You've just finished your first tour of StreamPipes.
-Although there's still more to learn, we introduced most of the currently available features.
-On the next page, the different processing elements that come with the installation are explained.
diff --git a/website-v2/versioned_docs/version-0.97.0/user-guide-first-steps.md b/website-v2/versioned_docs/version-0.97.0/user-guide-first-steps.md
index e3c4b1a36..ca45313f7 100644
--- a/website-v2/versioned_docs/version-0.97.0/user-guide-first-steps.md
+++ b/website-v2/versioned_docs/version-0.97.0/user-guide-first-steps.md
@@ -14,8 +14,6 @@ Afterwards, this section contains two examples on how to create pipelines based
 ## Interactive Tutorial
 The easiest way to get started with StreamPipes is the interactive tutorial. Once you open the pipeline editor for the first time, you'll see a splash screen as shown below.
 Click **Start tour** to start the interactive tutorial, which will guide you through your first steps with StreamPipes.
- 
-![Interactive Tutorial](/img/quickstart/interactive-tutorial.png)  
 
 If the splash screen does not show up, make sure you've installed the following pipeline elements:
 * Flow rate (data stream)
diff --git a/website-v2/versioned_docs/version-0.97.0/user-guide-tour.md b/website-v2/versioned_docs/version-0.97.0/user-guide-tour.md
deleted file mode 100644
index a6ae2f8ff..000000000
--- a/website-v2/versioned_docs/version-0.97.0/user-guide-tour.md
+++ /dev/null
@@ -1,305 +0,0 @@
----
-id: user-guide-tour
-title: Tour
-sidebar_label: Tour
----
-
-StreamPipes is a framework that enables domain experts to model and execute stream processing pipelines in a big data infrastructure.
-The graphical user interface of StreamPipes is a web application that provides an easy to use solution for domain experts.
-In this page, an overview of the many features of StreamPipes is given. We will tour through all features and explain what they do and how users can interact with them.
-
-First of all, a user needs to log in to the system.
-The credentials for the user are specified during the installation process.
-
-![StreamPipes Login](/img/features_0_62_0/login.png) 
-
-## Home
-After logging in, the user is redirected on to the home page.
-The home page gives an overview over the different features available in the StreamPipes UI.
-
-On the left, the navigation menu can be seen.
-You can either use the icons on the left side or click on the menu icon on the
-top left to open the details view of the navigation menu.
-
-On the top right, a link refers to the documentation and the logout button is present.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/home/home.png" alt="Home"/>
-    <img src="/img/features_0_62_0/home/open_menu.png" alt="Open Menu"/>
-</div>
-
-
-
-## Pipeline Editor
-The first feature we are going to explain is the Pipeline Editor.
-This is one of the central features of StreamPipes, since graphical modeling of pipelines takes place in this view.
-
-On the top we can see four tabs: __Data Sets__, __Data Streams__, __Processing Elements__, and __Data Sinks__.
-Each tab contains multiple pipeline elements, which can be installed at runtime.
-The installation of pipeline elements is explained later in section [Install Pipeline Elements](user-guide-tour.md#install-pipeline-elements).
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/2_PipelineEditor_DataStreams.png" alt="Data Streams"/>
-    <img src="/img/features_0_62_0/editor/3_PipelineEditor_DataProcessors.png" alt="Processing Elements"/>
-    <img src="/img/features_0_62_0/editor/4_PipelineEditor_DataSinks.png" alt="Data Sinks"/>
-    <img src="/img/features_0_62_0/editor/1_PipelineEditor_DataSets.png" alt="Data Sets"/>
-</div>
-
-There are multiple ways to search for a pipeline element. 
-The easiest way is to enter a search term in the search field on the top left corner.
-The system filters the elements according to the search term and only presents the relevant ones.
-Another way is to select one of the categories from the drop down menu.
-The system then filters the elements according to the selected category.
-The category of an element is defined by its functionality.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/5_text_filter.png" alt="Text Filter"/>
-    <img src="/img/features_0_62_0/editor/6_category_drop_down.png" alt="Category Drop Down"/>
-    <img src="/img/features_0_62_0/editor/7_category_filter.png" alt="Category Filter"/>
-</div>
-
-Modelling of a pipeline starts with choosing one ore more data sources. Therefore a data stream or data set must be selected
-and moved into the editor via drag and drop.
-After adding a data stream, we can select a processing element to transform the events of the data stream.
-This is done again by dragging the processing element icon into our editor.
-The mouse can be used to connect the two elements.
-It is automatically checked in the background if the two elements are semantically compatible.
-If this check is successful, a configuration menu is shown. It contains the parameters that can be modified by the
-user. For all parameters, a description is provided and the system also prevents the user from entering parameters that
-are not correct, according to the semantic description of the element.
-It is also ensured that all required parameters are provided by the user, otherwise an error message is displayed.
-
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/8_connect_elements.png" alt="Connect Elements"/>
-    <img src="/img/features_0_62_0/editor/9_configure_element.png" alt="Configure Elements"/>
-</div>
-
-When the user tries to connect two elements that are not compatible, the system shows a __connection error__ message.
-The example illustrated below shows such a case. The user tried to connect a text filter to a light sensor.
-This is not possible since the text filter processing element requires at least one event property of type string, which is not provided by the light sensor.
-
-![Connection Error](/img/features_0_62_0/editor/10_connection_error.png) 
-
-To further improve the usability, multiple ways are available to connect new elements besides the drag and drop option.
-Each processing element has multiple short-cut buttons to connect it with another element.
-The first one (eye icon) can be used to get a suggestion of all elements that are compatible with the current element.
-The second one (plus icon) gives a recommendation on the elements the user might want to connect, based on the usage of the component in
-other pipelines.
-There is also a button (question tag icon) to open the documentation of a selected element.
-Elements can be deleted by clicking the 'delete' button.
-Each element can also be re-configured at a later point in time using the configuration button.
-There is one important aspect about re-configuration of pipeline elements you need to be aware of: Only elements that are not yet connected to another element can be modified.
-The reason for this behaviour is that some of the following elements might rely on the configuration of previous elements.
-This way it is ensured that the user can not change the behaviour of the pipeline by accident.
- 
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/11_shortcut_buttons.png" alt="Shortcut Buttons"/>
-    <img src="/img/features_0_62_0/editor/12_compatible_elements.png" alt="Compatible Elements"/>
-    <img src="/img/features_0_62_0/editor/13_recommend_elements.png" alt="Recommended elements"/>
-</div>
-
-
-After the pipeline is completely modelled, the editor looks similar to the first image below.
-Especially for larger pipelines, the auto layout button in the editor menu might be helpful.
-With this button, the pipeline will be beautifully aligned in the editor, helping users to get a better overview of the complete pipeline.
-On the top left corner of the editor, the 'save' button can be found.
-After the modelling of the pipeline is done, use this button to save and execute the pipeline.
-A save dialogue pops up when clicking the save button. 
-The pipeline title must be entered and an additional description can be provided.
-It is recommended to always provide a description, because it makes it easier for other users to understand the meaning of the pipeline.
-In the save menu, the user can either just store the pipeline configuration or store it and immediately start the pipeline.
-Once the pipeline is executed, the user is redirected to the _Manage Pipeline_ view.
-In this view, the user gets immediate feedback whether all components did start correctly and the pipeline is up and running.
-This view also shows that individual elements might run in different environments on different servers.
-If there is an error during the execution, a notification containing a (hopefully) detailed error description is provided in this view.
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/14_save_adjust.png" alt="Save adjust delete"/>
-    <img src="/img/features_0_62_0/editor/15_save_dialogue.png" alt="Complete pipeline"/>
-    <img src="/img/features_0_62_0/editor/16_pipeline_sucessfully_started.png" alt="Pipeline sucessfully started"/>
-</div>
-
-## Connect new Data Sources
-With StreamPipes Connect it is possible to connect new data sources in StreamPipes with just a few clicks.
-Therefore, we provide a marketplace with a lot of different adapters that can be configured and executed to create new __Data Streams__ in the __Pipeline Editor__.
-With StreamPipes Connect it is possible to connect specific data sources - e.g. an adapter streaming the current location of the ISS (International Space Station).
-It is also possible to connect generic sources like message brokers or databases.
-If the event schema of the data source is unknown, the system tries to infer the schema by extracting some sample data and analysing it.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/connect/new/01_connect.png" alt="Market Place"/>
-    <img src="/img/features_0_62_0/connect/new/02_mqtt_adapter.png" alt="MQTT adapter"/>
-    <img src="/img/features_0_62_0/connect/new/03_configure_mqtt.png" alt="Configure MQTT adpater"/>
-    <img src="/img/features_0_62_0/connect/new/04_configure_format.png" alt="Guess event schema"/>
-    <img src="/img/features_0_62_0/connect/new/05_guess_schema.png" alt="Guess event schema"/>
-    <img src="/img/features_0_62_0/connect/new/06_edit_adapter.png" alt="Edit adapter"/>
-    <img src="/img/features_0_62_0/connect/new/07_start_adapter.png" alt="Start adapter"/>
-    <img src="/img/features_0_62_0/connect/new/08_data_stream_in_editor.png" alt="New data stram in pipeline editor"/>
-</div>
-
-Additionally to connecting new sources, data can be cleaned, transformed, and enriched with meta-information.
-Therefore, the event schema can be changed or enriched in step 3 (Define Event Schema).
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/connect/edit/01_edit_timestamp.png" alt="Edit a property to timestamp"/>
-    <img src="/img/features_0_62_0/connect/edit/02_change_unit.png" alt="Change Unit of property"/>
-    <img src="/img/features_0_62_0/connect/edit/03_change_unit.png" alt="Change Unit of property"/>
-</div>
-
-## Manage Pipelines
-The _Manage Pipelines_ view provides an overview of all existing pipelines.
-Existing pipelines can be managed using this view.
-For instance, users can start and stop pipelines or delete them when they are not longer needed.
-Pipeline actions can be performed by clicking one of the buttons next to each pipeline.
-For each pipeline, the title and description is displayed in the table.
-By clicking the edit symbol an overview of the created pipline is shown. In this window you are able to analyze statistics, identify errors or edit the pipeline.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/manage_pipelines/1_pipeline_overview.png" alt="Pipeline Overview"/>
-    <img src="/img/features_0_62_0/manage_pipelines/2_pipeline_information.png" alt="Pipeline infomation"/>
-    <img src="/img/features_0_62_0/manage_pipelines/3_delete_pipeline.png" alt="Delete Pipelines"/>
-    <img src="/img/features_0_62_0/manage_pipelines/4_pipeline_deleted.png" alt="Delete Pipelines"/>
-</div>
-
-In a setting with many defined pipelines, it can get really hard to keep track of all pipelines.
-This is why we introduce categories.
-A category is a set of pipelines that can be defined by users in order to better organize pipelines.
-By clicking on the "Manage Categories" button on the top left, a new category can be added to StreamPipes.
-In this example, we create a new category named "New Demo Category".
-After saving a category, pipelines can be added to the newly created category.
-The new category is then presented as a tab in the _Pipeline Management_ view.
-This tab contains all previously defined pipelines.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/manage_pipelines/5_pipeline_category.png" alt="Pipeline Category"/>
-    <img src="/img/features_0_62_0/manage_pipelines/6_add_category.png" alt="Add Pipeline Category"/>
-    <img src="/img/features_0_62_0/manage_pipelines/7_new_category.png" alt="New Category"/>
-    <img src="/img/features_0_62_0/manage_pipelines/8_show_new_category.png" alt="Show new Category"/>
-</div>
-
-## Live Dashboard
-The live dashboard can be used for multiple use cases.
-It is a good way to live monitor a running system in a dashboard, but it can also be used during the pipeline development to get a fast feedback from newly created pipelines.
-Below is a screenshot of an example dashboard showing the current value of pressure, which further shows a line chart and a trafficlight for a water level pipeline.
-All pipelines that contain the "Dashboard Sink" can be visualized in this view.
-To add a new visualisation, click on the "Add visualisation" button on the top left corner.
-Afterwards, a three-step configuration menu is shown.
-The first step is to select the pipeline that should be visualized.
-In the second step, the type of visualization can be defined.
-Currently 10 different types are available, including line charts, various map visualizations and data tables.
-After selecting the type (in our example "Gauge"), you can select the specific measurement values of the data stream that should be displayed.
-In the example below, the water level value should be monitored and the gauge value should range from 0 to 100.
-Once all steps are completed, the new visualization is placed on the dashboard and live data is presented as soon as it becomes available.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/dashboard/01_dashboard.png" alt="Screenshot of live dashboard"/>
-    <img src="/img/features_0_62_0/dashboard/02_new_visualisation.png" alt="Select Pipeline to visualize"/>
-    <img src="/img/features_0_62_0/dashboard/03_select_gauge.png" alt="Select Visualization Type"/>
-    <img src="/img/features_0_62_0/dashboard/04_configure_gauge.png" alt="Configure  Visualzation"/>
-    <img src="/img/features_0_62_0/dashboard/05_new_gauge_done.png" alt="Show new Visualzation"/>
-</div>
-
-## File Download
-With the file download,  it is possible to download stored files directly from Elasticsearch.
-This can be very useful for example when a data dumb is needed for a specific time range.
-All data that is written into Elasticsearch using the _Elasticsearch Sink_ can be accessed by the file downloader.
-A common use case is to download data for offline analysis and to train a machine learning algorithm.
-First, an index must be defined, afterwards, the time range must be set.
-A date picker helps users to enter the time range.
-When a user clicks the "Create File" button the file is created.
-All files stored on the server can be downloaded via the download button.
-If the files are not longer needed, they can be deleted by clicking the delete button.
-This will remove the file from the server.
-Since data is stored in Elasticsearch anyways. it is recommended not to store the files for a longer period of time on the server.
-When a file is needed again at a later point in time it is easy to create it again. 
-This way a lot of disk space on the server can be saved, especially when the files are rather large.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/file_download/01_file_download.png" alt="File Download"/>
-    <img src="/img/features_0_62_0/file_download/02_file_download.png" alt="File Download with selected time range"/>
-    <img src="/img/features_0_62_0/file_download/03_file_download.png" alt="File Download with new File"/>
-</div>
-
-## Notifications
-Notifications are a good solution to notify someone when a urgent situation occurs.
-A notification can be created by using the notification sink in the pipeline editor.
-When using such a sink a configuration dialogue is presented to the user.
-In this dialogue the user must provide enough information to resolve the solution when it occurs.
-The message can be nicely configured in the message editor.
-It is also possible to embed values of the event that triggered the notification.
-This can be done with the #property# notation.
-All available properties are presented in the notification configurator.
-When the notification is triggered the #property# template is replaced with the actual value of the property.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/notification/01_select_notification_sink.png" alt="Select Notification"/>
-    <img src="/img/features_0_62_0/notification/02_configure_notification.png" alt="Configure Notification"/>
-</div>
-
-A pop up icon on the notification tab in the menu shows the user how many unread notifications currently are in the system.
-This icon also alerts users when new notifications occur.
-In the notification overview all notifications are listed.
-On the top are the new notifications that are not read yet.
-A user can mark them as read by clicking on the little envelope icon.
-Those notifications are then no longer in the unread section, but they remain in the "All Messages" view.
-This way it is possible to keep track of all notifications and have a look at them at a later point in time.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/notification/03_new_notification.png" alt="New Notification"/>
-</div>
-
-
-## Install Pipeline Elements
-StreamPipes is highly configurable and extensible.
-Pipeline elements can be added and removed during runtime.
-This can be done in the "Install Pipeline Elements" view.
-All available pipeline elements are shown here and can be selected to install or uninstall.
-It is also possible to select multiple or all of them and then install them all together.
-When a new element is installed by the user it is automatically available in the "Pipeline Editor" and can be used for pipelines.
-Elements that are uninstalled are removed from the system. 
-They can not longer be used within pipelines.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/install_elements/01_install_elements.png" alt="Install Elements View"/>
-    <img src="/img/features_0_62_0/install_elements/02_install_countAggregation.png" alt="Insall new Element"/>
-    <img src="/img/features_0_62_0/install_elements/03_installed_countAggregation.png" alt="Installation Successful"/>
-    <img src="/img/features_0_62_0/install_elements/04_countAggregation_in_editor.png" alt="Show new installed element"/>
-</div>
-
-
-## My Elements
-The "My Elements" view gives a quick overview over all installed pipeline elements.
-Here they can be inspected and the description can be re-imported.
-In this view it is also possible to have a look at the JSON-LD representation of each element.
-This is not important for a user, but it is worth noting that the system uses this machine understandable format to support the user.
-For example all the information of the sources, like data schema or unit information is in the JSON-LD meta data.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/my_elements/01_my_elements.png" alt="My Elements Overview"/>
-    <img src="/img/features_0_62_0/my_elements/02_my_elements_jsonid.png" alt="View JSON-LD"/>
-</div>
-
-## Configuration
-The last feature is the _configuration view_.
-Here, it is possible to change the configuration parameters of installed components.
-All components containing processing elements automatically register in StreamPipes when they are started in the same network as the backend component.
-Once a container is registered it is represented in the configuration view.
-The green dot on the top left indicates that tha container is running properly.
-When there is a problem with a container the green dot changes to red and the user knows there is a problem.
-To configure the parameters the top right arrow of a configuration box must be clicked.
-Then the configuration menu pops up. 
-Within there it is possible to change the parameters of a service.
-To make the changes persistent the "Update" button must be clicked.
-A user should keep in mind that sometimes it is necessary to restart a container when the parameters are changed.
-Sometimes it is also necessary to re-import the pipeline element description, either by uninstalling and re-installing them after the container restart or be reloading the description in the "My elements" view.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/configuration/01_configuration_overview.png" alt="Configuration Overview"/>
-    <img src="/img/features_0_62_0/configuration/02_change_config.png" alt="Change Configuration"/>
-</div>
-
-
-Congratulations! You've just finished your first tour of StreamPipes.
-Although there's still more to learn, we introduced most of the currently available features.
-On the next page, the different processing elements that come with the installation are explained.
diff --git a/website-v2/versioned_docs/version-0.98.0/user-guide-first-steps.md b/website-v2/versioned_docs/version-0.98.0/user-guide-first-steps.md
index e3c4b1a36..ca45313f7 100644
--- a/website-v2/versioned_docs/version-0.98.0/user-guide-first-steps.md
+++ b/website-v2/versioned_docs/version-0.98.0/user-guide-first-steps.md
@@ -14,8 +14,6 @@ Afterwards, this section contains two examples on how to create pipelines based
 ## Interactive Tutorial
 The easiest way to get started with StreamPipes is the interactive tutorial. Once you open the pipeline editor for the first time, you'll see a splash screen as shown below.
 Click **Start tour** to start the interactive tutorial, which will guide you through your first steps with StreamPipes.
- 
-![Interactive Tutorial](/img/quickstart/interactive-tutorial.png)  
 
 If the splash screen does not show up, make sure you've installed the following pipeline elements:
 * Flow rate (data stream)
diff --git a/website-v2/versioned_docs/version-0.98.0/user-guide-tour.md b/website-v2/versioned_docs/version-0.98.0/user-guide-tour.md
deleted file mode 100644
index a6ae2f8ff..000000000
--- a/website-v2/versioned_docs/version-0.98.0/user-guide-tour.md
+++ /dev/null
@@ -1,305 +0,0 @@
----
-id: user-guide-tour
-title: Tour
-sidebar_label: Tour
----
-
-StreamPipes is a framework that enables domain experts to model and execute stream processing pipelines in a big data infrastructure.
-The graphical user interface of StreamPipes is a web application that provides an easy to use solution for domain experts.
-In this page, an overview of the many features of StreamPipes is given. We will tour through all features and explain what they do and how users can interact with them.
-
-First of all, a user needs to log in to the system.
-The credentials for the user are specified during the installation process.
-
-![StreamPipes Login](/img/features_0_62_0/login.png) 
-
-## Home
-After logging in, the user is redirected on to the home page.
-The home page gives an overview over the different features available in the StreamPipes UI.
-
-On the left, the navigation menu can be seen.
-You can either use the icons on the left side or click on the menu icon on the
-top left to open the details view of the navigation menu.
-
-On the top right, a link refers to the documentation and the logout button is present.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/home/home.png" alt="Home"/>
-    <img src="/img/features_0_62_0/home/open_menu.png" alt="Open Menu"/>
-</div>
-
-
-
-## Pipeline Editor
-The first feature we are going to explain is the Pipeline Editor.
-This is one of the central features of StreamPipes, since graphical modeling of pipelines takes place in this view.
-
-On the top we can see four tabs: __Data Sets__, __Data Streams__, __Processing Elements__, and __Data Sinks__.
-Each tab contains multiple pipeline elements, which can be installed at runtime.
-The installation of pipeline elements is explained later in section [Install Pipeline Elements](user-guide-tour.md#install-pipeline-elements).
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/2_PipelineEditor_DataStreams.png" alt="Data Streams"/>
-    <img src="/img/features_0_62_0/editor/3_PipelineEditor_DataProcessors.png" alt="Processing Elements"/>
-    <img src="/img/features_0_62_0/editor/4_PipelineEditor_DataSinks.png" alt="Data Sinks"/>
-    <img src="/img/features_0_62_0/editor/1_PipelineEditor_DataSets.png" alt="Data Sets"/>
-</div>
-
-There are multiple ways to search for a pipeline element. 
-The easiest way is to enter a search term in the search field on the top left corner.
-The system filters the elements according to the search term and only presents the relevant ones.
-Another way is to select one of the categories from the drop down menu.
-The system then filters the elements according to the selected category.
-The category of an element is defined by its functionality.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/5_text_filter.png" alt="Text Filter"/>
-    <img src="/img/features_0_62_0/editor/6_category_drop_down.png" alt="Category Drop Down"/>
-    <img src="/img/features_0_62_0/editor/7_category_filter.png" alt="Category Filter"/>
-</div>
-
-Modelling of a pipeline starts with choosing one ore more data sources. Therefore a data stream or data set must be selected
-and moved into the editor via drag and drop.
-After adding a data stream, we can select a processing element to transform the events of the data stream.
-This is done again by dragging the processing element icon into our editor.
-The mouse can be used to connect the two elements.
-It is automatically checked in the background if the two elements are semantically compatible.
-If this check is successful, a configuration menu is shown. It contains the parameters that can be modified by the
-user. For all parameters, a description is provided and the system also prevents the user from entering parameters that
-are not correct, according to the semantic description of the element.
-It is also ensured that all required parameters are provided by the user, otherwise an error message is displayed.
-
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/8_connect_elements.png" alt="Connect Elements"/>
-    <img src="/img/features_0_62_0/editor/9_configure_element.png" alt="Configure Elements"/>
-</div>
-
-When the user tries to connect two elements that are not compatible, the system shows a __connection error__ message.
-The example illustrated below shows such a case. The user tried to connect a text filter to a light sensor.
-This is not possible since the text filter processing element requires at least one event property of type string, which is not provided by the light sensor.
-
-![Connection Error](/img/features_0_62_0/editor/10_connection_error.png) 
-
-To further improve the usability, multiple ways are available to connect new elements besides the drag and drop option.
-Each processing element has multiple short-cut buttons to connect it with another element.
-The first one (eye icon) can be used to get a suggestion of all elements that are compatible with the current element.
-The second one (plus icon) gives a recommendation on the elements the user might want to connect, based on the usage of the component in
-other pipelines.
-There is also a button (question tag icon) to open the documentation of a selected element.
-Elements can be deleted by clicking the 'delete' button.
-Each element can also be re-configured at a later point in time using the configuration button.
-There is one important aspect about re-configuration of pipeline elements you need to be aware of: Only elements that are not yet connected to another element can be modified.
-The reason for this behaviour is that some of the following elements might rely on the configuration of previous elements.
-This way it is ensured that the user can not change the behaviour of the pipeline by accident.
- 
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/11_shortcut_buttons.png" alt="Shortcut Buttons"/>
-    <img src="/img/features_0_62_0/editor/12_compatible_elements.png" alt="Compatible Elements"/>
-    <img src="/img/features_0_62_0/editor/13_recommend_elements.png" alt="Recommended elements"/>
-</div>
-
-
-After the pipeline is completely modelled, the editor looks similar to the first image below.
-Especially for larger pipelines, the auto layout button in the editor menu might be helpful.
-With this button, the pipeline will be beautifully aligned in the editor, helping users to get a better overview of the complete pipeline.
-On the top left corner of the editor, the 'save' button can be found.
-After the modelling of the pipeline is done, use this button to save and execute the pipeline.
-A save dialogue pops up when clicking the save button. 
-The pipeline title must be entered and an additional description can be provided.
-It is recommended to always provide a description, because it makes it easier for other users to understand the meaning of the pipeline.
-In the save menu, the user can either just store the pipeline configuration or store it and immediately start the pipeline.
-Once the pipeline is executed, the user is redirected to the _Manage Pipeline_ view.
-In this view, the user gets immediate feedback whether all components did start correctly and the pipeline is up and running.
-This view also shows that individual elements might run in different environments on different servers.
-If there is an error during the execution, a notification containing a (hopefully) detailed error description is provided in this view.
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/14_save_adjust.png" alt="Save adjust delete"/>
-    <img src="/img/features_0_62_0/editor/15_save_dialogue.png" alt="Complete pipeline"/>
-    <img src="/img/features_0_62_0/editor/16_pipeline_sucessfully_started.png" alt="Pipeline sucessfully started"/>
-</div>
-
-## Connect new Data Sources
-With StreamPipes Connect it is possible to connect new data sources in StreamPipes with just a few clicks.
-Therefore, we provide a marketplace with a lot of different adapters that can be configured and executed to create new __Data Streams__ in the __Pipeline Editor__.
-With StreamPipes Connect it is possible to connect specific data sources - e.g. an adapter streaming the current location of the ISS (International Space Station).
-It is also possible to connect generic sources like message brokers or databases.
-If the event schema of the data source is unknown, the system tries to infer the schema by extracting some sample data and analysing it.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/connect/new/01_connect.png" alt="Market Place"/>
-    <img src="/img/features_0_62_0/connect/new/02_mqtt_adapter.png" alt="MQTT adapter"/>
-    <img src="/img/features_0_62_0/connect/new/03_configure_mqtt.png" alt="Configure MQTT adpater"/>
-    <img src="/img/features_0_62_0/connect/new/04_configure_format.png" alt="Guess event schema"/>
-    <img src="/img/features_0_62_0/connect/new/05_guess_schema.png" alt="Guess event schema"/>
-    <img src="/img/features_0_62_0/connect/new/06_edit_adapter.png" alt="Edit adapter"/>
-    <img src="/img/features_0_62_0/connect/new/07_start_adapter.png" alt="Start adapter"/>
-    <img src="/img/features_0_62_0/connect/new/08_data_stream_in_editor.png" alt="New data stram in pipeline editor"/>
-</div>
-
-Additionally to connecting new sources, data can be cleaned, transformed, and enriched with meta-information.
-Therefore, the event schema can be changed or enriched in step 3 (Define Event Schema).
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/connect/edit/01_edit_timestamp.png" alt="Edit a property to timestamp"/>
-    <img src="/img/features_0_62_0/connect/edit/02_change_unit.png" alt="Change Unit of property"/>
-    <img src="/img/features_0_62_0/connect/edit/03_change_unit.png" alt="Change Unit of property"/>
-</div>
-
-## Manage Pipelines
-The _Manage Pipelines_ view provides an overview of all existing pipelines.
-Existing pipelines can be managed using this view.
-For instance, users can start and stop pipelines or delete them when they are not longer needed.
-Pipeline actions can be performed by clicking one of the buttons next to each pipeline.
-For each pipeline, the title and description is displayed in the table.
-By clicking the edit symbol an overview of the created pipline is shown. In this window you are able to analyze statistics, identify errors or edit the pipeline.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/manage_pipelines/1_pipeline_overview.png" alt="Pipeline Overview"/>
-    <img src="/img/features_0_62_0/manage_pipelines/2_pipeline_information.png" alt="Pipeline infomation"/>
-    <img src="/img/features_0_62_0/manage_pipelines/3_delete_pipeline.png" alt="Delete Pipelines"/>
-    <img src="/img/features_0_62_0/manage_pipelines/4_pipeline_deleted.png" alt="Delete Pipelines"/>
-</div>
-
-In a setting with many defined pipelines, it can get really hard to keep track of all pipelines.
-This is why we introduce categories.
-A category is a set of pipelines that can be defined by users in order to better organize pipelines.
-By clicking on the "Manage Categories" button on the top left, a new category can be added to StreamPipes.
-In this example, we create a new category named "New Demo Category".
-After saving a category, pipelines can be added to the newly created category.
-The new category is then presented as a tab in the _Pipeline Management_ view.
-This tab contains all previously defined pipelines.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/manage_pipelines/5_pipeline_category.png" alt="Pipeline Category"/>
-    <img src="/img/features_0_62_0/manage_pipelines/6_add_category.png" alt="Add Pipeline Category"/>
-    <img src="/img/features_0_62_0/manage_pipelines/7_new_category.png" alt="New Category"/>
-    <img src="/img/features_0_62_0/manage_pipelines/8_show_new_category.png" alt="Show new Category"/>
-</div>
-
-## Live Dashboard
-The live dashboard can be used for multiple use cases.
-It is a good way to live monitor a running system in a dashboard, but it can also be used during the pipeline development to get a fast feedback from newly created pipelines.
-Below is a screenshot of an example dashboard showing the current value of pressure, which further shows a line chart and a trafficlight for a water level pipeline.
-All pipelines that contain the "Dashboard Sink" can be visualized in this view.
-To add a new visualisation, click on the "Add visualisation" button on the top left corner.
-Afterwards, a three-step configuration menu is shown.
-The first step is to select the pipeline that should be visualized.
-In the second step, the type of visualization can be defined.
-Currently 10 different types are available, including line charts, various map visualizations and data tables.
-After selecting the type (in our example "Gauge"), you can select the specific measurement values of the data stream that should be displayed.
-In the example below, the water level value should be monitored and the gauge value should range from 0 to 100.
-Once all steps are completed, the new visualization is placed on the dashboard and live data is presented as soon as it becomes available.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/dashboard/01_dashboard.png" alt="Screenshot of live dashboard"/>
-    <img src="/img/features_0_62_0/dashboard/02_new_visualisation.png" alt="Select Pipeline to visualize"/>
-    <img src="/img/features_0_62_0/dashboard/03_select_gauge.png" alt="Select Visualization Type"/>
-    <img src="/img/features_0_62_0/dashboard/04_configure_gauge.png" alt="Configure  Visualzation"/>
-    <img src="/img/features_0_62_0/dashboard/05_new_gauge_done.png" alt="Show new Visualzation"/>
-</div>
-
-## File Download
-With the file download,  it is possible to download stored files directly from Elasticsearch.
-This can be very useful for example when a data dumb is needed for a specific time range.
-All data that is written into Elasticsearch using the _Elasticsearch Sink_ can be accessed by the file downloader.
-A common use case is to download data for offline analysis and to train a machine learning algorithm.
-First, an index must be defined, afterwards, the time range must be set.
-A date picker helps users to enter the time range.
-When a user clicks the "Create File" button the file is created.
-All files stored on the server can be downloaded via the download button.
-If the files are not longer needed, they can be deleted by clicking the delete button.
-This will remove the file from the server.
-Since data is stored in Elasticsearch anyways. it is recommended not to store the files for a longer period of time on the server.
-When a file is needed again at a later point in time it is easy to create it again. 
-This way a lot of disk space on the server can be saved, especially when the files are rather large.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/file_download/01_file_download.png" alt="File Download"/>
-    <img src="/img/features_0_62_0/file_download/02_file_download.png" alt="File Download with selected time range"/>
-    <img src="/img/features_0_62_0/file_download/03_file_download.png" alt="File Download with new File"/>
-</div>
-
-## Notifications
-Notifications are a good solution to notify someone when a urgent situation occurs.
-A notification can be created by using the notification sink in the pipeline editor.
-When using such a sink a configuration dialogue is presented to the user.
-In this dialogue the user must provide enough information to resolve the solution when it occurs.
-The message can be nicely configured in the message editor.
-It is also possible to embed values of the event that triggered the notification.
-This can be done with the #property# notation.
-All available properties are presented in the notification configurator.
-When the notification is triggered the #property# template is replaced with the actual value of the property.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/notification/01_select_notification_sink.png" alt="Select Notification"/>
-    <img src="/img/features_0_62_0/notification/02_configure_notification.png" alt="Configure Notification"/>
-</div>
-
-A pop up icon on the notification tab in the menu shows the user how many unread notifications currently are in the system.
-This icon also alerts users when new notifications occur.
-In the notification overview all notifications are listed.
-On the top are the new notifications that are not read yet.
-A user can mark them as read by clicking on the little envelope icon.
-Those notifications are then no longer in the unread section, but they remain in the "All Messages" view.
-This way it is possible to keep track of all notifications and have a look at them at a later point in time.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/notification/03_new_notification.png" alt="New Notification"/>
-</div>
-
-
-## Install Pipeline Elements
-StreamPipes is highly configurable and extensible.
-Pipeline elements can be added and removed during runtime.
-This can be done in the "Install Pipeline Elements" view.
-All available pipeline elements are shown here and can be selected to install or uninstall.
-It is also possible to select multiple or all of them and then install them all together.
-When a new element is installed by the user it is automatically available in the "Pipeline Editor" and can be used for pipelines.
-Elements that are uninstalled are removed from the system. 
-They can not longer be used within pipelines.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/install_elements/01_install_elements.png" alt="Install Elements View"/>
-    <img src="/img/features_0_62_0/install_elements/02_install_countAggregation.png" alt="Insall new Element"/>
-    <img src="/img/features_0_62_0/install_elements/03_installed_countAggregation.png" alt="Installation Successful"/>
-    <img src="/img/features_0_62_0/install_elements/04_countAggregation_in_editor.png" alt="Show new installed element"/>
-</div>
-
-
-## My Elements
-The "My Elements" view gives a quick overview over all installed pipeline elements.
-Here they can be inspected and the description can be re-imported.
-In this view it is also possible to have a look at the JSON-LD representation of each element.
-This is not important for a user, but it is worth noting that the system uses this machine understandable format to support the user.
-For example all the information of the sources, like data schema or unit information is in the JSON-LD meta data.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/my_elements/01_my_elements.png" alt="My Elements Overview"/>
-    <img src="/img/features_0_62_0/my_elements/02_my_elements_jsonid.png" alt="View JSON-LD"/>
-</div>
-
-## Configuration
-The last feature is the _configuration view_.
-Here, it is possible to change the configuration parameters of installed components.
-All components containing processing elements automatically register in StreamPipes when they are started in the same network as the backend component.
-Once a container is registered it is represented in the configuration view.
-The green dot on the top left indicates that tha container is running properly.
-When there is a problem with a container the green dot changes to red and the user knows there is a problem.
-To configure the parameters the top right arrow of a configuration box must be clicked.
-Then the configuration menu pops up. 
-Within there it is possible to change the parameters of a service.
-To make the changes persistent the "Update" button must be clicked.
-A user should keep in mind that sometimes it is necessary to restart a container when the parameters are changed.
-Sometimes it is also necessary to re-import the pipeline element description, either by uninstalling and re-installing them after the container restart or be reloading the description in the "My elements" view.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/configuration/01_configuration_overview.png" alt="Configuration Overview"/>
-    <img src="/img/features_0_62_0/configuration/02_change_config.png" alt="Change Configuration"/>
-</div>
-
-
-Congratulations! You've just finished your first tour of StreamPipes.
-Although there's still more to learn, we introduced most of the currently available features.
-On the next page, the different processing elements that come with the installation are explained.


(streampipes-website) 01/08: feat: Restructure docs

Posted by ri...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dominikriemer pushed a commit to branch refactor-website
in repository https://gitbox.apache.org/repos/asf/streampipes-website.git

commit 7d67d22bebc3ff09128d527ded3b504410282b24
Author: Dominik Riemer <do...@gmail.com>
AuthorDate: Thu May 28 18:10:09 2026 +0200

    feat: Restructure docs
---
 docs/{01_try-overview.md => 01_overview.md}        |     0
 docs/01_try-installation.md                        |    62 -
 docs/01_try-tutorial.md                            |    20 -
 docs/02_concepts-adapter.md                        |     7 -
 docs/02_concepts-data-streams.md                   |     7 -
 docs/02_concepts-glossary.md                       |     7 -
 docs/02_concepts-overview.md                       |    46 -
 docs/02_concepts-pipeline.md                       |     7 -
 docs/02_introduction.md                            |    85 -
 .../02_quick-start-guide.md                        |    97 +-
 .../03_concepts-architecture.md                    |    94 +-
 .../03_concepts-introduction.md                    |     2 +-
 .../03_concepts-terms.md                           |    14 +-
 docs/03_use-configurations.md                      |    48 -
 docs/03_use-connect.md                             |    72 -
 docs/03_use-dashboard.md                           |    66 -
 docs/03_use-install-pipeline-elements.md           |     9 -
 docs/03_use-managing-pipelines.md                  |    52 -
 docs/03_use-notifications.md                       |    25 -
 docs/03_use-pipeline-editor.md                     |    62 -
 docs/03_use-programmatically-create-adapters.md    |   154 -
 docs/03_use-programmatically-create-pipelines.md   |   164 -
 docs/04_use-assets.md                              |     5 +
 docs/{03_use-data-explorer.md => 04_use-charts.md} |     6 +-
 .../03_use-connect.md => docs/04_use-connect.md    |   155 +-
 .../04_use-dashboards.md                           |     6 +-
 ...ploy-retention-config.md => 04_use-datasets.md} |    31 +-
 docs/04_use-pipelines.md                           |   268 +
 .../04_use-programmatic-access.md                  |     6 +-
 docs/{03_use-shortcuts.md => 04_use-shortcuts.md}  |     0
 docs/05_deploy-choosing-the-right-flavor.md        |    47 -
 docs/05_deploy-docker.md                           |    92 -
 docs/05_deploy-environment-variables.md            |    88 -
 docs/05_deploy-kubernetes.md                       |   269 -
 docs/05_deploy-use-ssl.md                          |    35 -
 .../05_how-to-custom-adapter.md                    |    14 +-
 .../05_how-to-custom-data-processor.md             |    16 +-
 .../05_how-to-custom-data-sink.md                  |    10 +-
 docs/{07_connect_mqtt.md => 05_how-to-mqtt.md}     |     6 +-
 docs/05_how-to-opcua.md                            |     5 +
 .../06_configure-operate-deployment.md             |   185 +-
 .../06_configure-operate-environment-variables.md  |     4 +-
 docs/06_configure-operate-extension-services.md    |     5 +
 docs/06_configure-operate-extensions.md            |     9 +
 .../06_configure-operate-general-settings.md       |     8 +-
 ...ecurity.md => 06_configure-operate-security.md} |     6 +-
 docs/06_extend-archetypes.md                       |    46 -
 docs/06_extend-client.md                           |   204 -
 docs/06_extend-tutorial-adapters.md                |   612 -
 docs/06_extend-tutorial-data-processors.md         |   454 -
 docs/06_extend-tutorial-data-sinks.md              |   272 -
 .../07_extend-archetypes.md                        |     2 +-
 docs/{06_extend-cli.md => 07_extend-cli.md}        |     0
 ...d-customize-ui.md => 07_extend-customize-ui.md} |     0
 ...t-processor.md => 07_extend-first-processor.md} |     0
 ...event-model.md => 07_extend-sdk-event-model.md} |     2 +-
 ...sdk-functions.md => 07_extend-sdk-functions.md} |     2 +-
 ...gration-sd.md => 07_extend-sdk-migration-sd.md} |     0
 ...k-migrations.md => 07_extend-sdk-migrations.md} |     0
 ...egies.md => 07_extend-sdk-output-strategies.md} |     0
 ...rties.md => 07_extend-sdk-static-properties.md} |     0
 ...nts.md => 07_extend-sdk-stream-requirements.md} |     0
 docs/{06_extend-setup.md => 07_extend-setup.md}    |     4 +-
 docs/08_technicals-architecture.md                 |   110 -
 docs/08_technicals-messaging.md                    |    65 -
 docs/08_technicals-runtime-wrappers.md             |    37 -
 docs/08_technicals-user-guidance.md                |     7 -
 .../version-0.92.0 => docs}/09_contribute.md       |     0
 docs/09_debugging.md                               |     7 -
 .../version-0.95.0 => docs}/09_get-help.md         |     0
 docs/09_monitoring.md                              |     7 -
 docs/10_contribute.md                              |    17 -
 docs/10_get-help.md                                |    25 -
 ...apache.streampipes.connect.iiot.adapters.oi4.md |     2 +-
 ...onnect.iiot.adapters.plc4x.generic.knxnet-ip.md |     6 +-
 ...ipes.connect.iiot.protocol.stream.httpserver.md |     3 +-
 ...che.streampipes.processors.filters.jvm.merge.md |     4 +-
 ...tlong.processor.distancecalculator.haversine.md |     6 +-
 ...treampipes.processors.siddhi.numericalfilter.md |     4 +-
 ...nsformation.jvm.processor.booloperator.state.md |     2 +-
 docs/user-guide-first-steps.md                     |   209 -
 docs/user-guide-tour.md                            |   305 -
 website-v2/blog/2020-01-23-streampipes_on_rpi.md   |     2 +-
 website-v2/blog/2020-05-27-streampipes_on_k3s.md   |     4 +-
 website-v2/docusaurus.config.js                    |     2 +-
 website-v2/package-lock.json                       | 21876 ++++++++++++-------
 website-v2/package.json                            |    10 +-
 website-v2/sidebars.json                           |   465 +-
 .../version-0.91.0/01_try-installation.md          |    66 -
 .../version-0.91.0/01_try-overview.md              |   134 -
 .../version-0.91.0/01_try-tutorial.md              |    21 -
 .../version-0.91.0/02_concepts-adapter.md          |     8 -
 .../version-0.91.0/02_concepts-data-streams.md     |     8 -
 .../version-0.91.0/02_concepts-glossary.md         |     8 -
 .../version-0.91.0/02_concepts-overview.md         |    36 -
 .../version-0.91.0/02_concepts-pipeline.md         |     8 -
 .../version-0.91.0/03_use-configurations.md        |    49 -
 .../version-0.91.0/03_use-dashboard.md             |    67 -
 .../version-0.91.0/03_use-data-explorer.md         |   103 -
 .../03_use-install-pipeline-elements.md            |    10 -
 .../version-0.91.0/03_use-managing-pipelines.md    |    53 -
 .../version-0.91.0/03_use-notifications.md         |    26 -
 .../version-0.91.0/03_use-pipeline-editor.md       |    63 -
 .../version-0.91.0/05_deploy-docker.md             |    75 -
 .../version-0.91.0/05_deploy-kubernetes.md         |    61 -
 .../version-0.91.0/05_deploy-security.md           |    76 -
 .../version-0.91.0/05_deploy-use-ssl.md            |    36 -
 .../version-0.91.0/06_extend-archetypes.md         |    65 -
 .../versioned_docs/version-0.91.0/06_extend-cli.md |   191 -
 .../version-0.91.0/06_extend-first-processor.md    |    58 -
 .../version-0.91.0/06_extend-sdk-event-model.md    |   142 -
 .../version-0.91.0/06_extend-sdk-functions.md      |   126 -
 .../version-0.91.0/06_extend-sdk-migration-sd.md   |   117 -
 .../06_extend-sdk-output-strategies.md             |   349 -
 .../06_extend-sdk-static-properties.md             |   267 -
 .../06_extend-sdk-stream-requirements.md           |   179 -
 .../version-0.91.0/06_extend-setup.md              |    51 -
 .../06_extend-tutorial-data-processors.md          |   363 -
 .../06_extend-tutorial-data-sinks.md               |   231 -
 .../06_extend-tutorial-data-sources.md             |   205 -
 .../version-0.91.0/07_technicals-architecture.md   |    63 -
 .../version-0.91.0/07_technicals-configuration.md  |    59 -
 .../version-0.91.0/07_technicals-messaging.md      |     8 -
 .../07_technicals-runtime-wrappers.md              |     8 -
 .../version-0.91.0/07_technicals-user-guidance.md  |     8 -
 .../versioned_docs/version-0.91.0/08_debugging.md  |     8 -
 .../versioned_docs/version-0.91.0/08_monitoring.md |     8 -
 .../versioned_docs/version-0.91.0/09_contribute.md |    18 -
 .../versioned_docs/version-0.91.0/09_get-help.md   |    26 -
 .../version-0.91.0/dev-guide-archetype.md          |     7 -
 .../version-0.91.0/dev-guide-processor-sdk.md      |    12 -
 .../version-0.91.0/dev-guide-sink-sdk.md           |    12 -
 .../version-0.91.0/faq-common-problems.md          |    74 -
 ...apache.streampipes.connect.adapters.coindesk.md |    45 -
 ...pache.streampipes.connect.adapters.flic.mqtt.md |    60 -
 ...rg.apache.streampipes.connect.adapters.gdelt.md |    43 -
 ...apache.streampipes.connect.adapters.iex.news.md |    49 -
 ...ache.streampipes.connect.adapters.iex.stocks.md |    48 -
 ...pache.streampipes.connect.adapters.image.set.md |    39 -
 ...he.streampipes.connect.adapters.image.stream.md |    39 -
 ...he.streampipes.connect.adapters.influxdb.set.md |    42 -
 ...streampipes.connect.adapters.influxdb.stream.md |    42 -
 .../org.apache.streampipes.connect.adapters.iss.md |    40 -
 ...pache.streampipes.connect.adapters.mysql.set.md |    40 -
 ...he.streampipes.connect.adapters.mysql.stream.md |    40 -
 ...ache.streampipes.connect.adapters.netio.mqtt.md |    65 -
 ...ache.streampipes.connect.adapters.netio.rest.md |    65 -
 ....connect.adapters.nswaustralia.trafficcamera.md |    40 -
 ...rg.apache.streampipes.connect.adapters.opcua.md |    77 -
 ...he.streampipes.connect.adapters.plc4x.modbus.md |    40 -
 ...apache.streampipes.connect.adapters.plc4x.s7.md |    40 -
 .../org.apache.streampipes.connect.adapters.ros.md |    65 -
 ...reampipes.connect.adapters.simulator.machine.md |    41 -
 ...pes.connect.adapters.simulator.randomdataset.md |    40 -
 ....connect.adapters.simulator.randomdatastream.md |    40 -
 ...rg.apache.streampipes.connect.adapters.slack.md |    40 -
 .../org.apache.streampipes.connect.adapters.ti.md  |    58 -
 ....streampipes.connect.adapters.wikipedia.edit.md |    40 -
 ...e.streampipes.connect.adapters.wikipedia.new.md |    40 -
 ...che.streampipes.connect.protocol.stream.file.md |    39 -
 ...che.streampipes.connect.protocol.stream.http.md |    39 -
 ...reampipes.connect.protocol.stream.httpserver.md |    39 -
 ...he.streampipes.connect.protocol.stream.kafka.md |    39 -
 ...che.streampipes.connect.protocol.stream.mqtt.md |    54 -
 ...e.streampipes.connect.protocol.stream.pulsar.md |    39 -
 .../org.apache.streampipes.processor.geo.flink.md  |    52 -
 ...ache.streampipes.processor.geo.jvm.geocoding.md |    61 -
 ...reampipes.processor.geo.jvm.reversegeocoding.md |    65 -
 ...treampipes.processor.geo.jvm.staticgeocoding.md |    62 -
 ...ssification.jvm.generic-image-classification.md |    53 -
 ...cessor.imageclassification.jvm.image-cropper.md |    44 -
 ...essor.imageclassification.jvm.image-enricher.md |    44 -
 ...ampipes.processor.imageclassification.qrcode.md |    69 -
 ...pes.processors.aggregation.flink.aggregation.md |    62 -
 ...reampipes.processors.aggregation.flink.count.md |    67 -
 ...ipes.processors.aggregation.flink.eventcount.md |    57 -
 ...treampipes.processors.aggregation.flink.rate.md |    55 -
 ...ampipes.processors.changedetection.jvm.cusum.md |    66 -
 ...cessors.enricher.flink.processor.math.mathop.md |    57 -
 ...s.enricher.flink.processor.math.staticmathop.md |    57 -
 ...essors.enricher.flink.processor.trigonometry.md |    57 -
 ...rs.enricher.flink.processor.urldereferencing.md |    52 -
 ...eampipes.processors.enricher.flink.timestamp.md |    49 -
 ...eampipes.processors.enricher.jvm.sizemeasure.md |    50 -
 ...e.streampipes.processors.filters.jvm.compose.md |    51 -
 ...he.streampipes.processors.filters.jvm.enrich.md |    48 -
 ...che.streampipes.processors.filters.jvm.limit.md |    71 -
 ...che.streampipes.processors.filters.jvm.merge.md |    58 -
 ...pipes.processors.filters.jvm.numericalfilter.md |    57 -
 ...s.processors.filters.jvm.numericaltextfilter.md |    68 -
 ...e.streampipes.processors.filters.jvm.project.md |    49 -
 ...treampipes.processors.filters.jvm.textfilter.md |    54 -
 ...streampipes.processors.filters.jvm.threshold.md |    57 -
 ...processors.geo.jvm.jts.processor.latLngToGeo.md |    74 -
 ...pes.processors.geo.jvm.jts.processor.setEPSG.md |    60 -
 ....processors.geo.jvm.jts.processor.trajectory.md |    84 -
 ...cessors.geo.jvm.processor.distancecalculator.md |    61 -
 ...reampipes.processors.geo.jvm.processor.speed.md |    56 -
 ...s.geo.jvm.processor.staticdistancecalculator.md |    71 -
 ...s.processors.pattern-detection.flink.absence.md |    54 -
 ...pipes.processors.pattern-detection.flink.and.md |    54 -
 ...ssors.pattern-detection.flink.peak-detection.md |    54 -
 ....processors.pattern-detection.flink.sequence.md |    54 -
 ...ache.streampipes.processors.siddhi.frequency.md |    56 -
 ...treampipes.processors.siddhi.frequencychange.md |    59 -
 ...pache.streampipes.processors.siddhi.increase.md |    66 -
 ...treampipes.processors.siddhi.numericalfilter.md |    64 -
 ...pache.streampipes.processors.siddhi.sequence.md |    36 -
 ...rg.apache.streampipes.processors.siddhi.stop.md |    57 -
 ...ocessors.statistics.flink.statistics-summary.md |    44 -
 ...rocessors.textmining.flink.languagedetection.md |    54 -
 ...mpipes.processors.textmining.flink.wordcount.md |    54 -
 ...treampipes.processors.textmining.jvm.chunker.md |    70 -
 ....processors.textmining.jvm.languagedetection.md |   170 -
 ...ampipes.processors.textmining.jvm.namefinder.md |    66 -
 ...pipes.processors.textmining.jvm.partofspeech.md |    63 -
 ....processors.textmining.jvm.sentencedetection.md |    60 -
 ...eampipes.processors.textmining.jvm.tokenizer.md |    60 -
 ...cessors.transformation.flink.field-converter.md |    55 -
 ...processors.transformation.flink.field-mapper.md |    70 -
 ...rocessors.transformation.flink.field-renamer.md |    69 -
 ....processors.transformation.flink.fieldhasher.md |    55 -
 ...nsformation.flink.measurement-unit-converter.md |    54 -
 ...s.transformation.flink.processor.boilerplate.md |    50 -
 ...sors.transformation.jvm.booloperator.counter.md |    65 -
 ...ors.transformation.jvm.booloperator.inverter.md |    52 -
 ....transformation.jvm.booloperator.timekeeping.md |    71 -
 ...essors.transformation.jvm.booloperator.timer.md |    57 -
 ....processors.transformation.jvm.changed-value.md |    46 -
 ...es.processors.transformation.jvm.count-array.md |    56 -
 ...es.processors.transformation.jvm.csvmetadata.md |    77 -
 ...processors.transformation.jvm.duration-value.md |    52 -
 ...ansformation.jvm.processor.booloperator.edge.md |    58 -
 ...nsformation.jvm.processor.booloperator.state.md |    59 -
 ...rs.transformation.jvm.processor.state.buffer.md |    55 -
 ...formation.jvm.processor.state.labeler.buffer.md |    70 -
 ...formation.jvm.processor.state.labeler.number.md |    59 -
 ...formation.jvm.processor.stringoperator.state.md |    52 -
 ...nsformation.jvm.processor.timestampextractor.md |    59 -
 ...es.processors.transformation.jvm.split-array.md |    60 -
 ...rs.transformation.jvm.stringoperator.counter.md |    62 -
 ...sors.transformation.jvm.stringoperator.timer.md |    64 -
 ...s.processors.transformation.jvm.taskduration.md |    51 -
 ...sors.transformation.jvm.transform-to-boolean.md |    51 -
 .../pe/org.apache.streampipes.protocol.set.file.md |    39 -
 .../pe/org.apache.streampipes.protocol.set.http.md |    39 -
 ...che.streampipes.sinks.brokers.jvm.bufferrest.md |    59 -
 ...org.apache.streampipes.sinks.brokers.jvm.jms.md |    61 -
 ...g.apache.streampipes.sinks.brokers.jvm.kafka.md |    62 -
 ...rg.apache.streampipes.sinks.brokers.jvm.mqtt.md |    62 -
 ...rg.apache.streampipes.sinks.brokers.jvm.nats.md |    79 -
 ....apache.streampipes.sinks.brokers.jvm.pulsar.md |    64 -
 ...pache.streampipes.sinks.brokers.jvm.rabbitmq.md |    74 -
 ...rg.apache.streampipes.sinks.brokers.jvm.rest.md |    53 -
 ...org.apache.streampipes.sinks.databases.ditto.md |    74 -
 ...eampipes.sinks.databases.flink.elasticsearch.md |    61 -
 ...ache.streampipes.sinks.databases.jvm.couchdb.md |    64 -
 ...che.streampipes.sinks.databases.jvm.influxdb.md |    86 -
 ...apache.streampipes.sinks.databases.jvm.iotdb.md |    71 -
 ...apache.streampipes.sinks.databases.jvm.mysql.md |    75 -
 ...apache.streampipes.sinks.databases.jvm.opcua.md |    73 -
 ...e.streampipes.sinks.databases.jvm.postgresql.md |    74 -
 ...che.streampipes.sinks.internal.jvm.dashboard.md |    53 -
 ...ache.streampipes.sinks.internal.jvm.datalake.md |    86 -
 ....streampipes.sinks.internal.jvm.notification.md |    58 -
 ...he.streampipes.sinks.notifications.jvm.email.md |    68 -
 ...treampipes.sinks.notifications.jvm.onesignal.md |    59 -
 ...he.streampipes.sinks.notifications.jvm.slack.md |    63 -
 ...streampipes.sinks.notifications.jvm.telegram.md |    68 -
 .../version-0.91.0/user-guide-first-steps.md       |   214 -
 .../version-0.91.0/user-guide-tour.md              |   307 -
 .../version-0.92.0/01_try-installation.md          |    66 -
 .../version-0.92.0/01_try-overview.md              |   133 -
 .../version-0.92.0/01_try-tutorial.md              |    20 -
 .../version-0.92.0/02_concepts-adapter.md          |     7 -
 .../version-0.92.0/02_concepts-data-streams.md     |     7 -
 .../version-0.92.0/02_concepts-glossary.md         |     7 -
 .../version-0.92.0/02_concepts-overview.md         |    46 -
 .../version-0.92.0/02_concepts-pipeline.md         |     7 -
 .../version-0.92.0/02_introduction.md              |    85 -
 .../version-0.92.0/03_use-configurations.md        |    48 -
 .../version-0.92.0/03_use-connect.md               |    72 -
 .../version-0.92.0/03_use-dashboard.md             |    66 -
 .../version-0.92.0/03_use-data-explorer.md         |   102 -
 .../03_use-install-pipeline-elements.md            |     9 -
 .../version-0.92.0/03_use-managing-pipelines.md    |    52 -
 .../version-0.92.0/03_use-notifications.md         |    25 -
 .../version-0.92.0/03_use-pipeline-editor.md       |    62 -
 .../version-0.92.0/05_deploy-docker.md             |    79 -
 .../05_deploy-environment-variables.md             |     5 -
 .../version-0.92.0/05_deploy-kubernetes.md         |    35 -
 .../version-0.92.0/05_deploy-security.md           |    75 -
 .../version-0.92.0/05_deploy-use-ssl.md            |    35 -
 .../version-0.92.0/06_extend-archetypes.md         |    48 -
 .../versioned_docs/version-0.92.0/06_extend-cli.md |   190 -
 .../version-0.92.0/06_extend-client.md             |   204 -
 .../version-0.92.0/06_extend-first-processor.md    |    57 -
 .../version-0.92.0/06_extend-sdk-event-model.md    |   141 -
 .../version-0.92.0/06_extend-sdk-functions.md      |   125 -
 .../version-0.92.0/06_extend-sdk-migration-sd.md   |   116 -
 .../06_extend-sdk-output-strategies.md             |   348 -
 .../06_extend-sdk-static-properties.md             |   266 -
 .../06_extend-sdk-stream-requirements.md           |   178 -
 .../version-0.92.0/06_extend-setup.md              |    51 -
 .../06_extend-tutorial-data-processors.md          |   362 -
 .../06_extend-tutorial-data-sinks.md               |   230 -
 .../06_extend-tutorial-data-sources.md             |   204 -
 .../version-0.92.0/07_technicals-messaging.md      |    42 -
 .../07_technicals-runtime-wrappers.md              |     7 -
 .../version-0.92.0/07_technicals-user-guidance.md  |     7 -
 .../versioned_docs/version-0.92.0/08_debugging.md  |     7 -
 .../versioned_docs/version-0.92.0/08_monitoring.md |     7 -
 .../versioned_docs/version-0.92.0/09_get-help.md   |    25 -
 .../version-0.92.0/dev-guide-archetype.md          |     7 -
 .../version-0.92.0/dev-guide-introduction.md       |    52 -
 .../version-0.92.0/dev-guide-processor-sdk.md      |    12 -
 .../version-0.92.0/dev-guide-sink-sdk.md           |    12 -
 .../version-0.92.0/faq-common-problems.md          |    73 -
 ...apache.streampipes.connect.adapters.coindesk.md |    44 -
 ...pache.streampipes.connect.adapters.flic.mqtt.md |    59 -
 ...rg.apache.streampipes.connect.adapters.gdelt.md |    42 -
 ...apache.streampipes.connect.adapters.iex.news.md |    48 -
 ...ache.streampipes.connect.adapters.iex.stocks.md |    47 -
 ...pache.streampipes.connect.adapters.image.set.md |    38 -
 ...he.streampipes.connect.adapters.image.stream.md |    38 -
 ...he.streampipes.connect.adapters.influxdb.set.md |    41 -
 ...streampipes.connect.adapters.influxdb.stream.md |    41 -
 .../org.apache.streampipes.connect.adapters.iss.md |    39 -
 ...pache.streampipes.connect.adapters.mysql.set.md |    39 -
 ...he.streampipes.connect.adapters.mysql.stream.md |    39 -
 ...ache.streampipes.connect.adapters.netio.mqtt.md |    64 -
 ...ache.streampipes.connect.adapters.netio.rest.md |    64 -
 ....connect.adapters.nswaustralia.trafficcamera.md |    39 -
 ...rg.apache.streampipes.connect.adapters.opcua.md |    76 -
 ...he.streampipes.connect.adapters.plc4x.modbus.md |    75 -
 ...apache.streampipes.connect.adapters.plc4x.s7.md |    96 -
 .../org.apache.streampipes.connect.adapters.ros.md |    64 -
 ...reampipes.connect.adapters.simulator.machine.md |    40 -
 ...pes.connect.adapters.simulator.randomdataset.md |    39 -
 ....connect.adapters.simulator.randomdatastream.md |    39 -
 ...rg.apache.streampipes.connect.adapters.slack.md |    39 -
 .../org.apache.streampipes.connect.adapters.ti.md  |    57 -
 ....streampipes.connect.adapters.wikipedia.edit.md |    39 -
 ...e.streampipes.connect.adapters.wikipedia.new.md |    39 -
 ...che.streampipes.connect.protocol.stream.file.md |    38 -
 ...che.streampipes.connect.protocol.stream.http.md |    38 -
 ...reampipes.connect.protocol.stream.httpserver.md |    38 -
 ...he.streampipes.connect.protocol.stream.kafka.md |    38 -
 ...che.streampipes.connect.protocol.stream.mqtt.md |    53 -
 ...e.streampipes.connect.protocol.stream.pulsar.md |    38 -
 .../org.apache.streampipes.processor.geo.flink.md  |    51 -
 ...ache.streampipes.processor.geo.jvm.geocoding.md |    60 -
 ...reampipes.processor.geo.jvm.reversegeocoding.md |    64 -
 ...treampipes.processor.geo.jvm.staticgeocoding.md |    61 -
 ...ssification.jvm.generic-image-classification.md |    52 -
 ...cessor.imageclassification.jvm.image-cropper.md |    43 -
 ...essor.imageclassification.jvm.image-enricher.md |    43 -
 ...ampipes.processor.imageclassification.qrcode.md |    68 -
 ...pes.processors.aggregation.flink.aggregation.md |    61 -
 ...reampipes.processors.aggregation.flink.count.md |    66 -
 ...ipes.processors.aggregation.flink.eventcount.md |    56 -
 ...treampipes.processors.aggregation.flink.rate.md |    54 -
 ...ampipes.processors.changedetection.jvm.cusum.md |    65 -
 ...cessors.enricher.flink.processor.math.mathop.md |    56 -
 ...s.enricher.flink.processor.math.staticmathop.md |    56 -
 ...essors.enricher.flink.processor.trigonometry.md |    56 -
 ...rs.enricher.flink.processor.urldereferencing.md |    51 -
 ...eampipes.processors.enricher.flink.timestamp.md |    48 -
 ...eampipes.processors.enricher.jvm.sizemeasure.md |    49 -
 ...e.streampipes.processors.filters.jvm.compose.md |    50 -
 ...he.streampipes.processors.filters.jvm.enrich.md |    47 -
 ...che.streampipes.processors.filters.jvm.limit.md |    70 -
 ...che.streampipes.processors.filters.jvm.merge.md |    57 -
 ...pipes.processors.filters.jvm.numericalfilter.md |    56 -
 ...s.processors.filters.jvm.numericaltextfilter.md |    67 -
 ...e.streampipes.processors.filters.jvm.project.md |    48 -
 ...treampipes.processors.filters.jvm.textfilter.md |    53 -
 ...streampipes.processors.filters.jvm.threshold.md |    56 -
 ...processors.geo.jvm.jts.processor.latLngToGeo.md |    73 -
 ...pes.processors.geo.jvm.jts.processor.setEPSG.md |    59 -
 ....processors.geo.jvm.jts.processor.trajectory.md |    83 -
 ...cessors.geo.jvm.processor.distancecalculator.md |    60 -
 ...reampipes.processors.geo.jvm.processor.speed.md |    55 -
 ...s.geo.jvm.processor.staticdistancecalculator.md |    70 -
 ...s.processors.pattern-detection.flink.absence.md |    53 -
 ...pipes.processors.pattern-detection.flink.and.md |    53 -
 ...ssors.pattern-detection.flink.peak-detection.md |    53 -
 ....processors.pattern-detection.flink.sequence.md |    53 -
 ...ache.streampipes.processors.siddhi.frequency.md |    55 -
 ...treampipes.processors.siddhi.frequencychange.md |    58 -
 ...pache.streampipes.processors.siddhi.increase.md |    65 -
 ...treampipes.processors.siddhi.numericalfilter.md |    63 -
 ...pache.streampipes.processors.siddhi.sequence.md |    35 -
 ...rg.apache.streampipes.processors.siddhi.stop.md |    56 -
 ...ocessors.statistics.flink.statistics-summary.md |    43 -
 ...rocessors.textmining.flink.languagedetection.md |    53 -
 ...mpipes.processors.textmining.flink.wordcount.md |    53 -
 ...treampipes.processors.textmining.jvm.chunker.md |    69 -
 ....processors.textmining.jvm.languagedetection.md |   169 -
 ...ampipes.processors.textmining.jvm.namefinder.md |    65 -
 ...pipes.processors.textmining.jvm.partofspeech.md |    62 -
 ....processors.textmining.jvm.sentencedetection.md |    59 -
 ...eampipes.processors.textmining.jvm.tokenizer.md |    59 -
 ...cessors.transformation.flink.field-converter.md |    54 -
 ...processors.transformation.flink.field-mapper.md |    69 -
 ...rocessors.transformation.flink.field-renamer.md |    68 -
 ....processors.transformation.flink.fieldhasher.md |    54 -
 ...nsformation.flink.measurement-unit-converter.md |    53 -
 ...s.transformation.flink.processor.boilerplate.md |    49 -
 ...sors.transformation.jvm.booloperator.counter.md |    64 -
 ...ors.transformation.jvm.booloperator.inverter.md |    51 -
 ....transformation.jvm.booloperator.timekeeping.md |    70 -
 ...essors.transformation.jvm.booloperator.timer.md |    56 -
 ....processors.transformation.jvm.changed-value.md |    45 -
 ...es.processors.transformation.jvm.count-array.md |    55 -
 ...es.processors.transformation.jvm.csvmetadata.md |    76 -
 ...processors.transformation.jvm.duration-value.md |    51 -
 ...ansformation.jvm.processor.booloperator.edge.md |    57 -
 ...nsformation.jvm.processor.booloperator.state.md |    58 -
 ...rs.transformation.jvm.processor.state.buffer.md |    54 -
 ...formation.jvm.processor.state.labeler.buffer.md |    69 -
 ...formation.jvm.processor.state.labeler.number.md |    58 -
 ...formation.jvm.processor.stringoperator.state.md |    51 -
 ...nsformation.jvm.processor.timestampextractor.md |    58 -
 ...es.processors.transformation.jvm.split-array.md |    59 -
 ...rs.transformation.jvm.stringoperator.counter.md |    61 -
 ...sors.transformation.jvm.stringoperator.timer.md |    63 -
 ...s.processors.transformation.jvm.taskduration.md |    50 -
 ...sors.transformation.jvm.transform-to-boolean.md |    50 -
 .../pe/org.apache.streampipes.protocol.set.file.md |    38 -
 .../pe/org.apache.streampipes.protocol.set.http.md |    38 -
 ...che.streampipes.sinks.brokers.jvm.bufferrest.md |    58 -
 ...org.apache.streampipes.sinks.brokers.jvm.jms.md |    60 -
 ...g.apache.streampipes.sinks.brokers.jvm.kafka.md |    61 -
 ...rg.apache.streampipes.sinks.brokers.jvm.mqtt.md |    62 -
 ...rg.apache.streampipes.sinks.brokers.jvm.nats.md |    78 -
 ....apache.streampipes.sinks.brokers.jvm.pulsar.md |    63 -
 ...pache.streampipes.sinks.brokers.jvm.rabbitmq.md |    73 -
 ...rg.apache.streampipes.sinks.brokers.jvm.rest.md |    52 -
 ...org.apache.streampipes.sinks.databases.ditto.md |    73 -
 ...eampipes.sinks.databases.flink.elasticsearch.md |    60 -
 ...ache.streampipes.sinks.databases.jvm.couchdb.md |    63 -
 ...che.streampipes.sinks.databases.jvm.influxdb.md |    85 -
 ...apache.streampipes.sinks.databases.jvm.iotdb.md |    70 -
 ...apache.streampipes.sinks.databases.jvm.mysql.md |    74 -
 ...apache.streampipes.sinks.databases.jvm.opcua.md |    72 -
 ...e.streampipes.sinks.databases.jvm.postgresql.md |    73 -
 ...che.streampipes.sinks.internal.jvm.dashboard.md |    52 -
 ...ache.streampipes.sinks.internal.jvm.datalake.md |    85 -
 ....streampipes.sinks.internal.jvm.notification.md |    57 -
 ...he.streampipes.sinks.notifications.jvm.email.md |    67 -
 ...treampipes.sinks.notifications.jvm.onesignal.md |    63 -
 ...he.streampipes.sinks.notifications.jvm.slack.md |    67 -
 ...streampipes.sinks.notifications.jvm.telegram.md |    70 -
 .../version-0.92.0/user-guide-first-steps.md       |   209 -
 .../version-0.92.0/user-guide-tour.md              |   305 -
 .../version-0.93.0/01_try-installation.md          |    62 -
 .../version-0.93.0/01_try-overview.md              |   134 -
 .../version-0.93.0/01_try-tutorial.md              |    20 -
 .../version-0.93.0/02_concepts-adapter.md          |     7 -
 .../version-0.93.0/02_concepts-data-streams.md     |     7 -
 .../version-0.93.0/02_concepts-glossary.md         |     7 -
 .../version-0.93.0/02_concepts-pipeline.md         |     7 -
 .../version-0.93.0/03_use-configurations.md        |    48 -
 .../version-0.93.0/03_use-connect.md               |    72 -
 .../version-0.93.0/03_use-data-explorer.md         |   102 -
 .../03_use-install-pipeline-elements.md            |     9 -
 .../version-0.93.0/03_use-managing-pipelines.md    |    52 -
 .../version-0.93.0/03_use-notifications.md         |    25 -
 .../version-0.93.0/03_use-pipeline-editor.md       |    62 -
 .../05_deploy-choosing-the-right-flavor.md         |    47 -
 .../version-0.93.0/05_deploy-docker.md             |   104 -
 .../05_deploy-environment-variables.md             |    88 -
 .../version-0.93.0/05_deploy-security.md           |    75 -
 .../version-0.93.0/05_deploy-use-ssl.md            |    35 -
 .../version-0.93.0/06_extend-archetypes.md         |    46 -
 .../versioned_docs/version-0.93.0/06_extend-cli.md |   190 -
 .../version-0.93.0/06_extend-customize-ui.md       |   226 -
 .../version-0.93.0/06_extend-first-processor.md    |    54 -
 .../version-0.93.0/06_extend-sdk-event-model.md    |   141 -
 .../version-0.93.0/06_extend-sdk-functions.md      |   127 -
 .../version-0.93.0/06_extend-sdk-migration-sd.md   |   116 -
 .../version-0.93.0/06_extend-sdk-migrations.md     |   179 -
 .../06_extend-sdk-output-strategies.md             |   348 -
 .../06_extend-sdk-static-properties.md             |   267 -
 .../06_extend-sdk-stream-requirements.md           |   181 -
 .../version-0.93.0/06_extend-setup.md              |    50 -
 .../06_extend-tutorial-data-processors.md          |   454 -
 .../06_extend-tutorial-data-sinks.md               |   272 -
 .../version-0.93.0/07_technicals-architecture.md   |   110 -
 .../version-0.93.0/07_technicals-messaging.md      |    65 -
 .../07_technicals-runtime-wrappers.md              |    37 -
 .../version-0.93.0/07_technicals-user-guidance.md  |     7 -
 .../versioned_docs/version-0.93.0/08_debugging.md  |     7 -
 .../versioned_docs/version-0.93.0/08_monitoring.md |     7 -
 .../versioned_docs/version-0.93.0/09_contribute.md |    17 -
 .../versioned_docs/version-0.93.0/09_get-help.md   |    25 -
 .../version-0.93.0/faq-common-problems.md          |    73 -
 ...apache.streampipes.connect.adapters.coindesk.md |    44 -
 ...pache.streampipes.connect.adapters.flic.mqtt.md |    59 -
 ...he.streampipes.connect.adapters.image.stream.md |    38 -
 .../org.apache.streampipes.connect.adapters.iss.md |    39 -
 ...rg.apache.streampipes.connect.adapters.slack.md |    39 -
 .../org.apache.streampipes.connect.adapters.ti.md  |    57 -
 ....streampipes.connect.adapters.wikipedia.edit.md |    39 -
 ...e.streampipes.connect.adapters.wikipedia.new.md |    39 -
 ...mpipes.connect.iiot.adapters.influxdb.stream.md |    41 -
 ...che.streampipes.connect.iiot.adapters.iolink.md |    90 -
 ...streampipes.connect.iiot.adapters.netio.mqtt.md |    64 -
 ...streampipes.connect.iiot.adapters.netio.rest.md |    64 -
 ...ache.streampipes.connect.iiot.adapters.opcua.md |    76 -
 ...reampipes.connect.iiot.adapters.plc4x.modbus.md |    75 -
 ...e.streampipes.connect.iiot.adapters.plc4x.s7.md |    96 -
 ...apache.streampipes.connect.iiot.adapters.ros.md |    64 -
 ...ipes.connect.iiot.adapters.simulator.machine.md |    40 -
 ...treampipes.connect.iiot.protocol.stream.file.md |    38 -
 ...treampipes.connect.iiot.protocol.stream.http.md |    38 -
 ...ipes.connect.iiot.protocol.stream.httpserver.md |    38 -
 ...reampipes.connect.iiot.protocol.stream.kafka.md |    38 -
 ...treampipes.connect.iiot.protocol.stream.mqtt.md |    53 -
 ...treampipes.connect.iiot.protocol.stream.nats.md |    69 -
 ...eampipes.connect.iiot.protocol.stream.pulsar.md |    38 -
 ...mpipes.connect.iiot.protocol.stream.rocketmq.md |    38 -
 ...eampipes.connect.iiot.protocol.stream.tubemq.md |    54 -
 ...ssification.jvm.generic-image-classification.md |    52 -
 ...cessor.imageclassification.jvm.image-cropper.md |    43 -
 ...essor.imageclassification.jvm.image-enricher.md |    43 -
 ...ampipes.processor.imageclassification.qrcode.md |    68 -
 ...pipes.processors.changedetection.jvm.welford.md |    72 -
 ...e.streampipes.processors.enricher.jvm.jseval.md |    55 -
 ...rocessors.enricher.jvm.processor.math.mathop.md |    56 -
 ...ors.enricher.jvm.processor.math.staticmathop.md |    56 -
 ...ocessors.enricher.jvm.processor.trigonometry.md |    56 -
 ...eampipes.processors.enricher.jvm.valuechange.md |    52 -
 ...e.streampipes.processors.filters.jvm.compose.md |    50 -
 ...he.streampipes.processors.filters.jvm.enrich.md |    47 -
 ...che.streampipes.processors.filters.jvm.limit.md |    70 -
 ...che.streampipes.processors.filters.jvm.merge.md |    57 -
 ...ampipes.processors.filters.jvm.movingaverage.md |    46 -
 ...pipes.processors.filters.jvm.numericalfilter.md |    56 -
 ...s.processors.filters.jvm.numericaltextfilter.md |    67 -
 ...ocessors.filters.jvm.processor.booleanfilter.md |    52 -
 ...e.streampipes.processors.filters.jvm.project.md |    48 -
 ...he.streampipes.processors.filters.jvm.schema.md |    46 -
 ...pache.streampipes.processors.filters.jvm.sdt.md |    85 -
 ...treampipes.processors.filters.jvm.textfilter.md |    53 -
 ...streampipes.processors.filters.jvm.threshold.md |    56 -
 ...ampipes.processors.filters.jvm.throughputmon.md |    56 -
 ...cessors.geo.jvm.jts.processor.buffergeometry.md |    95 -
 ...processors.geo.jvm.jts.processor.bufferpoint.md |    82 -
 ...mpipes.processors.geo.jvm.jts.processor.epsg.md |    64 -
 ...ssors.geo.jvm.jts.processor.latlngtojtspoint.md |    73 -
 ...rocessors.geo.jvm.jts.processor.reprojection.md |    68 -
 ....processors.geo.jvm.jts.processor.trajectory.md |    83 -
 ...ors.geo.jvm.jts.processor.validation.complex.md |    86 -
 ...sors.geo.jvm.jts.processor.validation.simple.md |    80 -
 ...tlong.processor.distancecalculator.haversine.md |    61 -
 ...processor.distancecalculator.haversinestatic.md |    74 -
 ...eo.jvm.latlong.processor.geocoder.googlemaps.md |    61 -
 ....latlong.processor.geocoder.googlemapsstatic.md |    62 -
 ...vm.latlong.processor.revgeocoder.geocityname.md |    67 -
 ...rs.geo.jvm.latlong.processor.speedcalculator.md |    59 -
 ...g.apache.streampipes.processors.siddhi.count.md |    66 -
 ...pache.streampipes.processors.siddhi.increase.md |    65 -
 ....streampipes.processors.siddhi.listcollector.md |    51 -
 ...che.streampipes.processors.siddhi.listfilter.md |    53 -
 ...treampipes.processors.siddhi.numericalfilter.md |    63 -
 ...rg.apache.streampipes.processors.siddhi.topk.md |    53 -
 ...treampipes.processors.textmining.jvm.chunker.md |    69 -
 ...ampipes.processors.textmining.jvm.namefinder.md |    65 -
 ...pipes.processors.textmining.jvm.partofspeech.md |    62 -
 ....processors.textmining.jvm.sentencedetection.md |    59 -
 ...eampipes.processors.textmining.jvm.tokenizer.md |    59 -
 ...sors.transformation.jvm.booloperator.counter.md |    66 -
 ...ors.transformation.jvm.booloperator.inverter.md |    51 -
 ...sors.transformation.jvm.booloperator.logical.md |    42 -
 ....transformation.jvm.booloperator.timekeeping.md |    70 -
 ...essors.transformation.jvm.booloperator.timer.md |    58 -
 ....processors.transformation.jvm.changed-value.md |    46 -
 ...es.processors.transformation.jvm.count-array.md |    55 -
 ...es.processors.transformation.jvm.csvmetadata.md |    77 -
 ...processors.transformation.jvm.duration-value.md |    51 -
 ...s.processors.transformation.jvm.field-mapper.md |    74 -
 ...es.processors.transformation.jvm.fieldhasher.md |    55 -
 ...es.processors.transformation.jvm.fieldrename.md |    59 -
 ....transformation.jvm.measurementunitconverter.md |    53 -
 ...ansformation.jvm.processor.booloperator.edge.md |    58 -
 ...nsformation.jvm.processor.booloperator.state.md |    63 -
 ...formation.jvm.processor.state.labeler.number.md |    58 -
 ...formation.jvm.processor.stringoperator.state.md |    51 -
 ...nsformation.jvm.processor.timestampextractor.md |    58 -
 ...eampipes.processors.transformation.jvm.round.md |    72 -
 ...es.processors.transformation.jvm.split-array.md |    60 -
 ...rs.transformation.jvm.stringoperator.counter.md |    65 -
 ...sors.transformation.jvm.stringoperator.timer.md |    66 -
 ...s.processors.transformation.jvm.taskduration.md |    50 -
 ...sors.transformation.jvm.transform-to-boolean.md |    53 -
 ...che.streampipes.sinks.brokers.jvm.bufferrest.md |    58 -
 ...org.apache.streampipes.sinks.brokers.jvm.jms.md |    60 -
 ...g.apache.streampipes.sinks.brokers.jvm.kafka.md |    61 -
 ...rg.apache.streampipes.sinks.brokers.jvm.mqtt.md |    61 -
 ...rg.apache.streampipes.sinks.brokers.jvm.nats.md |    78 -
 ....apache.streampipes.sinks.brokers.jvm.pulsar.md |    63 -
 ...pache.streampipes.sinks.brokers.jvm.rabbitmq.md |    73 -
 ...rg.apache.streampipes.sinks.brokers.jvm.rest.md |    52 -
 ...pache.streampipes.sinks.brokers.jvm.rocketmq.md |    59 -
 ....apache.streampipes.sinks.brokers.jvm.tubemq.md |    61 -
 ...ache.streampipes.sinks.brokers.jvm.websocket.md |    52 -
 ...org.apache.streampipes.sinks.databases.ditto.md |    73 -
 ...ache.streampipes.sinks.databases.jvm.couchdb.md |    63 -
 ...che.streampipes.sinks.databases.jvm.influxdb.md |    85 -
 ...apache.streampipes.sinks.databases.jvm.iotdb.md |    91 -
 ...apache.streampipes.sinks.databases.jvm.opcua.md |    72 -
 ...e.streampipes.sinks.databases.jvm.postgresql.md |    73 -
 ...apache.streampipes.sinks.databases.jvm.redis.md |    87 -
 ...ache.streampipes.sinks.internal.jvm.datalake.md |    52 -
 ....streampipes.sinks.internal.jvm.notification.md |    57 -
 ...he.streampipes.sinks.notifications.jvm.email.md |    67 -
 ...treampipes.sinks.notifications.jvm.onesignal.md |    63 -
 ...he.streampipes.sinks.notifications.jvm.slack.md |    67 -
 ...streampipes.sinks.notifications.jvm.telegram.md |    70 -
 .../version-0.93.0/user-guide-first-steps.md       |   209 -
 .../version-0.93.0/user-guide-for-quickstart.md    |   134 -
 .../version-0.93.0/user-guide-tour.md              |   305 -
 .../version-0.95.0/01_try-installation.md          |    62 -
 .../version-0.95.0/01_try-overview.md              |   134 -
 .../version-0.95.0/01_try-tutorial.md              |    20 -
 .../version-0.95.0/02_concepts-adapter.md          |     7 -
 .../version-0.95.0/02_concepts-data-streams.md     |     7 -
 .../version-0.95.0/02_concepts-glossary.md         |     7 -
 .../version-0.95.0/02_concepts-overview.md         |    46 -
 .../version-0.95.0/02_concepts-pipeline.md         |     7 -
 .../version-0.95.0/02_introduction.md              |    85 -
 .../version-0.95.0/03_use-connect.md               |    72 -
 .../version-0.95.0/03_use-dashboard.md             |    66 -
 .../version-0.95.0/03_use-data-explorer.md         |   102 -
 .../03_use-install-pipeline-elements.md            |     9 -
 .../version-0.95.0/03_use-managing-pipelines.md    |    52 -
 .../version-0.95.0/03_use-notifications.md         |    25 -
 .../version-0.95.0/03_use-pipeline-editor.md       |    62 -
 .../05_deploy-choosing-the-right-flavor.md         |    47 -
 .../version-0.95.0/05_deploy-docker.md             |   104 -
 .../version-0.95.0/05_deploy-kubernetes.md         |   269 -
 .../version-0.95.0/05_deploy-security.md           |    75 -
 .../version-0.95.0/05_deploy-use-ssl.md            |    35 -
 .../versioned_docs/version-0.95.0/06_extend-cli.md |   190 -
 .../version-0.95.0/06_extend-client.md             |   204 -
 .../version-0.95.0/06_extend-customize-ui.md       |   226 -
 .../version-0.95.0/06_extend-first-processor.md    |    54 -
 .../version-0.95.0/06_extend-sdk-event-model.md    |   141 -
 .../version-0.95.0/06_extend-sdk-functions.md      |   127 -
 .../version-0.95.0/06_extend-sdk-migration-sd.md   |   117 -
 .../version-0.95.0/06_extend-sdk-migrations.md     |   179 -
 .../06_extend-sdk-output-strategies.md             |   348 -
 .../06_extend-sdk-static-properties.md             |   267 -
 .../06_extend-sdk-stream-requirements.md           |   181 -
 .../version-0.95.0/06_extend-setup.md              |    50 -
 .../version-0.95.0/06_extend-tutorial-adapters.md  |   612 -
 .../version-0.95.0/07_technicals-architecture.md   |   110 -
 .../version-0.95.0/07_technicals-messaging.md      |    65 -
 .../07_technicals-runtime-wrappers.md              |    37 -
 .../version-0.95.0/07_technicals-user-guidance.md  |     7 -
 .../versioned_docs/version-0.95.0/08_debugging.md  |     7 -
 .../versioned_docs/version-0.95.0/08_monitoring.md |     7 -
 .../versioned_docs/version-0.95.0/09_contribute.md |    17 -
 .../version-0.95.0/faq-common-problems.md          |    73 -
 ...he.streampipes.connect.adapters.image.stream.md |    38 -
 .../org.apache.streampipes.connect.adapters.iss.md |    39 -
 ...mpipes.connect.iiot.adapters.influxdb.stream.md |    41 -
 ...che.streampipes.connect.iiot.adapters.iolink.md |    90 -
 ...streampipes.connect.iiot.adapters.netio.mqtt.md |    64 -
 ...streampipes.connect.iiot.adapters.netio.rest.md |    64 -
 ...apache.streampipes.connect.iiot.adapters.oi4.md |    88 -
 ...ache.streampipes.connect.iiot.adapters.opcua.md |    76 -
 ...reampipes.connect.iiot.adapters.plc4x.modbus.md |    75 -
 ...e.streampipes.connect.iiot.adapters.plc4x.s7.md |    96 -
 ...apache.streampipes.connect.iiot.adapters.ros.md |    64 -
 ...ipes.connect.iiot.adapters.simulator.machine.md |    40 -
 ...treampipes.connect.iiot.protocol.stream.file.md |    90 -
 ...treampipes.connect.iiot.protocol.stream.http.md |    38 -
 ...ipes.connect.iiot.protocol.stream.httpserver.md |    51 -
 ...reampipes.connect.iiot.protocol.stream.kafka.md |    38 -
 ...treampipes.connect.iiot.protocol.stream.mqtt.md |    53 -
 ...treampipes.connect.iiot.protocol.stream.nats.md |    69 -
 ...eampipes.connect.iiot.protocol.stream.pulsar.md |    38 -
 ...mpipes.connect.iiot.protocol.stream.rocketmq.md |    38 -
 ...eampipes.connect.iiot.protocol.stream.tubemq.md |    54 -
 ...ssification.jvm.generic-image-classification.md |    52 -
 ...cessor.imageclassification.jvm.image-cropper.md |    43 -
 ...essor.imageclassification.jvm.image-enricher.md |    43 -
 ...ampipes.processor.imageclassification.qrcode.md |    68 -
 ...pipes.processors.changedetection.jvm.welford.md |    72 -
 ...e.streampipes.processors.enricher.jvm.jseval.md |    55 -
 ...rocessors.enricher.jvm.processor.math.mathop.md |    56 -
 ...ors.enricher.jvm.processor.math.staticmathop.md |    56 -
 ...ocessors.enricher.jvm.processor.trigonometry.md |    56 -
 ...eampipes.processors.enricher.jvm.valuechange.md |    52 -
 ...e.streampipes.processors.filters.jvm.compose.md |    50 -
 ...he.streampipes.processors.filters.jvm.enrich.md |    47 -
 ...che.streampipes.processors.filters.jvm.limit.md |    70 -
 ...che.streampipes.processors.filters.jvm.merge.md |    57 -
 ...ampipes.processors.filters.jvm.movingaverage.md |    46 -
 ...pipes.processors.filters.jvm.numericalfilter.md |    56 -
 ...s.processors.filters.jvm.numericaltextfilter.md |    67 -
 ...ocessors.filters.jvm.processor.booleanfilter.md |    52 -
 ...e.streampipes.processors.filters.jvm.project.md |    48 -
 ...he.streampipes.processors.filters.jvm.schema.md |    46 -
 ...pache.streampipes.processors.filters.jvm.sdt.md |    85 -
 ...treampipes.processors.filters.jvm.textfilter.md |    53 -
 ...streampipes.processors.filters.jvm.threshold.md |    56 -
 ...ampipes.processors.filters.jvm.throughputmon.md |    56 -
 ...cessors.geo.jvm.jts.processor.buffergeometry.md |    95 -
 ...processors.geo.jvm.jts.processor.bufferpoint.md |    82 -
 ...mpipes.processors.geo.jvm.jts.processor.epsg.md |    64 -
 ...ssors.geo.jvm.jts.processor.latlngtojtspoint.md |    73 -
 ...rocessors.geo.jvm.jts.processor.reprojection.md |    68 -
 ....processors.geo.jvm.jts.processor.trajectory.md |    83 -
 ...ors.geo.jvm.jts.processor.validation.complex.md |    86 -
 ...sors.geo.jvm.jts.processor.validation.simple.md |    80 -
 ...tlong.processor.distancecalculator.haversine.md |    61 -
 ...processor.distancecalculator.haversinestatic.md |    74 -
 ...eo.jvm.latlong.processor.geocoder.googlemaps.md |    61 -
 ....latlong.processor.geocoder.googlemapsstatic.md |    62 -
 ...vm.latlong.processor.revgeocoder.geocityname.md |    67 -
 ...rs.geo.jvm.latlong.processor.speedcalculator.md |    59 -
 ...g.apache.streampipes.processors.siddhi.count.md |    66 -
 ...pache.streampipes.processors.siddhi.increase.md |    65 -
 ....streampipes.processors.siddhi.listcollector.md |    51 -
 ...che.streampipes.processors.siddhi.listfilter.md |    53 -
 ...treampipes.processors.siddhi.numericalfilter.md |    63 -
 ...rg.apache.streampipes.processors.siddhi.topk.md |    53 -
 ...treampipes.processors.textmining.jvm.chunker.md |    69 -
 ...ampipes.processors.textmining.jvm.namefinder.md |    65 -
 ...pipes.processors.textmining.jvm.partofspeech.md |    62 -
 ....processors.textmining.jvm.sentencedetection.md |    59 -
 ...eampipes.processors.textmining.jvm.tokenizer.md |    59 -
 ...sors.transformation.jvm.booloperator.counter.md |    66 -
 ...ors.transformation.jvm.booloperator.inverter.md |    51 -
 ...sors.transformation.jvm.booloperator.logical.md |    42 -
 ....transformation.jvm.booloperator.timekeeping.md |    70 -
 ...essors.transformation.jvm.booloperator.timer.md |    58 -
 ....processors.transformation.jvm.changed-value.md |    46 -
 ...es.processors.transformation.jvm.count-array.md |    55 -
 ...es.processors.transformation.jvm.csvmetadata.md |    77 -
 ...pipes.processors.transformation.jvm.datetime.md |    78 -
 ...processors.transformation.jvm.duration-value.md |    51 -
 ...s.processors.transformation.jvm.field-mapper.md |    74 -
 ...es.processors.transformation.jvm.fieldhasher.md |    55 -
 ...es.processors.transformation.jvm.fieldrename.md |    59 -
 ....transformation.jvm.measurementunitconverter.md |    53 -
 ...ansformation.jvm.processor.booloperator.edge.md |    58 -
 ...nsformation.jvm.processor.booloperator.state.md |    63 -
 ...formation.jvm.processor.state.labeler.number.md |    58 -
 ....transformation.jvm.processor.staticmetadata.md |    74 -
 ...formation.jvm.processor.stringoperator.state.md |    51 -
 ...nsformation.jvm.processor.timestampextractor.md |    58 -
 ...eampipes.processors.transformation.jvm.round.md |    72 -
 ...es.processors.transformation.jvm.split-array.md |    60 -
 ...rs.transformation.jvm.stringoperator.counter.md |    65 -
 ...sors.transformation.jvm.stringoperator.timer.md |    66 -
 ...s.processors.transformation.jvm.taskduration.md |    50 -
 ...sors.transformation.jvm.transform-to-boolean.md |    53 -
 ...che.streampipes.sinks.brokers.jvm.bufferrest.md |    58 -
 ...org.apache.streampipes.sinks.brokers.jvm.jms.md |    60 -
 ...g.apache.streampipes.sinks.brokers.jvm.kafka.md |    61 -
 ...rg.apache.streampipes.sinks.brokers.jvm.mqtt.md |    61 -
 ...rg.apache.streampipes.sinks.brokers.jvm.nats.md |    78 -
 ....apache.streampipes.sinks.brokers.jvm.pulsar.md |    63 -
 ...pache.streampipes.sinks.brokers.jvm.rabbitmq.md |    73 -
 ...rg.apache.streampipes.sinks.brokers.jvm.rest.md |    52 -
 ...pache.streampipes.sinks.brokers.jvm.rocketmq.md |    59 -
 ....apache.streampipes.sinks.brokers.jvm.tubemq.md |    61 -
 ...ache.streampipes.sinks.brokers.jvm.websocket.md |    52 -
 ...org.apache.streampipes.sinks.databases.ditto.md |    73 -
 ...ache.streampipes.sinks.databases.jvm.couchdb.md |    63 -
 ...che.streampipes.sinks.databases.jvm.influxdb.md |    85 -
 ...apache.streampipes.sinks.databases.jvm.iotdb.md |    91 -
 ...apache.streampipes.sinks.databases.jvm.opcua.md |    65 -
 ...e.streampipes.sinks.databases.jvm.postgresql.md |    73 -
 ...apache.streampipes.sinks.databases.jvm.redis.md |    87 -
 ...ache.streampipes.sinks.internal.jvm.datalake.md |    68 -
 ....streampipes.sinks.internal.jvm.notification.md |    63 -
 ...he.streampipes.sinks.notifications.jvm.email.md |    73 -
 ....streampipes.sinks.notifications.jvm.msteams.md |    86 -
 ...treampipes.sinks.notifications.jvm.onesignal.md |    63 -
 ...he.streampipes.sinks.notifications.jvm.slack.md |    66 -
 ...streampipes.sinks.notifications.jvm.telegram.md |    70 -
 .../version-0.95.0/user-guide-first-steps.md       |   209 -
 .../version-0.95.0/user-guide-for-quickstart.md    |   134 -
 ...apache.streampipes.connect.iiot.adapters.oi4.md |     2 +-
 ...onnect.iiot.adapters.plc4x.generic.knxnet-ip.md |     6 +-
 ...ipes.connect.iiot.protocol.stream.httpserver.md |     3 +-
 ...che.streampipes.processors.filters.jvm.merge.md |     4 +-
 ...tlong.processor.distancecalculator.haversine.md |     6 +-
 ...treampipes.processors.siddhi.numericalfilter.md |     4 +-
 ...nsformation.jvm.processor.booloperator.state.md |     2 +-
 .../version-0.95.1/user-guide-first-steps.md       |     3 +-
 ...apache.streampipes.connect.iiot.adapters.oi4.md |     2 +-
 ...onnect.iiot.adapters.plc4x.generic.knxnet-ip.md |     6 +-
 ...ipes.connect.iiot.protocol.stream.httpserver.md |     3 +-
 ...che.streampipes.processors.filters.jvm.merge.md |     4 +-
 ...tlong.processor.distancecalculator.haversine.md |     6 +-
 ...treampipes.processors.siddhi.numericalfilter.md |     4 +-
 ...nsformation.jvm.processor.booloperator.state.md |     2 +-
 .../version-0.97.0/user-guide-first-steps.md       |     3 +-
 ...apache.streampipes.connect.iiot.adapters.oi4.md |     2 +-
 ...onnect.iiot.adapters.plc4x.generic.knxnet-ip.md |     6 +-
 ...ipes.connect.iiot.protocol.stream.httpserver.md |     3 +-
 ...che.streampipes.processors.filters.jvm.merge.md |     4 +-
 ...tlong.processor.distancecalculator.haversine.md |     6 +-
 ...treampipes.processors.siddhi.numericalfilter.md |     4 +-
 ...nsformation.jvm.processor.booloperator.state.md |     2 +-
 .../version-0.98.0/user-guide-first-steps.md       |     3 +-
 .../version-0.91.0-sidebars.json                   |   213 -
 .../version-0.92.0-sidebars.json                   |   213 -
 .../version-0.93.0-sidebars.json                   |   219 -
 .../version-0.95.0-sidebars.json                   |   203 -
 .../version-0.95.1-sidebars.json                   |   462 +-
 .../version-0.97.0-sidebars.json                   |   442 +-
 .../version-0.98.0-sidebars.json                   |   444 +-
 website-v2/versions.json                           |     6 +-
 821 files changed, 15811 insertions(+), 61838 deletions(-)

diff --git a/docs/01_try-overview.md b/docs/01_overview.md
similarity index 100%
rename from docs/01_try-overview.md
rename to docs/01_overview.md
diff --git a/docs/01_try-installation.md b/docs/01_try-installation.md
deleted file mode 100644
index bd92e48e9..000000000
--- a/docs/01_try-installation.md
+++ /dev/null
@@ -1,62 +0,0 @@
----
-id: try-installation
-title: Installation
-sidebar_label: Installation
----
-
-import DownloadSection from '@site/src/components/download/DownloadSection.tsx';
-
-The easiest way to install StreamPipes is our Docker-based installation. For production-grade deployments, we also
-recommend looking at our Kubernetes support, which is also part of the installation kit.
-
-## Prerequisites
-
-The Docker-based installation requires **Docker** and **Docker Compose** to be installed on the target machine.
-Installation instructions can be found below.
-
-:::info Install Docker
-Go to https://docs.docker.com/installation/ and follow the instructions to install Docker for your OS. Make sure
-docker can be started as a non-root user (described in the installation manual, don’t forget to log out and in
-again) and check that Docker is installed correctly by executing docker-run hello-world
-:::
-
-### Supported operating systems
-
-The Docker-based installation supports the operating systems **Linux**, **Mac OS X** and **Windows 10 upwards**. Older windows
-versions are not fully compatible with Docker. Linux VMs running under Windows might cause network problems with Docker,
-therefore some manual work might be needed to make StreamPipes run properly.
-
-### Web Browser
-
-The StreamPipes application itself will be accessible through a web browser. We recommend a recent version of Chrome (
-best experience), Firefox or Edge.
-
-## Install StreamPipes
-
-<DownloadSection version={'0.98.0'} releaseDate={'2025-12-15'}></DownloadSection>
-
-## Setup StreamPipes
-
-Once you've opened the browser at the URL given above, you should see the StreamPipes application as shown below. At
-initial startup, StreamPipes automatically performs an installation process.
-After the installation has finished, continue by clicking on "Go to login
-page", once all components are successfully configured.
-
-On the login page, enter your credentials, then you should be forwarded to the home page.
-
-Congratulations! You've successfully managed to install StreamPipes. Now we're ready to build our first pipeline!
-
-<div class="my-carousel docs-carousel">
-    <img src="/img/01_try-installation/04_home.png" alt="Home page"/>
-</div>
-
-:::danger Errors during the installation process
-In most cases, errors during the installation are due to an under-powered system.
-If there is a problem with any of the components, please restart the whole system (`docker-compose
-down` and eventually also delete the volumes).
-Please also make sure that you've assigned enough memory available to Docker.
-:::
-
-## Next Steps
-
-That's it! Have a look at the usage guide to learn how to use Apache StreamPipes.
diff --git a/docs/01_try-tutorial.md b/docs/01_try-tutorial.md
deleted file mode 100644
index c13d6f1dc..000000000
--- a/docs/01_try-tutorial.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-id: try-tutorial
-title: Interactive Tutorial
-sidebar_label: Interactive Tutorial
----
-
-Once you've installed StreamPipes and see the home screen, you'll see a number of modules that are part of the StreamPipes toolbox.
-As a first step, you might be interested in taking the interactive tutorial that helps you create your first pipeline.
-Switch to the **Pipeline Editor** and you will see a dialog that asks you for the start of the interactive tutorial:
-
-<img className="docs-image" src="/img/01_try-tutorial/01_tutorial-welcome.png" alt="Tutorial Welcome Page"/>
-
-Click **Start Tour** to start the tour. In this tour, you'll build a simple pipeline that monitors (simulated) live data from a water tank system.
-Within the tour, perform the actions as recommended and click **Next** to trigger the next steps. Some tour steps won't require to select **Next**, but wait for you to take the recommended action.
-You can cancel the tour anytime by clicking the **Exit Tour** button.
-
-<img className="docs-image" src="/img/01_try-tutorial/02_tutorial-process.png" alt="Tutorial Welcome Page"/>
-
-Now after you've built your first pipeline, you might be interested in reading about some of our core [concepts](concepts-overview) 
-
diff --git a/docs/02_concepts-adapter.md b/docs/02_concepts-adapter.md
deleted file mode 100644
index a94c38268..000000000
--- a/docs/02_concepts-adapter.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-id: concepts-adapter
-title: Data Adapters
-sidebar_label: Data Adapters
----
-
-tbd
diff --git a/docs/02_concepts-data-streams.md b/docs/02_concepts-data-streams.md
deleted file mode 100644
index 329f9b908..000000000
--- a/docs/02_concepts-data-streams.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-id: concepts-data-streams
-title: Data Streams
-sidebar_label: Data Streams
----
-
-tbd
\ No newline at end of file
diff --git a/docs/02_concepts-glossary.md b/docs/02_concepts-glossary.md
deleted file mode 100644
index b401d1829..000000000
--- a/docs/02_concepts-glossary.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-id: concepts-glossary
-title: Glossary
-sidebar_label: Glossary
----
-
-tbd
\ No newline at end of file
diff --git a/docs/02_concepts-overview.md b/docs/02_concepts-overview.md
deleted file mode 100644
index f26f3cc07..000000000
--- a/docs/02_concepts-overview.md
+++ /dev/null
@@ -1,46 +0,0 @@
----
-id: concepts-overview
-title: StreamPipes Concepts
-sidebar_label: Overview
----
-
-To understand how StreamPipes works, it is helpful to understand a few core concepts, which are illustrated below.
-These encompass the entire data journey within StreamPipes: Starting with data collection ([adapters](#adapter)),
-through data exchange ([data streams](#data-stream)) and data processing ([data processors](#data-processor) and [pipelines](#pipeline)),
-to data persistence and distribution ([data sinks](#data-sink)).
-
-<img src="/img/02_concepts-overview/components-overview.png" alt="Overview of concepts"/>
-
-## Adapter
-An adapter connects to any external data source (e.g., OPC-UA, MQTT, S7 PLC, Modbus) and forwards the events it receives to the internal StreamPipes system.
-Adapters can either be created by using a predefined adapter for a data source available in our marketplace [StreamPipes Connect](./03_use-connect.md).
-An overview of all available adapters can be found under the menu bar **📚 Pipeline Elements**.
-When you select one of these adapters, you can easily connect to the data source using an intuitive and convenient UI dialog (see the Connect section for more details).
-Alternatively, you can define your own adapter by [using the provided Software Development Kit (SDK)](./06_extend-tutorial-adapters.md).
-Creating an adapter is always the first step when you want to get data into StreamPipes and process it further.
-
-## Data Stream
-**Data streams** are the primary source for working with events in StreamPipes.
-A stream is an ordered sequence of events, where an event typically consists of one or more observation values and additional metadata.
-The `structure` (or `schema` as we call it) of an event provided by a data stream is stored in StreamPipes' internal semantic schema registry.
-Data streams are primarily created by adapters, but can also be created by a [StreamPipes Function](./06_extend-sdk-functions.md).
-
-## Data Processor
-**Data processors** in StreamPipes transform one or more input streams into an output stream.
-Such transformations can be simple, such as filtering based on a predefined rule, or more complex, such as applying rule-based or learning-based algorithms to the data.  
-Data processors can be applied to any data stream that meets the input requirements of a processor.
-In addition, most processors can be configured by providing custom parameters directly in the user interface.
-Processing elements define stream requirements, which are a set of minimum characteristics that an incoming event stream must provide.
-Data processors can maintain state or perform stateless operations.
-
-## Data Sink
-**Data sinks** consume event streams similar to data processors, but do not provide an output data stream.
-As such, data sinks typically perform some action or trigger a visualization as a result of a stream transformation.
-Similar to data processors, sinks also require the presence of specific input requirements from each bound data stream and can be customized.
-StreamPipes provides several internal data sinks, for example, to generate notifications, visualize live data, or persist historical data from incoming streams.
-In addition, StreamPipes provides several data sinks to forward data streams to external systems such as databases.
-
-## Pipeline
-A pipeline in Apache StreamPipes describes the transformation process from a data stream to a data sink.
-Typically, a pipeline consists of at least one data stream, zero or more data processors, and at least one data sink.
-Pipelines are created graphically by users using the [Pipeline Editor](./03_use-pipeline-editor.md) and can be started and stopped at any time.
diff --git a/docs/02_concepts-pipeline.md b/docs/02_concepts-pipeline.md
deleted file mode 100644
index 3d2c5369b..000000000
--- a/docs/02_concepts-pipeline.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-id: concepts-pipelines
-title: Pipelines
-sidebar_label: Pipelines
----
-
-tbd
\ No newline at end of file
diff --git a/docs/02_introduction.md b/docs/02_introduction.md
deleted file mode 100644
index 6dc71b384..000000000
--- a/docs/02_introduction.md
+++ /dev/null
@@ -1,85 +0,0 @@
----
-id: introduction
-title: Introduction
-sidebar_label: Introduction
----
-
-## What is StreamPipes?
-
-Apache StreamPipes is a self-service Industrial IoT toolbox to enable non-technical users to connect, analyze and
-explore IoT data streams. The main goal of StreamPipes is to help users bridging the gap between operational
-technology (OT) and information technology (IT). This is achieved by providing a set of tools which help to make
-industrial data accessible for downstream tasks such as data analytics and condition monitoring.
-When working with industrial data and especially when building upon an open source stack for such tasks, users are often
-faced with the management and integration of a variety of different tools for data connectivity, messaging &
-integration, data enrichment, data storage, visualization and analytics. This results in an increasing operational
-complexity and hardly manageable software stacks.
-
-Apache StreamPipes addresses this problem: It provides a complete toolbox with a variety of different tools to easily
-gather data from OT systems such as Programmatic Logic Controllers (PLCs), industrial protocols (e.g., OPC-UA or
-Modbus), IT protocols (e.g., MQTT) and others. Data is integrated in the form of live data streams. Based on connected
-data, StreamPipes provides another module called the pipeline editor, which can be used to apply real-time analytics
-algorithms on connected data stream. To this end, a library of pre-defined algorithms can be used. Out of the box,
-StreamPipes provides more than 100 pipeline elements tailored at manufacturing data analytics. This includes simple
-rule-based algorithms (e.g., flank detection, peak detection, boolean timers), as well as the possibility to integrate
-more sophisticated ML-based algorithms. Finally, the pipeline editor allows to integrate with third-party systems by
-using a variety of data sinks (e.g., to forward data to messaging brokers such as Apache Kafka, MQTT or RocketMQ, to
-store data in databases such as PostgreSQL or Redis or to trigger notifications). Besides pipelines, an included data
-explorer allows to visually analyze industrial IoT data. For this purpose, a number of visualizations are integrated
-that allow non-technical users to quickly get first insights. Examples are correlations between several sensor values,
-value heatmaps, distributions or time-series visualizations. Further tools include a dashboard used for real-time
-monitoring, e.g., for visualizing live KPIs at shopfloor level.
-
-But StreamPipes is much more than just the user interface and an orchestration system for pipelines: It can be used as a
-whole developer platform for Industrial IoT application. Apache StreamPipes is made for extensibility - it provides
-several extension points, which allow the definition of custom algorithms, additional interfaces to third-party tools
-and proprietary data sources.
-
-StreamPipes includes developer support for Java and Python, making it easy to integrate custom-trained machine learning
-models into the data processing environment. With the built-in Python support, it is also possible to run online machine
-learning methods directly on data streams gathered by StreamPipes.
-
-## Where does StreamPipes help?
-
-Being positioned in the industrial IoT domain, the overall goal of StreamPipes is to help manufacturing companies to
-quickly build up an industrial IoT infrastructure and to analyse IIoT data without the need for manual programming.
-Oftentimes, StreamPipes is compared to other tools in this area such as Node-RED for visually wiring of pipelines, which
-is often used together with Grafana for data visualization and InfluxDB for time-series storage. The disadvantage of
-such architectures is the system complexity beyond the first prototype, especially when it comes to production
-deployments. Maintaining and securing multiple software instances is often a hard task requiring for substantial
-development effort. In addition, implementing single-sign-on and providing a unified user experience is another hurdle.
-This is where StreamPipes, as a single integrated tool with production-critical features such as access and role
-management, provides many advantages.
-StreamPipes has already a wide user range from the manufacturing domain. It helps users to quickly do the first steps
-related to industrial analytics but can also be used for monitoring whole production facilities, analysing data streams
-from multiple plants and sensors in real time using the integrated algorithm toolbox. Customization to individual use
-cases is easy due to several extension points:
-
-* Software development kit for adapters, data processors and sinks: The functionality of StreamPipes can be extending by
-  using the integrated SDK. For instance, it is possible to integrate custom-tailored algorithms for proprietary sensors
-  or models into the toolbox. Additional algorithms and data sinks can be installed at runtime.
-* Additional user interface plugins: StreamPipes allows to extend the default installation with additional UI views,
-  making use of a micro frontend approach. For instance, users can extend the system with custom-tailored views for a
-  specific machine or plant. Developers can use a platform API to communicate with the core StreamPipes instance.
-* UI customization: To ensure a consistent look and feel, StreamPipes can be customized to the company’s corporate
-  identity.
-
-## How does StreamPipes technically work in a nutshell?
-
-
-<img className="docs-image docs-image-no-shadow" src="/img/architecture/streampipes-architecture-components.png" alt="Overview StreamPipes Architecture"/>
-
-
-To foster extensibility, Apache StreamPipes is based on a microservice architecture as illustrated above. The main
-services provided or used by StreamPipes are the a) user interface, b) the core, c) a time-series storage, d) a
-publish/subscribe messaging layer and e) extensions services. Adapters are created over the user interface using an
-intuitive configuration wizard and connect to the underlying source systems. Raw events coming from adapters can be
-pre-processed (e.g., measurement unit conversions or datatype conversions). Afterwards, events are sent to the message
-broker, which is the central backbone to provide IIoT data to internal and external applications. 
-
-Besides adapters, extensions microservices can also integrate additional business logic in form of data processors and
-data sinks. StreamPipes comes with over 100 built-in processors and sinks, covering basic use cases out-of-the-box. The StreamPipes core cares about orchestration of these pipeline elements and communicates with the user
-interface. In addition, a time-series storage ensures persistence and can be used by any extensions service to write
-data into the internal storage. The StreamPipes core provides a query interface to access historical data, which is, for
-instance, used by the data explorer UI component. The user interface itself provides several built-in modules but can
-also be extended with additional micro frontends. 
diff --git a/website-v2/versioned_docs/version-0.95.0/user-guide-tour.md b/docs/02_quick-start-guide.md
similarity index 82%
rename from website-v2/versioned_docs/version-0.95.0/user-guide-tour.md
rename to docs/02_quick-start-guide.md
index a6ae2f8ff..4a006e8e7 100644
--- a/website-v2/versioned_docs/version-0.95.0/user-guide-tour.md
+++ b/docs/02_quick-start-guide.md
@@ -1,9 +1,84 @@
 ---
-id: user-guide-tour
-title: Tour
-sidebar_label: Tour
+id: quick-start-guide
+title: Quick Start Guide
+sidebar_label: "🚀 Quick Start Guide"
 ---
 
+import DownloadSection from '@site/src/components/download/DownloadSection.tsx';
+
+The easiest way to install StreamPipes is our Docker-based installation. For production-grade deployments, we also
+recommend looking at our Kubernetes support, which is also part of the installation kit.
+
+## Prerequisites
+
+The Docker-based installation requires **Docker** and **Docker Compose** to be installed on the target machine.
+Installation instructions can be found below.
+
+:::info Install Docker
+Go to https://docs.docker.com/installation/ and follow the instructions to install Docker for your OS. Make sure
+docker can be started as a non-root user (described in the installation manual, don’t forget to log out and in
+again) and check that Docker is installed correctly by executing docker-run hello-world
+:::
+
+### Supported operating systems
+
+The Docker-based installation supports the operating systems **Linux**, **Mac OS X** and **Windows 10 upwards**. Older windows
+versions are not fully compatible with Docker. Linux VMs running under Windows might cause network problems with Docker,
+therefore some manual work might be needed to make StreamPipes run properly.
+
+### Web Browser
+
+The StreamPipes application itself will be accessible through a web browser. We recommend a recent version of Chrome (
+best experience), Firefox or Edge.
+
+## Install StreamPipes
+
+<DownloadSection version={'0.98.0'} releaseDate={'2025-12-15'}></DownloadSection>
+
+## Setup StreamPipes
+
+Once you've opened the browser at the URL given above, you should see the StreamPipes application as shown below. At
+initial startup, StreamPipes automatically performs an installation process.
+After the installation has finished, continue by clicking on "Go to login
+page", once all components are successfully configured.
+
+On the login page, enter your credentials, then you should be forwarded to the home page.
+
+Congratulations! You've successfully managed to install StreamPipes. Now we're ready to build our first pipeline!
+
+<div class="my-carousel docs-carousel">
+    <img src="/img/01_try-installation/04_home.png" alt="Home page"/>
+</div>
+
+:::danger Errors during the installation process
+In most cases, errors during the installation are due to an under-powered system.
+If there is a problem with any of the components, please restart the whole system (`docker-compose
+down` and eventually also delete the volumes).
+Please also make sure that you've assigned enough memory available to Docker.
+:::
+
+## Tutorial
+
+Once you've installed StreamPipes and see the home screen, you'll see a number of modules that are part of the StreamPipes toolbox.
+As a first step, you might be interested in taking the interactive tutorial that helps you create your first pipeline.
+Switch to the **Pipeline Editor** and you will see a dialog that asks you for the start of the interactive tutorial:
+
+<img className="docs-image" src="/img/01_try-tutorial/01_tutorial-welcome.png" alt="Tutorial Welcome Page"/>
+
+Click **Start Tour** to start the tour. In this tour, you'll build a simple pipeline that monitors (simulated) live data from a water tank system.
+Within the tour, perform the actions as recommended and click **Next** to trigger the next steps. Some tour steps won't require to select **Next**, but wait for you to take the recommended action.
+You can cancel the tour anytime by clicking the **Exit Tour** button.
+
+<img className="docs-image" src="/img/01_try-tutorial/02_tutorial-process.png" alt="Tutorial Welcome Page"/>
+
+Now after you've built your first pipeline, you might be interested in reading about some of our core [concepts](concepts-overview)
+
+
+## Next Steps
+
+That's it! Have a look at the usage guide to learn how to use Apache StreamPipes.
+
+
 StreamPipes is a framework that enables domain experts to model and execute stream processing pipelines in a big data infrastructure.
 The graphical user interface of StreamPipes is a web application that provides an easy to use solution for domain experts.
 In this page, an overview of the many features of StreamPipes is given. We will tour through all features and explain what they do and how users can interact with them.
@@ -11,7 +86,7 @@ In this page, an overview of the many features of StreamPipes is given. We will
 First of all, a user needs to log in to the system.
 The credentials for the user are specified during the installation process.
 
-![StreamPipes Login](/img/features_0_62_0/login.png) 
+![StreamPipes Login](/img/features_0_62_0/login.png)
 
 ## Home
 After logging in, the user is redirected on to the home page.
@@ -45,7 +120,7 @@ The installation of pipeline elements is explained later in section [Install Pip
     <img src="/img/features_0_62_0/editor/1_PipelineEditor_DataSets.png" alt="Data Sets"/>
 </div>
 
-There are multiple ways to search for a pipeline element. 
+There are multiple ways to search for a pipeline element.
 The easiest way is to enter a search term in the search field on the top left corner.
 The system filters the elements according to the search term and only presents the relevant ones.
 Another way is to select one of the categories from the drop down menu.
@@ -79,7 +154,7 @@ When the user tries to connect two elements that are not compatible, the system
 The example illustrated below shows such a case. The user tried to connect a text filter to a light sensor.
 This is not possible since the text filter processing element requires at least one event property of type string, which is not provided by the light sensor.
 
-![Connection Error](/img/features_0_62_0/editor/10_connection_error.png) 
+![Connection Error](/img/features_0_62_0/editor/10_connection_error.png)
 
 To further improve the usability, multiple ways are available to connect new elements besides the drag and drop option.
 Each processing element has multiple short-cut buttons to connect it with another element.
@@ -92,7 +167,7 @@ Each element can also be re-configured at a later point in time using the config
 There is one important aspect about re-configuration of pipeline elements you need to be aware of: Only elements that are not yet connected to another element can be modified.
 The reason for this behaviour is that some of the following elements might rely on the configuration of previous elements.
 This way it is ensured that the user can not change the behaviour of the pipeline by accident.
- 
+
 
 <div class="my-carousel">
     <img src="/img/features_0_62_0/editor/11_shortcut_buttons.png" alt="Shortcut Buttons"/>
@@ -106,7 +181,7 @@ Especially for larger pipelines, the auto layout button in the editor menu might
 With this button, the pipeline will be beautifully aligned in the editor, helping users to get a better overview of the complete pipeline.
 On the top left corner of the editor, the 'save' button can be found.
 After the modelling of the pipeline is done, use this button to save and execute the pipeline.
-A save dialogue pops up when clicking the save button. 
+A save dialogue pops up when clicking the save button.
 The pipeline title must be entered and an additional description can be provided.
 It is recommended to always provide a description, because it makes it easier for other users to understand the meaning of the pipeline.
 In the save menu, the user can either just store the pipeline configuration or store it and immediately start the pipeline.
@@ -212,7 +287,7 @@ All files stored on the server can be downloaded via the download button.
 If the files are not longer needed, they can be deleted by clicking the delete button.
 This will remove the file from the server.
 Since data is stored in Elasticsearch anyways. it is recommended not to store the files for a longer period of time on the server.
-When a file is needed again at a later point in time it is easy to create it again. 
+When a file is needed again at a later point in time it is easy to create it again.
 This way a lot of disk space on the server can be saved, especially when the files are rather large.
 
 <div class="my-carousel">
@@ -257,7 +332,7 @@ This can be done in the "Install Pipeline Elements" view.
 All available pipeline elements are shown here and can be selected to install or uninstall.
 It is also possible to select multiple or all of them and then install them all together.
 When a new element is installed by the user it is automatically available in the "Pipeline Editor" and can be used for pipelines.
-Elements that are uninstalled are removed from the system. 
+Elements that are uninstalled are removed from the system.
 They can not longer be used within pipelines.
 
 <div class="my-carousel">
@@ -288,7 +363,7 @@ Once a container is registered it is represented in the configuration view.
 The green dot on the top left indicates that tha container is running properly.
 When there is a problem with a container the green dot changes to red and the user knows there is a problem.
 To configure the parameters the top right arrow of a configuration box must be clicked.
-Then the configuration menu pops up. 
+Then the configuration menu pops up.
 Within there it is possible to change the parameters of a service.
 To make the changes persistent the "Update" button must be clicked.
 A user should keep in mind that sometimes it is necessary to restart a container when the parameters are changed.
diff --git a/website-v2/versioned_docs/version-0.92.0/07_technicals-architecture.md b/docs/03_concepts-architecture.md
similarity index 53%
rename from website-v2/versioned_docs/version-0.92.0/07_technicals-architecture.md
rename to docs/03_concepts-architecture.md
index 9a4dfbdf6..1c1651b78 100644
--- a/website-v2/versioned_docs/version-0.92.0/07_technicals-architecture.md
+++ b/docs/03_concepts-architecture.md
@@ -1,5 +1,5 @@
 ---
-id: technicals-architecture
+id: concepts-architecture
 title: Architecture
 sidebar_label: Architecture
 ---
@@ -25,7 +25,7 @@ Multiple extension services can be part of a single StreamPipes installation.
 Each service might provide its own set of extensions. Extensions services register at the StreamPipes Core at startup. Users are able to install all or a subset of extensions of each service.
 This allows StreamPipes to be extended at runtime by starting a new service with additional extensions.
 
-Extensions can be built using the SDK (see [Extending StreamPipes](06_extend-setup.md)).
+Extensions can be built using the SDK (see [Extending StreamPipes](07_extend-setup.md)).
 Extensions services can be provided either in Java or in Python.
 
 :::info
@@ -107,4 +107,94 @@ StreamPipes also supports arrays and nested structures, although we recommend us
 
 
 
+## Architecture
+
+To exchange messages at runtime between individual [Extensions Services](07_technicals-architecture.md), StreamPipes uses external messaging systems.
+This corresponds to an event-driven architecture with a central message broker and decoupled services which consume and produce events from the messaging system.
+
+There are many different open source messaging systems on the market, which each have individual strengths.
+To provide a flexible system which matches different needs, StreamPipes can be configured to use various messaging systems.
+
+## Supported messaging systems
+
+The following messaging systems are currently supported:
+
+* Apache Kafka
+* Apache Pulsar
+* MQTT
+* NATS
+
+## Configure StreamPipes to use another messaging system
+
+Configuring StreamPipes for one of these messaging system is an installation-time configuration.
+We currently do not recommend to change the configuration at runtime.
+
+The protocol can be configured with the environment variable `SP_PRIORITIZED_PROTOCOL` assigned to the core with one of the following values:
+
+```bash
+SP_PRIORITIZED_PROTOCOL=kafka # Use Kafka as protocol
+SP_PRIORITIZED_PROTOCOL=pulsar # Use Pulsar as protocol
+SP_PRIORITIZED_PROTOCOL=mqtt # Use MQTT as protocol
+SP_PRIORITIZED_PROTOCOL=nats # Use NATS as protocol
+```
+
+Note that each extension service can support an arbitrary number of protocols. For instance, you can have a lightweight extension service which only supports NATS, but have another, cloud-centered service which supports Kafka, both registered at the Core.
+To select a protocol when multiple protocols are supported by two pipeline elements, StreamPipes selects a protocol based on a priority, which can be configured in the [Configuration View](06_configure-operate-general-settings.md).
+StreamPipes ensures that only pipeline elements which have a commonly supported protocol can be connected.
+
+Note that you might need to change the installation files. For the `Docker-Compose` based installation, we provide various compose file for different messaging setups. For the `Kubernetes` installation, we provide variables which can be set in the helm chart's `values.yaml` file.
+
+### Configure broker addresses
+
+By default, StreamPipes assumes that the messaging system is started from its own environment, e.g., the system configured in the selected `Docker-Compose` file.
+
+Besides that, it is also possible to let StreamPipes connect to an externally provided messaging system. For this purpose, various environment variables exist.
+
+* `SP_PRIORITIZED_PROTOCOL` to set the prioritized protocol to either `kafka`, `mqtt`, `nats` or `pulsar`
+
+* `SP_KAFKA_HOST`, `SP_KAFKA_PORT` to configure Kafka access
+* `SP_MQTT_HOST`, `SP_MQTT_PORT` to configure MQTT access
+* `SP_NATS_HOST`, `SP_NATS_PORT` to configure NATS access
+* `SP_PULSAR_URL` to configure Pulsar access
+
+
+Most settings can also be set in the UI under `Settings->Messaging`.
+
+:::warning Installation-time configurations
+Although it is currently possible to change messaging settings in the user interface, we do not support dynamic modification of messaging systems.
+Choosing a proper system is considered an installation-time setting which should not be changed afterwards.
+Already existing Adapters and pipeline elements are not properly updated after changes of the messaging layer.
+:::
+
+
+## Overview
+
+In general, StreamPipes has an exchangeable runtime layer, e.g., the actual processing of incoming events can be delegated to a third-party stream processing system such as Kafka Streams or Apache Flink.
+
+The default runtime wrapper is the StreamPipes Native Wrapper, called the `StandaloneWrapper`.
+
+Although not recommended for production, we invite interested developers to check out our experimental wrappers:
+
+* Kafka Streams runtime wrapper at [https://github.com/apache/streampipes/tree/dev/streampipes-wrapper-kafka-streams](https://github.com/apache/streampipes/tree/dev/streampipes-wrapper-kafka-streams)
+* Apache Flink runtime wrapper at [https://github.com/apache/streampipes/tree/dev/streampipes-wrapper-flink](https://github.com/apache/streampipes/tree/dev/streampipes-wrapper-flink)
+
+## Assigning a runtime wrapper to an extension service
+
+Runtime wrappers can be assigned in the `Service Definition` of the `Init` class of an extension service:
+
+```java
+
+  @Override
+  public SpServiceDefinition provideServiceDefinition(){
+    return SpServiceDefinitionBuilder.create("org.apache.streampipes.extensions.all.jvm",
+    "StreamPipes Extensions (JVM)",
+    "",8090)
+    ...
+    .registerRuntimeProvider(new StandaloneStreamPipesRuntimeProvider())
+    ...
+    .build();
+  }
+
+```
 
+Please let us know through our communication channels if you are interested in this feature and if you are willing to contribute!
diff --git a/website-v2/versioned_docs/version-0.93.0/02_introduction.md b/docs/03_concepts-introduction.md
similarity index 99%
rename from website-v2/versioned_docs/version-0.93.0/02_introduction.md
rename to docs/03_concepts-introduction.md
index 6dc71b384..5b845ebfe 100644
--- a/website-v2/versioned_docs/version-0.93.0/02_introduction.md
+++ b/docs/03_concepts-introduction.md
@@ -1,5 +1,5 @@
 ---
-id: introduction
+id: concepts-introduction
 title: Introduction
 sidebar_label: Introduction
 ---
diff --git a/website-v2/versioned_docs/version-0.93.0/02_concepts-overview.md b/docs/03_concepts-terms.md
similarity index 91%
rename from website-v2/versioned_docs/version-0.93.0/02_concepts-overview.md
rename to docs/03_concepts-terms.md
index f26f3cc07..e85ec995a 100644
--- a/website-v2/versioned_docs/version-0.93.0/02_concepts-overview.md
+++ b/docs/03_concepts-terms.md
@@ -1,7 +1,7 @@
 ---
-id: concepts-overview
-title: StreamPipes Concepts
-sidebar_label: Overview
+id: concepts-terms
+title: Terms
+sidebar_label: Terms
 ---
 
 To understand how StreamPipes works, it is helpful to understand a few core concepts, which are illustrated below.
@@ -13,17 +13,17 @@ to data persistence and distribution ([data sinks](#data-sink)).
 
 ## Adapter
 An adapter connects to any external data source (e.g., OPC-UA, MQTT, S7 PLC, Modbus) and forwards the events it receives to the internal StreamPipes system.
-Adapters can either be created by using a predefined adapter for a data source available in our marketplace [StreamPipes Connect](./03_use-connect.md).
+Adapters can either be created by using a predefined adapter for a data source available in our marketplace [StreamPipes Connect](04_use-connect.md).
 An overview of all available adapters can be found under the menu bar **📚 Pipeline Elements**.
 When you select one of these adapters, you can easily connect to the data source using an intuitive and convenient UI dialog (see the Connect section for more details).
-Alternatively, you can define your own adapter by [using the provided Software Development Kit (SDK)](./06_extend-tutorial-adapters.md).
+Alternatively, you can define your own adapter by [using the provided Software Development Kit (SDK)](05_how-to-custom-adapter.md).
 Creating an adapter is always the first step when you want to get data into StreamPipes and process it further.
 
 ## Data Stream
 **Data streams** are the primary source for working with events in StreamPipes.
 A stream is an ordered sequence of events, where an event typically consists of one or more observation values and additional metadata.
 The `structure` (or `schema` as we call it) of an event provided by a data stream is stored in StreamPipes' internal semantic schema registry.
-Data streams are primarily created by adapters, but can also be created by a [StreamPipes Function](./06_extend-sdk-functions.md).
+Data streams are primarily created by adapters, but can also be created by a [StreamPipes Function](07_extend-sdk-functions.md).
 
 ## Data Processor
 **Data processors** in StreamPipes transform one or more input streams into an output stream.
@@ -43,4 +43,4 @@ In addition, StreamPipes provides several data sinks to forward data streams to
 ## Pipeline
 A pipeline in Apache StreamPipes describes the transformation process from a data stream to a data sink.
 Typically, a pipeline consists of at least one data stream, zero or more data processors, and at least one data sink.
-Pipelines are created graphically by users using the [Pipeline Editor](./03_use-pipeline-editor.md) and can be started and stopped at any time.
+Pipelines are created graphically by users using the [Pipeline Editor](04_use-pipelines.md) and can be started and stopped at any time.
diff --git a/docs/03_use-configurations.md b/docs/03_use-configurations.md
deleted file mode 100644
index 4aa953fbb..000000000
--- a/docs/03_use-configurations.md
+++ /dev/null
@@ -1,48 +0,0 @@
----
-id: use-configurations
-title: Configurations
-sidebar_label: Configurations
----
-
-The configuration section is an admin-only interface for system-wide settings.
-
-## General configuration
-
-<img className="docs-image" src="/img/03_use-configurations/01_general-configuration.png" alt="General configuration"/>
-
-The general configuration serves to provide basic system settings. The basic settings allow to configure the app name (which is used, e.g., for mails sent by StreamPipes). 
-Additionally, the externally available host and port can be set which is used by the mail system to add links to emails.
-
-Furthermore, self-registration and password recovery features can be activated in this view. Note that both features require a working email configuration.
-
-## Datalake
-
-<img className="docs-image" src="/img/03_use-configurations/02_datalake-configuration.png" alt="Datalake configuration"/>
-
-Here, stored data lake databases can be truncated or deleted. The view also gives information on the number of data points currently stored in a measurement series.
-
-## Email configuration
-
-<img className="docs-image" src="/img/03_use-configurations/03_email-configuration.png" alt="Email configuration"/>
-
-In this section, the email configuration is set. The email configuration is used to send mails to users. Most standard mail server settings are supported. The configuration can be validated by triggering a test mail that is sent to a given recipient.
-
-## Messaging
-
-<img className="docs-image" src="/img/03_use-configurations/04_messaging-configuration.png" alt="Messaging configuration"/>
-
-Messaging configuration is used to control parameters used for communication between pipeline elements. Individual Kafka settings can be configured, as well as the priority of selected message formats and protocols during pipeline creation.
-
-## Pipeline Element Configuration
-
-<img className="docs-image" src="/img/03_use-configurations/05_pipeline-element-configuration.png" alt="Pipeline element configuration"/>
-
-Individual configurations of extensions services are available in this view. The available configurations depend on the provided configuration variables in the service definition of each extensions service.
-
-## Security
-
-<img className="docs-image" src="/img/03_use-configurations/06_security-configuration.png" alt="Messaging configuration"/>
-
-The security configuration allows to manage existing user accounts, service accounts and groups. New users can be added and roles can be assigned.
-
-Please also read more about security [here](05_deploy-security.md).
diff --git a/docs/03_use-connect.md b/docs/03_use-connect.md
deleted file mode 100644
index ba8146481..000000000
--- a/docs/03_use-connect.md
+++ /dev/null
@@ -1,72 +0,0 @@
----
-id: use-connect
-title: StreamPipes Connect
-sidebar_label: StreamPipes Connect
----
-
-StreamPipes Connect is the module to connect external data sources with Apache StreamPipes directly from the user interface. 
-StreamPipes Connect offers various adapters for common communication protocols and some specific sensors. Besides connecting data, StreamPipes Connect offers ways to pre-process data without the need to build pipelines and integrates a schema guesser that listens for incoming data and recommends the recognized event schema.
-
-The screenshot below illustrates the data marketplace, which shown after navigating to "StreamPipes Connect" and then clicking the "New adapter" button at the top.
-
-<img className="docs-image" src="/img/03_use-connect/01_connect-overview.png" alt="StreamPipes Connect Overview"/>
-
-## Connecting new data sources
-
-### Data Marketplace
-The data marketplace shows a list of all adapters that are currently installed in Apache StreamPipes. Each adapter offers various configuration options which depend on the specifics of the adapter.
-Adapters are distinguished a) by the data source concept they provide (data set or data stream) and b) the adapter type, where we distinguish between _generic adapters_, which usually implement a generic communication protocol such as MQTT or Apache Kafka or a specific sensor interface (e.g., for Netio power sockets).
-Several filter options are available to find a suitable adapter. The configuration of a new adapter starts with selecting one of the available adapters, which starts an assistant that supports the adapter generation.
-
-### Protocol/Basic Settings
-In the first step, basic configurations need to be provided. For instance, for an Apache PLC4X adapter, the IP address of the PLC needs to be provided. In this example, we provide basic settings for connecting to an Apache Kafka broker. After all values are provided, the "Next" button opens the next step. 
-
-<img className="docs-image" src="/img/03_use-connect/06_connect-create.png" alt="StreamPipes Connect Basic Settings"/>
-
-### Format Specification
-The next step, format generation, is only available for generic adapters which support different message formats to be sent over the corresponding protocol. Think of a message broker that is able to consume messages in both JSON format or binary format.
-Currently supported formats include XML, various JSON representations, images and CSV. After a format has been selected, further format configurations can be provided (depending on the selected format) to further customize the incoming message format.
-
-<img className="docs-image" src="/img/03_use-connect/02_customize-format.png" alt="StreamPipes Connect Format Selection"/>
-
-### Schema Editor
-In the next step, based on the previously provided protocol and format settings, the system will either provide the fixed/pre-defined schema of the adapter or, in case of specific adapters, will connect to the underlying system and try to listen for incoming data. After a few seconds, the schema editor will appear that provides a list of detected fields from the incoming events (the schema).
-
-<img className="docs-image" src="/img/03_use-connect/03_schema-editor.png" alt="StreamPipes Connect Schema Editor"/>
-
-In the toolbar, several configuration options are available which transform the original schema:
-
-* **Add Nested Property**. This option allows to modify the structure of the event by creating a nested structure. The schema can be simply changed by dragging and dropping fields into the nested structure.
-* **Add Static Value**. This option allows to add a field containing a static value (e.g., an identifier) to the event.
-* **Add Timestamp**. This options appends the current timestamp to each incoming event, useful in case the timestamp is not provided by the origin.
-* **Refresh**. Re-triggers the schema guessing.
-* **Delete field**. Select one or more fields by clicking the checkbox on the right and trigger the delete button.
-* **Property scope**. For each field, a property scope can be defined which is either _Measurement_, _Dimension_ or _Header_. These values are later be used in the pipeline editor to assist in configuring pipeline elements and do not have any functional consequence. 
-Use _Measurement_ to indicate the field measures a value (e.g., a temperature value from a sensor), use _Dimension_ for any identifier (e.g., the sensor ID) and use _Header_ for any other metadata such as timestamps.
-
-For each field (also called event property) of the schema, additional configuration options are available by clicking the _Edit_ button:
-
-* **Label**. Used to provide a human-readable label for the field, which will ease the identification of fields when building pipelines.
-* **Runtime Name.** This is the identifier of the field in the underlying message representation format (e.g., the JSON key). Renaming the runtime name will trigger a so-called _transformation rule_ which renames the incoming field name to the new field name before forwarding it to StreamPipes.
-* **Domain Property/Semantic Type**. To help StreamPipes better understand the value which is represented by the field, semantic type information can be given. Up from StreamPipes 0.68.0, the semantic type can be selected from a wide range of available options. Additionally, an URL can be manually provided that indicates the meaning of the value (e.g., http://schema.org/Temperature).
-* **Mark as Timestamp**. Indicates that the selected value represents a timestamp. When selected, a _timestamp converter_ can be configured which will convert incoming timestamps to the UNIX timestamp.
-* **Runtime Type**. Here, the data type can be changed  
-* **Unit**. Allows to specify the unit in which the value is measured. Once selected, you can also automatically convert the unit to a target unit, which will then be inserted into the data stream produced by the adapter (see screenshot below). 
-
-<img className="docs-image" src="/img/03_use-connect/04_schema-editor-conversion.png" alt="StreamPipes Connect Unit Conversion"/>
-
-Assigning a timestamp is mandatory and can be either done by adding a timestamp from the menu, or by choosing an existing field and marking it as timestamp.
-
-### Adapter Generation
-Finally, the adapter is ready to be started. In the _Adapter Generation_ page, a name and description for the resulting data stream must be provided.
-Once started, StreamPipes creates your new adapter and displays a preview of the connected data, which refreshes about once per second.
-Afterwards, the newly created data stream is available in the pipeline editor for further usage.
-
-<img className="docs-image" src="/img/03_use-connect/05_adapter-generation.png" alt="StreamPipes Connect Adapter Generation"/>
-
-## Managing adapters
-
-Currently running adapters are available in the "Running adapters" section of StreamPipes Connect. Existing adapters can be stopped and deleted. Currently, there is no mechanism to edit an existing adapter or to stop the adapter without deleting it.
-
-### Adapter Templates
-For frequently used configurations, adapter templates can be created. An adapter template is a pre-configured adapter which can be further customized by users. Created adapter templates are available in the marketplace similar to standard adapters.
diff --git a/docs/03_use-dashboard.md b/docs/03_use-dashboard.md
deleted file mode 100644
index 339bf6b57..000000000
--- a/docs/03_use-dashboard.md
+++ /dev/null
@@ -1,66 +0,0 @@
----
-id: use-dashboard
-title: Live Dashboard
-sidebar_label: Live Dashboard
----
-
-The live dashboard can be used to visualize live data of data streams using a set of visualizations
-The entry page of the live dashboard lists all created dashboards as in the screenshot below:
-
-<img className="docs-image" src="/img/03_use-dashboard/01_dashboard-overview.png" alt="StreamPipes Dashboard Overview"/>
-
-## Visualizing Data Streams
-
-To visualize data streams in the live dashboard, a pipeline must be created that makes use of the so-called **Data Lake** sink.
-Any data stream or data processor can serve as an input of the data lake sink. Switch to the pipeline editor, create a pipeline and configure the data lake sink. The visualization name is used to identify the sink in case multiple data lake sinks are used within a single pipeline.
-
-## Managing Dashboards
-Multiple dashboards can be created, e.g., to organize different assets in a single dashboard view.
-
-A new dashboard can be created by clicking the _New Dashboard_ button, which opens a dialog that requires basic dashboard settings such as the title and description of the new dashboard.
-Once created, the dashboard will be shown in the overview. Here, the following dashboard actions are available:
-
-* **Show** opens the dashboard.
-* **Window** opens the dashboard in a new window with reduced controls, e.g., without the StreamPipes navigation and toolbar. This is a useful view for standalone displays that should visualize key parameters.
-* **Settings** allows to modify the basic dashboard settings. 
-* **Edit** opens the dashboard in edit mode, where widgets can be added to the dashboard.
-+ **Delete** deletes the selected dashboard.
-
-## Creating Visualizations
-
-Visualizations can be added to each dashboard in form of widgets. To add new visualizations, switch to the dashboard in _Edit_ mode.
-In edit mode, a button appears that allows to add a new visualization.
-
-Adding a new visualization is supported by a wizard consisting of three steps:
-
-<img className="docs-image" src="/img/03_use-dashboard/02_add-widget.png" alt="StreamPipes Dashboard Pipeline Selection"/>
-
-* **Select pipeline** is the first step where a pipeline is selected on which the visualization is based. In this view, all pipelines are listed that have at least one **Dashboard Sink**. In case a pipeline contains multiple data lake sinks, the visualization name is listed below the pipeline name which eases discovering of the proper visualization.
-* **Select widget** is the next step where the visualization widget must be selected. StreamPipes automatically filters this list based on input requirements of widgets. For instance, image visualizations are only visible if the input data stream provides an image object.
-* **Configure widget** provides widget-specific settings to configure the visualization. In most cases, colors and titles of widgets can be modified. Additionally, chart-specific settings such as axis value ranges can be configured.
-
-<img className="docs-image" src="/img/03_use-dashboard/03_configure-widget.png" alt="StreamPipes Dashboard Widget Configuration"/>
-
-By clicking _Create_, the new widget is placed on the canvas. Size and positioning of visualizations can be flexibly changed based on the provided grid. To change the widget configuration, the _Settings_ button of each widget can be clicked to re-open the configuration dialog.
-
-Once created, the dashboard provides a live view of all visualizations:
-
-<img className="docs-image" src="/img/03_use-dashboard/04_live-dashboard.png" alt="StreamPipes Live Dashboard"/>
-
-
-Before the dashboard is closed, make sure to click the _Save_ button to persist the updated dashboard. Changes can be discarded by clicking the _Discard_ button.
-
-
-## Available widgets
-
-The following visualizations are available in the latest release:
-
-* Area Chart
-* Gauge
-* HTML page (renders HTML markup)
-* Image  
-* Line Chart
-* Raw (displays the raw JSON input for debugging purposes)
-* Single Value (displays a single measurement)
-* Table
-* Traffic Light
diff --git a/docs/03_use-install-pipeline-elements.md b/docs/03_use-install-pipeline-elements.md
deleted file mode 100644
index 852693200..000000000
--- a/docs/03_use-install-pipeline-elements.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-id: use-install-pipeline-elements
-title: Install Pipeline Elements
-sidebar_label: Install Pipeline Elements
----
-
-## Install Pipeline Elements
-
-(coming soon)
diff --git a/docs/03_use-managing-pipelines.md b/docs/03_use-managing-pipelines.md
deleted file mode 100644
index 2c64b53ee..000000000
--- a/docs/03_use-managing-pipelines.md
+++ /dev/null
@@ -1,52 +0,0 @@
----
-id: use-managing-pipelines
-title: Managing Pipelines
-sidebar_label: Managing Pipelines
----
-
-The pipeline view lists all created pipelines and provides several views and actions to manage the lifecycle of pipelines.
-
-In the entry screen, an overview of all created pipelines is shown:
-
-<img className="docs-image" src="/img/03_use-managing-pipelines/01_pipeline-overview.png" alt="StreamPipes Pipeline Overview"/>
-
-## Pipeline Actions
-Within the pipeline overview, for each pipeline several actions are available:
-* **Start/Stop pipeline** Starts or stops the selected pipeline. Once clicked, StreamPipes will trigger the selected action for all pipeline elements and open a success or error dialog as illustrated below.
-* **Show details** opens the pipeline detail view (see below).  
-* **Modify pipeline** opens the pipeline in the pipeline editor, where the pipeline can be modified. Note that this button is only visible if the pipeline is not running.
-* **Delete pipeline** opens a confirm dialog, which subsequently deletes the selected pipeline.
-
-The screenshot below shows the status of a pipeline after it has been successfully started. By clicking the _Show details_ button, more information on the status of each corresponding pipeline element microservice becomes available. In case of failures, the failure reason will be shown for each pipeline element that has failed to start.
-
-<img className="docs-image" src="/img/03_use-managing-pipelines/02_pipeline-start-dialog.png" alt="StreamPipes Pipeline Start Dialog"/>
-
-## Organizing Pipelines into Categories
-Pipelines can be organized into categories, which is a useful feature in case a larger amount of pipelines is created.
-All categories will be shown as separate tabs in the pipeline overview. The same pipeline can be assigned to multiple categories.
-
-To add a new category or to add a new pipeline to an existing category, click the _Manage Categories_ button and configured the category and assigned pipelines in the dialog.
-
-## Pipeline Details
-The pipeline details view can be opened by clicking the _Show details_ button in the pipeline overview panel.
-
-<img className="docs-image" src="/img/03_use-managing-pipelines/03_pipeline-details.png" alt="StreamPipes Pipeline Details"/>
-
-### Overview
-The overview section displays the graphical structure of the pipeline and provides some statistics about recent pipeline actions. Additionally, pipelines can be directly started, stopped, modified and deletes within this view.
-
-### Monitoring
-Monitoring features will become available in version 0.68.0.
-
-### Errors
-Monitoring of failures and logs will become available in version 0.69.0.
-
-### QuickEdit
-The quick edit feature (only available for pipelines that are not running) is a quick and convenient way to modify some pipeline element configurations without opening the pipeline in the pipeline editor.
-To use the quick edit feature, switch to the _QuickEdit_ tab, which will display the selected pipeline.
-
-By clicking a pipeline element from the preview canvas, available configuration options of the selected pipeline element can be modified. Note that only modifications that do not affect the pipeline structure (e.g., different output streams) can be changed.
-
-<img className="docs-image" src="/img/03_use-managing-pipelines/04_pipeline-quick-edit.png" alt="StreamPipes Pipeline Quick Edit"/>
-
-After a configuration value was changed, make sure to click the _Update Pipeline_ button to save the changes.
diff --git a/docs/03_use-notifications.md b/docs/03_use-notifications.md
deleted file mode 100644
index b5c64ed98..000000000
--- a/docs/03_use-notifications.md
+++ /dev/null
@@ -1,25 +0,0 @@
----
-id: use-notifications
-title: Notifications
-sidebar_label: Notifications
----
-
-The notification module can be used to create internal notifications.
-
-<img className="docs-image" src="/img/03_use-notifications/01_notifications-overview.png" alt="StreamPipes Notifications"/>
-
-## Using notifications
-
-Any pipeline that includes the data sink **Notification** can trigger notifications that appear in the notification view. To configure a new notification, switch to the pipeline editor and append the notification sink to a data processor or data stream.
-The sink requires a title and message as configuration parameters.
-
-### Placeholders
-
-The notification message can include placeholders for fields which are replaced with the actual value at runtime.
-
-## Managing notifications
-
-The notification view is split into two parts. The left sides lists all pipelines which include a notification sink. By selecting a pipeline, available notifications will be shown in the right panel.
-By scrolling up, older notifications become visible. Notifications that have appeared in the detail view will be automatically marked as read, so that only new, unread notifications will appear in the left toolbar.
-
-
diff --git a/docs/03_use-pipeline-editor.md b/docs/03_use-pipeline-editor.md
deleted file mode 100644
index f09cf8486..000000000
--- a/docs/03_use-pipeline-editor.md
+++ /dev/null
@@ -1,62 +0,0 @@
----
-id: use-pipeline-editor
-title: Pipeline Editor
-sidebar_label: Pipeline Editor
----
-
-The pipeline editor module supports building pipelines that transform a data stream using a set of resuable data processors and data sinks.
-The empty pipeline editor looks similar to the illustration below after a new installation.
-
-<img className="docs-image" src="/img/03_use-pipeline-editor/01_pipeline-editor-overview.png" alt="StreamPipes Pipeline Editor Overview"/>
-
-## Pipeline Elements
-The four main concepts data sets, data streams, data processors and data sinks are available at the top of the pipeline editor. By switching the tabs, the individual pipeline elements for each category can be found.
-By clicking the questionmark symbol, which appears when hovering over an element, additional information can be viewed (e.g., for data streams a live preview of incoming data and the documentation of the pipeline element for data processors and sinks).
-
-<img className="docs-image" src="/img/03_use-pipeline-editor/02_pipeline-element-info.png" alt="StreamPipes Pipeline Element Info"/>
-
-## Creating Pipelines
-Pipelines are built by dragging data streams, processors and sinks into the pipeline assembly area. Typically, a pipeline is built step-by-step starting with a data soure (stream or set). 
-Afterwards, data processors and sinks are subsequently added to the pipeline. Connections between pipeline elements are made by selecting the gray connector of the source and moving it to the target pipeline element.
-Once a connection is made, StreamPipes performs a quick validation step and, in case two pipeline elements are compatible, automatically opens a configuration window.
-
-### Configuring Pipeline Elements
-The configuration depends on the selected pipeline element and looks similar to the screenshot below.
-In general, pipeline elements are configured by providing the required values. Once the pipeline element is fully configured, the _Save_ button activates and can be used to save the configuration for the pipeline element.
-
-<img className="docs-image" src="/img/03_use-pipeline-editor/03_configure-pipeline-element.png" alt="StreamPipes Pipeline Element Configuration"/>
-
-In addition, the following options are available in the pipeline element configuration menu:
-* **Show documentation** extends the view and displays the pipeline element's documentation next to the configuration view.
-* **Show only recommended settings** filters the list of available fields provided by the connected input data stream based on the _property scope_, e.g., so that only measurement values are displayed and dimension fields from the input stream are not available for selection. If deactivated, selections contain the full list of available fields that match the input requirement of the data processor.
-
-### Pipeline Element Options
-Further options for a pipeline element can be displayed by hovering over a pipeline element in the assembly area, so that additional buttons appear around the pipeline element:
-
-* **Configure element** re-opens the configuration view to update the pipeline element configuration (only available for data processors and sinks)
-* **Delete element** removes the pipeline element from the pipeline  
-* **Help** opens the pipeline element's documentation
-* **Compatible element** opens a dialog which shows all pipeline elements that are compatible to the current element's output data stream. The dialog offers an alternative to selecting pipeline elements directly from the pipeline element selection in the top.
-* **Pipeline Element Recommendation** opens a dialog which shows all recommended pipeline elements that are compatible the current element's output data stream. The recommendation is based on previously connected pipeline elements and is displayed below.
-
-### Pipeline Editor Options
-Several pipeline editor options are available in the menu bar of the pipeline assembly:
-
-<img className="docs-image" src="/img/03_use-pipeline-editor/05_pipeline-editor-options.png" alt="StreamPipes Pipeline Editor Options"/>
-
-* **Save pipeline** opens the save dialog (see below)
-* **Pan** allows to pan within the assembly area, useful for larger pipelines that do not fit in the screen
-* **Select** is visible if pan mode is active and switches back to the default select mode
-* **Zoom in/out** triggers the zoom in the pipeline assembly
-* **Auto Layout** layouts the pipeline in a much more beautiful way than you are able to do by yourself ;-)
-* **All pipeline modification saved** is displayed if the current pipeline has been cached. Cache updates are triggered after every change of the pipeline so that changes are not lost after reloading the window.
-* **Hints** are shown to display current errors (e.g., incomplete pipelines). Details can be opened by clicking the hint button.
-* **Clear assembly** clears the assembly and removes the current pipeline.
-
-### Saving a pipeline
-To save a pipeline, press the _save pipeline_ button. A dialog pops up where a name and description of the pipeline can be entered (only name is mandatory).
-Additionally, a pipeline can be directly started after it has been stored by checking the corresponding button.
-
-<img className="docs-image" src="/img/03_use-pipeline-editor/06_save-pipeline.png" alt="StreamPipes Save Pipeline Dialog"/>
-
-
diff --git a/docs/03_use-programmatically-create-adapters.md b/docs/03_use-programmatically-create-adapters.md
deleted file mode 100644
index 1c791dc39..000000000
--- a/docs/03_use-programmatically-create-adapters.md
+++ /dev/null
@@ -1,154 +0,0 @@
----
-id: use-programmatically-create-adapters
-title: Adapters as Code
-sidebar_label: Adapters as Code
----
-
-In Apache StreamPipes, adapters are typically created via the web interface. 
-However, it is possible to create adapters programmatically using a compact YAML format and the StreamPipes REST API. 
-Programmatic creation of adapters can be a useful feature in cases where many similar adapters have to be created. 
-In this case, an externally managed YAMl file containing the full adapter configuration can be used and modified.
-
-## Introduction
-
-In StreamPipes, adapters are responsible for collecting data from various industrial data sources. 
-While the UI simplifies this process, you can also manage adapters programmatically for better automation, integration with CI/CD pipelines, or infrastructure-as-code practices.
-
-This guide demonstrates how to define and create adapters using a YAML format and StreamPipes REST API, offering more flexibility to manage adapters programmatically.
-
-## Adapter YAML Structure
-
-An adapter in StreamPipes can be defined using a YAML file, which contains a compact description of the adapter configuration.
-The basic structure of the YAML format for an adapter definition includes:
-
-- **Name**: The name of the adapter.
-- **ID**: A unique ID for the adapter
-- **Description**: An additional description of the adapter
-- **AppID**: The adapter type
-- **Configuration**: Configuration details such as connection details, polling intervals, data format, and more
-- **Schema**: Schema refinements, e.g., additional label, description, semantic type and property scope
-- **Enrich**: Enrichment rules. Currently, only timestamp enrichment rules are supported in the YAML specification
-- **Transform**: Transformation rules. Currently, rename and measurement unit transforms are supported.
-- **CreateOptions**: Additional operations that are executed upon adapter generation.
-
-Here’s a sample structure to define an OPC-UA adapter:
-
-```yaml
-name: My OPC Adapter
-id: testadapter
-description: Test
-appId: org.apache.streampipes.connect.iiot.adapters.opcua
-configuration:
-  - opc_host_or_url: OPC_URL
-    opc_server_url: opc.tcp://localhost:62541/milo
-  - adapter_type: PULL_MODE
-    pulling_interval: 1000
-  - access_mode: UNAUTHENTICATED
-  - available_nodes:
-    - "ns=2;s=Leakage Test Station/temperature"
-    - "ns=2;s=Leakage Test Station/pressure"
-
-schema:
-  temperature:
-    propertyScope: measurement
-    label: Temp
-    description: Temperature value
-    semanticType: http://schema.org/temperature
-
-enrich:
-  timestamp: timestamp
-
-transform:
-  rename:
-    pressure: pressure3
-
-createOptions:
-  persist: true
-  start: true
-```
-
-## Programmatically creating adapters
-
-Here is a walkthrough to create an adapter programmatically over the API:
-
-### Background: Internal adapter generation process
-
-The YAML definition file is a more compact notation of StreamPipes internal data format to represent an adapter.
-When creating an adapter over the user interface, StreamPipes requires some basic, adapter-specific settings.
-Afterwards, a `Guess Schema` step is executed. In this step, StreamPipes connects to the underlying data sources, receives some samples of live data, determines the exact schema of the data stream and provides user with the source schema.
-This schema can be further refined using `Transformation Rules`. 
-
-When an adapter is created using the more compact YAML notation, the same process is applied. Based on the provided configuration, the API connects to the given data source and determines the schema.
-The transformation rules provided in the YAMl definition are then applied on the original schema.
-Therefore, it is important that the provided schema refinement and transformation steps fit the original schema.
-
-### Getting a valid definition file
-
-The easiest way to create a valid YAML file is the user interface. Within the StreamPipes Connect view, it is possible to export the YAML definition for all existing adapters.
-In addition, the adapter generation wizard also offers the option to view the adapter configuration before creating the adapter by clicking the `Code` checkbox:
-
-<img className="docs-image" src="/img/03_use-programmatically-create-adapters/01_adapter-generation-code.png" alt="StreamPipes Adapter Code View"/>
-
-Another option is to open the adapter details view:
-
-<img className="docs-image" src="/img/03_use-programmatically-create-adapters/02_adapter-details-view-code.png" alt="StreamPipes Adapter Details Code View"/>
-
-You can copy this definition and modify it according to your needs.
-
-#### Configuration
-
-For each configuration option in the user interface, there is a mapping to the YAMl definition.
-
-A configuration value is a key/value pair, where the key corresponds to the internal name of the configuration and the value depends on the configuration type.
-
-#### Schema
-
-Schema definitions enhance the metadata of each field from the input stream.
-The following configurations are supported:
-
-* `label` to add an additional (human-readable) label to the field
-* `description` for an additional description
-* `propertyScope` to determine the type of the field (HEADER_PROPERTY, DIMENSION_PROPERTY or MEASUREMENT_PROPERTY)
-* `semanticType` to provide the semantic type of the field (e.g., `https://schema.org/temperature`)
-
-#### Enrich
-
-* `timestamp` defines that an additional field named timestamp is added to each incoming event containing the ingestion time as a UNIX timestamp.
-
-#### Transform
-
-Currently, the following transforms are supported:
-
-* `rename` defines renaming of individual fields from the input stream. A valid configuration consists of a key/value pair, where the key indicates the original field name and the value the target field name.
-* `measurementUnit` defines a value transformation between measurement units. A valid configuration consists of a key/value pair, where the key indicates the field name and the value the target measurement unit.
-
-#### CreateOptions
-
-Currently, two settings can be provided in the `CreateOptions` section:
-
-* `persist` indicates whether the data stream produced by the adapter should also be stored. In this case, a `Persist Pipeline` is automatically created.
-* `start` indicates whether the adapter should be immediately started after creation.
-
-### API
-
-To create a new adapter, call the StreamPipes API as follows:
-
-```
-POST /streampipes-backend/api/v2/connect/compact-adapters
-Content-type: application/yml
-Accept: application/yml
-```
-
-You must provide valid credentials by either adding a Bearer token or an API key:
-
-```
-X-API-USER: your username
-X-API-KEY: your api key
-```
-
-The body of the request should contain the YAML definition.
-
-:::info
-It is also possible to provide the adapter specification as a JSON document. In this case, change the `Content-type` to `application/json`.
-
-
diff --git a/docs/03_use-programmatically-create-pipelines.md b/docs/03_use-programmatically-create-pipelines.md
deleted file mode 100644
index a3a117bbc..000000000
--- a/docs/03_use-programmatically-create-pipelines.md
+++ /dev/null
@@ -1,164 +0,0 @@
----
-id: use-programmatically-create-pipelines
-title: Pipelines as Code
-sidebar_label: Pipelines as Code
----
-
-In Apache StreamPipes, pipelines represent the flow of data from sources (streams), through processors (filters, transformations, etc.), and finally to sinks (third-party-systems, storage, notifications). 
-Traditionally, pipelines are created through the web-based user interface. 
-However, they can also be defined programmatically as code, offering the flexibility to manage pipelines using Infrastructure as Code (IaC) practices.
-
-This guide explains how to define and create pipelines programmatically using a YAML structure.
-
-## Introduction
-
-Defining pipelines as code allows you to automate the creation, management, and deployment of StreamPipes pipelines. 
-This is especially useful for managing multiple StreamPipes instances across environments. 
-Pipelines are written in a YAML format (or alternatively as JSON) and can be deployed programmatically via the StreamPipes REST API.
-
-This guide provides an overview of how to structure pipeline definitions in YAML and deploy them using the API.
-
-## Pipeline YAML Structure
-
-A pipeline in YAML consists of several key sections:
-
-- **ID**: A unique identifier for the pipeline.
-- **Name and Description**: Optional fields to describe the pipeline.
-- **Pipeline Elements**: The components that make up the pipeline, including streams (data sources), processors (data transformations), and sinks (output destinations).
-- **Create Options**: Specifies how and when to start the pipeline (e.g., `start: false` means the pipeline won't start automatically).
-
-Here’s a high-level breakdown of the structure:
-
-```yaml
-id: my-pipeline
-name: ""
-description: ""
-pipelineElements:  # Define pipeline components here
-  - type: stream     # Data source
-    ref: <reference> # Unique reference ID
-    id: <data-stream-id> # ID of the stream
-
-  - type: processor  # Data transformation
-    ref: <reference> # Unique reference ID
-    id: <processor-id> # ID of the processor
-    connectedTo:     # Previous pipeline element reference(s)
-      - <reference>
-    configuration:   # Processor-specific configurations
-      - <configuration-option>
-
-  - type: sink       # Data sink (output)
-    ref: <reference> # Unique reference ID
-    id: <sink-id>    # ID of the sink
-    connectedTo:     # Previous pipeline element reference(s)
-      - <reference>
-    configuration:   # Sink-specific configurations
-      - <configuration-option>
-
-createOptions:
-  start: <true|false>  # Whether to start the pipeline immediately
-```
-
-## Pipeline Elements
-
-### Building blocks
-
-The key building blocks of a pipeline include:
-
-#### Stream
-A stream represents a data source in the pipeline, such as a sensor feed, API, or message queue. It is referenced by a unique ID that identifies the data stream.
-
-#### Processor
-A processor transforms, filters, or enriches the data coming from a stream or another processor. Each processor has configuration parameters that control its behavior, such as filtering criteria or mapping options.
-
-#### Sink
-A sink sends the processed data to a final destination, such as a database, file storage, or another service. Sinks may also have configuration options that specify where and how the data should be sent.
-
-A pipeline element is selected by providing its ID. For processors and sinks, the ID  refers to the `appId` of the pipeline element, e.g., `org.apache.streampipes.processors.filters.jvm.numericalfilter`.
-For data streams, the ID refers to the `elementId` of the data stream.
-
-To define connections between pipeline elements, the `ref` and `connectedTo` fields can be used.
-`ref` can be a short string (e.g., `stream01` or `processor01`) which will be used as an internal identifier of the pipeline element.
-Within the `connectedTo` list, connections to other pipeline elements can be defined. 
-Each item of the list should relate to an existing `ref`.
-
-### Configuration
-
-In the `configuration` section, which only applies for data processors and sinks, the pipeline element configuration can be applied.
-The configuration options depend on the pipeline element and have the same structure as the adapter configuration (see [Adapters as Code](use-programmatically-create-adapters))
-The easiest way to determine a valid configuration is the web interface.
-
-After creating a pipeline in the web interface and clicking on `Save pipeline`, the option `Show pipeline configuration as code` shows the current pipeline configuration in YAML or JSON format:
-
-<img className="docs-image" src="/img/03_use-programmatically-create-pipelines/01_pipeline-editor-pipeline-as-code.png" alt="StreamPipes Pipeline Editor Code View"/>
-
-Another option is to view the pipeline details for an existing pipeline. Here, the YAMl definition of the pipeline can be viewed by clicking the `View pipeline as code` button:
-
-<img className="docs-image" src="/img/03_use-programmatically-create-pipelines/02_pipeline-details-pipeline-as-code.png" alt="StreamPipes Pipeline Editor Code View"/>
-
-
-## Example pipeline as Code
-
-Here's an example of a pipeline written in YAML format:
-
-```yaml
-id: my-pipeline
-name: "Density Filter Pipeline"
-description: "A pipeline that filters data based on the density and stores it in a data lake."
-pipelineElements:
-  - type: stream
-    ref: stream01
-    id: sp:spdatastream:GWWzMD
-  - type: processor
-    ref: processor01
-    id: org.apache.streampipes.processors.filters.jvm.numericalfilter
-    connectedTo:
-      - stream01
-    configuration:
-      - number-mapping: s0::density
-      - operation: <
-      - value: "12"
-  - type: sink
-    ref: sink01
-    id: org.apache.streampipes.sinks.internal.jvm.datalake
-    connectedTo:
-      - processor01
-    configuration:
-      - timestamp_mapping: s0::timestamp
-      - db_measurement: my-measurement
-      - schema_update: Update schema
-      - dimensions_selection:
-          - sensorId
-      - ignore_duplicates: false
-createOptions:
-  start: false
-```
-
-Stream: The pipeline begins with a data stream (sp:spdatastream:GWWzMD) referenced by stream01. This is the source of the data.
-
-Processor: The data is passed through a numerical filter processor (org.apache.streampipes.processors.filters.jvm.numericalfilter) which checks if the field s0::density is less than 12. The filter is connected to the stream via reference stream01.
-
-Sink: The filtered data is then sent to a data lake (org.apache.streampipes.sinks.internal.jvm.datalake). The sink is configured with several parameters including the mapping of the timestamp (s0::timestamp) and schema update options. The sink is connected to the processor via reference processor01.
-
-Create Options: The pipeline is set to not start automatically (start: false).
-
-## API
-
-To create a new pipeline, call the StreamPipes API as follows:
-
-```
-POST /streampipes-backend/api/v2/compact-pipelines
-Content-type: application/yml
-Accept: application/yml
-```
-
-You must provide valid credentials by either adding a Bearer token or an API key:
-
-```
-X-API-USER: your username
-X-API-KEY: your api key
-```
-
-The body of the request should contain the YAML definition.
-
-:::info
-It is also possible to provide the pipeline specification as a JSON document. In this case, change the `Content-type` to `application/json`.
diff --git a/docs/04_use-assets.md b/docs/04_use-assets.md
new file mode 100644
index 000000000..cd5c3a296
--- /dev/null
+++ b/docs/04_use-assets.md
@@ -0,0 +1,5 @@
+---
+id: use-assets
+title: Assets & Sites
+sidebar_label: Assets & Sites
+---
diff --git a/docs/03_use-data-explorer.md b/docs/04_use-charts.md
similarity index 99%
rename from docs/03_use-data-explorer.md
rename to docs/04_use-charts.md
index f84323bf6..1498e1819 100644
--- a/docs/03_use-data-explorer.md
+++ b/docs/04_use-charts.md
@@ -1,7 +1,7 @@
 ---
-id: use-data-explorer
-title: Data Explorer
-sidebar_label: Data Explorer
+id: use-charts
+title: Charts
+sidebar_label: Charts
 ---
 
 The data explorer can be used to visualize and explore data streams that are persisted by using the **Data Lake** sink.
diff --git a/website-v2/versioned_docs/version-0.91.0/03_use-connect.md b/docs/04_use-connect.md
similarity index 51%
rename from website-v2/versioned_docs/version-0.91.0/03_use-connect.md
rename to docs/04_use-connect.md
index 34495cb6e..d4be57d6a 100644
--- a/website-v2/versioned_docs/version-0.91.0/03_use-connect.md
+++ b/docs/04_use-connect.md
@@ -1,8 +1,7 @@
 ---
 id: use-connect
-title: StreamPipes Connect
-sidebar_label: StreamPipes Connect
-original_id: use-connect
+title: Connect IoT Data
+sidebar_label: Connect IoT Data
 ---
 
 StreamPipes Connect is the module to connect external data sources with Apache StreamPipes directly from the user interface. 
@@ -71,3 +70,153 @@ Currently running adapters are available in the "Running adapters" section of St
 
 ### Adapter Templates
 For frequently used configurations, adapter templates can be created. An adapter template is a pre-configured adapter which can be further customized by users. Created adapter templates are available in the marketplace similar to standard adapters.
+
+
+In Apache StreamPipes, adapters are typically created via the web interface.
+However, it is possible to create adapters programmatically using a compact YAML format and the StreamPipes REST API.
+Programmatic creation of adapters can be a useful feature in cases where many similar adapters have to be created.
+In this case, an externally managed YAMl file containing the full adapter configuration can be used and modified.
+
+## Introduction
+
+In StreamPipes, adapters are responsible for collecting data from various industrial data sources.
+While the UI simplifies this process, you can also manage adapters programmatically for better automation, integration with CI/CD pipelines, or infrastructure-as-code practices.
+
+This guide demonstrates how to define and create adapters using a YAML format and StreamPipes REST API, offering more flexibility to manage adapters programmatically.
+
+## Adapter YAML Structure
+
+An adapter in StreamPipes can be defined using a YAML file, which contains a compact description of the adapter configuration.
+The basic structure of the YAML format for an adapter definition includes:
+
+- **Name**: The name of the adapter.
+- **ID**: A unique ID for the adapter
+- **Description**: An additional description of the adapter
+- **AppID**: The adapter type
+- **Configuration**: Configuration details such as connection details, polling intervals, data format, and more
+- **Schema**: Schema refinements, e.g., additional label, description, semantic type and property scope
+- **Enrich**: Enrichment rules. Currently, only timestamp enrichment rules are supported in the YAML specification
+- **Transform**: Transformation rules. Currently, rename and measurement unit transforms are supported.
+- **CreateOptions**: Additional operations that are executed upon adapter generation.
+
+Here’s a sample structure to define an OPC-UA adapter:
+
+```yaml
+name: My OPC Adapter
+id: testadapter
+description: Test
+appId: org.apache.streampipes.connect.iiot.adapters.opcua
+configuration:
+  - opc_host_or_url: OPC_URL
+    opc_server_url: opc.tcp://localhost:62541/milo
+  - adapter_type: PULL_MODE
+    pulling_interval: 1000
+  - access_mode: UNAUTHENTICATED
+  - available_nodes:
+    - "ns=2;s=Leakage Test Station/temperature"
+    - "ns=2;s=Leakage Test Station/pressure"
+
+schema:
+  temperature:
+    propertyScope: measurement
+    label: Temp
+    description: Temperature value
+    semanticType: http://schema.org/temperature
+
+enrich:
+  timestamp: timestamp
+
+transform:
+  rename:
+    pressure: pressure3
+
+createOptions:
+  persist: true
+  start: true
+```
+
+## Programmatically creating adapters
+
+Here is a walkthrough to create an adapter programmatically over the API:
+
+### Background: Internal adapter generation process
+
+The YAML definition file is a more compact notation of StreamPipes internal data format to represent an adapter.
+When creating an adapter over the user interface, StreamPipes requires some basic, adapter-specific settings.
+Afterwards, a `Guess Schema` step is executed. In this step, StreamPipes connects to the underlying data sources, receives some samples of live data, determines the exact schema of the data stream and provides user with the source schema.
+This schema can be further refined using `Transformation Rules`.
+
+When an adapter is created using the more compact YAML notation, the same process is applied. Based on the provided configuration, the API connects to the given data source and determines the schema.
+The transformation rules provided in the YAMl definition are then applied on the original schema.
+Therefore, it is important that the provided schema refinement and transformation steps fit the original schema.
+
+### Getting a valid definition file
+
+The easiest way to create a valid YAML file is the user interface. Within the StreamPipes Connect view, it is possible to export the YAML definition for all existing adapters.
+In addition, the adapter generation wizard also offers the option to view the adapter configuration before creating the adapter by clicking the `Code` checkbox:
+
+<img className="docs-image" src="/img/03_use-programmatically-create-adapters/01_adapter-generation-code.png" alt="StreamPipes Adapter Code View"/>
+
+Another option is to open the adapter details view:
+
+<img className="docs-image" src="/img/03_use-programmatically-create-adapters/02_adapter-details-view-code.png" alt="StreamPipes Adapter Details Code View"/>
+
+You can copy this definition and modify it according to your needs.
+
+#### Configuration
+
+For each configuration option in the user interface, there is a mapping to the YAMl definition.
+
+A configuration value is a key/value pair, where the key corresponds to the internal name of the configuration and the value depends on the configuration type.
+
+#### Schema
+
+Schema definitions enhance the metadata of each field from the input stream.
+The following configurations are supported:
+
+* `label` to add an additional (human-readable) label to the field
+* `description` for an additional description
+* `propertyScope` to determine the type of the field (HEADER_PROPERTY, DIMENSION_PROPERTY or MEASUREMENT_PROPERTY)
+* `semanticType` to provide the semantic type of the field (e.g., `https://schema.org/temperature`)
+
+#### Enrich
+
+* `timestamp` defines that an additional field named timestamp is added to each incoming event containing the ingestion time as a UNIX timestamp.
+
+#### Transform
+
+Currently, the following transforms are supported:
+
+* `rename` defines renaming of individual fields from the input stream. A valid configuration consists of a key/value pair, where the key indicates the original field name and the value the target field name.
+* `measurementUnit` defines a value transformation between measurement units. A valid configuration consists of a key/value pair, where the key indicates the field name and the value the target measurement unit.
+
+#### CreateOptions
+
+Currently, two settings can be provided in the `CreateOptions` section:
+
+* `persist` indicates whether the data stream produced by the adapter should also be stored. In this case, a `Persist Pipeline` is automatically created.
+* `start` indicates whether the adapter should be immediately started after creation.
+
+### API
+
+To create a new adapter, call the StreamPipes API as follows:
+
+```
+POST /streampipes-backend/api/v2/connect/compact-adapters
+Content-type: application/yml
+Accept: application/yml
+```
+
+You must provide valid credentials by either adding a Bearer token or an API key:
+
+```
+X-API-USER: your username
+X-API-KEY: your api key
+```
+
+The body of the request should contain the YAML definition.
+
+:::info
+It is also possible to provide the adapter specification as a JSON document. In this case, change the `Content-type` to `application/json`.
+
+
diff --git a/website-v2/versioned_docs/version-0.93.0/03_use-dashboard.md b/docs/04_use-dashboards.md
similarity index 98%
rename from website-v2/versioned_docs/version-0.93.0/03_use-dashboard.md
rename to docs/04_use-dashboards.md
index 339bf6b57..cd2f5818e 100644
--- a/website-v2/versioned_docs/version-0.93.0/03_use-dashboard.md
+++ b/docs/04_use-dashboards.md
@@ -1,7 +1,7 @@
 ---
-id: use-dashboard
-title: Live Dashboard
-sidebar_label: Live Dashboard
+id: use-dashboards
+title: Dashboards
+sidebar_label: Dashboards
 ---
 
 The live dashboard can be used to visualize live data of data streams using a set of visualizations
diff --git a/docs/05_deploy-retention-config.md b/docs/04_use-datasets.md
similarity index 92%
rename from docs/05_deploy-retention-config.md
rename to docs/04_use-datasets.md
index f19a68114..a6ff6eb4c 100644
--- a/docs/05_deploy-retention-config.md
+++ b/docs/04_use-datasets.md
@@ -1,9 +1,10 @@
 ---
-id: deploy-retention-config
-title: Enable Datalake Retention
-sidebar_label: Enable Datalake Retention
+id: use-datasets
+title: Datasets
+sidebar_label: Datasets
 ---
 
+
 This page provides instructions on how to enable and test the Datalake retention feature. The Datalake retention feature automates the process of deleting and saving the contents of the Datalake to either a local filesystem or a cloud provider (currently, only S3-compatible providers are supported) at predefined intervals. Retention actions are carried out as scheduled CRON jobs, executing at specified times.
 
 ## Prerequisites
@@ -46,34 +47,34 @@ The retention configuration must be set individually for each desired DataLake.
 3. A dialog will appear, allowing you to configure the following options:
     - **Data to Retain**: Select which data should be retained.
     - **Retention Action**: Choose the retention action:
-      - **Delete**
-      - **Save**
-      - **Save and Delete**
+        - **Delete**
+        - **Save**
+        - **Save and Delete**
 
 If **Save** is selected, you can also configure:
 
 - **Export Format**: Specify the format in which the data will be exported.
 - **Export Destination**: Choose the destination for the saved data:
-  - **Folder**: No further configuration needed.
-  - **S3**: Requires an existing Export Provider to be set up (see the section below for details).
+    - **Folder**: No further configuration needed.
+    - **S3**: Requires an existing Export Provider to be set up (see the section below for details).
 
 To create a new export provider go to `Configuration > DataLake`, click on `+` and provide the access key, secret, endpoint, bucket name, and region.
 
 <img className="docs-image" src="/img/05_deploy-retention-config/NewExportProvider.png" alt="New Export Provider"/>
 
-For the Test Setting below this might be: 
+For the Test Setting below this might be:
 - **Access Key**: test
-- **Access Secret**: test 
+- **Access Secret**: test
 - **Endpoint**: http://0.0.0.0:4566
-- **Bucket**: random 
+- **Bucket**: random
 - **Region**: us-east-1
 
 
 
 
 
-## Test Setting 
-For Testing and Developing S3-based Export Provider it is possible to rely on locally hosted docker container e.g., localstack. 
+## Test Setting
+For Testing and Developing S3-based Export Provider it is possible to rely on locally hosted docker container e.g., localstack.
 ```yaml
 services:
   localstack:
@@ -95,7 +96,7 @@ volumes:
     driver: local
 ```
 
-For local testing start the container `docker compose up`, create a new bucket with the following java script: 
+For local testing start the container `docker compose up`, create a new bucket with the following java script:
 
 ```java
 
@@ -204,4 +205,4 @@ Pom.xml dependencies:
     </dependency>
 
 
-```
\ No newline at end of file
+```
diff --git a/docs/04_use-pipelines.md b/docs/04_use-pipelines.md
new file mode 100644
index 000000000..906a8a3a0
--- /dev/null
+++ b/docs/04_use-pipelines.md
@@ -0,0 +1,268 @@
+---
+id: use-pipelines
+title: Pipelines
+sidebar_label: Pipelines
+---
+
+The pipeline editor module supports building pipelines that transform a data stream using a set of resuable data processors and data sinks.
+The empty pipeline editor looks similar to the illustration below after a new installation.
+
+<img className="docs-image" src="/img/03_use-pipeline-editor/01_pipeline-editor-overview.png" alt="StreamPipes Pipeline Editor Overview"/>
+
+## Pipeline Elements
+The four main concepts data sets, data streams, data processors and data sinks are available at the top of the pipeline editor. By switching the tabs, the individual pipeline elements for each category can be found.
+By clicking the questionmark symbol, which appears when hovering over an element, additional information can be viewed (e.g., for data streams a live preview of incoming data and the documentation of the pipeline element for data processors and sinks).
+
+<img className="docs-image" src="/img/03_use-pipeline-editor/02_pipeline-element-info.png" alt="StreamPipes Pipeline Element Info"/>
+
+## Creating Pipelines
+Pipelines are built by dragging data streams, processors and sinks into the pipeline assembly area. Typically, a pipeline is built step-by-step starting with a data soure (stream or set). 
+Afterwards, data processors and sinks are subsequently added to the pipeline. Connections between pipeline elements are made by selecting the gray connector of the source and moving it to the target pipeline element.
+Once a connection is made, StreamPipes performs a quick validation step and, in case two pipeline elements are compatible, automatically opens a configuration window.
+
+### Configuring Pipeline Elements
+The configuration depends on the selected pipeline element and looks similar to the screenshot below.
+In general, pipeline elements are configured by providing the required values. Once the pipeline element is fully configured, the _Save_ button activates and can be used to save the configuration for the pipeline element.
+
+<img className="docs-image" src="/img/03_use-pipeline-editor/03_configure-pipeline-element.png" alt="StreamPipes Pipeline Element Configuration"/>
+
+In addition, the following options are available in the pipeline element configuration menu:
+* **Show documentation** extends the view and displays the pipeline element's documentation next to the configuration view.
+* **Show only recommended settings** filters the list of available fields provided by the connected input data stream based on the _property scope_, e.g., so that only measurement values are displayed and dimension fields from the input stream are not available for selection. If deactivated, selections contain the full list of available fields that match the input requirement of the data processor.
+
+### Pipeline Element Options
+Further options for a pipeline element can be displayed by hovering over a pipeline element in the assembly area, so that additional buttons appear around the pipeline element:
+
+* **Configure element** re-opens the configuration view to update the pipeline element configuration (only available for data processors and sinks)
+* **Delete element** removes the pipeline element from the pipeline  
+* **Help** opens the pipeline element's documentation
+* **Compatible element** opens a dialog which shows all pipeline elements that are compatible to the current element's output data stream. The dialog offers an alternative to selecting pipeline elements directly from the pipeline element selection in the top.
+* **Pipeline Element Recommendation** opens a dialog which shows all recommended pipeline elements that are compatible the current element's output data stream. The recommendation is based on previously connected pipeline elements and is displayed below.
+
+### Pipeline Editor Options
+Several pipeline editor options are available in the menu bar of the pipeline assembly:
+
+<img className="docs-image" src="/img/03_use-pipeline-editor/05_pipeline-editor-options.png" alt="StreamPipes Pipeline Editor Options"/>
+
+* **Save pipeline** opens the save dialog (see below)
+* **Pan** allows to pan within the assembly area, useful for larger pipelines that do not fit in the screen
+* **Select** is visible if pan mode is active and switches back to the default select mode
+* **Zoom in/out** triggers the zoom in the pipeline assembly
+* **Auto Layout** layouts the pipeline in a much more beautiful way than you are able to do by yourself ;-)
+* **All pipeline modification saved** is displayed if the current pipeline has been cached. Cache updates are triggered after every change of the pipeline so that changes are not lost after reloading the window.
+* **Hints** are shown to display current errors (e.g., incomplete pipelines). Details can be opened by clicking the hint button.
+* **Clear assembly** clears the assembly and removes the current pipeline.
+
+### Saving a pipeline
+To save a pipeline, press the _save pipeline_ button. A dialog pops up where a name and description of the pipeline can be entered (only name is mandatory).
+Additionally, a pipeline can be directly started after it has been stored by checking the corresponding button.
+
+<img className="docs-image" src="/img/03_use-pipeline-editor/06_save-pipeline.png" alt="StreamPipes Save Pipeline Dialog"/>
+
+
+The pipeline view lists all created pipelines and provides several views and actions to manage the lifecycle of pipelines.
+
+In the entry screen, an overview of all created pipelines is shown:
+
+<img className="docs-image" src="/img/03_use-managing-pipelines/01_pipeline-overview.png" alt="StreamPipes Pipeline Overview"/>
+
+## Pipeline Actions
+Within the pipeline overview, for each pipeline several actions are available:
+* **Start/Stop pipeline** Starts or stops the selected pipeline. Once clicked, StreamPipes will trigger the selected action for all pipeline elements and open a success or error dialog as illustrated below.
+* **Show details** opens the pipeline detail view (see below).
+* **Modify pipeline** opens the pipeline in the pipeline editor, where the pipeline can be modified. Note that this button is only visible if the pipeline is not running.
+* **Delete pipeline** opens a confirm dialog, which subsequently deletes the selected pipeline.
+
+The screenshot below shows the status of a pipeline after it has been successfully started. By clicking the _Show details_ button, more information on the status of each corresponding pipeline element microservice becomes available. In case of failures, the failure reason will be shown for each pipeline element that has failed to start.
+
+<img className="docs-image" src="/img/03_use-managing-pipelines/02_pipeline-start-dialog.png" alt="StreamPipes Pipeline Start Dialog"/>
+
+## Organizing Pipelines into Categories
+Pipelines can be organized into categories, which is a useful feature in case a larger amount of pipelines is created.
+All categories will be shown as separate tabs in the pipeline overview. The same pipeline can be assigned to multiple categories.
+
+To add a new category or to add a new pipeline to an existing category, click the _Manage Categories_ button and configured the category and assigned pipelines in the dialog.
+
+## Pipeline Details
+The pipeline details view can be opened by clicking the _Show details_ button in the pipeline overview panel.
+
+<img className="docs-image" src="/img/03_use-managing-pipelines/03_pipeline-details.png" alt="StreamPipes Pipeline Details"/>
+
+### Overview
+The overview section displays the graphical structure of the pipeline and provides some statistics about recent pipeline actions. Additionally, pipelines can be directly started, stopped, modified and deletes within this view.
+
+### Monitoring
+Monitoring features will become available in version 0.68.0.
+
+### Errors
+Monitoring of failures and logs will become available in version 0.69.0.
+
+### QuickEdit
+The quick edit feature (only available for pipelines that are not running) is a quick and convenient way to modify some pipeline element configurations without opening the pipeline in the pipeline editor.
+To use the quick edit feature, switch to the _QuickEdit_ tab, which will display the selected pipeline.
+
+By clicking a pipeline element from the preview canvas, available configuration options of the selected pipeline element can be modified. Note that only modifications that do not affect the pipeline structure (e.g., different output streams) can be changed.
+
+<img className="docs-image" src="/img/03_use-managing-pipelines/04_pipeline-quick-edit.png" alt="StreamPipes Pipeline Quick Edit"/>
+
+After a configuration value was changed, make sure to click the _Update Pipeline_ button to save the changes.
+
+
+In Apache StreamPipes, pipelines represent the flow of data from sources (streams), through processors (filters, transformations, etc.), and finally to sinks (third-party-systems, storage, notifications).
+Traditionally, pipelines are created through the web-based user interface.
+However, they can also be defined programmatically as code, offering the flexibility to manage pipelines using Infrastructure as Code (IaC) practices.
+
+This guide explains how to define and create pipelines programmatically using a YAML structure.
+
+## Introduction
+
+Defining pipelines as code allows you to automate the creation, management, and deployment of StreamPipes pipelines.
+This is especially useful for managing multiple StreamPipes instances across environments.
+Pipelines are written in a YAML format (or alternatively as JSON) and can be deployed programmatically via the StreamPipes REST API.
+
+This guide provides an overview of how to structure pipeline definitions in YAML and deploy them using the API.
+
+## Pipeline YAML Structure
+
+A pipeline in YAML consists of several key sections:
+
+- **ID**: A unique identifier for the pipeline.
+- **Name and Description**: Optional fields to describe the pipeline.
+- **Pipeline Elements**: The components that make up the pipeline, including streams (data sources), processors (data transformations), and sinks (output destinations).
+- **Create Options**: Specifies how and when to start the pipeline (e.g., `start: false` means the pipeline won't start automatically).
+
+Here’s a high-level breakdown of the structure:
+
+```yaml
+id: my-pipeline
+name: ""
+description: ""
+pipelineElements:  # Define pipeline components here
+  - type: stream     # Data source
+    ref: <reference> # Unique reference ID
+    id: <data-stream-id> # ID of the stream
+
+  - type: processor  # Data transformation
+    ref: <reference> # Unique reference ID
+    id: <processor-id> # ID of the processor
+    connectedTo:     # Previous pipeline element reference(s)
+      - <reference>
+    configuration:   # Processor-specific configurations
+      - <configuration-option>
+
+  - type: sink       # Data sink (output)
+    ref: <reference> # Unique reference ID
+    id: <sink-id>    # ID of the sink
+    connectedTo:     # Previous pipeline element reference(s)
+      - <reference>
+    configuration:   # Sink-specific configurations
+      - <configuration-option>
+
+createOptions:
+  start: <true|false>  # Whether to start the pipeline immediately
+```
+
+## Pipeline Elements
+
+### Building blocks
+
+The key building blocks of a pipeline include:
+
+#### Stream
+A stream represents a data source in the pipeline, such as a sensor feed, API, or message queue. It is referenced by a unique ID that identifies the data stream.
+
+#### Processor
+A processor transforms, filters, or enriches the data coming from a stream or another processor. Each processor has configuration parameters that control its behavior, such as filtering criteria or mapping options.
+
+#### Sink
+A sink sends the processed data to a final destination, such as a database, file storage, or another service. Sinks may also have configuration options that specify where and how the data should be sent.
+
+A pipeline element is selected by providing its ID. For processors and sinks, the ID  refers to the `appId` of the pipeline element, e.g., `org.apache.streampipes.processors.filters.jvm.numericalfilter`.
+For data streams, the ID refers to the `elementId` of the data stream.
+
+To define connections between pipeline elements, the `ref` and `connectedTo` fields can be used.
+`ref` can be a short string (e.g., `stream01` or `processor01`) which will be used as an internal identifier of the pipeline element.
+Within the `connectedTo` list, connections to other pipeline elements can be defined.
+Each item of the list should relate to an existing `ref`.
+
+### Configuration
+
+In the `configuration` section, which only applies for data processors and sinks, the pipeline element configuration can be applied.
+The configuration options depend on the pipeline element and have the same structure as the adapter configuration (see [Adapters as Code](use-programmatically-create-adapters))
+The easiest way to determine a valid configuration is the web interface.
+
+After creating a pipeline in the web interface and clicking on `Save pipeline`, the option `Show pipeline configuration as code` shows the current pipeline configuration in YAML or JSON format:
+
+<img className="docs-image" src="/img/03_use-programmatically-create-pipelines/01_pipeline-editor-pipeline-as-code.png" alt="StreamPipes Pipeline Editor Code View"/>
+
+Another option is to view the pipeline details for an existing pipeline. Here, the YAMl definition of the pipeline can be viewed by clicking the `View pipeline as code` button:
+
+<img className="docs-image" src="/img/03_use-programmatically-create-pipelines/02_pipeline-details-pipeline-as-code.png" alt="StreamPipes Pipeline Editor Code View"/>
+
+
+## Example pipeline as Code
+
+Here's an example of a pipeline written in YAML format:
+
+```yaml
+id: my-pipeline
+name: "Density Filter Pipeline"
+description: "A pipeline that filters data based on the density and stores it in a data lake."
+pipelineElements:
+  - type: stream
+    ref: stream01
+    id: sp:spdatastream:GWWzMD
+  - type: processor
+    ref: processor01
+    id: org.apache.streampipes.processors.filters.jvm.numericalfilter
+    connectedTo:
+      - stream01
+    configuration:
+      - number-mapping: s0::density
+      - operation: <
+      - value: "12"
+  - type: sink
+    ref: sink01
+    id: org.apache.streampipes.sinks.internal.jvm.datalake
+    connectedTo:
+      - processor01
+    configuration:
+      - timestamp_mapping: s0::timestamp
+      - db_measurement: my-measurement
+      - schema_update: Update schema
+      - dimensions_selection:
+          - sensorId
+      - ignore_duplicates: false
+createOptions:
+  start: false
+```
+
+Stream: The pipeline begins with a data stream (sp:spdatastream:GWWzMD) referenced by stream01. This is the source of the data.
+
+Processor: The data is passed through a numerical filter processor (org.apache.streampipes.processors.filters.jvm.numericalfilter) which checks if the field s0::density is less than 12. The filter is connected to the stream via reference stream01.
+
+Sink: The filtered data is then sent to a data lake (org.apache.streampipes.sinks.internal.jvm.datalake). The sink is configured with several parameters including the mapping of the timestamp (s0::timestamp) and schema update options. The sink is connected to the processor via reference processor01.
+
+Create Options: The pipeline is set to not start automatically (start: false).
+
+## API
+
+To create a new pipeline, call the StreamPipes API as follows:
+
+```
+POST /streampipes-backend/api/v2/compact-pipelines
+Content-type: application/yml
+Accept: application/yml
+```
+
+You must provide valid credentials by either adding a Bearer token or an API key:
+
+```
+X-API-USER: your username
+X-API-KEY: your api key
+```
+
+The body of the request should contain the YAML definition.
+
+:::info
+It is also possible to provide the pipeline specification as a JSON document. In this case, change the `Content-type` to `application/json`.
diff --git a/website-v2/versioned_docs/version-0.93.0/06_extend-client.md b/docs/04_use-programmatic-access.md
similarity index 98%
rename from website-v2/versioned_docs/version-0.93.0/06_extend-client.md
rename to docs/04_use-programmatic-access.md
index f584c3d2c..83eb1b120 100644
--- a/website-v2/versioned_docs/version-0.93.0/06_extend-client.md
+++ b/docs/04_use-programmatic-access.md
@@ -1,7 +1,7 @@
 ---
-id: extend-client
-title: StreamPipes Client
-sidebar_label: StreamPipes Client
+id: use-programmatic-access
+title: Programmatic Access
+sidebar_label: Programmatic Access
 ---
 
 
diff --git a/docs/03_use-shortcuts.md b/docs/04_use-shortcuts.md
similarity index 100%
rename from docs/03_use-shortcuts.md
rename to docs/04_use-shortcuts.md
diff --git a/docs/05_deploy-choosing-the-right-flavor.md b/docs/05_deploy-choosing-the-right-flavor.md
deleted file mode 100644
index a140bf46e..000000000
--- a/docs/05_deploy-choosing-the-right-flavor.md
+++ /dev/null
@@ -1,47 +0,0 @@
----
-id: choosing-the-right-flavor
-title: Choosing the right flavor
-sidebar_label: Service selection options
----
-
-
-## Introduction
-
-StreamPipes comes with many different options to customize a deployment. This section introduces the various options you can choose from when installing StreamPipes.
-
-You can choose between various **deployment modes**, choose from two different core packages and several extension packages, wich are described below.
-
-## Deployment Mode
-
-For the deployment model, you choose between a standard multi-container `Docker-Compose` installation and the `Kubernetes` installation.
-we provide several `Docker-Compose` files for the various options shown here and a `helm chart`. 
-See [Docker Deployment](05_deploy-docker.md) and [Kubernetes Deployment](05_deploy-kubernetes.md) for more details.
-
-### Running StreamPipes in a non-containerized environment
-
-Of course, it is also possible to launch StreamPipes in a non-containerized environment. 
-You will need to build your own executable binaries by running `mvn package`.
-In addition, it is required to install the required 3rd party services (see [Architecture](07_technicals-architecture.md)) and configure the environment variables as described in [Environment Variables](05_deploy-environment-variables.md).
-
-## Core Service
-
-We provide two different pre-packaged versions of core services. The default `streampipes-service-core` is a packaged JAR file which includes client libraries for the various messaging systems StreamPipes supports at the cost of a larger file size.
-In case you plan to run StreamPipes on less resource-intensive hardware, we recommend to switch to the `streampipes-service-core-minimal` package, which only includes support for MQTT and NATS, but has a smaller file size and slightly improved startup performance.
-
-## Extension Services
-
-Similar to the core, we provide several pre-packaged extension services which differ mainly by their file size, number of supported adapters and pipeline elements and messaging systems.
-
-The following packages exist:
-
-* `streampipes-extensions-all-jvm` is the largest package and includes all official StreamPipes adapters and pipeline elements. It also includes support for all messaging systems Streampipes currently supports.
-* `streampipes-extensions-all-iiot` is a subset of the aforementioned package and excludes adapters and pipeline elements which are often not relevant for IIoT use cases. For instance, the package excludes text mining-related pipeline elements.
-* `streampipes-extensions-iiot-minimal` is a subset of the aforementioned package and includes only support for the lightweight messaging systems MQTT and NATS.
-
-Generally said, in cases where you plan to deploy StreamPipes on a resource-limited edge device, we recommend a combination of the `streampipes-service-core-minimal` and `streampipes-extensions-iiot-minimal` package. This could, for instance, be a device with less than 4GB memory.
-In other cases, it depends on the use case and if you need all adapters and pipeline elements or are ok with the IIoT-related extensions.
-
-## Messaging System
-
-StreamPipes can be configured to use different messaging systems for exchanging events between adapters and pipeline elements.
-The section [Messaging](07_technicals-messaging.md) includes detailed information on the configuration of messaging systems. 
diff --git a/docs/05_deploy-docker.md b/docs/05_deploy-docker.md
deleted file mode 100644
index 08dbfaa19..000000000
--- a/docs/05_deploy-docker.md
+++ /dev/null
@@ -1,92 +0,0 @@
----
-id: deploy-docker
-title: Docker Deployment
-sidebar_label: Docker Deployment
----
-
-StreamPipes Compose is a simple collection of user-friendly `docker-compose` files that easily lets gain first-hand experience with Apache StreamPipes.
-
-> **NOTE**: We recommend StreamPipes Compose to only use for initial try-out and testing. If you are a developer and
-> want to develop new pipeline elements or core feature, use the [StreamPipes CLI](06_extend-cli.md).
-
-#### TL;DR: A one-liner to rule them all :-)
-
-```bash
-docker-compose up -d
-```
-Go to http://localhost to finish the installation in the browser. Once finished, switch to the pipeline editor and start the interactive tour or check the [online tour](https://streampipes.apache.org/docs/user-guide-tour/) to learn how to create your first pipeline!
-
-## Prerequisites
-* Docker >= 17.06.0
-* Docker-Compose >= 1.17.0 (Compose file format: 3.4)
-* Google Chrome (recommended), Mozilla Firefox, Microsoft Edge
-
-Tested on: **macOS, Linux, Windows 10 upwards** (CMD, PowerShell, GitBash)
-
-**macOS** and **Windows** users can easily get Docker and Docker-Compose on their systems by installing **Docker for Mac/Windows** (recommended).
-
-> **NOTE**: On purpose, we disabled all port mappings except of http port **80** to access the StreamPipes UI to provide minimal surface for conflicting ports.
-
-## Usage
-We provide several options to get you going:
-
-- **default**: Default docker-compose file, called `docker-compose.yml`.
-- **nats**: The standard installation which uses Nats as message broker,called `docker-compose.nats.yml`.
-- **full**: Contains experimental Flink wrappers, called `docker-compose.full.yml`.
-
-:::info
-
-Other options include configurations for the internally used message broker. The current default is `Kafka`, but you can also start StreamPipes with `Nats`, `MQTT` or `Apache Pulsar`.
-Use one of the other provided docker-compose files.
-
-:::
-
-**Starting** the **default** option is as easy as simply running:
-> **NOTE**: Starting might take a while since `docker-compose up` also initially pulls all Docker images from Dockerhub.
-
-```bash
-docker-compose up -d
-# go to `http://localhost` after all services are started
-```
-After all containers are successfully started just got to your browser and visit http://localhost to finish the installation. Once finished, switch to the pipeline editor and start the interactive tour or check the [online tour](https://streampipes.apache.org/docs/user-guide-tour/) to learn how to create your first pipeline!
-
-**Stopping** the **default** option is similarly easy:
-```bash
-docker-compose down
-# if you want to remove mapped data volumes, run:
-# docker-compose down -v
-```
-
-Starting the **nats** option is almost the same, just specify the `docker-compose.nats.yml` file:
-```bash
-docker-compose -f docker-compose.nats.yml up -d
-# go to `http://localhost` after all services are started
-```
-**Stopping** the **nats** option:
-```bash
-docker-compose -f docker-compose.nats.yml down
-```
-
-
-Starting the **full** option is almost the same, just specify the `docker-compose.full.yml` file:
-```bash
-docker-compose -f docker-compose.full.yml up -d
-#go to `http://localhost` after all services are started
-```
-Stopping the **full** option:
-```bash
-docker-compose -f docker-compose.nats.yml down
-#docker-compose -f docker-compose.nats.yml down -v
-```
-
-## Update services
-To actively pull the latest available Docker images use:
-```bash
-docker-compose pull
-```
-
-## Upgrade
-To upgrade to another StreamPipes version, simply edit the `SP_VERSION` in the `.env` file.
-```
-SP_VERSION=<VERSION>
-```
diff --git a/docs/05_deploy-environment-variables.md b/docs/05_deploy-environment-variables.md
deleted file mode 100644
index c4066fb70..000000000
--- a/docs/05_deploy-environment-variables.md
+++ /dev/null
@@ -1,88 +0,0 @@
----
-id: deploy-environment-variables
-title: Environment Variables
-sidebar_label: Environment Variables
----
-
-## Introduction
-
-A StreamPipes installation can be configured in many ways by providing environment variables.
-The following lists describe available environment variables along with a description.
-
-## StreamPipes Core Service
-
-### Internal
-
-| Env Variable Name              | Default Value                                           | Description                                                                                                                      |
-|--------------------------------|---------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------|
-| SP_DEBUG                       | false                                                   | Should only be set for local development to reroute traffic to localhost                                                         |
-| SP_INITIAL_ADMIN_EMAIL         | admin@streampipes.apache.org                            | Installation-time variable for defining the default user name                                                                    |
-| SP_INITIAL_ADMIN_PASSWORD      | admin                                                   | Installation-time variable for defining the default user password                                                                |
-| SP_INITIAL_SERVICE_USER        | sp-service-client                                       | Installation-time variable for defining the initial service user (must be same to the configured user in the extension service)  |
-| SP_INITIAL_SERVICE_USER_SECRET | my-apache-streampipes-secret-key-change-me              | Installation-time variable for defining the initial service secret (minimum 35 chars)                                            |
-| SP_JWT_SECRET                  | Empty for Docker, Auto-generated for K8s                | JWT secret, base64-encoded, minimum 256 bits                                                                                     |
-| SP_JWT_SIGNING_MODE            | HMAC                                                    | HMAC or RSA, RSA can be used to authenticate Core-Extensions communication                                                       |
-| SP_JWT_PRIVATE_KEY_LOC         | Empty                                                   | Required id SP_JWT_SIGNING_MODE=RSA, path to the private key, can be generated in the UI (Settings->Security->Generate Key Pair) |
-| SP_ENCRYPTION_PASSCODE         | eGgemyGBoILAu3xckolp for Docker, Auto-generated for K8s | Encryption passcode for `SecretStaticProperties`                                                                                 |
-| SP_PRIORITIZED_PROTOCOL        | kafka                                                   | Messaging layer for data exchange between extensions                                                                             |
-
-
-### Third-party services
-
-| Env Variable Name      | Default Value | Description                                                               |
-|------------------------|---------------|---------------------------------------------------------------------------|
-| SP_COUCHDB_HOST        | couchdb       | The hostname or IP of the CouchDB database                                |
-| SP_COUCHDB_PROTOCOL    | http          | The protocol (http or https) of the CouchDB database                      |
-| SP_COUCHDB_PORT        | 5984          | The port of the CouchDB database                                          |
-| SP_COUCHDB_USER        | admin         | The user of the CouchDB database (must have permissions to add databases) |
-| SP_COUCHDB_PASSWORD    | admin         | The password of the CouchDB user                                          |
-| SP_TS_STORAGE_HOST     | influxdb      | The hostname of the timeseries storage (currently InfluxDB)               |
-| SP_TS_STORAGE_PORT     | 8086          | The port of the timeseries storage                                        |
-| SP_TS_STORAGE_PROTOCOL | http          | The protocol of the timeseries storage (http or https)                    |
-| SP_TS_STORAGE_BUCKET   | sp            | The InfluxDB storage bucket name                                          |
-| SP_TS_STORAGE_ORG      | sp            | The InfluxDB storage org                                                  |
-| SP_TS_STORAGE_TOKEN    | sp-admin      | The InfluxDB storage token                                                |
-
-The InfluxDB itself can be configured by providing the variables `DOCKER_INFLUXDB_INIT_PASSWORD` and `DOCKER_INFLUXDB_INIT_ADMIN_TOKEN`. See the `docker-compose` file for details.
-
-## StreamPipes Extensions Service
-
-### Internal
-
-| Env Variable Name              | Default Value                              | Description                                                                                                        |
-|--------------------------------|--------------------------------------------|--------------------------------------------------------------------------------------------------------------------|
-| SP_CLIENT_USER                 | Empty                                      | Service account for communication with Core                                                                        |
-| SP_CLIENT_SECRET               | Empty                                      | Service secret for communication with Core                                                                         |
-| SP_EXT_AUTH_MODE               | sp-service-client                          | When set to AUTH: all interfaces are only accessible with authentication (requires SP_JET_PRIVATE_KEY_LOC in Core) |
-| SP_JWT_PUBLIC_KEY_LOC          | my-apache-streampipes-secret-key-change-me | Path to the public key of the corresponding SP_JWT_PRIVATE_KEY defined in Core                                     |
-
-### Third-party services
-
-The following variables are only required for extensions which require access to the internal time-series storage (the `Data Lake Sink`).
-
-| Env Variable Name      | Default Value | Description                                                               |
-|------------------------|---------------|---------------------------------------------------------------------------|
-| SP_TS_STORAGE_HOST     | influxdb      | The hostname of the timeseries storage (currently InfluxDB)               |
-| SP_TS_STORAGE_PORT     | 8086          | The port of the timeseries storage                                        |
-| SP_TS_STORAGE_PROTOCOL | http          | The protocol of the timeseries storage (http or https)                    |
-| SP_TS_STORAGE_BUCKET   | sp            | The InfluxDB storage bucket name                                          |
-| SP_TS_STORAGE_ORG      | sp            | The InfluxDB storage org                                                  |
-| SP_TS_STORAGE_TOKEN    | sp-admin      | The InfluxDB storage token                                                |
-
-
-## Recommended variables
-
-For a standard deployment, it is recommended to customize the following variables:
-
-*	Initiales Admin-Passwort (SP_INITIAL_ADMIN_PASSWORD, Core)
-*	Initiales Client Secret (SP_INITIAL_SERVICE_USER_SECRET, Core)
-*	Client Secret Extensions (SP_CLIENT_USER, Extensions)
-*	Encryption Passcode (SP_ENCRYPTION_PASSCODE, Core)
-*	CouchDB-Password (SP_COUCHDB_PASSWORD, Core + Extensions + CouchDB)
-*	InfluxDB Storage Password (DOCKER_INFLUXDB_INIT_PASSWORD, InfluxDB)
-*	InfluxDB Storage Token (SP_TS_STORAGE_TOKEN (Core, Extensions)
-  * DOCKER_INFLUXDB_INIT_ADMIN_TOKEN (InfluxDB service)
-
-## Auto-generation of variables in K8s setups
-
-See the [Kubernetes Guide](05_deploy-kubernetes.md) for an overview of auto-generated variables.
diff --git a/docs/05_deploy-kubernetes.md b/docs/05_deploy-kubernetes.md
deleted file mode 100644
index 6734676b4..000000000
--- a/docs/05_deploy-kubernetes.md
+++ /dev/null
@@ -1,269 +0,0 @@
----
-id: deploy-kubernetes
-title: Kubernetes Deployment
-sidebar_label: Kubernetes Deployment
----
-
-## Prerequisites
-Requires Helm (https://helm.sh/) and an actively running Kubernetes cluster.
-
-## Usage
-We provide helm chart options to get you going in the `installer/k8s`folder.
-
-**Starting** the default helm chart option is as easy as simply running the following command from the root of this folder:
-> **NOTE**: Starting might take a while since we also initially pull all Docker images from Dockerhub.
-
-```bash
-helm install streampipes ./
-```
-After a while, all containers should successfully started, indicated by the `Running` status.
-
-The `values.yaml` file contains several configuration options to customize your StreamPipes installation. See the section below for all configuration options.
-
-## Ingress
-
-The helm chart provides several options to configure an Ingress or to define an Ingressroute that directly integrates with Traefik.
-
-## Dynamic Volume Provisioning
-
-You can override the `storageClassName` variable to configure StreamPipes for dynamic volume provisioning.
-
-## Parameters
-
-Here is an overview of the supported parameters to configure StreamPipes.
-
-### Common parameters
-
-| Parameter Name                                   | Description                                             | Value                                   |
-|--------------------------------------------------|---------------------------------------------------------|-----------------------------------------|
-| deployment                                       | Deployment type (lite or full)                          | lite                                    |
-| preferredBroker                                  | Preferred broker for deployment                         | "nats"                                  |
-| monitoringSystem                                 | Enable monitoring system (true/false)                   | false                                   |
-| pullPolicy                                       | Image pull policy                                       | "Always"                                |
-| restartPolicy                                    | Restart policy for the container                        | Always                                  |
-| persistentVolumeReclaimPolicy                    | Reclaim policy for persistent volumes                   | "Delete"                                |
-| persistentVolumeAccessModes                      | Access mode for persistent volumes                      | "ReadWriteOnce"                         |
-| initialDelaySeconds                              | Initial delay for liveness and readiness probes         | 60                                      |
-| periodSeconds                                    | Interval between liveness and readiness probes          | 30                                      |
-| failureThreshold                                 | Number of consecutive failures for readiness probes     | 30                                      |
-| hostPath                                         | Host path for the application                           | ""                                      |
-
-### StreamPipes common parameters
-
-| Parameter Name                                  | Description                                             | Value                                    |
-|-------------------------------------------------|---------------------------------------------------------|------------------------------------------|
-| streampipes.version                             | StreamPipes version                                     | "0.93.0-SNAPSHOT"                        |
-| streampipes.registry                            | StreamPipes registry URL                                | "apachestreampipes"                      |
-| streampipes.auth.secretName                     | The secret name for storing secrets                     | "sp-secrets"                             |
-| streampipes.auth.users.admin.user               | The initial admin user                                  | "admin@streampipes.apache.org"           |
-| streampipes.auth.users.admin.password           | The initial admin password (leave empty for autogen)    | "admin"                                  |
-| streampipes.auth.users.service.user             | The initial service account user                        | "sp-service-client"                      |
-| streampipes.auth.users.service.secret           | The initial service account secret                      | empty (auto-generated)                   |
-| streampipes.auth.encryption.passcode            | Passcode for value encryption                           | empty (auto-generated)                   |
-| streampipes.core.appName                        | StreamPipes backend application name                    | "backend"                                |
-| streampipes.core.port                           | StreamPipes backend port                                | 8030                                     |
-| streampipes.core.persistence.storageClassName   | Storage class name for backend PVs                      | "hostpath"                               |
-| streampipes.core.persistence.storageSize        | Size of the backend PV                                  | "1Gi"                                    |
-| streampipes.core.persistence.claimName          | Name of the backend PersistentVolumeClaim               | "backend-pvc"                            |
-| streampipes.core.persistence.pvName             | Name of the backend PersistentVolume                    | "backend-pv"                             |
-| streampipes.core.service.name                   | Name of the backend service                             | "backend"                                |
-| streampipes.core.service.port                   | TargetPort of the StreamPipes backend service           | 8030                                     |
-| streampipes.ui.appName                          | StreamPipes UI application name                         | "ui"                                     |
-| streampipes.ui.resolverActive                   | Flag for enabling DNS resolver for Nginx proxy          | true                                     |
-| streampipes.ui.port                             | StreamPipes UI port                                     | 8088                                     |
-| streampipes.ui.resolver                         | DNS resolver for Nginx proxy                            | "kube-dns.kube-system.svc.cluster.local" |
-| streampipes.ui.service.name                     | Name of the UI service                                  | "ui"                                     |
-| streampipes.ui.service.type                     | Type of the UI service                                  | "ClusterIP"                              |
-| streampipes.ui.service.nodePort                 | Node port for the UI service                            | 8088                                     |
-| streampipes.ui.service.port                     | TargetPort of the StreamPipes UI service                | 8088                                     |
-| streampipes.ingress.active                      | Flag for enabling Ingress for StreamPipes               | false                                    |
-| streampipes.ingress.annotations                 | Annotations for Ingress                                 | {}                                       |
-| streampipes.ingress.host                        | Hostname for Ingress                                    | ""                                       |
-| streampipes.ingressroute.active                 | Flag for enabling IngressRoute for StreamPipes          | true                                     |
-| streampipes.ingressroute.annotations            | Annotations for IngressRoute                            | {}                                       |
-| streampipes.ingressroute.entryPoints            | Entry points for IngressRoute                           | ["web", "websecure"]                     |
-| streampipes.ingressroute.host                   | Hostname for IngressRoute                               | ""                                       |
-| streampipes.ingressroute.certResolverActive     | Flag for enabling certificate resolver for IngressRoute | true                                     |
-| streampipes.ingressroute.certResolver           | Certificate resolver for IngressRoute                   | ""                                       |
-
-
-### Extensions common parameters
-
-| Parameter Name                                  | Description                                             | Value                                    |
-|-------------------------------------------------|---------------------------------------------------------|------------------------------------------|
-| extensions.iiot.appName                         | IIoT extensions application name                        | extensions-all-iiot                      |
-| extensions.iiot.port                            | Port for the IIoT extensions application                | 8090                                     |
-| extensions.iiot.service.name                    | Name of the IIoT extensions service                     | extensions-all-iiot                      |
-| extensions.iiot.service.port                    | TargetPort of the IIoT extensions service               | 8090                                     |
-
-
-### External common parameters
-
-#### Couchdb common parameters
-
-| Parameter Name                                  | Description                                              | Value                                    |
-|-------------------------------------------------|----------------------------------------------------------|------------------------------------------|
-| external.couchdb.appName                        | CouchDB application name                                 | "couchdb"                                |
-| external.couchdb.version                        | CouchDB version                                          | 3.3.1                                    |
-| external.couchdb.user                           | CouchDB admin username                                   | "admin"                                  |
-| external.couchdb.password                       | CouchDB admin password                                   | empty (auto-generated)                   |
-| external.couchdb.port                           | Port for the CouchDB service                             | 5984                                     |
-| external.couchdb.service.name                   | Name of the CouchDB service                              | "couchdb"                                |
-| external.couchdb.service.port                   | TargetPort of the CouchDB service                        | 5984                                     |
-| external.couchdb.persistence.storageClassName   | Storage class name for CouchDB PVs                       | "hostpath"                               |
-| external.couchdb.persistence.storageSize        | Size of the CouchDB PV                                   | "1Gi"                                    |
-| external.couchdb.persistence.claimName          | Name of the CouchDB PersistentVolumeClaim                | "couchdb-pvc"                            |
-| external.couchdb.persistence.pvName             | Name of the CouchDB PersistentVolume                     | "couchdb-pv"                             |
-
-#### Influxdb common parameters
-
-| Parameter Name                                  | Description                                              | Value                                    |
-|-------------------------------------------------|----------------------------------------------------------|------------------------------------------|
-| external.influxdb.appName                       | InfluxDB application name                                | "influxdb"                               |
-| external.influxdb.version                       | InfluxDB version                                         | 2.6                                      |
-| external.influxdb.username                      | InfluxDB admin username                                  | "admin"                                  |
-| external.influxdb.password                      | InfluxDB admin password                                  | empty (auto-generated)                   |
-| external.influxdb.adminToken                    | InfluxDB admin token                                     | empty (auto-generated)                   |
-| external.influxdb.initOrg                       | InfluxDB initial organization                            | "sp"                                     |
-| external.influxdb.initBucket                    | InfluxDB initial bucket                                  | "sp"                                     |
-| external.influxdb.initMode                      | InfluxDB initialization mode                             | "setup"                                  |
-| external.influxdb.apiPort                       | Port number for the InfluxDB service (API)               | 8083                                     |
-| external.influxdb.httpPort                      | Port number for the InfluxDB service (HTTP)              | 8086                                     |
-| external.influxdb.grpcPort                      | Port number for the InfluxDB service (gRPC)              | 8090                                     |
-| external.influxdb.service.name                  | Name of the InfluxDB service                             | "influxdb"                               |
-| external.influxdb.service.apiPort               | TargetPort of the InfluxDB service for API               | 8083                                     |
-| external.influxdb.service.httpPort              | TargetPort of the InfluxDB service for HTTP              | 8086                                     |
-| external.influxdb.service.grpcPort              | TargetPort of the InfluxDB service for gRPC              | 8090                                     |
-| external.influxdb.persistence.storageClassName  | Storage class name for InfluxDB PVs                      | "hostpath"                               |
-| external.influxdb.persistence.storageSize       | Size of the InfluxDB PV                                  | "1Gi"                                    |
-| external.influxdb.persistence.storageSizeV1     | Size of the InfluxDB PV for v1 databases                 | "1Gi"                                    |
-| external.influxdb.persistence.claimName         | Name of the InfluxDBv2 PersistentVolumeClaim             | "influxdb2-pvc"                          |
-| external.influxdb.persistence.claimNameV1       | Name of the InfluxDBv1 PersistentVolumeClaim             | "influxdb-pvc"                           |
-| external.influxdb.persistence.pvName            | Name of the InfluxDBv2 PersistentVolume                  | "influxdb2-pv"                           |
-| external.influxdb.persistence.pvNameV1          | Name of the InfluxDBv1 PersistentVolume                  | "influxdb-pv"                            |
-
-
-#### Nats common parameters
-
-| Parameter Name                                  | Description                                              | Value                                    |
-|-------------------------------------------------|----------------------------------------------------------|------------------------------------------|
-| external.nats.appName                           | NATS application name                                    | "nats"                                   |
-| external.nats.port                              | Port for the NATS service                                | 4222                                     |
-| external.nats.version                           | NATS version                                             |                                          |
-| external.nats.service.type                      | Type of the NATS service                                 | "NodePort"                               |
-| external.nats.service.externalTrafficPolicy     | External traffic policy for the NATS service             | "Local"                                  |
-| external.nats.service.name                      | Name of the NATS service                                 | "nats"                                   |
-| external.nats.service.port                      | TargetPort of the NATS service                           | 4222                                     |
-
-
-#### Kafka common parameters
-
-| Parameter Name                                  | Description                                              | Value                                    |
-|-------------------------------------------------|----------------------------------------------------------|------------------------------------------|
-| external.kafka.appName                          | Kafka application name                                   | "kafka"                                  |
-| external.kafka.version                          | Kafka version                                            | 2.2.0                                    |
-| external.kafka.port                             | Port for the Kafka service                               | 9092                                     |
-| external.kafka.external.hostname                | Name which will be advertised to external clients. Clients which use (default) port 9094       | "localhost"
-| external.kafka.service.name                     | Name of the Kafka service                                | "kafka"                                  |
-| external.kafka.service.port                     | TargetPort of the Kafka service                          | 9092                                     |
-| external.kafka.service.portOutside              | Port for Kafka client outside of the cluster | 9094                              |
-| external.kafka.persistence.storageClassName     | Storage class name for Kafka PVs                         | "hostpath"                               |
-| external.kafka.persistence.storageSize          | Size of the Kafka PV                                     | "1Gi"                                    |
-| external.kafka.persistence.claimName            | Name of the Kafka PersistentVolumeClaim                  | "kafka-pvc"                              |
-| external.kafka.persistence.pvName               | Name of the Kafka PersistentVolume                       | "kafka-pv"                               |
-|
-
-#### Zookeeper common parameters
-
-| Parameter Name                                  | Description                                              | Value                                    |
-|-------------------------------------------------|----------------------------------------------------------|------------------------------------------|
-| external.zookeeper.appName                      | ZooKeeper application name                               | "zookeeper"                              |
-| external.zookeeper.version                      | ZooKeeper version                                        | 3.4.13                                   |
-| external.zookeeper.port                         | Port for the ZooKeeper service                           | 2181                                     |
-| external.zookeeper.service.name                 | Name of the ZooKeeper service                            | "zookeeper"                              |
-| external.zookeeper.service.port                 | TargetPort of the ZooKeeper service                      | 2181                                     |
-| external.zookeeper.persistence.storageClassName | Storage class name for ZooKeeper PVs                     | "hostpath"                               |
-| external.zookeeper.persistence.storageSize      | Size of the ZooKeeper PV                                 | "1Gi"                                    |
-| external.zookeeper.persistence.claimName        | Name of the ZooKeeper PersistentVolumeClaim              | "zookeeper-pvc"                          |
-| external.zookeeper.persistence.pvName           | Name of the ZooKeeper PersistentVolume                   | "zookeeper-pv"                           |
-
-
-#### Pulsar common parameters
-
-| Parameter Name                                  | Description                                              | Value                                    |
-|-------------------------------------------------|----------------------------------------------------------|------------------------------------------|
-| external.pulsar.appName                         | pulsar application name                                  | "pulsar"                                 |
-| external.pulsar.version                         | pulsar version                                           | 3.0.0                                    |
-| external.pulsar.port                            | Port for the pulsar service                              | 6650                                     |
-| external.pulsar.service.name                    | Name of the pulsar service                               | "pulsar"                                 |
-| external.pulsar.service.port                    | TargetPort of the pulsar service                         | 6650                                     |
-| external.pulsar.persistence.storageClassName    | Storage class name for pulsar PVs                        | "hostpath"                               |
-| external.pulsar.persistence.storageSize         | Size of the pulsar PV                                    | "1Gi"                                    |
-| external.pulsar.persistence.claimName           | Name of the pulsar PersistentVolumeClaim                 | "pulsar-pvc"                             |
-| external.pulsar.persistence.pvName              | Name of the pulsar PersistentVolume                      | "pulsar-pv"                              |
-
-### Monitoring common parameters
-
-#### Monitoring - Prometheus
-
-| Parameter Name                                  | Description                                              | Value                                    |
-|-------------------------------------------------|----------------------------------------------------------|------------------------------------------|
-| prometheus.appName                              | Prometheus application name                              | "prometheus"                             |
-| prometheus.version                              | Prometheus version                                       | 2.45.0                                   |
-| prometheus.port                                 | Prometheus port                                          | 9090                                     |
-| prometheus.service.name                         | Prometheus service name                                  | "prometheus"                             |
-| prometheus.service.port                         | Prometheus service port                                  | 9090                                     |
-| prometheus.persistence.storageClassName         | Prometheus storage class name                            | "hostpath"                               |
-| prometheus.persistence.storageSize              | Prometheus storage size                                  | "2Gi"                                    |
-| prometheus.persistence.claimName                | Prometheus PVC claim name                                | "prometheus-pvc"                         |
-| prometheus.persistence.pvName                   | Prometheus PV name                                       | "prometheus-pv"                          |
-| prometheus.persistence.tokenStorageSize         | Prometheus token storage size                            | "16Ki"                                   |
-| prometheus.config.scrapeInterval                | Prometheus scrape interval                               | 10s                                      |
-| prometheus.config.evaluationInterval            | Prometheus evaluation interval                           | 15s                                      |
-| prometheus.config.backendJobName                | Prometheus backend job name                              | "backend"                                |
-| prometheus.config.extensionsName                | Prometheus extensions job name                           | "extensions-all-iiot"                    |
-| prometheus.config.tokenFileName                 | Prometheus token file name                               | "token"                                  |
-| prometheus.config.tokenFileDir                  | Prometheus token file directory                          | "/opt/data"
-
-#### Monitoring - Grafana
-
-| Parameter Name                                  | Description                                              | Value                                    |
-|-------------------------------------------------|----------------------------------------------------------|------------------------------------------|
-| grafana.appName                                 | Grafana application name                                 | "grafana"                                |
-| grafana.version                                 | Grafana version                                          | 10.1.2                                   |
-| grafana.port                                    | Grafana port                                             | 3000                                     |
-| grafana.service.name                            | Grafana service name                                     | "grafana"                                |
-| grafana.service.port                            | Grafana service port                                     | 3000                                     |
-| grafana.persistence.storageClassName            | Grafana storage class name                               | "hostpath"                               |
-| grafana.persistence.storageSize                 | Grafana storage size                                     | "1Gi"                                    |
-| grafana.persistence.claimName                   | Grafana PVC claim name                                   | "grafana-pvc"                            |
-| grafana.persistence.pvName                      | Grafana PV name                                          | "grafana-pv"                             |
-
-
-## Auto-generation of parameters.
-
-The helm chart includes a `secrets.yaml` file which auto-generates several settings as follows:
-
-```yaml
-
-apiVersion: v1
-kind: Secret
-metadata:
-  name: sp-secrets
-  namespace: {{ .Release.Namespace | quote }}
-type: Opaque
-data:
-  sp-initial-admin-password: {{ ternary (randAlphaNum 10) .Values.streampipes.auth.users.admin.password (empty .Values.streampipes.auth.users.admin.password) | b64enc | quote }}
-  sp-initial-client-secret: {{ ternary (randAlphaNum 35) .Values.streampipes.auth.users.service.secret (empty .Values.streampipes.auth.users.service.secret) | b64enc | quote }}
-  sp-encryption-passcode:  {{ ternary (randAlphaNum 20) .Values.streampipes.auth.encryption.passcode (empty .Values.streampipes.auth.encryption.passcode) | b64enc | quote }}
-  sp-couchdb-password:  {{ ternary (randAlphaNum 20) .Values.external.couchdb.password (empty .Values.external.couchdb.password) | b64enc | quote }}
-  sp-ts-storage-password:  {{ ternary (randAlphaNum 20) .Values.external.influxdb.password (empty .Values.external.influxdb.password) | b64enc | quote }}
-  sp-ts-storage-token:  {{ ternary (randAlphaNum 20) .Values.external.influxdb.adminToken (empty .Values.external.influxdb.adminToken) | b64enc | quote }}
-
-```
-
-
-## Deleting the current helm chart deployment:
-```bash
-helm uninstall streampipes
-```
diff --git a/docs/05_deploy-use-ssl.md b/docs/05_deploy-use-ssl.md
deleted file mode 100644
index d5762b8dc..000000000
--- a/docs/05_deploy-use-ssl.md
+++ /dev/null
@@ -1,35 +0,0 @@
----
-id: deploy-use-ssl
-title: Use SSL
-sidebar_label: Use SSL
----
-
-This page explains how SSL Certificates can be used to provide transport layer security between your Browser and the Streampipes Backend.
-
-## Prerequisites
-You need a valid Certificate consisting of a Private and a Public Key. Both Keys must be in PEM Format. Please note that your Private Key should never be shared, otherwise the communication can not be considered secure.
-
-## Edit docker-compose.yml
-In order to use SSL you have to open port 443 on the nginx Service. Incoming insecure Traffic on Port 80 will be automatically rerouted to Port 443.
-
-The Environment-Variable NGINX_SSL must be set to "true".
-
-Finally you have to inject the Certificates into the Docker-Container. In the example below, the Certificates are placed in the directory /etc/ssl/private/ on the host machine. Please change the path according to the place where the Certificates are located on your machine. The path after the colon should not be changed!
-```yaml
-[...]
-  nginx:
-    image: apachestreampipes/ui
-    ports:
-      - "80:80"
-      - "443:443"
-    environment:
-      - NGINX_SSL=true
-    volumes:
-      - /etc/ssl/private/private.pem:/etc/nginx/ssl/ssl.pem
-      - /etc/ssl/private/public.pem:/etc/nginx/ssl/cert.pem
-    depends_on:
-      - backend
-    networks:
-      spnet:
-[...]
-```
diff --git a/website-v2/versioned_docs/version-0.93.0/06_extend-tutorial-adapters.md b/docs/05_how-to-custom-adapter.md
similarity index 98%
rename from website-v2/versioned_docs/version-0.93.0/06_extend-tutorial-adapters.md
rename to docs/05_how-to-custom-adapter.md
index 4e95cba9a..8b009cf4a 100644
--- a/website-v2/versioned_docs/version-0.93.0/06_extend-tutorial-adapters.md
+++ b/docs/05_how-to-custom-adapter.md
@@ -1,7 +1,7 @@
 ---
-id: extend-tutorial-adapters
-title: "Tutorial: Build Custom Adapters"
-sidebar_label: "Tutorial: Adapters"
+id: how-to-custom-adapter
+title: "Write a custom adapter"
+sidebar_label: "Write a custom adapter"
 ---
 
 In this tutorial, we will create a new data source consisting of a single data stream.
@@ -18,7 +18,7 @@ to show how we can extend our existing adapter to be configurable via the UI.
 This tutorial shows how to build your own type of adapter.
 It is intended for people who are interested in extending StreamPipes to meet their own needs.
 If you are here to explore StreamPipes and are interested in using an adapter, you may want to
-continue [here](./03_use-connect.md).
+continue [here](04_use-connect.md).
 :::
 
 ## Objective
@@ -265,7 +265,7 @@ The two main parts that should always happen within this method are highlighted
 * `Line 10`: Creating an event is crucial for our adapters. This event is then filled with data by the adapter before it
   is distributed.
 * `Line 13`: The event must finally be passed to the `collector`, which then takes the data and distributes it within
-  StreamPipes in the form of a [data stream](./02_concepts-overview.md#data-stream).
+  StreamPipes in the form of a [data stream](03_concepts-terms.md#data-stream).
 
 ```java jsx {10,13} showLineNumbers
 @Override
@@ -389,7 +389,7 @@ public GuessSchema onSchemaRequested(IAdapterParameterExtractor extractor,
 An attribute of an Event is referred to as `property` in StreamPipes.
 So in our case we have three properties.
 Since StreamPipes creates a sample event in the UI when configuring the adapter (
-see [here](./03_use-connect.md#schema-editor)),
+see [here](04_use-connect.md#schema-editor)),
 providing a meaningful sample value for every property allows StreamPipes to demonstrate its full potential.
 
 Since every event schema is required to have a timestamp property, we provide a convenience definition (see `line 3`).
@@ -439,7 +439,7 @@ registering our adapter service with the core to make the adapter available in S
 This is done within `provideServiceDefinition()`. Since we don't have the generic adapter ready yet,
 we'll comment out its registration (`line 7`). Now we can run the `Init` class to register the adapter with your running
 StreamPipes instance. If you don't have a running instance at your hand,
-you can take a look at our [Installation Guide](./01_try-installation.md).
+you can take a look at our [Installation Guide](02_installation.md).
 
 ```java jsx {7-8} showLineNumbers
 @Override
diff --git a/website-v2/versioned_docs/version-0.95.0/06_extend-tutorial-data-processors.md b/docs/05_how-to-custom-data-processor.md
similarity index 97%
rename from website-v2/versioned_docs/version-0.95.0/06_extend-tutorial-data-processors.md
rename to docs/05_how-to-custom-data-processor.md
index 4c2d5ee25..a3406c715 100644
--- a/website-v2/versioned_docs/version-0.95.0/06_extend-tutorial-data-processors.md
+++ b/docs/05_how-to-custom-data-processor.md
@@ -1,7 +1,7 @@
 ---
-id: extend-tutorial-data-processors
-title: "Tutorial: Data Processors"
-sidebar_label: "Tutorial: Data Processors"
+id: how-to-custom-data-processor
+title: "Write a custom data processor"
+sidebar_label: "Write a custom data processor"
 ---
 
 In this tutorial, we will add a new data processor.
@@ -42,7 +42,7 @@ mvn archetype:generate \
 -DartifactId=my-example -DclassNamePrefix=MyExample -DpackageName=mypackagename
 ```
 
-You will see a project structure similar to the structure shown in the [archetypes](06_extend-archetypes.md) section.
+You will see a project structure similar to the structure shown in the [archetypes](07_extend-archetypes.md) section.
 
 :::tip
 
@@ -218,7 +218,7 @@ The radius can be defined by adding a simple required text field to the descript
 ```
 
 Such user-defined parameters are called _static properties_. There are many different types of static properties (see
-the [Processor SDK](06_extend-sdk-static-properties.md) for an overview). Similar to stream requirements, it is also recommended to type `Labels.withId("radius")` and move labels and descriptions to the resource file.
+the [Processor SDK](07_extend-sdk-static-properties.md) for an overview). Similar to stream requirements, it is also recommended to type `Labels.withId("radius")` and move labels and descriptions to the resource file.
 
 In this example, we'll further add two very simple input fields to let users provide latitude and longitude of the
 geofence center.
@@ -406,7 +406,7 @@ longitude fields from the input event (which is provided as a map data type) and
 geofence center and these coordinates.
 If the distance is below the given radius, the event is forwarded to the next operator.
 
-See the [event model](06_extend-sdk-event-model.md) guide to learn how to extract parameters from events.
+See the [event model](07_extend-sdk-event-model.md) guide to learn how to extract parameters from events.
 
 ## Registering the pipeline element
 
@@ -445,10 +445,10 @@ Execute the main method in the class `Init` we've just created.
 
 The service automatically registers itself in StreamPipes.
 To install the just created element, open the StreamPipes UI and follow the manual provided in
-the [user guide](03_use-install-pipeline-elements.md).
+the [user guide](06_configure-operate-extensions.md).
 
 ## Read more
 
 Congratulations! You've just created your first data processor for StreamPipes.
 There are many more things to explore and data processors can be defined in much more detail using multiple wrappers.
-Follow our [SDK guide](06_extend-sdk-static-properties.md) to see what's possible!
+Follow our [SDK guide](07_extend-sdk-static-properties.md) to see what's possible!
diff --git a/website-v2/versioned_docs/version-0.95.0/06_extend-tutorial-data-sinks.md b/docs/05_how-to-custom-data-sink.md
similarity index 98%
rename from website-v2/versioned_docs/version-0.95.0/06_extend-tutorial-data-sinks.md
rename to docs/05_how-to-custom-data-sink.md
index 09baeff71..15c700cef 100644
--- a/website-v2/versioned_docs/version-0.95.0/06_extend-tutorial-data-sinks.md
+++ b/docs/05_how-to-custom-data-sink.md
@@ -1,7 +1,7 @@
 ---
-id: extend-tutorial-data-sinks
-title: "Tutorial: Data Sinks"
-sidebar_label: "Tutorial: Data Sinks"
+id: how-to-custom-data-sink
+title: "Write a custom data sink"
+sidebar_label: "Write a custom data sink"
 ---
 
 In this tutorial, we will add a new data sink using the standalone wrapper.
@@ -30,7 +30,7 @@ mvn archetype:generate -DarchetypeGroupId=org.apache.streampipes \
 -DgroupId=org.streampipes.tutorial -DartifactId=sink-tutorial -DclassNamePrefix=Rest -DpackageName=mypackage
 ```
 
-You will see a project structure similar to the structure shown in the [archetypes](06_extend-archetypes.md) section.
+You will see a project structure similar to the structure shown in the [archetypes](07_extend-archetypes.md) section.
 
 :::tip
 
@@ -263,7 +263,7 @@ Execute the main method in the class `Init` we've just created. The service auto
 StreamPipes.
 
 To install the created element, open the StreamPipes UI and follow the manual provided in
-the [user guide](03_use-install-pipeline-elements.md).
+the [user guide](06_configure-operate-extensions.md).
 
 ## Read more
 
diff --git a/docs/07_connect_mqtt.md b/docs/05_how-to-mqtt.md
similarity index 98%
rename from docs/07_connect_mqtt.md
rename to docs/05_how-to-mqtt.md
index bee2b3177..978c935b9 100644
--- a/docs/07_connect_mqtt.md
+++ b/docs/05_how-to-mqtt.md
@@ -1,7 +1,7 @@
 ---
-id: connect-mqtt
-title: MQTT
-sidebar_label: MQTT
+id: how-to-mqtt
+title: Integrate MQTT data
+sidebar_label: Integrate MQTT data
 ---
 
 This document provides an overview of the MQTT connection and security configuration options available in StreamPipes. It covers how to configure broker connections, authentication modes, and TLS/SSL security settings — including guidance on keystore and truststore management for secure communication.
diff --git a/docs/05_how-to-opcua.md b/docs/05_how-to-opcua.md
new file mode 100644
index 000000000..5925eb2d8
--- /dev/null
+++ b/docs/05_how-to-opcua.md
@@ -0,0 +1,5 @@
+---
+id: how-to-opcua
+title: Integrate OPC UA data
+sidebar_label: Integrate OPC UA data
+---
diff --git a/website-v2/versioned_docs/version-0.93.0/05_deploy-kubernetes.md b/docs/06_configure-operate-deployment.md
similarity index 77%
rename from website-v2/versioned_docs/version-0.93.0/05_deploy-kubernetes.md
rename to docs/06_configure-operate-deployment.md
index 478e1a3c9..ca1f74339 100644
--- a/website-v2/versioned_docs/version-0.93.0/05_deploy-kubernetes.md
+++ b/docs/06_configure-operate-deployment.md
@@ -1,9 +1,140 @@
 ---
-id: deploy-kubernetes
-title: Kubernetes Deployment
-sidebar_label: Kubernetes Deployment
+id: configure-operate-deployment
+title: Deployment options
+sidebar_label: Deployment options
 ---
 
+
+## Introduction
+
+StreamPipes comes with many different options to customize a deployment. This section introduces the various options you can choose from when installing StreamPipes.
+
+You can choose between various **deployment modes**, choose from two different core packages and several extension packages, wich are described below.
+
+## Deployment Mode
+
+For the deployment model, you choose between a standard multi-container `Docker-Compose` installation and the `Kubernetes` installation.
+we provide several `Docker-Compose` files for the various options shown here and a `helm chart`. 
+See [Docker Deployment](06_deploy-docker.md) and [Kubernetes Deployment](06_deploy-kubernetes.md) for more details.
+
+### Running StreamPipes in a non-containerized environment
+
+Of course, it is also possible to launch StreamPipes in a non-containerized environment. 
+You will need to build your own executable binaries by running `mvn package`.
+In addition, it is required to install the required 3rd party services (see [Architecture](07_technicals-architecture.md)) and configure the environment variables as described in [Environment Variables](06_configure-operate-environment-variables.md).
+
+## Core Service
+
+We provide two different pre-packaged versions of core services. The default `streampipes-service-core` is a packaged JAR file which includes client libraries for the various messaging systems StreamPipes supports at the cost of a larger file size.
+In case you plan to run StreamPipes on less resource-intensive hardware, we recommend to switch to the `streampipes-service-core-minimal` package, which only includes support for MQTT and NATS, but has a smaller file size and slightly improved startup performance.
+
+## Extension Services
+
+Similar to the core, we provide several pre-packaged extension services which differ mainly by their file size, number of supported adapters and pipeline elements and messaging systems.
+
+The following packages exist:
+
+* `streampipes-extensions-all-jvm` is the largest package and includes all official StreamPipes adapters and pipeline elements. It also includes support for all messaging systems Streampipes currently supports.
+* `streampipes-extensions-all-iiot` is a subset of the aforementioned package and excludes adapters and pipeline elements which are often not relevant for IIoT use cases. For instance, the package excludes text mining-related pipeline elements.
+* `streampipes-extensions-iiot-minimal` is a subset of the aforementioned package and includes only support for the lightweight messaging systems MQTT and NATS.
+
+Generally said, in cases where you plan to deploy StreamPipes on a resource-limited edge device, we recommend a combination of the `streampipes-service-core-minimal` and `streampipes-extensions-iiot-minimal` package. This could, for instance, be a device with less than 4GB memory.
+In other cases, it depends on the use case and if you need all adapters and pipeline elements or are ok with the IIoT-related extensions.
+
+## Messaging System
+
+StreamPipes can be configured to use different messaging systems for exchanging events between adapters and pipeline elements.
+The section [Messaging](07_technicals-messaging.md) includes detailed information on the configuration of messaging systems. 
+
+
+StreamPipes Compose is a simple collection of user-friendly `docker-compose` files that easily lets gain first-hand experience with Apache StreamPipes.
+
+> **NOTE**: We recommend StreamPipes Compose to only use for initial try-out and testing. If you are a developer and
+> want to develop new pipeline elements or core feature, use the [StreamPipes CLI](07_extend-cli.md).
+
+#### TL;DR: A one-liner to rule them all :-)
+
+```bash
+docker-compose up -d
+```
+Go to http://localhost to finish the installation in the browser. Once finished, switch to the pipeline editor and start the interactive tour or check the [online tour](https://streampipes.apache.org/docs/user-guide-tour/) to learn how to create your first pipeline!
+
+## Prerequisites
+* Docker >= 17.06.0
+* Docker-Compose >= 1.17.0 (Compose file format: 3.4)
+* Google Chrome (recommended), Mozilla Firefox, Microsoft Edge
+
+Tested on: **macOS, Linux, Windows 10 upwards** (CMD, PowerShell, GitBash)
+
+**macOS** and **Windows** users can easily get Docker and Docker-Compose on their systems by installing **Docker for Mac/Windows** (recommended).
+
+> **NOTE**: On purpose, we disabled all port mappings except of http port **80** to access the StreamPipes UI to provide minimal surface for conflicting ports.
+
+## Usage
+We provide several options to get you going:
+
+- **default**: Default docker-compose file, called `docker-compose.yml`.
+- **nats**: The standard installation which uses Nats as message broker,called `docker-compose.nats.yml`.
+- **full**: Contains experimental Flink wrappers, called `docker-compose.full.yml`.
+
+:::info
+
+Other options include configurations for the internally used message broker. The current default is `Kafka`, but you can also start StreamPipes with `Nats`, `MQTT` or `Apache Pulsar`.
+Use one of the other provided docker-compose files.
+
+:::
+
+**Starting** the **default** option is as easy as simply running:
+> **NOTE**: Starting might take a while since `docker-compose up` also initially pulls all Docker images from Dockerhub.
+
+```bash
+docker-compose up -d
+# go to `http://localhost` after all services are started
+```
+After all containers are successfully started just got to your browser and visit http://localhost to finish the installation. Once finished, switch to the pipeline editor and start the interactive tour or check the [online tour](https://streampipes.apache.org/docs/user-guide-tour/) to learn how to create your first pipeline!
+
+**Stopping** the **default** option is similarly easy:
+```bash
+docker-compose down
+# if you want to remove mapped data volumes, run:
+# docker-compose down -v
+```
+
+Starting the **nats** option is almost the same, just specify the `docker-compose.nats.yml` file:
+```bash
+docker-compose -f docker-compose.nats.yml up -d
+# go to `http://localhost` after all services are started
+```
+**Stopping** the **nats** option:
+```bash
+docker-compose -f docker-compose.nats.yml down
+```
+
+
+Starting the **full** option is almost the same, just specify the `docker-compose.full.yml` file:
+```bash
+docker-compose -f docker-compose.full.yml up -d
+#go to `http://localhost` after all services are started
+```
+Stopping the **full** option:
+```bash
+docker-compose -f docker-compose.nats.yml down
+#docker-compose -f docker-compose.nats.yml down -v
+```
+
+## Update services
+To actively pull the latest available Docker images use:
+```bash
+docker-compose pull
+```
+
+## Upgrade
+To upgrade to another StreamPipes version, simply edit the `SP_VERSION` in the `.env` file.
+```
+SP_VERSION=<VERSION>
+```
+
+
 ## Prerequisites
 Requires Helm (https://helm.sh/) and an actively running Kubernetes cluster.
 
@@ -99,22 +230,6 @@ Here is an overview of the supported parameters to configure StreamPipes.
 
 ### External common parameters
 
-#### Consul common parameters
-
-| Parameter Name                                  | Description                                              | Value                                    |
-|-------------------------------------------------|----------------------------------------------------------|------------------------------------------|
-| external.consul.appName                         | Consul application name                                  | "consul"                                 |
-| external.consul.version                         | Consul version                                           | 1.14.3                                   |
-| external.consul.webPort                         | Port number for the Consul web interface                 | 8500                                     |
-| external.consul.dnsPort                         | Port number for the Consul DNS interface                 | 8600                                     |
-| external.consul.persistence.storageClassName    | Storage class name for Consul PVs                        | "hostpath"                               |
-| external.consul.persistence.storageSize         | Size of the Consul PV                                    | "1Gi"                                    |
-| external.consul.persistence.claimName           | Name of the Consul PersistentVolumeClaim                 | "consul-pvc"                             |
-| external.consul.persistence.pvName              | Name of the Consul PersistentVolume                      | "consul-pv"                              |
-| external.consul.service.name                    | Name of the Consul service                               | "consul"                                 |
-| external.consul.service.webPort                 | TargetPort of the Consul service for web interface       | 8500                                     |
-| external.consul.service.dnsPort                 | TargetPort of the Consul service for DNS interface       | 8600                                     |
-
 #### Couchdb common parameters
 
 | Parameter Name                                  | Description                                              | Value                                    |
@@ -283,3 +398,35 @@ data:
 ```bash
 helm uninstall streampipes
 ```
+
+
+his page explains how SSL Certificates can be used to provide transport layer security between your Browser and the Streampipes Backend.
+
+## Prerequisites
+You need a valid Certificate consisting of a Private and a Public Key. Both Keys must be in PEM Format. Please note that your Private Key should never be shared, otherwise the communication can not be considered secure.
+
+## Edit docker-compose.yml
+In order to use SSL you have to open port 443 on the nginx Service. Incoming insecure Traffic on Port 80 will be automatically rerouted to Port 443.
+
+The Environment-Variable NGINX_SSL must be set to "true".
+
+Finally you have to inject the Certificates into the Docker-Container. In the example below, the Certificates are placed in the directory /etc/ssl/private/ on the host machine. Please change the path according to the place where the Certificates are located on your machine. The path after the colon should not be changed!
+```yaml
+[...]
+  nginx:
+    image: apachestreampipes/ui
+    ports:
+      - "80:80"
+      - "443:443"
+    environment:
+      - NGINX_SSL=true
+    volumes:
+      - /etc/ssl/private/private.pem:/etc/nginx/ssl/ssl.pem
+      - /etc/ssl/private/public.pem:/etc/nginx/ssl/cert.pem
+    depends_on:
+      - backend
+    networks:
+      spnet:
+[...]
+```
+
diff --git a/website-v2/versioned_docs/version-0.95.0/05_deploy-environment-variables.md b/docs/06_configure-operate-environment-variables.md
similarity index 98%
rename from website-v2/versioned_docs/version-0.95.0/05_deploy-environment-variables.md
rename to docs/06_configure-operate-environment-variables.md
index c4066fb70..916941fd8 100644
--- a/website-v2/versioned_docs/version-0.95.0/05_deploy-environment-variables.md
+++ b/docs/06_configure-operate-environment-variables.md
@@ -1,5 +1,5 @@
 ---
-id: deploy-environment-variables
+id: configure-operate-environment-variables
 title: Environment Variables
 sidebar_label: Environment Variables
 ---
@@ -85,4 +85,4 @@ For a standard deployment, it is recommended to customize the following variable
 
 ## Auto-generation of variables in K8s setups
 
-See the [Kubernetes Guide](05_deploy-kubernetes.md) for an overview of auto-generated variables.
+See the [Kubernetes Guide](06_deploy-kubernetes.md) for an overview of auto-generated variables.
diff --git a/docs/06_configure-operate-extension-services.md b/docs/06_configure-operate-extension-services.md
new file mode 100644
index 000000000..d746ee46f
--- /dev/null
+++ b/docs/06_configure-operate-extension-services.md
@@ -0,0 +1,5 @@
+---
+id: configure-operate-extension-services
+title: Extension Services
+sidebar_label: Extension Services
+---
diff --git a/docs/06_configure-operate-extensions.md b/docs/06_configure-operate-extensions.md
new file mode 100644
index 000000000..0ac09ae59
--- /dev/null
+++ b/docs/06_configure-operate-extensions.md
@@ -0,0 +1,9 @@
+---
+id: configure-operate-extensions
+title: Manage Extensions
+sidebar_label: Manage Extensions
+---
+
+## Install Pipeline Elements
+
+(coming soon)
diff --git a/website-v2/versioned_docs/version-0.95.0/03_use-configurations.md b/docs/06_configure-operate-general-settings.md
similarity index 93%
rename from website-v2/versioned_docs/version-0.95.0/03_use-configurations.md
rename to docs/06_configure-operate-general-settings.md
index 4aa953fbb..d6fd002ed 100644
--- a/website-v2/versioned_docs/version-0.95.0/03_use-configurations.md
+++ b/docs/06_configure-operate-general-settings.md
@@ -1,7 +1,7 @@
 ---
-id: use-configurations
-title: Configurations
-sidebar_label: Configurations
+id: configure-operate-general-settings
+title: General Settings
+sidebar_label: General Settings
 ---
 
 The configuration section is an admin-only interface for system-wide settings.
@@ -45,4 +45,4 @@ Individual configurations of extensions services are available in this view. The
 
 The security configuration allows to manage existing user accounts, service accounts and groups. New users can be added and roles can be assigned.
 
-Please also read more about security [here](05_deploy-security.md).
+Please also read more about security [here](06_configure-operate-security.md).
diff --git a/docs/05_deploy-security.md b/docs/06_configure-operate-security.md
similarity index 99%
rename from docs/05_deploy-security.md
rename to docs/06_configure-operate-security.md
index 01c2e024c..7101b36b4 100644
--- a/docs/05_deploy-security.md
+++ b/docs/06_configure-operate-security.md
@@ -1,7 +1,7 @@
 ---
-id: deploy-security
-title: Security
-sidebar_label: Security
+id: configure-operate-security
+title: Security & User Management
+sidebar_label: Security & User Management
 ---
 
 ## Overriding default settings
diff --git a/docs/06_extend-archetypes.md b/docs/06_extend-archetypes.md
deleted file mode 100644
index a6907f0ee..000000000
--- a/docs/06_extend-archetypes.md
+++ /dev/null
@@ -1,46 +0,0 @@
----
-id: extend-archetypes
-title: Maven Archetypes
-sidebar_label: Maven Archetypes
----
-
-In this tutorial we explain how you can use the Maven archetypes to develop your own StreamPipes processors and sinks.
-We use IntelliJ in this tutorial, but it works with any IDE of your choice.
-
-## Prerequisites
-You need to have Maven installed, further you need an up and running StreamPipes installation on your development computer.
-
-## Create Project
-To create a new project, we provide multiple Maven Archteypes.
-Currently, we provide archetypes for standalone Java-based microservices and archetypes for the experimental Flink wrapper.
-The commands required to create a new pipeline element project can be found below. Make sure that you select a version compatible with your StreamPipes installation.
-Copy the command into your terminal to create a new project.
-The project will be created in the current folder.
-First, the ``groupId`` of the resulting Maven artifact must be set.
-We use ``groupId``: ``org.example`` and ``artifactId``: ``ExampleProcessor``.
-You can keep the default values for the other settings, confirm them by hitting enter.
-
-:::info Choosing the right version
-Make sure that the version used to create your archetype matches your running Apache StreamPipes version.
-In the example below, replace `{sp.version}` with the proper version, e.g., `0.92.0`.
-:::
-
-```bash
-mvn archetype:generate                              	 	     \
-  -DarchetypeGroupId=org.apache.streampipes          			         \
-  -DarchetypeArtifactId=streampipes-archetype-extensions-jvm  \
-  -DarchetypeVersion={sp.version}
-```
-
-
-## Project structure
-Open the project in your IDE.
-If everything worked, the structure should look similar to the following image.
-In the *main* package, it is defined which processors / sinks you want to activate and the *pe.example* package contains two skeletons for creating a data processor and sink.
-For details, have a look at the other parts of the Developer Guide, where these classes are explained in more depth.
-
-<img src="/img/archetype/project_structure.png" width="30%" alt="Project Structure"/>
-
-## Next steps
-
-Click [here](06_extend-first-processor.md) to learn how to create your first data processor.
diff --git a/docs/06_extend-client.md b/docs/06_extend-client.md
deleted file mode 100644
index f584c3d2c..000000000
--- a/docs/06_extend-client.md
+++ /dev/null
@@ -1,204 +0,0 @@
----
-id: extend-client
-title: StreamPipes Client
-sidebar_label: StreamPipes Client
----
-
-
-:::info Looking for Python support?
-
-This section explains how to use the Apache StreamPipes Java Client. Please read the Python docs to find out how to use
-the client for Python.
-
-:::
-
-## About the StreamPipes client
-
-Sometimes you don't want to write your own extensions to StreamPipes, but want to interact with StreamPipes from
-external application.
-One example is to influence the lifecycle of pipelines - think of a feature which automatically starts or stops specific
-pipelines that monitor the production of a specific product.
-
-Another example is to gather live data from Apache StreamPipes, e.g., to consume data that has been previously connected
-by an external, standalone application.
-
-For such use cases, we provide the StreamPipes client, which is currently available in Python and Java. This section
-covers the usage of the Java client.
-
-## Using the StreamPipes client
-
-:::info Choosing the right version
-
-Your client library version should match the installed Apache StreamPipes version. Replace `${streampipes.version}` with
-the version of your installation, e.g., `0.92.0`.
-
-:::
-
-In your Java project, add the following dependency to your pom file:
-
-```xml
-
-<dependency>
-    <groupId>org.apache.streampipes</groupId>
-    <artifactId>streampipes-client</artifactId>
-    <version>${streampipes.version}</version>
-</dependency>
-
-```
-
-## Obtaining an API token
-
-<img className="docs-image" src="/img/screenshots/streampipes-profile-token.png" alt="Overview StreamPipes Architecture"/>
-
-To communicate with Apache StreamPipes, you need to provide proper credentials. There are two ways to obtain
-credentials:
-
-* An API token, which is bound to a user. The API token can be generate from the UI clicking on the user icon and then
-  navigate to `Profile/API`.
-* A service user, which can be created by users with role `Admin`.
-
-Service users can have their own permissions, while API tokens inherit all permissions from the corresponding user.
-
-## Connecting to StreamPipes
-
-Once you have your API token and configured your dependencies, you can connect to an Apache StreamPipes instance as
-follows:
-
-```java
-
-CredentialsProvider credentials=StreamPipesCredentials
-    .withApiKey("admin@streampipes.apache.org","YOUR_API_KEY");
-
-// Create an instance of the StreamPipes client
-    StreamPipesClient client=StreamPipesClient
-    .create("localhost",8082,credentials,true);
-
-```
-
-The following configurations are required:
-
-* The `withApiKey` method expects the username and the API key. Alternatively, use the `withServiceToken` method to
-  authenticate as a service user.
-* The client instance requires the hostname or IP address of your running StreamPipes instance. In addition, you need to
-  provide the port, the credentials object and a flag which needs to be set in case the StreamPipes instance is not
-  served over HTTPS.
-* There are short-hand convenience options to create a client instance.
-
-## Working with the client
-
-Here are some examples how you can work with the StreamPipes client:
-
-```java
-
-// Get streams
-List<SpDataStream> streams=client.streams().all();
-
-// Get a specific stream
-    Optional<SpDataStream> stream=client.streams().get("STREAM_ID");
-
-// see the schema of a data stream
-    EventSchema schema=stream.get().getEventSchema();
-
-// print the list of fields of this stream
-    List<EventProperty> fields=schema.getEventProperties();
-
-// Get all pipelines
-    List<Pipeline> pipelines=client.pipelines().all();
-
-// Start a pipeline
-    PipelineOperationStatus status=client.pipelines().start(pipelines.get(0));
-
-// Stop a pipeline with providing a pipeline Id
-    PipelineOperationStatus status=client.pipelines().stop("PIPELINE_ID");
-
-// Get all pipeline element templates
-    List<PipelineElementTemplate> templates=client.pipelineElementTemplates().all();
-
-// Get all data sinks
-    List<DataSinkInvocation> dataSinks=client.sinks().all();
-
-
-```
-
-## Consuming live data
-
-StreamPipes supports a variety of messaging protocols to internally handle data streams. If you plan to gather live data
-from the client library, you also need to add one or more of the supported messaging
-protocols to the pom file. The default protocol depends on the StreamPipes configuration and is set in the `.env` file
-in your installation folder.
-
-```xml
-
-<!-- For Kafka support -->
-<dependency>
-    <groupId>org.apache.streampipes</groupId>
-    <artifactId>streampipes-messaging-kafka</artifactId>
-    <version>${streampipes.version}</version>
-</dependency>
-
-        <!-- For Nats support -->
-<dependency>
-<groupId>org.apache.streampipes</groupId>
-<artifactId>streampipes-messaging-nats</artifactId>
-<version>${streampipes.version}</version>
-</dependency>
-
-
-        <!-- For MQTT support -->
-<dependency>
-<groupId>org.apache.streampipes</groupId>
-<artifactId>streampipes-messaging-mqtt</artifactId>
-<version>${streampipes.version}</version>
-</dependency>
-
-```
-
-In addition, add the message format that is used internally by StreamPipes. The default message format used by
-StreamPipes is JSON, so let's include the dependency as well:
-
-```xml
-
-<!-- For JSON support -->
-<dependency>
-    <groupId>org.apache.streampipes</groupId>
-    <artifactId>streampipes-dataformat-json</artifactId>
-    <version>${streampipes.version}</version>
-</dependency>
-
-```
-
-Once you've imported the dependencies, it is easy to consume live data. First, register the protocols and formats in
-your client instance:
-
-```java
-
-client.registerProtocol(new SpKafkaProtocolFactory());
-
-// or Nats:
-    client.registerProtocol(new SpNatsProtocolFactory());
-
-// data format:
-    client.registerDataFormat(new JsonDataFormatFactory());
-
-```
-
-Then, you are ready to consume data:
-
-```java
-
-client.streams().subscribe(dataStreams.get(0),new EventProcessor() {
-@Override
-public void onEvent(Event event) {
-    // example
-    MapUtils.debugPrint(System.out,"event",event.getRaw());
-    }
-    });
-
-```
-
-:::tip
-
-There are many more options to work with the StreamPipes Client - e.g., you can trigger emails directly from the API.
-Just explore the various classes and interfaces provided by the client!
-
-:::
diff --git a/docs/06_extend-tutorial-adapters.md b/docs/06_extend-tutorial-adapters.md
deleted file mode 100644
index 4e95cba9a..000000000
--- a/docs/06_extend-tutorial-adapters.md
+++ /dev/null
@@ -1,612 +0,0 @@
----
-id: extend-tutorial-adapters
-title: "Tutorial: Build Custom Adapters"
-sidebar_label: "Tutorial: Adapters"
----
-
-In this tutorial, we will create a new data source consisting of a single data stream.
-By the end of the tutorial, you will be able to implement custom adapters that allow you to connect to data sources
-other than those officially supported by StreamPipes.
-To do this, we will split the tutorial into two parts.
-The [first part](#building-a-basic-adapter) focuses on creating the adapter and defining the event stream.
-At the end, we will have a working adapter that produces an event stream that can be used in StreamPipes.
-This adapter does not provide any way to configure its behavior, so in
-the [second part](#building-a-more-advanced-adapter-by-processing-ui-input) of the tutorial
-to show how we can extend our existing adapter to be configurable via the UI.
-
-:::info
-This tutorial shows how to build your own type of adapter.
-It is intended for people who are interested in extending StreamPipes to meet their own needs.
-If you are here to explore StreamPipes and are interested in using an adapter, you may want to
-continue [here](./03_use-connect.md).
-:::
-
-## Objective
-
-We are going to create an adapter that will simulate a stream of data generated by a control station in a logistics
-center that is used to sort packages.
-This station consists of two sensors: a light barrier that detects when a package passes through, and a weight sensor.
-
-This sensor produces a continuous stream of events containing the current time stamp, an indicator of whether a package
-is present or the conveyor is empty, and the weight of the package in kilograms.
-The events are published in JSON format as follows
-
-```json
-{
-  "timestamp": 1697720916959,
-  "parcelPresent": true,
-  "weight": 3.520
-}
-```
-
-In the following section, we will show you how to develop an adapter that is capable of generating this stream so that
-it is available for further processing in StreamPipes.
-
-## Project Set Up
-
-Instead of creating a new project from scratch, we recommend to use our Maven archetype to create a new project
-skeleton (`streampipes-archetype-extensions-jvm`).
-Enter the following command in a command line of your choice (please ensure
-that [Apache Maven](https://maven.apache.org/install.html) isinstalled):
-
-```bash
-mvn archetype:generate \
--DarchetypeGroupId=org.apache.streampipes -DarchetypeArtifactId=streampipes-archetype-extensions-jvm \
--DarchetypeVersion=0.93.0 -DgroupId=org.apache.streampipes \
--DartifactId=streampipes-archetype-extensions-jvm -DclassNamePrefix=ParcelControlStation -DpackageName=parcelcontrol
-```
-
-This command will ask you for input twice, you can just skip both of them by hitting *enter*.
-The first dialog sets the version to use for our `streampipes-archetype-extensions-jvm` module.
-Feel free to change this if you like.
-
-```bash
-Define value for property 'version' 1.0-SNAPSHOT: : 
-
- Y: : 
-```
-
-The `mvn archetype:generate` command generates some required files, the required file structure, and some boilerplate
-code.
-The generated file structure should look like the following:
-
-:::info
-Note that you can customize the parameters of the mvn command to affect the file structure and file naming.
-:::
-
-```bash
-
-|streampipes-archetype-extensions  # name is determined by '-DartifactId'
-|-- development
-|   |-- env 
-|-- src
-|   |-- main
-|   |   |-- java.org.apache.streampipes  # name after .java. is determined by '-DgroupId'
-|   |   |   |-- pe.parcelcontrol  # name after .pe. is determined by '-DpackageName'
-|   |   |   |   |-- ParcelControlStationDataProcessor.java  # class name is determined by '-DclassNamePrefix'
-|   |   |   |   |-- ParcelControlStationDataSink.java
-|   |   |   |   |-- ParcelControlStationGenericAdapter.java
-|   |   |   |   |-- ParcelControlStationSpecificAdapter.java
-|   |   |   |-- Init.java
-|   |   |-- resources
-|   |   |   |-- org.apache.streampipes.pe.parcelcontrol.genericadapter
-|   |   |   |   |-- documentation.md
-|   |   |   |   |-- icon.png
-|   |   |   |   |-- strings.en
-|   |   |   |-- org.apache.streampipes.pe.parcelcontrol.processor
-|   |   |   |   |-- documentation.md
-|   |   |   |   |-- icon.png
-|   |   |   |   |-- strings.en
-|   |   |   |-- org.apache.streampipes.pe.parcelcontrol.sink
-|   |   |   |   |-- documentation.md
-|   |   |   |   |-- icon.png
-|   |   |   |   |-- strings.en
-|   |   |   |-- org.apache.streampipes.pe.parcelcontrol.specificadapter
-|   |   |   |   |-- documentation.md
-|   |   |   |   |-- icon.png
-|   |   |   |   |-- strings.en
-|   |-- test.java.org.apache.streampipes  # name after .java. is determined by '-DgroupId'
-|   |   |-- InitTest.java
-|-- Dockerfile
-|-- pom.xml
-
-```
-
-:::tip
-In addition to the basic project skeleton, the sample project also includes a sample `Dockerfile` that you can use to
-package your application into a Docker container.
-:::
-
-## Building a Basic Adapter
-
-In the following, we will demonstrate how to use the boilerplate code generated by the Maven plugin (
-see [Project setup](#project-setup)).
-Within this section, we will focus on creating an event stream that can be used within StreamPipes.
-The following section shows how to configure the created adapter with UI input.
-
-Attentive readers may have noticed that two adapter classes have been generated.
-We will focus on the `ParcelControlStationSpecificAdapter` first, the `ParcelControlStationSimulatorGenericAdapter` will
-be used later for more advanced adapter features.
-First, let us take a look at the `ParcelControlStationSpecificAdapter.java` file as generated by the Maven
-archetype.
-
-```java jsx showLineNumbers
-package org.apache.streampipes.pe.parcelcontrol;
-
-import org.apache.streampipes.commons.exceptions.connect.AdapterException;
-import org.apache.streampipes.extensions.api.connect.IAdapterConfiguration;
-import org.apache.streampipes.extensions.api.connect.IEventCollector;
-import org.apache.streampipes.extensions.api.connect.StreamPipesAdapter;
-import org.apache.streampipes.extensions.api.connect.context.IAdapterGuessSchemaContext;
-import org.apache.streampipes.extensions.api.connect.context.IAdapterRuntimeContext;
-import org.apache.streampipes.extensions.api.extractor.IAdapterParameterExtractor;
-import org.apache.streampipes.model.AdapterType;
-import org.apache.streampipes.model.connect.guess.GuessSchema;
-import org.apache.streampipes.sdk.builder.adapter.AdapterConfigurationBuilder;
-import org.apache.streampipes.sdk.builder.adapter.GuessSchemaBuilder;
-import org.apache.streampipes.sdk.helpers.Labels;
-import org.apache.streampipes.sdk.helpers.Locales;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class ParcelControlStationSpecificAdapter implements StreamPipesAdapter {
-
-  private boolean running = false;
-
-  @Override
-  public IAdapterConfiguration declareConfig() {
-    return AdapterConfigurationBuilder.create(
-        "org.apache.streampipes.pe.parcelcontrol.specificadapter",
-        ParcelControlStationSpecificAdapter::new
-      )
-      .withAssets(Assets.DOCUMENTATION, Assets.ICON)
-      .withCategory(AdapterType.Manufacturing)
-      .withLocales(Locales.EN)
-      .buildConfiguration();
-  }
-
-  @Override
-  public void onAdapterStarted(IAdapterParameterExtractor extractor,
-                               IEventCollector collector,
-                               IAdapterRuntimeContext adapterRuntimeContext) throws AdapterException {
-
-    Runnable demo = () -> {
-      while (running) {
-        // make event
-        Map<String, Object> event = new HashMap<>();
-        // forward the event to the adapter pipeline
-        collector.collect(event);
-      }
-    };
-    running = true;
-    new Thread(demo).start();
-  }
-
-  @Override
-  public void onAdapterStopped(IAdapterParameterExtractor extractor,
-                               IAdapterRuntimeContext adapterRuntimeContext) throws AdapterException {
-
-    // do cleanup
-    running = false;
-  }
-
-  @Override
-  public GuessSchema onSchemaRequested(IAdapterParameterExtractor extractor,
-                                       IAdapterGuessSchemaContext adapterGuessSchemaContext) throws AdapterException {
-
-    // build the schema by adding properties to the schema builder and a preview if possible
-    return GuessSchemaBuilder
-      .create()
-      .build();
-    }
-  }
-
-```
-
-The class extends `StreamPipesAdapter`, which is the interface that all adapters within StreamPipes must implement.
-This interface requires us to implement four methods:
-
-* `declareConfig()`: This method is expected to return the configuration of the adapter. The configuration includes
-  metadata about the adapter and its input parameters.
-* `onAdapterStarted()`: This method is expected to contain the actual adapter logic. It is called when the adapter is
-  started, and is responsible for sending incoming data to StreamPipes as an event.
-* `onAdapterStopped()`: This method is called when the adapter is stopped and is responsible for gracefully exiting the
-  adapter.
-  gracefully and usually performs some cleanup tasks.
-* `onSchemaRequested()`: This method is expected to return the schema of the event stream. This is ideally done
-  dynamically based on some incoming data (*guess*) or provided statically if not otherwise possible.
-
-### Describing the Adapter via the Configuration
-
-The standard code generated here is already sufficient for us.
-So let's have a quick look at the important aspects:
-
-* `Line 4`: Here we define a unique identifier for our adapter. This allows us to identify all instances of the same
-  adapter. Including your own namespace is always a good choice to avoid conflicts.
-* `Line 7`: Here we define what assets are available for this adapter. In this case, we provide a documentation file and
-  an icon. Both assets are located in the `resource' directory (see file tree above).
-* `Line 8`: This defines a rough categorization along predefined adapter types.
-* `Line 9`: Here we define which locales are available for this adapter. Since we only provide one `strings.en' file so
-  far (see file tree above), the current selection is sufficient. Theoretically you can support multiple languages, but
-  this is not fully supported yet.
-
-```java jsx {4,7-9} showLineNumbers
-  @Override
-  public IAdapterConfiguration declareConfig() {
-    return AdapterConfigurationBuilder.create(
-        "org.apache.streampipes.pe.parcelcontrol.specificadapter",
-        ParcelControlStationSpecificAdapter::new
-      )
-      .withAssets(Assets.DOCUMENTATION, Assets.ICON)
-      .withCategory(AdapterType.Manufacturing)
-      .withLocales(Locales.EN)
-      .buildConfiguration();
-  }
-```
-
-Before we continue, let's quickly have a look at the `strings.en` file that defines our locales.
-Here we can define a meaningful and human-readable adapter tile in the first line and a short description:
-
-```text
-org.apache.streampipes.pe.parcelcontrol.specificadapter.title=Parcel Control Station (simple)
-org.apache.streampipes.pe.parcelcontrol.specificadapter.description=This adapter simulates data coming from a parcel control station in a logistics center.
-```
-
-Now we have successfully configured our adapter and prepared all descriptive elements, we can focus on the actual logic.
-
-### Creating the Data Stream
-
-The logic that creates events that are then populated via StreamPipes is defined in `onAdapterStarted()`.
-Within this method, connectors usually connect to the data source and extract data.
-In our case, however, we simply want to create some sample data directly.
-The two main parts that should always happen within this method are highlighted in the provided skeleton code:
-
-* `Line 10`: Creating an event is crucial for our adapters. This event is then filled with data by the adapter before it
-  is distributed.
-* `Line 13`: The event must finally be passed to the `collector`, which then takes the data and distributes it within
-  StreamPipes in the form of a [data stream](./02_concepts-overview.md#data-stream).
-
-```java jsx {10,13} showLineNumbers
-@Override
-public void onAdapterStarted(IAdapterParameterExtractor extractor,
-                             IEventCollector collector,
-                             IAdapterRuntimeContext adapterRuntimeContext) throws AdapterException {
-
-  Runnable demo = () -> {
-    while (running) {
-    
-      // make event
-      Map<String, Object> event = new HashMap<>();
-      
-      // forward the event to the adapter pipeline
-      collector.collect(event);
-    }
-  };
-  running = true;
-  new Thread(demo).start();
-}
-```
-
-So the only thing left to do is to create the actual events.
-In our scenario, we want to create two types of events: one describing an empty conveyor and one describing a detected
-and weighed package.
-To keep the implementation simple, we simply want to have a parcel event every five seconds. We can implement this as
-follows:
-
-```java
- Runnable parcelControl = () -> {
-    while (running) {
-    
-      // get the current time in seconds
-      long timestamp = System.currentTimeMillis();
-      long timeInSeconds = (int) timestamp / 1000;
-    
-      // make event
-      Map<String, Object> event = new HashMap<>();
-      event.put("timestamp", timestamp);
-      
-      if (timeInSeconds % 5 == 0) {
-        event.put("parcelPresent", true);
-        event.put("weight", ThreadLocalRandom.current().nextDouble(0, 10));
-        
-      } else {
-        event.put("parcelPresent", false);
-        event.put("weight", 0);
-      }
-      
-      // forward the event to the adapter pipeline
-      collector.collect(event);
-
-      try {
-        Thread.sleep(1000);
-      } catch (InterruptedException e) {
-        throw new RuntimeException(e);
-      }
-    }
-  };
-  running = true;
-  new Thread(parcelControl).start();
-```
-
-This is already enough to get a data stream into StreamPipes.
-As the next step we need to describe to event schema.
-
-### Defining the Event Schema
-
-In StreamPipes, each data stream comes with an event schema that describes what information the event contains,
-in what data formats, and some semantic type information.
-This allows StreamPipes to provide easy and convenient stream handling with a lot of automatic conversions and
-validations.
-For example, whether a particular data processor is suitable for a given event stream.
-This event schema is provided by `onSchemaRequested()`:
-
-```java
-@Override
-public GuessSchema onSchemaRequested(IAdapterParameterExtractor extractor,
-                                     IAdapterGuessSchemaContext adapterGuessSchemaContext) throws AdapterException {
-
-  // build the schema by adding properties to the schema builder and a preview if possible
-  return GuessSchemaBuilder
-    .create()
-    .build();
-  }
-
-```
-
-Normally, the event schema is determined automatically and dynamically, since an adapter is usually quite generic (read
-more in the [Advanced section](#advanced)).
-But in our case, we already know the event schema, and it never changes, so we can just define it:
-
-```java jsx {3,13-20} showLineNumbers
-@Override
-public GuessSchema onSchemaRequested(IAdapterParameterExtractor extractor,
-                                     IAdapterGuessSchemaContext adapterGuessSchemaContext) throws AdapterException {
-
-  // build the schema by adding properties to the schema builder and a preview if possible
-  return GuessSchemaBuilder.create()
-          .property(timestampProperty("timestamp"))
-          .sample("timestamp", System.currentTimeMillis())
-          .property(PrimitivePropertyBuilder
-                  .create(Datatypes.Boolean, "parcelPresent")
-                  .label("Parcel Present")
-                  .description("Indicates if a parcel is weighed.")
-                  .domainProperty(SO.BOOLEAN)
-                  .scope(PropertyScope.MEASUREMENT_PROPERTY)
-                  .build())
-          .sample("parcelPresent", true)
-          .property(PrimitivePropertyBuilder
-                  .create(Datatypes.Double, "weight")
-                  .label("Parcel Weight")
-                  .description("Parcel weight")
-                  .domainProperty(SO.WEIGHT)
-                  .scope(PropertyScope.MEASUREMENT_PROPERTY)
-                  .build())
-          .sample("weight", 3.520)
-          .build();
-```
-
-An attribute of an Event is referred to as `property` in StreamPipes.
-So in our case we have three properties.
-Since StreamPipes creates a sample event in the UI when configuring the adapter (
-see [here](./03_use-connect.md#schema-editor)),
-providing a meaningful sample value for every property allows StreamPipes to demonstrate its full potential.
-
-Since every event schema is required to have a timestamp property, we provide a convenience definition (see `line 3`).
-For all other properties the recommend way of definition is using the `PrimitivePropertyBuilder` (see `line 13-20`) and
-consists of the following steps:
-
-* `Line 14`: every property must have a data type specified and a property name
-* `Line 15`: In addition to the property name we can define a label that is designed for the end user and shown in the
-  UI.
-* `Line 16`: Assigns a human-readable description to the event property. The description is used in the StreamPipes UI
-  for better explaining users the meaning of the property.
-* `Line 17`: Specifies the semantics of the property (e.g., whether a double value stands for weight or temperature
-  value).
-* `Line 18`: Assigns a property scope to the event property. This determines how the property is handled internally.
-
-:::note
-StreamPipes does not require you to provide all of this information about a property.
-Anything beyond line `14` (up to line `20`) is optional, but the more you provide, the better StreamPipes can show it's
-full potential and feature richness.
-:::
-
-This makes our adapter almost complete, there is only one little step left.
-
-### Defining the Adapter Termination
-
-As a final step, we need to define what should happen if the adapter is stopped.
-In general, the adapter should not fire any events after that.
-Normally, this step includes things like closing connections and clearing resources.
-In our case this is quite simple, we just need to stop our thread:
-
-```java
-@Override
-public void onAdapterStopped(IAdapterParameterExtractor extractor,
-                             IAdapterRuntimeContext adapterRuntimeContext) throws AdapterException {
-
-  // do cleanup
-  running = false;
-}
-```
-
-Now it's time to start our adapter and observe it in action!
-
-### Register and Run the Adapter
-
-Before we actually use our adapter, let's take a quick look at the `Init` class. This class is responsible for
-registering our adapter service with the core to make the adapter available in StreamPipes.
-This is done within `provideServiceDefinition()`. Since we don't have the generic adapter ready yet,
-we'll comment out its registration (`line 7`). Now we can run the `Init` class to register the adapter with your running
-StreamPipes instance. If you don't have a running instance at your hand,
-you can take a look at our [Installation Guide](./01_try-installation.md).
-
-```java jsx {7-8} showLineNumbers
-@Override
-public SpServiceDefinition provideServiceDefinition() {
-  return SpServiceDefinitionBuilder.create("org.apache.streampipes",
-          "human-readable service name",
-          "human-readable service description", 8090)
-      .registerRuntimeProvider(new StandaloneStreamPipesRuntimeProvider())
-      //.registerAdapter(new ParcelControlStationGenericAdapter())
-      .registerAdapter(new ParcelControlStationSpecificAdapter())
-      .registerMessagingFormats(
-          new JsonDataFormatFactory(),
-          new CborDataFormatFactory(),
-          new SmileDataFormatFactory(),
-          new FstDataFormatFactory())
-      .registerMessagingProtocols(
-          new SpKafkaProtocolFactory(),
-          new SpJmsProtocolFactory(),
-          new SpMqttProtocolFactory(),
-          new SpNatsProtocolFactory(),
-          new SpPulsarProtocolFactory())
-      .build();
-}
- ```
-
-:::tip
-When executing the `main()` method of the `Init` class, make sure that all environment variables are set from
-the `development/env` file are set.
-If they are not set, the adapter may not be able to register with StreamPipes.
-:::
-
-Once you see the following log message in the console, the adapter is ready, and you can switch to the UI of your
-StreamPipes instance.
-
-```bash
-s.s.e.c.ConnectWorkerRegistrationService : Successfully connected to master. Worker is now running.
-```
-
-Please go to the connect module and click on `New Adapter`,
-you should now be able to see your adapter `Parcel Control Station (simple)`:
-<img src="/img/06_tutorial_adapter/adapter-demo.gif" alt="Demo of parcel adapter"/>
-
-The adapter runs successfully in StreamPipes, you can now play around with the data stream that the
-adapter, or continue with the next section to learn how to make an adapter configurable through the UI.
-
-### Building a more Advanced Adapter by Processing UI Input
-
-In this section, we will extend our previous build apter by adding the ability to configure the minimum and maximum
-package
-in the UI from which the weight value is retrieved.
-The beauty of building adapters for StreamPipes is that you don't have to worry about the UI.
-StreamPipes provides a set of pre-built input elements for adapters that you can simply add to your adapter
-configuration.
-So the first thing we need to customize is `declareConfig()`:
-
-```java jsx {10-11} showLineNumbers
-@Override
-public IAdapterConfiguration declareConfig() {
-  return AdapterConfigurationBuilder.create(
-                  "org.apache.streampipes.pe.parcelcontrol.specificadapter",
-                  ParcelControlStationSpecificAdapter::new
-          )
-          .withAssets(Assets.DOCUMENTATION, Assets.ICON)
-          .withCategory(AdapterType.Manufacturing)
-          .withLocales(Locales.EN)
-          .requiredFloatParameter(Labels.withId("min-weight"), 0.0f)
-          .requiredFloatParameter(Labels.withId("max-weight"), 10.f)
-          .buildConfiguration();
-}
-
-```
-
-In line `9-10` we have introduced two input parameters that expect float values as input. They have a default value
-of `0` or `10` resp. The defined identifier (`min-weight` and `max-weight`) can be used two provide a caption and
-a description via the `strings.en` file:
-
-```text
-min-weight.title=Minimum Parcel Weight
-min-weight.description=The lower bound from which the weight values are sampled randomly.
-
-max-weight.title=Maximum Parcel Weight
-max-weight.description=The upper bound from which the weight values are sampled randomly.
-```
-
-As a last step, we now need to modify the calculation of the parcel weight, so that the provided parameters are actually
-applied.
-This is done in `onAdapterStarted()`.
-
-```java jsx {6-9,24} showLineNumbers
-@Override
-public void onAdapterStarted(IAdapterParameterExtractor extractor,
-                             IEventCollector collector,
-                             IAdapterRuntimeContext adapterRuntimeContext) throws AdapterException {
-
-  var ex = extractor.getStaticPropertyExtractor();
-  
-  float minWeight = ex.singleValueParameter("min-weight", Float.class);
-  float maxWeight = ex.singleValueParameter("max-weight", Float.class);
-
-  Runnable parcelControl = () -> {
-    while (running) {
-
-      // get the current time in seconds
-      long timestamp = System.currentTimeMillis();
-      long timeInSeconds = (int) timestamp / 1000;
-
-      // make event
-      Map<String, Object> event = new HashMap<>();
-      event.put("timestamp", timestamp);
-
-      if (timeInSeconds % 5 == 0) {
-        event.put("parcelPresent", true);
-        event.put("weight", ThreadLocalRandom.current().nextDouble(minWeight, maxWeight));
-
-      } else {
-        event.put("parcelPresent", false);
-        event.put("weight", 0);
-      }
-
-      // forward the event to the adapter pipeline
-      collector.collect(event);
-
-      try {
-        Thread.sleep(1000);
-      } catch (InterruptedException e) {
-        throw new RuntimeException(e);
-      }
-    }
-  };
-  running = true;
-  new Thread(parcelControl).start();
-}
-```
-
-* line `6-9`: We use an `StaticPropertyExtractor` to retrieve both user inputs
-* line `24`: We calculate the parcel weight by passing the configured values vor the minimum and maximum value.
-
-You can now run the `main()` method of the `Init` class to register the adapter at StreamPipes.
-The UI dialog to create a new instance of our parcel control station adapter looks now the following:
-<img src="/img/06_tutorial_adapter/adapter-with-ui-dialog.png" alt="Adapter with UI dialog"/>
-
-:::caution
-Please make sure that you uninstall the parcel adapter in `Install Pipeline Elements` before 
-you restart the execution of the `Init` class, if you have already done so.
-Otherwise, the changes made in this section will have no effect.
-:::
-
-### Read More
-
-Congratulations! You've just created your first StreamPipes adapter 🎉 <br />
-
-There are many more things to explore and data sources can be defined in much more detail.
-If this is of interest to you, the [advanced section](#advanced) will satisfy your needs.
-
-If anything within this tutorial did not work for you or you had problems following it,
-please feel free to provide some feedback by opening an [issue on GitHub](https://github.com/apache/streampipes/issues/new?assignees=&labels=bug%2Cdocumentation%2Cwebsite&projects=&template=doc_website_issue_report.yml).
-
-<!-- ## Advanced
-
-There is more to come about advanced features of our adapters. Stay tuned!
-
-### Forward Log Messages to the UI to Allow Debugging for the End User
-
-### Determine the Event Schema Based on the Concrete Data Structure
-
-### Implement a Generic Adapter that is Capable of Multiple Input Formats
-
-### Extend the Existing Pool of Parsers by Your Own Parser
-
-### Introduce a Vew Version of an Adapter and Ensure Migration of Existing Adapters -->
diff --git a/docs/06_extend-tutorial-data-processors.md b/docs/06_extend-tutorial-data-processors.md
deleted file mode 100644
index 4c2d5ee25..000000000
--- a/docs/06_extend-tutorial-data-processors.md
+++ /dev/null
@@ -1,454 +0,0 @@
----
-id: extend-tutorial-data-processors
-title: "Tutorial: Data Processors"
-sidebar_label: "Tutorial: Data Processors"
----
-
-In this tutorial, we will add a new data processor.
-
-From an architectural point of view, we will create a self-contained service that includes the description of the data
-processor and an implementation.
-
-## Objective
-
-We are going to create a new data processor that realizes a simple geofencing algorithm - we detect vehicles that enter
-a specified radius around a user-defined location.
-This pipeline element will be a generic element that works with any event stream that provides geospatial coordinates in
-form of a latitude/longitude pair.
-
-The algorithm outputs every location event once the position has entered the geofence.
-
-:::note
-
-The implementation in this tutorial is pretty simple - our processor will fire an event every time the GPS location is
-inside the geofence.
-In a real-world application, you would probably want to define a pattern that recognizes the _first_ event a vehicle
-enters the geofence.
-
-This can be easily done using a CEP library.
-
-:::
-
-## Project setup
-
-Instead of creating a new project from scratch, we recommend to use the Maven archetype to create a new project
-skeleton (streampipes-archetype-extensions-jvm).
-Enter the following command in a command line of your choice (Apache Maven needs to be installed):
-
-```
-mvn archetype:generate \
--DarchetypeGroupId=org.apache.streampipes -DarchetypeArtifactId=streampipes-archetype-extensions-jvm \
--DarchetypeVersion=0.93.0 -DgroupId=my.groupId \
--DartifactId=my-example -DclassNamePrefix=MyExample -DpackageName=mypackagename
-```
-
-You will see a project structure similar to the structure shown in the [archetypes](06_extend-archetypes.md) section.
-
-:::tip
-
-Besides the basic project skeleton, the sample project also includes an example Dockerfile you can use to package your
-application into a Docker container.
-
-:::
-
-Now you're ready to create your first data processor for StreamPipes!
-
-## Adding data processor requirements
-
-First, we will add a new stream requirement.
-Create a new class `GeofencingProcessor` which should look as follows:
-
-```java
-package org.apache.streampipes.pe.example;
-
-import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
-import org.apache.streampipes.extensions.api.pe.config.IDataProcessorConfiguration;
-import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
-import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
-import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
-import org.apache.streampipes.model.runtime.Event;
-import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
-import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
-import org.apache.streampipes.sdk.helpers.EpProperties;
-import org.apache.streampipes.sdk.helpers.EpRequirements;
-import org.apache.streampipes.sdk.helpers.Labels;
-import org.apache.streampipes.sdk.helpers.OutputStrategies;
-import org.apache.streampipes.sdk.helpers.SupportedFormats;
-import org.apache.streampipes.sdk.helpers.SupportedProtocols;
-import org.apache.streampipes.vocabulary.SO;
-
-public class GeofencingProcessor implements IStreamPipesDataProcessor {
-
-  private static final String LATITUDE_CENTER = "latitude-center";
-  private static final String LONGITUDE_CENTER = "longitude-center";
-
-
-  public IDataProcessorConfiguration declareConfig() {
-    return DataProcessorConfiguration.create(
-        GeofencingProcessor::new,
-        ProcessingElementBuilder.create(
-              "org.apache.streampipes.tutorial-geofencing"
-            )
-            .category(DataProcessorType.ENRICH)
-            .withAssets(Assets.DOCUMENTATION, Assets.ICON)
-            .build());
-  }
-
-  @Override
-  public void onPipelineStarted(IDataProcessorParameters params, 
-                                SpOutputCollector collector, 
-                                EventProcessorRuntimeContext runtimeContext) {
-
-  }
-
-  @Override
-  public void onEvent(Event event, 
-                      SpOutputCollector collector) {
-
-  }
-
-  @Override
-  public void onPipelineStopped() {
-
-  }
-}
-
-
-```
-
-In this class, we need to implement three methods: The `declareConfig` method is used to define abstract stream
-requirements such as event properties that must be present in any input stream that is later connected to the element
-using the StreamPipes UI.
-The second method, `onPipelineStarted` is triggered once a pipeline is started. 
-The `onEvent` method is called for every incoming event. 
-Finally, the `onPipelineStopped` method is called once the pipeline is stopped.
-
-Similar to data sources, the SDK provides a builder class to generate the description for data processors.
-
-The current code within the `declareConfig` method  creates a new data processor with the ID. 
-The ID is used as the internal ID of the data processor, but also used to reference additional assets in the `resources` folder, such as a `strings.en` file, used to configure labels and description, and a `documentation.md` file, which will later servce as a markdown documentation in the UI.
-But first, we will add some _stream requirements_ to the description. As we'd like to develop a generic pipeline element that
-works with any event that provides a lat/lng pair, we define two stream requirements as stated below:
-
-```java
-.requiredStream(StreamRequirementsBuilder
-    .create()
-    .requiredPropertyWithUnaryMapping(
-        EpRequirements.domainPropertyReq(Geo.LAT),
-        Labels.from("latitude-field","Latitude","The event property containing the latitude value"),
-        PropertyScope.MEASUREMENT_PROPERTY
-    )
-    .requiredPropertyWithUnaryMapping(
-        EpRequirements.domainPropertyReq(Geo.LNG),
-        Labels.from("longitude-field","Longitude","The event property containing the longitude value"),
-        PropertyScope.MEASUREMENT_PROPERTY
-    )
-    .build())
-```
-
-The first line, `.requiredStream()` defines that we want a data processor with exactly one input stream. Adding more
-stream requirements would create elements with multiple input connectors in StreamPipes.
-Stream requirements can be assigned by using the `StreamRequirementsBuilder` class.
-In our example, we define two requirements, so-called _domain property requirements_. In contrast to _data type
-requirements_ where we'd expect an event property with a field of a specific data type (e.g., float), domain property
-requirements expect a specific semantic type (called domain property), e.g., from a vocabulary such as the WGS84 Geo vocab.
-
-Once a pipeline is deployed, we are interested in the actual field (and its field name) that contains the latitude and
-longitude values.
-In some cases, there might be more than one field that satisfies a property requirement, and we would like users to
-select the property the geofencing component should operate on.
-Therefore, our example uses the method `requiredPropertyWithUnaryMapping`, which will map a requirement to a real event
-property of an input stream and let the user choose the appropriate field in the StreamPipes UI when pipelines are
-defined.
-
-Finally, the `PropertyScope` indicates that the required property is a measurement value (in contrast to a dimension
-value). This allows us later to provide improved user guidance in the pipeline editor.
-
-Similar to mapping properties, text parameters have an internalId (radius), a label and a description.
-In addition, we can assign a _value specification_ to the parameter indicating the value range we support.
-Our example supports a radius value between 0 and 1000 with a granularity of 1.
-In the StreamPipes UI, a required text parameter is rendered as a text input field, in case we provide an optional value
-specification, a slider input is automatically generated.
-
-For now, we've assigned parameters with an internal ID, a label and a description. 
-To decouple human-readable labels and description from the actual data processor description, it is possible to extract the strings to a properties file.
-In the `resources` folder, switch to a folder with the same name as the data processor's ID. If you've used the Maven archetype to build our project, there should be a `strings.en` file.
-In this file, we can configure labels and descriptions. For instance, instead of writing
-
-```java
-
-.requiredPropertyWithUnaryMapping(
-        EpRequirements.domainPropertyReq(Geo.LAT),
-        Labels.from("latitude-field","Latitude","The event property containing the latitude value"),
-        PropertyScope.MEASUREMENT_PROPERTY
-    )
-
-```
-
-it is recommended to write
-
-```java
-
-.requiredPropertyWithUnaryMapping(
-        EpRequirements.domainPropertyReq(Geo.LAT),
-        Labels.withId("latitude-field"), 
-        PropertyScope.MEASUREMENT_PROPERTY
-    )
-
-```
-
-and add the following line to the `strings.en` file:
-
-```properties
-
-latitude-field.title=Latitude
-latitute-field.description=The event property containing the latitude value
-
-```
-
-This feature will also ease future internationalization efforts.
-
-Besides requirements, users should be able to define the center coordinate of the Geofence and the size of the fence
-defined as a radius around the center in meters.
-The radius can be defined by adding a simple required text field to the description:
-
-```java
-.requiredIntegerParameter("radius","Geofence Size","The size of the circular geofence in meters.",0,1000,1)
-```
-
-Such user-defined parameters are called _static properties_. There are many different types of static properties (see
-the [Processor SDK](06_extend-sdk-static-properties.md) for an overview). Similar to stream requirements, it is also recommended to type `Labels.withId("radius")` and move labels and descriptions to the resource file.
-
-In this example, we'll further add two very simple input fields to let users provide latitude and longitude of the
-geofence center.
-
-Add the following line to the `declareConfig` method:
-
-```java
-   .requiredFloatParameter(Labels.from(LATITUDE_KEY,"Latitude","The latitude value"))
-    .requiredFloatParameter(Labels.from(LONGITUDE_KEY,"Longitude","The longitude value"))
-
-```
-
-Now we need to define the output of our Geofencing pipeline element.
-As explained in the first section, the element should fire every time some geo-located entity arrives within the defined
-geofence.
-Therefore, the processor outputs the same schema as it receives as an input.
-Although we don't know the exact input right now as it depends on the stream users connect in StreamPipes when creating
-pipelines, we can define an _output strategy_ as follows:
-
-```java
-.outputStrategy(OutputStrategies.keep())
-```
-
-This defines a _KeepOutputStrategy_, i.e., the input event schema is not modified by the processor.
-There are many more output strategies you can define depending on the functionality you desire, e.g., _AppendOutput_ for
-defining a processor that enriches events or _CustomOutput_ in case you would like users to select the output by
-themselves.
-
-That's it! We've now defined input requirements, required user input and an output strategy.
-In the next section, you will learn how to extract these parameters once the pipeline element is invoked after a
-pipeline was created.
-
-## Pipeline element invocation
-
-Once users start a pipeline that uses our geofencing component, the _onPipelineStarted_ method in our class is called. The
-interface `IDataProcessorParameters` includes convenient access to user-configured parameters a users has selected in the pipeline
-editor and information on the actual streams that are connected to the pipeline element.
-
-Next, we are interested in the fields of the input event stream that contains the latitude and longitude value we would
-like to compute against the geofence center location as follows:
-
-```java
-  String latitudeFieldName = params.extractor().mappingPropertyValue("latitude-field");
-  String longitudeFieldName = params.extractor().mappingPropertyValue("longitude-field");
-```
-
-We use the same `internalId` we've used to define the mapping property requirements in the `declareModel` method.
-
-Next, for extracting the geofence center coordinates, add to class variables centerLatitude and centerLongitude and
-assign the selected values using the following statements:
-
-```java
-  this.centerLatitude = params.extractor().singleValueParameter(LATITUDE_CENTER,Float.class);
-  this.centerLongitude = params.extractor().singleValueParameter(LONGITUDE_CENTER,Float.class);
-```
-
-The radius value can be extracted as follows:
-
-```java
-  int radius = params.extractor().singleValueParameter("radius",Float.class);
-```
-
-Great! That's all we need to describe a data processor for usage in StreamPipes. Your processor class should look as
-follows:
-
-```java
-
-package org.apache.streampipes.pe.example;
-
-import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
-import org.apache.streampipes.extensions.api.pe.config.IDataProcessorConfiguration;
-import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
-import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
-import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
-import org.apache.streampipes.model.runtime.Event;
-import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
-import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
-import org.apache.streampipes.sdk.helpers.EpProperties;
-import org.apache.streampipes.sdk.helpers.EpRequirements;
-import org.apache.streampipes.sdk.helpers.Labels;
-import org.apache.streampipes.sdk.helpers.OutputStrategies;
-import org.apache.streampipes.sdk.helpers.SupportedFormats;
-import org.apache.streampipes.sdk.helpers.SupportedProtocols;
-import org.apache.streampipes.vocabulary.SO;
-
-public class GeofencingProcessor implements IStreamPipesDataProcessor {
-
-  private static final String LATITUDE_CENTER = "latitude-center";
-  private static final String LONGITUDE_CENTER = "longitude-center";
-
-  private float centerLatitude;
-  private float centerLongitude;
-  private String latitudeFieldName;
-  private String longitudeFieldName;
-
-  private int radius;
-
-  public IDataProcessorConfiguration declareConfig() {
-    return DataProcessorConfiguration.create(
-        GeofencingProcessor::new,
-        ProcessingElementBuilder.create("org.streampipes.tutorial-geofencing")
-            .category(DataProcessorType.ENRICH)
-            .withAssets(Assets.DOCUMENTATION, Assets.ICON)
-            .withLocales(Locales.EN)
-            .requiredStream(StreamRequirementsBuilder
-                .create()
-                .requiredPropertyWithUnaryMapping(EpRequirements.domainPropertyReq(Geo.lat),
-                    Labels.from("latitude-field", "Latitude", "The event " +
-                        "property containing the latitude value"), PropertyScope.MEASUREMENT_PROPERTY)
-                .requiredPropertyWithUnaryMapping(EpRequirements.domainPropertyReq(Geo.lng),
-                    Labels.from("longitude-field", "Longitude", "The event " +
-                        "property containing the longitude value"), PropertyScope.MEASUREMENT_PROPERTY)
-                .build())
-            .outputStrategy(OutputStrategies.keep())
-            .requiredIntegerParameter("radius", "Geofence Size", "The size of the circular geofence in meters.", 0, 1000, 1)
-            .requiredFloatParameter(Labels.from(LATITUDE_CENTER, "Latitude", "The latitude value"))
-            .requiredFloatParameter(Labels.from(LONGITUDE_CENTER, "Longitude", "The longitude value"))
-            .build()
-    );
-  }
-
-  @Override
-  public void onPipelineStarted(IDataProcessorParameters params,
-                                SpOutputCollector collector,
-                                EventProcessorRuntimeContext runtimeContext) {
-    this.centerLatitude = params.extractor().singleValueParameter(LATITUDE_CENTER, Float.class);
-    this.centerLongitude = params.extractor().singleValueParameter(LONGITUDE_CENTER, Float.class);
-    this.latitudeFieldName = params.extractor().mappingPropertyValue("latitude-field");
-    this.longitudeFieldName = params.extractor().mappingPropertyValue("longitude-field");
-    this.radius = params.extractor().singleValueParameter("radius", Integer.class);
-  }
-
-  @Override
-  public void onEvent(Event event,
-                      SpOutputCollector collector) {
-
-  }
-
-  @Override
-  public void onPipelineStopped() {
-
-  }
-}
-
-```
-
-## Adding an implementation
-
-Everything we need to do now is to add an implementation.
-
-Add the following piece of code to the onEvent method, which realizes the Geofencing functionality:
-
-```java
-
-    @Override
-    public void onEvent(Event event, 
-                        SpOutputCollector collector) {
-        float latitude = event.getFieldBySelector(latitudeFieldName).getAsPrimitive().getAsFloat();
-        float longitude = event.getFieldBySelector(longitudeFieldName).getAsPrimitive().getAsFloat();
-    
-        float distance = distFrom(latitude,longitude, centerLatitude, centerLongitude);
-    
-        if(distance <= radius){
-          collector.collect(event);
-        }
-    }
-    
-    public static float distFrom(float lat1, float lng1, float lat2, float lng2) {
-        double earthRadius = 6371000;
-        double dLat = Math.toRadians(lat2-lat1);
-        double dLng = Math.toRadians(lng2-lng1);
-        double a = Math.sin(dLat/2)*Math.sin(dLat/2) +
-        Math.cos(Math.toRadians(lat1))*Math.cos(Math.toRadians(lat2)) *
-        Math.sin(dLng/2)*Math.sin(dLng/2);
-        
-        double c = 2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a));
-        
-        return(float)(earthRadius*c);
-    }
-```
-
-We won't go into details here as this isn't StreamPipes-related code, but in general the class extracts latitude and
-longitude fields from the input event (which is provided as a map data type) and calculates the distance between the
-geofence center and these coordinates.
-If the distance is below the given radius, the event is forwarded to the next operator.
-
-See the [event model](06_extend-sdk-event-model.md) guide to learn how to extract parameters from events.
-
-## Registering the pipeline element
-
-The final step is to register the data processor in the `Init` method. Add the following line to
-the `SpServiceDefinitionBuilder`:
-
-```java
- .registerPipelineElement(new GeofencingProcessor())
-```
-
-## Starting the service
-
-:::tip
-
-Once you start the service, it will register in StreamPipes with the hostname. The hostname will be auto-discovered and
-should work out-of-the-box.
-In some cases, the detected hostname is not resolvable from within a container (where the core is running). In this
-case, provide a SP_HOST environment variable to override the auto-discovery.
-
-:::
-
-:::tip
-
-The default port of all pipeline element services as defined in the `create` method is port 8090.
-If you'd like to run multiple services at the same time on your development machine, change the port here. As an
-alternative, you can also provide an env variable `SP_PORT` which overrides the port settings. This is useful to use
-different configs for dev and prod environments.
-
-:::
-
-Now we are ready to start our service!
-
-Configure your IDE to provide an environment variable called ``SP_DEBUG`` with value ``true`` when starting the project.
-
-Execute the main method in the class `Init` we've just created.
-
-The service automatically registers itself in StreamPipes.
-To install the just created element, open the StreamPipes UI and follow the manual provided in
-the [user guide](03_use-install-pipeline-elements.md).
-
-## Read more
-
-Congratulations! You've just created your first data processor for StreamPipes.
-There are many more things to explore and data processors can be defined in much more detail using multiple wrappers.
-Follow our [SDK guide](06_extend-sdk-static-properties.md) to see what's possible!
diff --git a/docs/06_extend-tutorial-data-sinks.md b/docs/06_extend-tutorial-data-sinks.md
deleted file mode 100644
index 09baeff71..000000000
--- a/docs/06_extend-tutorial-data-sinks.md
+++ /dev/null
@@ -1,272 +0,0 @@
----
-id: extend-tutorial-data-sinks
-title: "Tutorial: Data Sinks"
-sidebar_label: "Tutorial: Data Sinks"
----
-
-In this tutorial, we will add a new data sink using the standalone wrapper.
-
-From an architectural point of view, we will create a self-contained service that includes the description of the data
-sink and a corresponding implementation.
-
-## Objective
-
-We are going to create a new data sink that calls an external HTTP endpoint to forward data to an external service.
-
-For each incoming event, an external service is invoked using an HTTP POST request. In this example, we'll call an
-endpoint provided by [RequestBin](https://requestbin.com/).
-To setup your own endpoint, go to [https://requestbin.com/](https://requestbin.com/) and click "Create a request bin".
-Copy the URL of the newly created endpoint.
-
-## Project setup
-
-Instead of creating a new project from scratch, we recommend to use the Maven archetype to create a new project
-skeleton (streampipes-archetype-extensions-jvm).
-Enter the following command in a command line of your choice (Apache Maven needs to be installed):
-
-```
-mvn archetype:generate -DarchetypeGroupId=org.apache.streampipes \
--DarchetypeArtifactId=streampipes-archetype-extensions-jvm -DarchetypeVersion=0.93.0 \
--DgroupId=org.streampipes.tutorial -DartifactId=sink-tutorial -DclassNamePrefix=Rest -DpackageName=mypackage
-```
-
-You will see a project structure similar to the structure shown in the [archetypes](06_extend-archetypes.md) section.
-
-:::tip
-
-Besides the basic project skeleton, the sample project also includes an example Dockerfile you can use to package your
-application into a Docker container.
-
-:::
-
-Now you're ready to create your first data sink for StreamPipes!
-
-## Adding data sink requirements
-
-First, we will add a new stream requirement.
-Create a class `RestSink` which should look as follows:
-
-```java
-package org.apache.streampipes.pe.example;
-
-import org.apache.streampipes.extensions.api.pe.IStreamPipesDataSink;
-import org.apache.streampipes.extensions.api.pe.config.IDataSinkConfiguration;
-import org.apache.streampipes.extensions.api.pe.context.EventSinkRuntimeContext;
-import org.apache.streampipes.extensions.api.pe.param.IDataSinkParameters;
-import org.apache.streampipes.model.DataSinkType;
-import org.apache.streampipes.model.runtime.Event;
-import org.apache.streampipes.model.schema.PropertyScope;
-import org.apache.streampipes.sdk.builder.DataSinkBuilder;
-import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.builder.sink.DataSinkConfiguration;
-import org.apache.streampipes.sdk.helpers.EpRequirements;
-import org.apache.streampipes.sdk.helpers.Labels;
-import org.apache.streampipes.sdk.helpers.Locales;
-import org.apache.streampipes.sdk.utils.Assets;
-
-public class RestSink implements IStreamPipesDataSink {
-
-  @Override
-  public IDataSinkConfiguration declareConfig() {
-    return DataSinkConfiguration.create(
-            RestSink::new,
-            DataSinkBuilder.create("org.apache.streampipes.tutorial.pe.sink.rest")
-                    .category(DataSinkType.NOTIFICATION)
-                    .withAssets(Assets.DOCUMENTATION, Assets.ICON)
-                    .withLocales(Locales.EN)
-                    .requiredStream(StreamRequirementsBuilder
-                            .create()
-                            .requiredPropertyWithNaryMapping(EpRequirements.anyProperty(), Labels.withId(
-                                    "fields-to-send"), PropertyScope.NONE)
-                            .build())
-                    .build()
-    );
-  }
-
-  @Override
-  public void onPipelineStarted(IDataSinkParameters params,
-                                EventSinkRuntimeContext eventSinkRuntimeContext) {
-
-  }
-
-  @Override
-  public void onEvent(Event event) {
-
-  }
-
-  @Override
-  public void onPipelineStopped() {
-
-  }
-
-
-```
-
-In this class, we need to implement three methods: The `declareConfig` method is used to define abstract stream
-requirements such as event properties that must be present in any input stream that is later connected to the element
-using the StreamPipes UI.
-The second method, `onPipelineStarted` is called once a pipeline using this sink is started. The third method, `onEvent`, is
-called for every incoming event.
-
-The `DataSinkBuilder` within the ``declareConfig`` method describes the properties of our data sink:
-
-* ``category`` defines a category for this sink.
-* ``withAssets`` denotes that we will provide an external documentation file and an icon, which can be found in
-  the ``resources`` folder
-* ``withLocales`` defines that we will provide an external language file, also available in the ``resources`` folder
-* ``requiredStream`` defines requirements any input stream connected to this sink must provide. In this case, we do not
-  have any specific requirements, we just forward all incoming events to the REST sink. However, we want to let the user
-  display a list of available fields from the connected input event, where users can select a subset. This is defined by
-  defining a Mapping from the empty requirement. This will later on render a selection dialog in the pipeline editor.
-
-The ``onPipelineStarted`` method is called when a pipeline containing the sink is started. Once a pipeline is started, we
-would like to extract user-defined parameters.
-In this example, we simply extract the fields selected by users that should be forwarded to the REST sink. Finally, we
-return a new configured event sink containing the parameters.
-
-## Pipeline element invocation
-
-Once users start a pipeline that uses our geofencing component, the _onInvocation_ method in our class is called. The
-interface `IDataSinkParameters` includes methods to extract the configuration parameters a user has selected in
-the pipeline editor and information on the actual streams that are connected to the pipeline element.
-
-## Adding an implementation
-
-Now we'll add a proper implementation (i.e., the Rest call executed for every incoming event) to the following methods:
-
-Our final class should look as follows:
-
-```java
-package org.apache.streampipes.pe.example;
-
-import org.apache.streampipes.commons.exceptions.SpRuntimeException;
-import org.apache.streampipes.dataformat.SpDataFormatDefinition;
-import org.apache.streampipes.dataformat.json.JsonDataFormatDefinition;
-import org.apache.streampipes.extensions.api.pe.IStreamPipesDataSink;
-import org.apache.streampipes.extensions.api.pe.config.IDataSinkConfiguration;
-import org.apache.streampipes.extensions.api.pe.context.EventSinkRuntimeContext;
-import org.apache.streampipes.extensions.api.pe.param.IDataSinkParameters;
-import org.apache.streampipes.model.DataSinkType;
-import org.apache.streampipes.model.runtime.Event;
-import org.apache.streampipes.model.schema.PropertyScope;
-import org.apache.streampipes.sdk.builder.DataSinkBuilder;
-import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.builder.sink.DataSinkConfiguration;
-import org.apache.streampipes.sdk.helpers.EpRequirements;
-import org.apache.streampipes.sdk.helpers.Labels;
-import org.apache.streampipes.sdk.helpers.Locales;
-import org.apache.streampipes.sdk.utils.Assets;
-
-import com.google.common.base.Charsets;
-import org.apache.http.client.fluent.Request;
-import org.apache.http.entity.StringEntity;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
-public class RestSink implements IStreamPipesDataSink {
-
-  private static final Logger LOG = LoggerFactory.getLogger(RestSink.class);
-
-  private static final String REST_ENDPOINT_URI = YOUR_REQUEST_BIN_URL;
-  private List<String> fieldsToSend;
-  private SpDataFormatDefinition dataFormatDefinition;
-
-  @Override
-  public IDataSinkConfiguration declareConfig() {
-    return DataSinkConfiguration.create(
-            RestSink::new,
-            DataSinkBuilder.create("org.apache.streampipes.tutorial.pe.sink.rest")
-                    .category(DataSinkType.NOTIFICATION)
-                    .withAssets(Assets.DOCUMENTATION, Assets.ICON)
-                    .withLocales(Locales.EN)
-                    .requiredStream(StreamRequirementsBuilder
-                            .create()
-                            .requiredPropertyWithNaryMapping(EpRequirements.anyProperty(), Labels.withId(
-                                    "fields-to-send"), PropertyScope.NONE)
-                            .build())
-                    .build()
-    );
-  }
-
-  @Override
-  public void onPipelineStarted(IDataSinkParameters params,
-                                EventSinkRuntimeContext eventSinkRuntimeContext) {
-    this.dataFormatDefinition = new JsonDataFormatDefinition();
-    this.fieldsToSend = params.extractor().mappingPropertyValues("fields-to-send");
-  }
-
-  @Override
-  public void onEvent(Event event) {
-    Map<String, Object> outEventMap = event.getSubset(fieldsToSend).getRaw();
-    try {
-      String json = new String(dataFormatDefinition.fromMap(outEventMap));
-      Request.Post(REST_ENDPOINT_URI).body(new StringEntity(json, Charsets.UTF_8)).execute();
-    } catch (SpRuntimeException e) {
-      LOG.error("Could not parse incoming event");
-    } catch (IOException e) {
-      LOG.error("Could not reach endpoint at {}", REST_ENDPOINT_URI);
-    }
-  }
-
-  @Override
-  public void onPipelineStopped() {
-
-  }
-}
-
-```
-
-The only class variable you need to change right now is the REST_ENDPOINT_URL. Change this url to the URL provided by
-your request bin.
-In the ``ònEvent`` method, we use a helper method to get a subset of the incoming event.
-Finally, we convert the resulting ``Map`` to a JSON string and call the endpoint.
-
-## Preparing the service
-
-The final step is to register the sink as a pipeline element.
-
-Go to the class `Init` and register the sink:
-
-```java
-.registerPipelineElement(new RestSink())
-```
-
-## Starting the service
-
-:::tip
-
-Once you start the service, it will register in StreamPipes with the hostname. The hostname will be auto-discovered and
-should work out-of-the-box.
-In some cases, the detected hostname is not resolvable from within a container (where the core is running). In this
-case, provide a SP_HOST environment variable to override the auto-discovery.
-
-:::
-
-:::tip
-
-The default port of all pipeline element services as defined in the `create` method is port 8090.
-If you'd like to run multiple services at the same time on your development machine, change the port here. As an
-alternative, you can also provide an env variable `SP_PORT` which overrides the port settings. This is useful to use
-different configs for dev and prod environments.
-
-:::
-
-Now we are ready to start our service!
-
-Configure your IDE to provide an environment variable called ``SP_DEBUG`` with value ``true`` when starting the project.
-
-Execute the main method in the class `Init` we've just created. The service automatically registers itself in
-StreamPipes.
-
-To install the created element, open the StreamPipes UI and follow the manual provided in
-the [user guide](03_use-install-pipeline-elements.md).
-
-## Read more
-
-Congratulations! You've just created your first data sink for StreamPipes.
-There are many more things to explore and data sinks can be defined in much more detail using multiple wrappers.
-Follow our [SDK guide](../dev-guide-sdk-guide-sinks) to see what's possible!
diff --git a/website-v2/versioned_docs/version-0.95.0/06_extend-archetypes.md b/docs/07_extend-archetypes.md
similarity index 97%
rename from website-v2/versioned_docs/version-0.95.0/06_extend-archetypes.md
rename to docs/07_extend-archetypes.md
index a6907f0ee..c8736a40b 100644
--- a/website-v2/versioned_docs/version-0.95.0/06_extend-archetypes.md
+++ b/docs/07_extend-archetypes.md
@@ -43,4 +43,4 @@ For details, have a look at the other parts of the Developer Guide, where these
 
 ## Next steps
 
-Click [here](06_extend-first-processor.md) to learn how to create your first data processor.
+Click [here](07_extend-first-processor.md) to learn how to create your first data processor.
diff --git a/docs/06_extend-cli.md b/docs/07_extend-cli.md
similarity index 100%
rename from docs/06_extend-cli.md
rename to docs/07_extend-cli.md
diff --git a/docs/06_extend-customize-ui.md b/docs/07_extend-customize-ui.md
similarity index 100%
rename from docs/06_extend-customize-ui.md
rename to docs/07_extend-customize-ui.md
diff --git a/docs/06_extend-first-processor.md b/docs/07_extend-first-processor.md
similarity index 100%
rename from docs/06_extend-first-processor.md
rename to docs/07_extend-first-processor.md
diff --git a/docs/06_extend-sdk-event-model.md b/docs/07_extend-sdk-event-model.md
similarity index 98%
rename from docs/06_extend-sdk-event-model.md
rename to docs/07_extend-sdk-event-model.md
index 42cc8d472..42e36cf0f 100644
--- a/docs/06_extend-sdk-event-model.md
+++ b/docs/07_extend-sdk-event-model.md
@@ -10,7 +10,7 @@ This guide explains the usage of the event model to manipulate runtime events fo
 
 ## Prerequisites
 
-This guide assumes that you are already familiar with the basic setup of [data processors](06_extend-first-processor.md).
+This guide assumes that you are already familiar with the basic setup of [data processors](07_extend-first-processor.md).
 
 ### Property Selectors
 
diff --git a/docs/06_extend-sdk-functions.md b/docs/07_extend-sdk-functions.md
similarity index 99%
rename from docs/06_extend-sdk-functions.md
rename to docs/07_extend-sdk-functions.md
index 150f2381d..b2c577c23 100644
--- a/docs/06_extend-sdk-functions.md
+++ b/docs/07_extend-sdk-functions.md
@@ -32,7 +32,7 @@ APIs are subject to change in a future version.
 :::
 
 
-To define a function, create a new extensions service using the [Maven Archetypes](06_extend-archetypes.md) or use an already existing service.
+To define a function, create a new extensions service using the [Maven Archetypes](07_extend-archetypes.md) or use an already existing service.
 
 ### Skeleton
 
diff --git a/docs/06_extend-sdk-migration-sd.md b/docs/07_extend-sdk-migration-sd.md
similarity index 100%
rename from docs/06_extend-sdk-migration-sd.md
rename to docs/07_extend-sdk-migration-sd.md
diff --git a/docs/06_extend-sdk-migrations.md b/docs/07_extend-sdk-migrations.md
similarity index 100%
rename from docs/06_extend-sdk-migrations.md
rename to docs/07_extend-sdk-migrations.md
diff --git a/docs/06_extend-sdk-output-strategies.md b/docs/07_extend-sdk-output-strategies.md
similarity index 100%
rename from docs/06_extend-sdk-output-strategies.md
rename to docs/07_extend-sdk-output-strategies.md
diff --git a/docs/06_extend-sdk-static-properties.md b/docs/07_extend-sdk-static-properties.md
similarity index 100%
rename from docs/06_extend-sdk-static-properties.md
rename to docs/07_extend-sdk-static-properties.md
diff --git a/docs/06_extend-sdk-stream-requirements.md b/docs/07_extend-sdk-stream-requirements.md
similarity index 100%
rename from docs/06_extend-sdk-stream-requirements.md
rename to docs/07_extend-sdk-stream-requirements.md
diff --git a/docs/06_extend-setup.md b/docs/07_extend-setup.md
similarity index 97%
rename from docs/06_extend-setup.md
rename to docs/07_extend-setup.md
index 12a96eb8e..a79887750 100644
--- a/docs/06_extend-setup.md
+++ b/docs/07_extend-setup.md
@@ -16,7 +16,7 @@ The only requirements in terms of development tools are that you have Java 17 an
 In order to quickly test developed pipeline elements without needing to install all services required by StreamPipes, we provide a CLI tool that allows you to selectively start StreamPipes components.
 The CLI tool allows to switch to several templates (based on docker-compose) depending on the role. 
 
-The documentation on the usage of the CLI tool is available [here](06_extend-cli.md).
+The documentation on the usage of the CLI tool is available [here](07_extend-cli.md).
 
 ## Override the SP_HOST variable
 
@@ -43,7 +43,7 @@ Instead of starting from scratch, we recommend using our provided maven archetyp
 
 ### Maven archetypes
 
-Create the Maven archetype as described in the [Maven Archetypes](06_extend-archetypes.md) guide.
+Create the Maven archetype as described in the [Maven Archetypes](07_extend-archetypes.md) guide.
 
 ### Examples
 
diff --git a/docs/08_technicals-architecture.md b/docs/08_technicals-architecture.md
deleted file mode 100644
index e62ba4625..000000000
--- a/docs/08_technicals-architecture.md
+++ /dev/null
@@ -1,110 +0,0 @@
----
-id: technicals-architecture
-title: Architecture
-sidebar_label: Architecture
----
-
-## Architecture
-
-<img className="docs-image" src="/img/07_technicals/architecture.png" alt="StreamPipes Architecture"/>
-
-Apache StreamPipes implements a microservice architecture as shown in the figure above.
-
-## StreamPipes Core
-
-The StreamPipes Core is the central component to manage all StreamPipes resources. 
-It delegates the management of adapters, pipeline elements, pipelines and functions to registered extensions services (see below) and monitors the execution of extensions.
-The Core also provides internal REST interfaces to communicate with the user interface, as well as public REST interfaces that can be used by external applications and StreamPipes clients.
-
-Configuration and user data are stored in an Apache CouchDB database.
-
-## StreamPipes Extensions
-
-An Apache StreamPipes extensions service is a microservice which contains the implementation of specific adapters, data streams, data processors, data sinks and functions.
-Multiple extension services can be part of a single StreamPipes installation.
-Each service might provide its own set of extensions. Extensions services register at the StreamPipes Core at startup. Users are able to install all or a subset of extensions of each service. 
-This allows StreamPipes to be extended at runtime by starting a new service with additional extensions.
-
-Extensions can be built using the SDK (see [Extending StreamPipes](06_extend-setup.md)).
-Extensions services can be provided either in Java or in Python.
-
-:::info
-
-As of version 0.93.0, the Python SDK supports functions only. If you would like to develop pipeline elements in Python as well, let us know in a [Github discussions](https://github.com/apache/streampipes/discussions) comment, so that we can better prioritize development.
-
-:::
-
-
-An extensions service interacts with the core by receiving control messages to invoke or detach an extension. 
-In addition, the core regularly fetches monitoring and log data from each registered extensions service.
-
-
-## StreamPipes Client
-
-The Apache StreamPipes Client is a lightweight library for Java and Python which can be used to interact with StreamPipes resources programmatically. 
-For instance, users use the client to influence the control flow of pipelines, to download raw data from the data lake APIs or to realize custom applications with live data.
-
-
-## Third-party systems
-
-In addition to the core components, an Apache StreamPipes version uses several third-party services, which are part of the standard installation.
-
-* Configurations and user data is stored in an [Apache CouchDB](https://couchdb.apache.org) database.
-* Time-series data is stored in an [InfluxDB](https://github.com/influxdata/influxdb) database.
-* Events are exchanged over a messaging system. Users can choose from various messaging systems that StreamPipes supports. Currently, we support [Apache Kafka](https://kafka.apache.org), [Apache Pulsar](https://pulsar.apache.org), [MQTT](https://mqtt.org/) and [NATS](https://nats.io/). The selection of the right messaging system depends on the use case. See [Messaging](07_technicals-messaging.md) for more information.
-
-:::info
-
-Versions prior to 0.93.0 included Consul for service discovery and registration. Starting from 0.93.0 onwards, we switched to an internal service discovery mechanism.
-
-:::
-
-All mentioned third-party services are part of the default installation and are auto-configured during the installation process.
-
-## Programming Languages
-
-Apache StreamPipes is mainly written in Java. 
-Services are based on Spring Boot. 
-The included [Python integration](https://streampipes.apache.org/docs/docs/python/latest/) is written in Python.
-
-The user interface is mainly written in TypeScript using the Angular framework.
-
-
-## Data Model
-
-Internally, Apache StreamPipes realizes a stream processing layer where events are continuously exchanged over a messaging system.
-When building a pipeline, data processors consume data from a topic assigned by the core and publish data back to another topic, which is also assigned by the core.
-
-At runtime, events have a flat and easily understandable data structure, consisting of key/value pairs. Events are serialized in JSON, although StreamPipes can be configured to use other (binary) message formats.
-
-This allows for easy integration with other systems which want to consume data from Streampipes, since an event could look as simple as this:
-
-```json
-{
-  "timestamp": 1234556,
-  "deviceId": "ABC",
-  "temperature": 37.5
-}
-```
-
-However, this wouldn't be very expressive, right? To [assist users](07_technicals-user-guidance.md), StreamPipes provides a rich description layer for events. So under the hood, for the `temperature` field shown above StreamPipes can also store the following:
-
-```json
-{
-  "label": "Temperature",
-  "description": "Measures the temperature during leakage tests",
-  "measurementUnit": "https://qudt.org/vocab/unit/DEG_C",
-  "runtimeName": "temperature",
-  "runtimeType": "xsd:float",
-  "semanticType": "https://my-company-vocabulary/leakage-test-temperature"
-}
-```
-
-By dividing the description layer from the runtime representation, we get a good trade-off between expressivity, readability for humans and lightweight runtime message formats.
-The schema is stored in an internal schema registry and available to the client APIs and user interface views to improve validation and user guidance.
-
-StreamPipes also supports arrays and nested structures, although we recommend using flat events where possible to ease integration with downstream systems (such as time-series storage).
-
-
-
-
diff --git a/docs/08_technicals-messaging.md b/docs/08_technicals-messaging.md
deleted file mode 100644
index d5308a6d8..000000000
--- a/docs/08_technicals-messaging.md
+++ /dev/null
@@ -1,65 +0,0 @@
----
-id: technicals-messaging
-title: Messaging
-sidebar_label: Messaging
----
-
-## Architecture
-
-To exchange messages at runtime between individual [Extensions Services](07_technicals-architecture.md), StreamPipes uses external messaging systems.
-This corresponds to an event-driven architecture with a central message broker and decoupled services which consume and produce events from the messaging system.
-
-There are many different open source messaging systems on the market, which each have individual strengths. 
-To provide a flexible system which matches different needs, StreamPipes can be configured to use various messaging systems.
-
-## Supported messaging systems
-
-The following messaging systems are currently supported:
-
-* Apache Kafka
-* Apache Pulsar
-* MQTT
-* NATS
-
-## Configure StreamPipes to use another messaging system
-
-Configuring StreamPipes for one of these messaging system is an installation-time configuration.
-We currently do not recommend to change the configuration at runtime.
-
-The protocol can be configured with the environment variable `SP_PRIORITIZED_PROTOCOL` assigned to the core with one of the following values:
-
-```bash
-SP_PRIORITIZED_PROTOCOL=kafka # Use Kafka as protocol
-SP_PRIORITIZED_PROTOCOL=pulsar # Use Pulsar as protocol
-SP_PRIORITIZED_PROTOCOL=mqtt # Use MQTT as protocol
-SP_PRIORITIZED_PROTOCOL=nats # Use NATS as protocol
-```
-
-Note that each extension service can support an arbitrary number of protocols. For instance, you can have a lightweight extension service which only supports NATS, but have another, cloud-centered service which supports Kafka, both registered at the Core.
-To select a protocol when multiple protocols are supported by two pipeline elements, StreamPipes selects a protocol based on a priority, which can be configured in the [Configuration View](03_use-configurations.md).
-StreamPipes ensures that only pipeline elements which have a commonly supported protocol can be connected.
-
-Note that you might need to change the installation files. For the `Docker-Compose` based installation, we provide various compose file for different messaging setups. For the `Kubernetes` installation, we provide variables which can be set in the helm chart's `values.yaml` file.
-
-### Configure broker addresses
-
-By default, StreamPipes assumes that the messaging system is started from its own environment, e.g., the system configured in the selected `Docker-Compose` file.
-
-Besides that, it is also possible to let StreamPipes connect to an externally provided messaging system. For this purpose, various environment variables exist.
-
-* `SP_PRIORITIZED_PROTOCOL` to set the prioritized protocol to either `kafka`, `mqtt`, `nats` or `pulsar`
-
-* `SP_KAFKA_HOST`, `SP_KAFKA_PORT` to configure Kafka access
-* `SP_MQTT_HOST`, `SP_MQTT_PORT` to configure MQTT access
-* `SP_NATS_HOST`, `SP_NATS_PORT` to configure NATS access
-* `SP_PULSAR_URL` to configure Pulsar access
-
-
-Most settings can also be set in the UI under `Settings->Messaging`.
-
-:::warning Installation-time configurations
-Although it is currently possible to change messaging settings in the user interface, we do not support dynamic modification of messaging systems.
-Choosing a proper system is considered an installation-time setting which should not be changed afterwards.
-Already existing Adapters and pipeline elements are not properly updated after changes of the messaging layer.
-:::
-
diff --git a/docs/08_technicals-runtime-wrappers.md b/docs/08_technicals-runtime-wrappers.md
deleted file mode 100644
index 9cebadfd2..000000000
--- a/docs/08_technicals-runtime-wrappers.md
+++ /dev/null
@@ -1,37 +0,0 @@
----
-id: technicals-runtime-wrappers
-title: Runtime Wrappers
-sidebar_label: Runtime Wrappers
----
-
-## Overview
-
-In general, StreamPipes has an exchangeable runtime layer, e.g., the actual processing of incoming events can be delegated to a third-party stream processing system such as Kafka Streams or Apache Flink.
-
-The default runtime wrapper is the StreamPipes Native Wrapper, called the `StandaloneWrapper`.
-
-Although not recommended for production, we invite interested developers to check out our experimental wrappers:
-
-* Kafka Streams runtime wrapper at [https://github.com/apache/streampipes/tree/dev/streampipes-wrapper-kafka-streams](https://github.com/apache/streampipes/tree/dev/streampipes-wrapper-kafka-streams) 
-* Apache Flink runtime wrapper at [https://github.com/apache/streampipes/tree/dev/streampipes-wrapper-flink](https://github.com/apache/streampipes/tree/dev/streampipes-wrapper-flink)
-
-## Assigning a runtime wrapper to an extension service
-
-Runtime wrappers can be assigned in the `Service Definition` of the `Init` class of an extension service:
-
-```java
-
-  @Override
-  public SpServiceDefinition provideServiceDefinition(){
-    return SpServiceDefinitionBuilder.create("org.apache.streampipes.extensions.all.jvm",
-    "StreamPipes Extensions (JVM)",
-    "",8090)
-    ...
-    .registerRuntimeProvider(new StandaloneStreamPipesRuntimeProvider())
-    ...
-    .build();
-  }
-
-```
-
-Please let us know through our communication channels if you are interested in this feature and if you are willing to contribute!
diff --git a/docs/08_technicals-user-guidance.md b/docs/08_technicals-user-guidance.md
deleted file mode 100644
index 697411861..000000000
--- a/docs/08_technicals-user-guidance.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-id: technicals-user-guidance
-title: User Guidance
-sidebar_label: User Guidance
----
-
-tbd
\ No newline at end of file
diff --git a/website-v2/versioned_docs/version-0.92.0/09_contribute.md b/docs/09_contribute.md
similarity index 100%
rename from website-v2/versioned_docs/version-0.92.0/09_contribute.md
rename to docs/09_contribute.md
diff --git a/docs/09_debugging.md b/docs/09_debugging.md
deleted file mode 100644
index 95892c175..000000000
--- a/docs/09_debugging.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-id: debugging-debugging
-title: Debugging
-sidebar_label: Debugging
----
-
-tbd
\ No newline at end of file
diff --git a/website-v2/versioned_docs/version-0.95.0/09_get-help.md b/docs/09_get-help.md
similarity index 100%
rename from website-v2/versioned_docs/version-0.95.0/09_get-help.md
rename to docs/09_get-help.md
diff --git a/docs/09_monitoring.md b/docs/09_monitoring.md
deleted file mode 100644
index 6680b5d86..000000000
--- a/docs/09_monitoring.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-id: debugging-monitoring
-title: Monitoring
-sidebar_label: Monitoring
----
-
-tbd
\ No newline at end of file
diff --git a/docs/10_contribute.md b/docs/10_contribute.md
deleted file mode 100644
index 119568929..000000000
--- a/docs/10_contribute.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-id: community-contribute
-title: Contribute
-sidebar_label: Contribute
----
-
-## Contribute
-
-We welcome contributions to StreamPipes. If you are interested in contributing to StreamPipes, let us know! You'll
-get to know an open-minded and motivated team working together to build the next IIoT analytics toolbox.
-
-Here are some first steps in case you want to contribute:
-* Subscribe to our dev mailing list [dev-subscribe@streampipes.apache.org](mailto:dev-subscribe@streampipes.apache.org)
-* Send an email, tell us about your interests and which parts of Streampipes you'd like to contribute (e.g., core or UI)!
-* Ask for a mentor who helps you to understand the code base and guides you through the first setup steps
-* Find an issue on [GitHub](https://github.com/apache/streampipes/issues) which is tagged with a _good first issue_ tag
-* Have a look at our **developer wiki** at [https://cwiki.apache.org/confluence/display/STREAMPIPES](https://cwiki.apache.org/confluence/display/STREAMPIPES) to learn more about StreamPipes development.
diff --git a/docs/10_get-help.md b/docs/10_get-help.md
deleted file mode 100644
index 0104f6810..000000000
--- a/docs/10_get-help.md
+++ /dev/null
@@ -1,25 +0,0 @@
----
-id: community-get-help
-title: Get Help
-sidebar_label: Get Help
----
-
-The Apache StreamPipes community is happy to help with any questions or problems you might have.
-
-## Questions
-Subscribe to our user mailing list to ask a question.
-
-[Mailing Lists](https://streampipes.apache.org/community/mailing-lists/)
-
-To subscribe to the user list, send an email to [users-subscribe@streampipes.apache.org](users-subscribe@streampipes.apache.org)
-
-You can also ask questions on our Github discussions page:
-[Github Discussions](https://github.com/apache/streampipes/discussions)
-
-## Bugs and Feature Requests
-
-If you've found a bug or have a feature that you'd love to see in StreamPipes, feel free to create an issue on [GitHub](https://github.com/apache/streampipes/issues)
-or [discuss your ideas](https://github.com/apache/streampipes/discussions/categories/ideas).
-
-
-
diff --git a/docs/pe/org.apache.streampipes.connect.iiot.adapters.oi4.md b/docs/pe/org.apache.streampipes.connect.iiot.adapters.oi4.md
index 1621d8702..dfca0bd2c 100644
--- a/docs/pe/org.apache.streampipes.connect.iiot.adapters.oi4.md
+++ b/docs/pe/org.apache.streampipes.connect.iiot.adapters.oi4.md
@@ -62,7 +62,7 @@ Choose between unauthenticated access or input your credentials for authenticate
 
 You should provide information about the sensor you want to connect to. This can be achieved in two ways:
 
-a) **By Type**: Specify the type of sensor you want to connect to, e.g., `'VVB001'`. <\br>
+a) **By Type**: Specify the type of sensor you want to connect to, e.g., `'VVB001'`. <br />
 b) **By IODD**: Simply upload the IODD description of the respective sensor. Please note: This feature is not yet available! If you're interested in this feature, please notify us through the mailing list or GitHub discussions and share your use case with us.
 
 ### Selected Sensors
diff --git a/docs/pe/org.apache.streampipes.connect.iiot.adapters.plc4x.generic.knxnet-ip.md b/docs/pe/org.apache.streampipes.connect.iiot.adapters.plc4x.generic.knxnet-ip.md
index cd15c4c5b..e5e0c1052 100644
--- a/docs/pe/org.apache.streampipes.connect.iiot.adapters.plc4x.generic.knxnet-ip.md
+++ b/docs/pe/org.apache.streampipes.connect.iiot.adapters.plc4x.generic.knxnet-ip.md
@@ -85,9 +85,9 @@ Use this configuration option in order to define the port number of the local po
 * knxproj-password: Optional password needed to read the knxproj file. (STRING)
 * group-address-num-levels: KNX Addresses can be encoded in multiple ways. Which encoding is used, is too not provided by the protocol itself so it has to be provided externally:
 
-- 3 Levels: {main-group (5 bit)}/{middle-group (3 bit)}/{sub-group (8 bit)}
-- 2 Levels: {main-group (5 bit)}/{sub-group (11 bit)}
-- 1 Level: {sub-group (16 bit)}
+- 3 Levels: `{main-group (5 bit)}/{middle-group (3 bit)}/{sub-group (8 bit)}`
+- 2 Levels: `{main-group (5 bit)}/{sub-group (11 bit)}`
+- 1 Level: `{sub-group (16 bit)}`
 
 The default is 3 levels. If the `knxproj-file-path` this information is provided by the file. (INT)
 * connection-type: Type of connection used to communicate. Possible values are:
diff --git a/docs/pe/org.apache.streampipes.connect.iiot.protocol.stream.httpserver.md b/docs/pe/org.apache.streampipes.connect.iiot.protocol.stream.httpserver.md
index 366b7ccce..f1dbdf179 100644
--- a/docs/pe/org.apache.streampipes.connect.iiot.protocol.stream.httpserver.md
+++ b/docs/pe/org.apache.streampipes.connect.iiot.protocol.stream.httpserver.md
@@ -38,7 +38,7 @@ Data sent to this endpoint via POST requests is transformed into StreamPipes eve
 ### Configuration
 
 #### Endpoint Appendix
-   Specify the name of the endpoint resource. The endpoint can be accessed at {host of StreamPipes UI}/endpoints/{endpointName}
+   Specify the name of the endpoint resource. The endpoint can be accessed at `{host of StreamPipes UI}/endpoints/{endpointName}`
 
 #### Configuration
 ##### Manual
@@ -48,4 +48,3 @@ Provides an option to define the event schema manually.
 Use a file with example data to automatically detect a first event schema.
 
 ***
-
diff --git a/docs/pe/org.apache.streampipes.processors.filters.jvm.merge.md b/docs/pe/org.apache.streampipes.processors.filters.jvm.merge.md
index 569b5ee2f..ff7549c61 100644
--- a/docs/pe/org.apache.streampipes.processors.filters.jvm.merge.md
+++ b/docs/pe/org.apache.streampipes.processors.filters.jvm.merge.md
@@ -51,7 +51,7 @@ Each of the data streams needs a timestamp.
 ## Configuration
 
 * For each stream a the timestamp property on which the merger is performed has to be selected
-* The Time Interval describes the maximum value between two events to decide whether they are a match. To be a valid match the following function must be true: | timestamp_stream_1 - timestamp_stream_2 | < interval
+* The Time Interval describes the maximum value between two events to decide whether they are a match. To be a valid match the following function must be true: `| timestamp_stream_1 - timestamp_stream_2 | < interval`
 
 ## Output
-The Compose processor has a configurable output that can be selected by the user at pipeline modeling time.
\ No newline at end of file
+The Compose processor has a configurable output that can be selected by the user at pipeline modeling time.
diff --git a/docs/pe/org.apache.streampipes.processors.geo.jvm.latlong.processor.distancecalculator.haversine.md b/docs/pe/org.apache.streampipes.processors.geo.jvm.latlong.processor.distancecalculator.haversine.md
index 075dd23d0..5caa63f0f 100644
--- a/docs/pe/org.apache.streampipes.processors.geo.jvm.latlong.processor.distancecalculator.haversine.md
+++ b/docs/pe/org.apache.streampipes.processors.geo.jvm.latlong.processor.distancecalculator.haversine.md
@@ -56,6 +56,8 @@ This is the second geographic coordinate that specifies the east-west position o
 This is the second geographic coordinate that specifies the north-south position of a point on the Earth's surface.
 
 ## Output
+```json
 {
-  'distance': 12.2
-}
\ No newline at end of file
+  "distance": 12.2
+}
+```
diff --git a/docs/pe/org.apache.streampipes.processors.siddhi.numericalfilter.md b/docs/pe/org.apache.streampipes.processors.siddhi.numericalfilter.md
index fb20b1013..4253e706f 100644
--- a/docs/pe/org.apache.streampipes.processors.siddhi.numericalfilter.md
+++ b/docs/pe/org.apache.streampipes.processors.siddhi.numericalfilter.md
@@ -36,7 +36,7 @@ CEP engine Siddhi by issuing a Siddhi query, e.g.
 
 ```
 // filter query to filter out all events not satisfying the condition
-from inputStreamName[numberField<10]
+`from inputStreamName[numberField<10]`
 select *
 ```
 
@@ -60,4 +60,4 @@ Specifies the filter operation that should be applied on the field.
 Specifies the threshold value.
 
 ## Output
-The processor outputs the input event if it satisfies the filter expression.
\ No newline at end of file
+The processor outputs the input event if it satisfies the filter expression.
diff --git a/docs/pe/org.apache.streampipes.processors.transformation.jvm.processor.booloperator.state.md b/docs/pe/org.apache.streampipes.processors.transformation.jvm.processor.booloperator.state.md
index 7eb96ae8b..16574a644 100644
--- a/docs/pe/org.apache.streampipes.processors.transformation.jvm.processor.booloperator.state.md
+++ b/docs/pe/org.apache.streampipes.processors.transformation.jvm.processor.booloperator.state.md
@@ -50,7 +50,7 @@ When all boolean values are false, a default state can be defined
 ### Mapping Configuration
 
 Configuration to provide a string mapping for each possible value.
-On the left ist the value of the runtime name and on the right the new value (e.g. {"runtimeName": "newValue"}).
+On the left ist the value of the runtime name and on the right the new value (e.g. `{"runtimeName": "newValue"}`).
 
 ***
 
diff --git a/docs/user-guide-first-steps.md b/docs/user-guide-first-steps.md
deleted file mode 100644
index b7ca89f62..000000000
--- a/docs/user-guide-first-steps.md
+++ /dev/null
@@ -1,209 +0,0 @@
----
-id: user-guide-first-steps
-title: First steps
-sidebar_label: First steps
----
-
-In this section, you'll learn how to create and run pipelines in StreamPipes.
-Before starting with this guide, all steps from the installation guide must be finished successfully and StreamPipes must be up and running.
-
-This guide consists of three steps:
-First, you'll learn how to create your first pipeline using the interactive tutorial.
-Afterwards, this section contains two examples on how to create pipelines based on the built-in data simulator.
- 
-## Interactive Tutorial
-The easiest way to get started with StreamPipes is the interactive tutorial. Once you open the pipeline editor for the first time, you'll see a splash screen as shown below.
-Click **Start tour** to start the interactive tutorial, which will guide you through your first steps with StreamPipes.
- 
-![Interactive Tutorial](/img/quickstart/interactive-tutorial.png)  
-
-If the splash screen does not show up, make sure you've installed the following pipeline elements:
-* Flow rate (data stream)
-* Numerical Filter (processing element)
-* Dashboard (data sink)
-
-After you've finished this very first tour, try the following tours to learn more about other features of StreamPipes:
-* Open the Live Dashboard and start the dashboard tour (by clicking the school icon in the top menu bar) to learn how to create real-time visualizations
-* Open StreamPipes Connect and start the tour to learn how to connect new data sources with StreamPipes.
- 
-## First Examples
-
-In this tutorial, you will create two simple pipelines that demonstrate the basic functionality of StreamPipes.
-The first example deals with monitoring a flow rate sensor.
-This pipeline ensures that everything works properly and data is sent through the whole system.
-In the second example we model a more complex situation detection pipeline that triggers a notification.
-Let's start with our first pipeline.
-If you have problems with any of the examples, please send us an email.
-We are happy to help you.
-
-## Data Simulation
-All the data sources that we have integrated in the StreamPipes demonstrator are simulated according to real world sensors.
-For example a flow rate sensor in a water pipe, which measures how much water flows in that pipe or a water level sensor in a water tank, that reports how high the water level is in the tank.
-In the next section you will use the flow rate sensor to build your first pipeline.
-
-## Flow Rate Visualization
-In the first example, we create a live line chart to monitor the value of the mass flow from a flow rate sensor.
-
-### Create Pipeline
-* As a first step go to the pipeline editor
-* Select the **FRS1** (Flow Rate Source 1)source
-* Then navigate to the **Data Sink** tab
-* Select the **DS** (Dashboard Sink) and connect the source with the sink
-* After connecting the elements save the pipeline by clicking on the save button on the top left corner
-* In the save menu add a name *Flow Rate Monitoring* and a description *This is my very first pipeline!*
-* Also select the **Start pipeline immediatly** checkbox
-* Then click the button **Save and go to pipeline view**
-* You are navigated to the pipeline view and a confirmation that the pipeline was started successfully should be shown
-
-<div class="my-carousel">
-    <img src="/img/quickstart/examples_master/01_PipelineEditor_DataStreams.png" alt="Show Pipeline Editor Streams"/>
-    <img src="/img/quickstart/examples_master/02_example1_source.png" alt="Sources"/>
-    <img src="/img/quickstart/examples_master/03_example1_pipeline_finished.png" alt="Pipeline Finished"/>
-    <img src="/img/quickstart/examples_master/04_example1_save.png" alt="Saved Pipeline"/>
-    <img src="/img/quickstart/examples_master/05_example1_pipeline_started.png" alt="Pipeline 01 Started"/>
-</div>
-
-### Create Visualization
-* After we have created the pipeline we must create the line chart
-* Navigate to the **Live Dashboard** of StreamPipes
-* Click on the **Add visualization** button
-* Select the just created pipeline **Flow Rate Monitoring** and click the **next** button
-* For the visualization select the **Line Chart** and click **next** again
-* Now you have to enter the configuration for the line chart
-    * Select time mapping: **timestamp**
-    * Select number mapping: **mass_flow**
-    * Range Minimum: **0** 
-    * Range Maximum: **10**
-* When all parameters are set correctly click the next button again.
-* Congratulation you created the first pipeline and should now see the line chart
-
-<div class="my-carousel">
-    <img src="/img/quickstart/examples_master/06_example01_live_visualisation.png" alt="Visualize Pipeline"/>
-    <img src="/img/quickstart/examples_master/07_example01_first_step.png" alt="Configure Visualization Step 1"/>
-    <img src="/img/quickstart/examples_master/08_example01_second_step.png" alt="Configure Visualization Step 2"/>
-    <img src="/img/quickstart/examples_master/09_example01_third_step.png" alt="Configure Visualization Step 3"/>
-    <img src="/img/quickstart/examples_master/10_example1_finished.png" alt="Pipeline 01 Done"/>
-</div>
-
-
-## Condition monitoring of a water tank
-In our second example we are going to create a more complex pipeline.
-This pipeline has two sources, the flow rate sensor from the previous example and a source measuring the water level in a tank.
-Our goal is to send a notification when the flow rate stops and the water level in the water tank sinks too fast.
-In this case a service technician should check the system as soon as possible.
-This example should just illustrate how the individual components work.
-Since the system currently uses simulated data each time the situation occurs a notification is triggered.
-
-Now lets start!
-
-
-### Build the pipeline
-* First we have to select the **FRS1** (Flow Rate Sensor 1) and **WL1** (Water Level) form the sources tab
-* In a first step we want to detect when the flow rate stops
-* Use the **NF** (Numerical Filter) from the processing elements tab and connect it to the **FRS1** source
-* Configure the **Numerical Filter**:
-    * Field name for filter operator: **mass_flow**
-    * Filter Operation: **<**
-    * Threshold value: **1**
-
-<div class="my-carousel">
-    <img src="/img/quickstart/examples_master/11_example2_start.png" alt="Start Example 2"/>
-    <img src="/img/quickstart/examples_master/12_example2_numerical.png" alt="Select Numericl Filter"/>
-    <img src="/img/quickstart/examples_master/13_example2_configure_numerical.png" alt="Configure Numerical Filter"/>
-</div>
-
-* As a next step we add an aggregation to the water level. This reduces the inaccuracies we have because the water moves in the tank. 
-* Select the **A** (Aggregation) processing element
-* Connect the **WL1** with **A**
-* Configure **Aggregation**:
-    * Property Selection: **level**
-    * Operation: **Average**
-    * Time Window Size: **10**
-    * Output Frequency: **1**
-    * Groupe By: **None**
-
-<div class="my-carousel">
-    <img src="/img/quickstart/examples_master/14_example2_aggregate.png" alt="Select Aggregation"/>
-    <img src="/img/quickstart/examples_master/15_example2_configure_aggregate.png" alt="Configure Aggregation"/>
-        <img src="/img/quickstart/examples_master/15_example2_configure_aggregate_2.png" alt="Configure Aggregation"/>
-
-</div>
-
-* With the next processing element we check if the water level decreases too fast
-* Select **I** (Trend) and connect it to **A**
-* Configure **Trend**:
-    * Timestamp field: **timestamp**
-    * Value to observe: **aggregatedValue** (This value is created by previous element)
-    * Group by: **sensorId**
-    * Increase / Decrease: **Decrease**
-    * Percentage of Increase / Decrease: **20**
-    * Time Window Length: **10**
-    * Select Output: **All**
-
-<div class="my-carousel">
-    <img src="/img/quickstart/examples_master/16_example2_increase.png" alt="Select Increase"/>
-    <img src="/img/quickstart/examples_master/17_example2_configure1_increase.png" alt="Configute 01 Increase"/>
-</div>
-
-* Now we connect the two stream with the sequence element, which checks if both events occur in a certain time
-* Select **S** (Sequence) and connect both data streams to it
-* Configure **Sequence**:
-    * Time Window Size: **1**
-    * Time Unit: **sec**
-    
-<div class="my-carousel">
-    <img src="/img/quickstart/examples_master/19_example2_sequence.png" alt="Select Sequence Detection"/>
-    <img src="/img/quickstart/examples_master/20_example2_configure_sequence.png" alt="ConfigureSequence Detection"/>
-</div>
-
-* Now we create a notification for the service technician that something is wrong with the system
-* Select **N** (Notification) from the data sink tab
-* Connect **S**  with **N**
-* Configure **Notification**: 
-    * Notification title: **Alarm**
-    * Content: **One notification was triggered by our first complex pipeline. Yeahhhh!**
-    
-<div class="my-carousel">
-    <img src="/img/quickstart/examples_master/21_example2_notification.png" alt="Select Notification"/>
-    <img src="/img/quickstart/examples_master/22_example2_configure_notification.png" alt="Configure Notification"/>
-</div>
-
-* Add the dashboard sink to the increase element to monitor the preliminary results
-* Select **DS** and connect to **I**
-
-<div class="my-carousel">
-    <img src="/img/quickstart/examples_master/23_example2_dashboard_sink.png" alt="Select Dashboard"/>
-</div>
-
-* Save the pipeline 
-* Save configuration:
-    * Pipeline Name: **Second Pipeline**
-    * Description: **Complex monitorung rule**
-    * Start pipeline immediately: **CHECK**
-* Click **Save and go to pipeline view**
-* All pipeline elements should be started successfully 
-* It can be seen that the elements run on different technologies, in flink and a java container
-    * http://pe-flink-examples:8090
-    * http://pe-jvm-examples:8090
-* Go to visualization and create **Raw Data** visualization for the new pipeline   
-    
-<div class="my-carousel">
-    <img src="/img/quickstart/examples_master/25_example2_started.png" alt="Pipeline Started Sucessfull"/>
-    <img src="/img/quickstart/examples/26_example2_visualisation.png" alt="Add Visualization"/>
-</div>
-
-* Every time you can see output in the **Raw Data** visualization of the new pipeline and the **Line Chart** from the first example are zero, a Notification is triggered by the pipeline.
-* Go to the **Notifications** view and have a look at the notification
-
-<div class="my-carousel">
-    <img src="/img/quickstart/examples/27_example2_notification.png" alt="Show Notification"/>
-</div>
-
-
-Congratulation you finished the quick start!
-It is recommended to stop the last pipeline, because it will keep creating notifications ;)
-
-We hope we gave you an easy quick start into StreamPipes.
-If you have any questions or suggestions, just send us an email.
-From here on you can explore all features in the [User Guide](user-guide-introduction) or go to the [Developer Guide](extend-setup) to learn how to write your own StreamPipes processing elements.
-
diff --git a/docs/user-guide-tour.md b/docs/user-guide-tour.md
deleted file mode 100644
index a6ae2f8ff..000000000
--- a/docs/user-guide-tour.md
+++ /dev/null
@@ -1,305 +0,0 @@
----
-id: user-guide-tour
-title: Tour
-sidebar_label: Tour
----
-
-StreamPipes is a framework that enables domain experts to model and execute stream processing pipelines in a big data infrastructure.
-The graphical user interface of StreamPipes is a web application that provides an easy to use solution for domain experts.
-In this page, an overview of the many features of StreamPipes is given. We will tour through all features and explain what they do and how users can interact with them.
-
-First of all, a user needs to log in to the system.
-The credentials for the user are specified during the installation process.
-
-![StreamPipes Login](/img/features_0_62_0/login.png) 
-
-## Home
-After logging in, the user is redirected on to the home page.
-The home page gives an overview over the different features available in the StreamPipes UI.
-
-On the left, the navigation menu can be seen.
-You can either use the icons on the left side or click on the menu icon on the
-top left to open the details view of the navigation menu.
-
-On the top right, a link refers to the documentation and the logout button is present.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/home/home.png" alt="Home"/>
-    <img src="/img/features_0_62_0/home/open_menu.png" alt="Open Menu"/>
-</div>
-
-
-
-## Pipeline Editor
-The first feature we are going to explain is the Pipeline Editor.
-This is one of the central features of StreamPipes, since graphical modeling of pipelines takes place in this view.
-
-On the top we can see four tabs: __Data Sets__, __Data Streams__, __Processing Elements__, and __Data Sinks__.
-Each tab contains multiple pipeline elements, which can be installed at runtime.
-The installation of pipeline elements is explained later in section [Install Pipeline Elements](user-guide-tour.md#install-pipeline-elements).
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/2_PipelineEditor_DataStreams.png" alt="Data Streams"/>
-    <img src="/img/features_0_62_0/editor/3_PipelineEditor_DataProcessors.png" alt="Processing Elements"/>
-    <img src="/img/features_0_62_0/editor/4_PipelineEditor_DataSinks.png" alt="Data Sinks"/>
-    <img src="/img/features_0_62_0/editor/1_PipelineEditor_DataSets.png" alt="Data Sets"/>
-</div>
-
-There are multiple ways to search for a pipeline element. 
-The easiest way is to enter a search term in the search field on the top left corner.
-The system filters the elements according to the search term and only presents the relevant ones.
-Another way is to select one of the categories from the drop down menu.
-The system then filters the elements according to the selected category.
-The category of an element is defined by its functionality.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/5_text_filter.png" alt="Text Filter"/>
-    <img src="/img/features_0_62_0/editor/6_category_drop_down.png" alt="Category Drop Down"/>
-    <img src="/img/features_0_62_0/editor/7_category_filter.png" alt="Category Filter"/>
-</div>
-
-Modelling of a pipeline starts with choosing one ore more data sources. Therefore a data stream or data set must be selected
-and moved into the editor via drag and drop.
-After adding a data stream, we can select a processing element to transform the events of the data stream.
-This is done again by dragging the processing element icon into our editor.
-The mouse can be used to connect the two elements.
-It is automatically checked in the background if the two elements are semantically compatible.
-If this check is successful, a configuration menu is shown. It contains the parameters that can be modified by the
-user. For all parameters, a description is provided and the system also prevents the user from entering parameters that
-are not correct, according to the semantic description of the element.
-It is also ensured that all required parameters are provided by the user, otherwise an error message is displayed.
-
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/8_connect_elements.png" alt="Connect Elements"/>
-    <img src="/img/features_0_62_0/editor/9_configure_element.png" alt="Configure Elements"/>
-</div>
-
-When the user tries to connect two elements that are not compatible, the system shows a __connection error__ message.
-The example illustrated below shows such a case. The user tried to connect a text filter to a light sensor.
-This is not possible since the text filter processing element requires at least one event property of type string, which is not provided by the light sensor.
-
-![Connection Error](/img/features_0_62_0/editor/10_connection_error.png) 
-
-To further improve the usability, multiple ways are available to connect new elements besides the drag and drop option.
-Each processing element has multiple short-cut buttons to connect it with another element.
-The first one (eye icon) can be used to get a suggestion of all elements that are compatible with the current element.
-The second one (plus icon) gives a recommendation on the elements the user might want to connect, based on the usage of the component in
-other pipelines.
-There is also a button (question tag icon) to open the documentation of a selected element.
-Elements can be deleted by clicking the 'delete' button.
-Each element can also be re-configured at a later point in time using the configuration button.
-There is one important aspect about re-configuration of pipeline elements you need to be aware of: Only elements that are not yet connected to another element can be modified.
-The reason for this behaviour is that some of the following elements might rely on the configuration of previous elements.
-This way it is ensured that the user can not change the behaviour of the pipeline by accident.
- 
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/11_shortcut_buttons.png" alt="Shortcut Buttons"/>
-    <img src="/img/features_0_62_0/editor/12_compatible_elements.png" alt="Compatible Elements"/>
-    <img src="/img/features_0_62_0/editor/13_recommend_elements.png" alt="Recommended elements"/>
-</div>
-
-
-After the pipeline is completely modelled, the editor looks similar to the first image below.
-Especially for larger pipelines, the auto layout button in the editor menu might be helpful.
-With this button, the pipeline will be beautifully aligned in the editor, helping users to get a better overview of the complete pipeline.
-On the top left corner of the editor, the 'save' button can be found.
-After the modelling of the pipeline is done, use this button to save and execute the pipeline.
-A save dialogue pops up when clicking the save button. 
-The pipeline title must be entered and an additional description can be provided.
-It is recommended to always provide a description, because it makes it easier for other users to understand the meaning of the pipeline.
-In the save menu, the user can either just store the pipeline configuration or store it and immediately start the pipeline.
-Once the pipeline is executed, the user is redirected to the _Manage Pipeline_ view.
-In this view, the user gets immediate feedback whether all components did start correctly and the pipeline is up and running.
-This view also shows that individual elements might run in different environments on different servers.
-If there is an error during the execution, a notification containing a (hopefully) detailed error description is provided in this view.
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/editor/14_save_adjust.png" alt="Save adjust delete"/>
-    <img src="/img/features_0_62_0/editor/15_save_dialogue.png" alt="Complete pipeline"/>
-    <img src="/img/features_0_62_0/editor/16_pipeline_sucessfully_started.png" alt="Pipeline sucessfully started"/>
-</div>
-
-## Connect new Data Sources
-With StreamPipes Connect it is possible to connect new data sources in StreamPipes with just a few clicks.
-Therefore, we provide a marketplace with a lot of different adapters that can be configured and executed to create new __Data Streams__ in the __Pipeline Editor__.
-With StreamPipes Connect it is possible to connect specific data sources - e.g. an adapter streaming the current location of the ISS (International Space Station).
-It is also possible to connect generic sources like message brokers or databases.
-If the event schema of the data source is unknown, the system tries to infer the schema by extracting some sample data and analysing it.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/connect/new/01_connect.png" alt="Market Place"/>
-    <img src="/img/features_0_62_0/connect/new/02_mqtt_adapter.png" alt="MQTT adapter"/>
-    <img src="/img/features_0_62_0/connect/new/03_configure_mqtt.png" alt="Configure MQTT adpater"/>
-    <img src="/img/features_0_62_0/connect/new/04_configure_format.png" alt="Guess event schema"/>
-    <img src="/img/features_0_62_0/connect/new/05_guess_schema.png" alt="Guess event schema"/>
-    <img src="/img/features_0_62_0/connect/new/06_edit_adapter.png" alt="Edit adapter"/>
-    <img src="/img/features_0_62_0/connect/new/07_start_adapter.png" alt="Start adapter"/>
-    <img src="/img/features_0_62_0/connect/new/08_data_stream_in_editor.png" alt="New data stram in pipeline editor"/>
-</div>
-
-Additionally to connecting new sources, data can be cleaned, transformed, and enriched with meta-information.
-Therefore, the event schema can be changed or enriched in step 3 (Define Event Schema).
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/connect/edit/01_edit_timestamp.png" alt="Edit a property to timestamp"/>
-    <img src="/img/features_0_62_0/connect/edit/02_change_unit.png" alt="Change Unit of property"/>
-    <img src="/img/features_0_62_0/connect/edit/03_change_unit.png" alt="Change Unit of property"/>
-</div>
-
-## Manage Pipelines
-The _Manage Pipelines_ view provides an overview of all existing pipelines.
-Existing pipelines can be managed using this view.
-For instance, users can start and stop pipelines or delete them when they are not longer needed.
-Pipeline actions can be performed by clicking one of the buttons next to each pipeline.
-For each pipeline, the title and description is displayed in the table.
-By clicking the edit symbol an overview of the created pipline is shown. In this window you are able to analyze statistics, identify errors or edit the pipeline.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/manage_pipelines/1_pipeline_overview.png" alt="Pipeline Overview"/>
-    <img src="/img/features_0_62_0/manage_pipelines/2_pipeline_information.png" alt="Pipeline infomation"/>
-    <img src="/img/features_0_62_0/manage_pipelines/3_delete_pipeline.png" alt="Delete Pipelines"/>
-    <img src="/img/features_0_62_0/manage_pipelines/4_pipeline_deleted.png" alt="Delete Pipelines"/>
-</div>
-
-In a setting with many defined pipelines, it can get really hard to keep track of all pipelines.
-This is why we introduce categories.
-A category is a set of pipelines that can be defined by users in order to better organize pipelines.
-By clicking on the "Manage Categories" button on the top left, a new category can be added to StreamPipes.
-In this example, we create a new category named "New Demo Category".
-After saving a category, pipelines can be added to the newly created category.
-The new category is then presented as a tab in the _Pipeline Management_ view.
-This tab contains all previously defined pipelines.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/manage_pipelines/5_pipeline_category.png" alt="Pipeline Category"/>
-    <img src="/img/features_0_62_0/manage_pipelines/6_add_category.png" alt="Add Pipeline Category"/>
-    <img src="/img/features_0_62_0/manage_pipelines/7_new_category.png" alt="New Category"/>
-    <img src="/img/features_0_62_0/manage_pipelines/8_show_new_category.png" alt="Show new Category"/>
-</div>
-
-## Live Dashboard
-The live dashboard can be used for multiple use cases.
-It is a good way to live monitor a running system in a dashboard, but it can also be used during the pipeline development to get a fast feedback from newly created pipelines.
-Below is a screenshot of an example dashboard showing the current value of pressure, which further shows a line chart and a trafficlight for a water level pipeline.
-All pipelines that contain the "Dashboard Sink" can be visualized in this view.
-To add a new visualisation, click on the "Add visualisation" button on the top left corner.
-Afterwards, a three-step configuration menu is shown.
-The first step is to select the pipeline that should be visualized.
-In the second step, the type of visualization can be defined.
-Currently 10 different types are available, including line charts, various map visualizations and data tables.
-After selecting the type (in our example "Gauge"), you can select the specific measurement values of the data stream that should be displayed.
-In the example below, the water level value should be monitored and the gauge value should range from 0 to 100.
-Once all steps are completed, the new visualization is placed on the dashboard and live data is presented as soon as it becomes available.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/dashboard/01_dashboard.png" alt="Screenshot of live dashboard"/>
-    <img src="/img/features_0_62_0/dashboard/02_new_visualisation.png" alt="Select Pipeline to visualize"/>
-    <img src="/img/features_0_62_0/dashboard/03_select_gauge.png" alt="Select Visualization Type"/>
-    <img src="/img/features_0_62_0/dashboard/04_configure_gauge.png" alt="Configure  Visualzation"/>
-    <img src="/img/features_0_62_0/dashboard/05_new_gauge_done.png" alt="Show new Visualzation"/>
-</div>
-
-## File Download
-With the file download,  it is possible to download stored files directly from Elasticsearch.
-This can be very useful for example when a data dumb is needed for a specific time range.
-All data that is written into Elasticsearch using the _Elasticsearch Sink_ can be accessed by the file downloader.
-A common use case is to download data for offline analysis and to train a machine learning algorithm.
-First, an index must be defined, afterwards, the time range must be set.
-A date picker helps users to enter the time range.
-When a user clicks the "Create File" button the file is created.
-All files stored on the server can be downloaded via the download button.
-If the files are not longer needed, they can be deleted by clicking the delete button.
-This will remove the file from the server.
-Since data is stored in Elasticsearch anyways. it is recommended not to store the files for a longer period of time on the server.
-When a file is needed again at a later point in time it is easy to create it again. 
-This way a lot of disk space on the server can be saved, especially when the files are rather large.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/file_download/01_file_download.png" alt="File Download"/>
-    <img src="/img/features_0_62_0/file_download/02_file_download.png" alt="File Download with selected time range"/>
-    <img src="/img/features_0_62_0/file_download/03_file_download.png" alt="File Download with new File"/>
-</div>
-
-## Notifications
-Notifications are a good solution to notify someone when a urgent situation occurs.
-A notification can be created by using the notification sink in the pipeline editor.
-When using such a sink a configuration dialogue is presented to the user.
-In this dialogue the user must provide enough information to resolve the solution when it occurs.
-The message can be nicely configured in the message editor.
-It is also possible to embed values of the event that triggered the notification.
-This can be done with the #property# notation.
-All available properties are presented in the notification configurator.
-When the notification is triggered the #property# template is replaced with the actual value of the property.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/notification/01_select_notification_sink.png" alt="Select Notification"/>
-    <img src="/img/features_0_62_0/notification/02_configure_notification.png" alt="Configure Notification"/>
-</div>
-
-A pop up icon on the notification tab in the menu shows the user how many unread notifications currently are in the system.
-This icon also alerts users when new notifications occur.
-In the notification overview all notifications are listed.
-On the top are the new notifications that are not read yet.
-A user can mark them as read by clicking on the little envelope icon.
-Those notifications are then no longer in the unread section, but they remain in the "All Messages" view.
-This way it is possible to keep track of all notifications and have a look at them at a later point in time.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/notification/03_new_notification.png" alt="New Notification"/>
-</div>
-
-
-## Install Pipeline Elements
-StreamPipes is highly configurable and extensible.
-Pipeline elements can be added and removed during runtime.
-This can be done in the "Install Pipeline Elements" view.
-All available pipeline elements are shown here and can be selected to install or uninstall.
-It is also possible to select multiple or all of them and then install them all together.
-When a new element is installed by the user it is automatically available in the "Pipeline Editor" and can be used for pipelines.
-Elements that are uninstalled are removed from the system. 
-They can not longer be used within pipelines.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/install_elements/01_install_elements.png" alt="Install Elements View"/>
-    <img src="/img/features_0_62_0/install_elements/02_install_countAggregation.png" alt="Insall new Element"/>
-    <img src="/img/features_0_62_0/install_elements/03_installed_countAggregation.png" alt="Installation Successful"/>
-    <img src="/img/features_0_62_0/install_elements/04_countAggregation_in_editor.png" alt="Show new installed element"/>
-</div>
-
-
-## My Elements
-The "My Elements" view gives a quick overview over all installed pipeline elements.
-Here they can be inspected and the description can be re-imported.
-In this view it is also possible to have a look at the JSON-LD representation of each element.
-This is not important for a user, but it is worth noting that the system uses this machine understandable format to support the user.
-For example all the information of the sources, like data schema or unit information is in the JSON-LD meta data.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/my_elements/01_my_elements.png" alt="My Elements Overview"/>
-    <img src="/img/features_0_62_0/my_elements/02_my_elements_jsonid.png" alt="View JSON-LD"/>
-</div>
-
-## Configuration
-The last feature is the _configuration view_.
-Here, it is possible to change the configuration parameters of installed components.
-All components containing processing elements automatically register in StreamPipes when they are started in the same network as the backend component.
-Once a container is registered it is represented in the configuration view.
-The green dot on the top left indicates that tha container is running properly.
-When there is a problem with a container the green dot changes to red and the user knows there is a problem.
-To configure the parameters the top right arrow of a configuration box must be clicked.
-Then the configuration menu pops up. 
-Within there it is possible to change the parameters of a service.
-To make the changes persistent the "Update" button must be clicked.
-A user should keep in mind that sometimes it is necessary to restart a container when the parameters are changed.
-Sometimes it is also necessary to re-import the pipeline element description, either by uninstalling and re-installing them after the container restart or be reloading the description in the "My elements" view.
-
-<div class="my-carousel">
-    <img src="/img/features_0_62_0/configuration/01_configuration_overview.png" alt="Configuration Overview"/>
-    <img src="/img/features_0_62_0/configuration/02_change_config.png" alt="Change Configuration"/>
-</div>
-
-
-Congratulations! You've just finished your first tour of StreamPipes.
-Although there's still more to learn, we introduced most of the currently available features.
-On the next page, the different processing elements that come with the installation are explained.
diff --git a/website-v2/blog/2020-01-23-streampipes_on_rpi.md b/website-v2/blog/2020-01-23-streampipes_on_rpi.md
index 3b1815c59..7e56e9e39 100644
--- a/website-v2/blog/2020-01-23-streampipes_on_rpi.md
+++ b/website-v2/blog/2020-01-23-streampipes_on_rpi.md
@@ -12,7 +12,7 @@ authorImageURL: "/img/wiener.png"
 This is the start of a two part series on how we want to bring StreamPipes closer to the edge. The [first part](/docs/blog/2020/01/23/streampipes_on_rpi) describes how we managed to build and deploy StreamPipes on one Raspberry Pi (Model 4), while the [second part](/docs/blog/2020/05/27/streampipes_on_k3s) further covers how to deploy StreamPipes over a Kubernetes cluster of two Raspberry Pi's via K3s using our StreamPipes helm chart.
 <!--truncate-->
 
-<TL;DR>
+**TL;DR**
 
 _With new advancements that came in the last StreamPipes release, we managed to reduce the required resources (mainly memory) drastically. To this extent, we cross-compiled StreamPipes Docker images for ARM support and deployed our lite version on a Raspberry Pi (Model 4). We showcase, that it is feasible to run analytical pipelines with ease and operate StreamPipes at moderate load._
 
diff --git a/website-v2/blog/2020-05-27-streampipes_on_k3s.md b/website-v2/blog/2020-05-27-streampipes_on_k3s.md
index c4370bf13..0fc440494 100644
--- a/website-v2/blog/2020-05-27-streampipes_on_k3s.md
+++ b/website-v2/blog/2020-05-27-streampipes_on_k3s.md
@@ -12,7 +12,7 @@ authorImageURL: "/img/wiener.png"
 This blog post is the second part of a series on how we want to bring StreamPipes closer to the edge. The [first part](/blog/2020/01/23/streampipes_on_rpi) describes how we managed to build and deploy StreamPipes on one Raspberry Pi (Model 4), while the [second part](/blog/2020/05/27/streampipes_on_k3s) further covers how to deploy StreamPipes over a Kubernetes cluster of two Raspberry Pi's via k3s using our StreamPipes helm chart.
 <!--truncate-->
 
-**<TL;DR>**
+**TL;DR**
 
 **With new advancements that came in the last StreamPipes release, we managed to reduce the required resources (mainly memory) drastically. To this extent, we cross-compiled StreamPipes Docker images for ARM support and deployed our lite version on a Raspberry Pi (Model 4). We showcase, that it is feasible to run analytical pipelines with ease and operate StreamPipes at moderate load. Additionally, we demonstrate how to deploy StreamPipes over a two-node k3s cluster using our StreamPipes [...]
 
@@ -33,7 +33,7 @@ Fortunately, there exists a few solutions in the container ecosystem with the op
 On the other hand, there exists [K3s](https://k3s.io/), a lightweight Kubernetes distro by Rancher that was introduced early 2019 and has since then gained huge popularity. As it is stated on their website:
 
 * **Perfect for Edge**: _K3s is a highly available, certified Kubernetes distribution designed for production workloads in unattended, resource-constrained, remote locations or inside IoT appliances_
-* **Simplified & Secure**: _K3s is packaged as a single <40MB binary that reduces the dependencies and steps needed to install, run and auto-update a production Kubernetes cluster._
+* **Simplified & Secure**: _K3s is packaged as a single less-than-40MB binary that reduces the dependencies and steps needed to install, run and auto-update a production Kubernetes cluster._
 * **Optimized for ARM**: _Both ARM64 and ARMv7 are supported with binaries and multiarch images available for both. K3s works great from something as small as a Raspberry Pi to an AWS a1.4xlarge 32GiB server._
 
 Thus, this lead us to the point to say, hey why not use K3s to manage StreamPipes in all its glory. The containerized microservice design in addition to the newly available multiarch images are a great fit.
diff --git a/website-v2/docusaurus.config.js b/website-v2/docusaurus.config.js
index f58389d71..0ad744fec 100644
--- a/website-v2/docusaurus.config.js
+++ b/website-v2/docusaurus.config.js
@@ -105,7 +105,7 @@ module.exports = {
     "image": "img/favicon.png",
     "footer": {
       "links": [],
-      "copyright": "Copyright © 2019 - 2025 The Apache Software Foundation",
+      "copyright": "Copyright © 2019 - 2026 The Apache Software Foundation",
       "logo": {
         "src": "img/sp-logo-color.png"
       }
diff --git a/website-v2/package-lock.json b/website-v2/package-lock.json
index 1d64696cb..cef01c751 100644
--- a/website-v2/package-lock.json
+++ b/website-v2/package-lock.json
@@ -5,297 +5,297 @@
   "packages": {
     "": {
       "dependencies": {
-        "@docusaurus/core": "2.4.1",
-        "@docusaurus/plugin-client-redirects": "2.4.1",
-        "@docusaurus/preset-classic": "2.4.1",
+        "@docusaurus/core": "3.10.1",
+        "@docusaurus/plugin-client-redirects": "3.10.1",
+        "@docusaurus/preset-classic": "3.10.1",
         "@iconify/icons-akar-icons": "^1.2.8",
         "@iconify/react": "^3.2.2",
         "clsx": "^1.1.1",
         "docusaurus-plugin-sass": "^0.2.4",
-        "react": "^17.0.2",
-        "react-dom": "^17.0.2",
+        "react": "^19.2.5",
+        "react-dom": "^19.2.5",
         "react-lazy-load-image-component": "^1.5.4",
         "sass": "^1.63.6",
         "swiper": "^10.0.0"
       }
     },
-    "node_modules/@algolia/autocomplete-core": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz",
-      "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==",
+    "node_modules/@algolia/abtesting": {
+      "version": "1.18.0",
+      "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.18.0.tgz",
+      "integrity": "sha512-8siuLG+FIns1AjZ/g2SDVwHz9S+ObacDQISEJvS8XsNei1zl3FXqfqQrBpmrG7ACWCyesXHbicMJtvRbg00FEw==",
+      "license": "MIT",
       "dependencies": {
-        "@algolia/autocomplete-plugin-algolia-insights": "1.9.3",
-        "@algolia/autocomplete-shared": "1.9.3"
+        "@algolia/client-common": "5.52.0",
+        "@algolia/requester-browser-xhr": "5.52.0",
+        "@algolia/requester-fetch": "5.52.0",
+        "@algolia/requester-node-http": "5.52.0"
+      },
+      "engines": {
+        "node": ">= 14.0.0"
       }
     },
-    "node_modules/@algolia/autocomplete-plugin-algolia-insights": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz",
-      "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==",
+    "node_modules/@algolia/autocomplete-core": {
+      "version": "1.19.8",
+      "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.8.tgz",
+      "integrity": "sha512-3YEorYg44niXcm7gkft3nXYItHd44e8tmh4D33CTszPgP0QWkaLEaFywiNyJBo7UL/mqObA/G9RYuU7R8tN1IA==",
+      "license": "MIT",
       "dependencies": {
-        "@algolia/autocomplete-shared": "1.9.3"
-      },
-      "peerDependencies": {
-        "search-insights": ">= 1 < 3"
+        "@algolia/autocomplete-plugin-algolia-insights": "1.19.8",
+        "@algolia/autocomplete-shared": "1.19.8"
       }
     },
-    "node_modules/@algolia/autocomplete-preset-algolia": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz",
-      "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==",
+    "node_modules/@algolia/autocomplete-plugin-algolia-insights": {
+      "version": "1.19.8",
+      "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.8.tgz",
+      "integrity": "sha512-ZvJWO8ZZJDpc1LNM2TTBdmQsZBLMR4rU5iNR2OYvEeFBiaf/0ESnRSSLQbryarJY4SVxtoz6A2ZtDMNM+iQEAA==",
+      "license": "MIT",
       "dependencies": {
-        "@algolia/autocomplete-shared": "1.9.3"
+        "@algolia/autocomplete-shared": "1.19.8"
       },
       "peerDependencies": {
-        "@algolia/client-search": ">= 4.9.1 < 6",
-        "algoliasearch": ">= 4.9.1 < 6"
+        "search-insights": ">= 1 < 3"
       }
     },
     "node_modules/@algolia/autocomplete-shared": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz",
-      "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==",
+      "version": "1.19.8",
+      "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.8.tgz",
+      "integrity": "sha512-h5hf2t8ejF6vlOgvLaZzQbWs5SyH2z4PAWygNAvvD/2RI29hdQ54ldUGwqVuj9Srs+n8XUKTPUqb7fvhBhQrnQ==",
+      "license": "MIT",
       "peerDependencies": {
         "@algolia/client-search": ">= 4.9.1 < 6",
         "algoliasearch": ">= 4.9.1 < 6"
       }
     },
-    "node_modules/@algolia/cache-browser-local-storage": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.18.0.tgz",
-      "integrity": "sha512-rUAs49NLlO8LVLgGzM4cLkw8NJLKguQLgvFmBEe3DyzlinoqxzQMHfKZs6TSq4LZfw/z8qHvRo8NcTAAUJQLcw==",
+    "node_modules/@algolia/client-abtesting": {
+      "version": "5.52.0",
+      "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.52.0.tgz",
+      "integrity": "sha512-wtwPgyPmO7b7sQPVgoK29c1VpfS08DnnJCmxX/oU1pV2DlMRJCzQcLN7JSloYpodyKHwM8+9wOzlAM0co3TDmA==",
+      "license": "MIT",
       "dependencies": {
-        "@algolia/cache-common": "4.18.0"
+        "@algolia/client-common": "5.52.0",
+        "@algolia/requester-browser-xhr": "5.52.0",
+        "@algolia/requester-fetch": "5.52.0",
+        "@algolia/requester-node-http": "5.52.0"
+      },
+      "engines": {
+        "node": ">= 14.0.0"
       }
     },
-    "node_modules/@algolia/cache-common": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.18.0.tgz",
-      "integrity": "sha512-BmxsicMR4doGbeEXQu8yqiGmiyvpNvejYJtQ7rvzttEAMxOPoWEHrWyzBQw4x7LrBY9pMrgv4ZlUaF8PGzewHg=="
-    },
-    "node_modules/@algolia/cache-in-memory": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.18.0.tgz",
-      "integrity": "sha512-evD4dA1nd5HbFdufBxLqlJoob7E2ozlqJZuV3YlirNx5Na4q1LckIuzjNYZs2ddLzuTc/Xd5O3Ibf7OwPskHxw==",
+    "node_modules/@algolia/client-analytics": {
+      "version": "5.52.0",
+      "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.52.0.tgz",
+      "integrity": "sha512-9KY36bRl4AH7RjqSeDDOKnjsz4IxQFBEOB8/fWmEbdQe+Isbs5jGzVJu9NEPQ1Tgwxlf8Uf07Swj3jZyMNUZ2g==",
+      "license": "MIT",
       "dependencies": {
-        "@algolia/cache-common": "4.18.0"
+        "@algolia/client-common": "5.52.0",
+        "@algolia/requester-browser-xhr": "5.52.0",
+        "@algolia/requester-fetch": "5.52.0",
+        "@algolia/requester-node-http": "5.52.0"
+      },
+      "engines": {
+        "node": ">= 14.0.0"
       }
     },
-    "node_modules/@algolia/client-account": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.18.0.tgz",
-      "integrity": "sha512-XsDnlROr3+Z1yjxBJjUMfMazi1V155kVdte6496atvBgOEtwCzTs3A+qdhfsAnGUvaYfBrBkL0ThnhMIBCGcew==",
-      "dependencies": {
-        "@algolia/client-common": "4.18.0",
-        "@algolia/client-search": "4.18.0",
-        "@algolia/transporter": "4.18.0"
+    "node_modules/@algolia/client-common": {
+      "version": "5.52.0",
+      "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.52.0.tgz",
+      "integrity": "sha512-3a/qM3dzJqqfTx7Yrw7uGQ98I3Q0rDfb4Vkv0wEzko96l7YQMxfBVz/VbLq2N+c59GweYv6Vhp8mPeqnWJSITw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 14.0.0"
       }
     },
-    "node_modules/@algolia/client-analytics": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.18.0.tgz",
-      "integrity": "sha512-chEUSN4ReqU7uRQ1C8kDm0EiPE+eJeAXiWcBwLhEynfNuTfawN9P93rSZktj7gmExz0C8XmkbBU19IQ05wCNrQ==",
+    "node_modules/@algolia/client-insights": {
+      "version": "5.52.0",
+      "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.52.0.tgz",
+      "integrity": "sha512-Rki7ACbMcvbQW0BuM84x9dkGHY47ABmv4jU6tYssat2k02p3mIUms2YOLUAMeknhmnFsj6lb6ZzOXdMWMyc1sA==",
+      "license": "MIT",
       "dependencies": {
-        "@algolia/client-common": "4.18.0",
-        "@algolia/client-search": "4.18.0",
-        "@algolia/requester-common": "4.18.0",
-        "@algolia/transporter": "4.18.0"
+        "@algolia/client-common": "5.52.0",
+        "@algolia/requester-browser-xhr": "5.52.0",
+        "@algolia/requester-fetch": "5.52.0",
+        "@algolia/requester-node-http": "5.52.0"
+      },
+      "engines": {
+        "node": ">= 14.0.0"
       }
     },
-    "node_modules/@algolia/client-common": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.18.0.tgz",
-      "integrity": "sha512-7N+soJFP4wn8tjTr3MSUT/U+4xVXbz4jmeRfWfVAzdAbxLAQbHa0o/POSdTvQ8/02DjCLelloZ1bb4ZFVKg7Wg==",
+    "node_modules/@algolia/client-personalization": {
+      "version": "5.52.0",
+      "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.52.0.tgz",
+      "integrity": "sha512-96s4Uzc3kk+/f4jJXIVVGWP5XlngOGNQ1x6hW9AT59pOixHlOs5tqJg+ZUS/GQ6h/iYP0ceQcmxDQeLyCLTaDQ==",
+      "license": "MIT",
       "dependencies": {
-        "@algolia/requester-common": "4.18.0",
-        "@algolia/transporter": "4.18.0"
+        "@algolia/client-common": "5.52.0",
+        "@algolia/requester-browser-xhr": "5.52.0",
+        "@algolia/requester-fetch": "5.52.0",
+        "@algolia/requester-node-http": "5.52.0"
+      },
+      "engines": {
+        "node": ">= 14.0.0"
       }
     },
-    "node_modules/@algolia/client-personalization": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.18.0.tgz",
-      "integrity": "sha512-+PeCjODbxtamHcPl+couXMeHEefpUpr7IHftj4Y4Nia1hj8gGq4VlIcqhToAw8YjLeCTfOR7r7xtj3pJcYdP8A==",
+    "node_modules/@algolia/client-query-suggestions": {
+      "version": "5.52.0",
+      "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.52.0.tgz",
+      "integrity": "sha512-lqeycNpSPe5Qa0OUWpejVvYQjQWV5nQuLT0a4aq7XzRAvCxprV/6Lf841EygdD2nrFnuS58ok7Au1uOtXzpnkg==",
+      "license": "MIT",
       "dependencies": {
-        "@algolia/client-common": "4.18.0",
-        "@algolia/requester-common": "4.18.0",
-        "@algolia/transporter": "4.18.0"
+        "@algolia/client-common": "5.52.0",
+        "@algolia/requester-browser-xhr": "5.52.0",
+        "@algolia/requester-fetch": "5.52.0",
+        "@algolia/requester-node-http": "5.52.0"
+      },
+      "engines": {
+        "node": ">= 14.0.0"
       }
     },
     "node_modules/@algolia/client-search": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.18.0.tgz",
-      "integrity": "sha512-F9xzQXTjm6UuZtnsLIew6KSraXQ0AzS/Ee+OD+mQbtcA/K1sg89tqb8TkwjtiYZ0oij13u3EapB3gPZwm+1Y6g==",
+      "version": "5.52.0",
+      "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.52.0.tgz",
+      "integrity": "sha512-ly1wETVGRo30cx61O7fetESN+ElL9c9K+bD/AVgnT1ar4c6v+/Yqjrhdtu6Fm4D0s4NZP081Isf6tunH1wUXHg==",
+      "license": "MIT",
       "dependencies": {
-        "@algolia/client-common": "4.18.0",
-        "@algolia/requester-common": "4.18.0",
-        "@algolia/transporter": "4.18.0"
+        "@algolia/client-common": "5.52.0",
+        "@algolia/requester-browser-xhr": "5.52.0",
+        "@algolia/requester-fetch": "5.52.0",
+        "@algolia/requester-node-http": "5.52.0"
+      },
+      "engines": {
+        "node": ">= 14.0.0"
       }
     },
     "node_modules/@algolia/events": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz",
-      "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ=="
-    },
-    "node_modules/@algolia/logger-common": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.18.0.tgz",
-      "integrity": "sha512-46etYgSlkoKepkMSyaoriSn2JDgcrpc/nkOgou/lm0y17GuMl9oYZxwKKTSviLKI5Irk9nSKGwnBTQYwXOYdRg=="
-    },
-    "node_modules/@algolia/logger-console": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.18.0.tgz",
-      "integrity": "sha512-3P3VUYMl9CyJbi/UU1uUNlf6Z8N2ltW3Oqhq/nR7vH0CjWv32YROq3iGWGxB2xt3aXobdUPXs6P0tHSKRmNA6g==",
-      "dependencies": {
-        "@algolia/logger-common": "4.18.0"
-      }
-    },
-    "node_modules/@algolia/requester-browser-xhr": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.18.0.tgz",
-      "integrity": "sha512-/AcWHOBub2U4TE/bPi4Gz1XfuLK6/7dj4HJG+Z2SfQoS1RjNLshZclU3OoKIkFp8D2NC7+BNsPvr9cPLyW8nyQ==",
-      "dependencies": {
-        "@algolia/requester-common": "4.18.0"
-      }
-    },
-    "node_modules/@algolia/requester-common": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.18.0.tgz",
-      "integrity": "sha512-xlT8R1qYNRBCi1IYLsx7uhftzdfsLPDGudeQs+xvYB4sQ3ya7+ppolB/8m/a4F2gCkEO6oxpp5AGemM7kD27jA=="
-    },
-    "node_modules/@algolia/requester-node-http": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.18.0.tgz",
-      "integrity": "sha512-TGfwj9aeTVgOUhn5XrqBhwUhUUDnGIKlI0kCBMdR58XfXcfdwomka+CPIgThRbfYw04oQr31A6/95ZH2QVJ9UQ==",
-      "dependencies": {
-        "@algolia/requester-common": "4.18.0"
-      }
-    },
-    "node_modules/@algolia/transporter": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.18.0.tgz",
-      "integrity": "sha512-xbw3YRUGtXQNG1geYFEDDuFLZt4Z8YNKbamHPkzr3rWc6qp4/BqEeXcI2u/P/oMq2yxtXgMxrCxOPA8lyIe5jw==",
-      "dependencies": {
-        "@algolia/cache-common": "4.18.0",
-        "@algolia/logger-common": "4.18.0",
-        "@algolia/requester-common": "4.18.0"
-      }
+      "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==",
+      "license": "MIT"
     },
-    "node_modules/@ampproject/remapping": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
-      "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
+    "node_modules/@algolia/ingestion": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.52.0.tgz",
+      "integrity": "sha512-U4EeTvgmluRjj39ykZSAd5X+a6LD5m7/mcOWDmB7hqm1R6QY0yT8jLxpNVEjYhzgEN5hcDGW6X67EWQY8KiYGQ==",
+      "license": "MIT",
       "dependencies": {
-        "@jridgewell/gen-mapping": "^0.3.0",
-        "@jridgewell/trace-mapping": "^0.3.9"
+        "@algolia/client-common": "5.52.0",
+        "@algolia/requester-browser-xhr": "5.52.0",
+        "@algolia/requester-fetch": "5.52.0",
+        "@algolia/requester-node-http": "5.52.0"
       },
       "engines": {
-        "node": ">=6.0.0"
+        "node": ">= 14.0.0"
       }
     },
-    "node_modules/@babel/code-frame": {
-      "version": "7.22.13",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz",
-      "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==",
+    "node_modules/@algolia/monitoring": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.52.0.tgz",
+      "integrity": "sha512-FCPnDcILfpTE94u7BVlV4DmnSV5wE3+j25EEF+3dYPrVzkVCSoAHs318oWDGxnxsAgiL4HpL12Jc4XHmw9shpA==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/highlight": "^7.22.13",
-        "chalk": "^2.4.2"
+        "@algolia/client-common": "5.52.0",
+        "@algolia/requester-browser-xhr": "5.52.0",
+        "@algolia/requester-fetch": "5.52.0",
+        "@algolia/requester-node-http": "5.52.0"
       },
       "engines": {
-        "node": ">=6.9.0"
+        "node": ">= 14.0.0"
       }
     },
-    "node_modules/@babel/code-frame/node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+    "node_modules/@algolia/recommend": {
+      "version": "5.52.0",
+      "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.52.0.tgz",
+      "integrity": "sha512-br3DO7n4N8CXwTRbZS0MnB4WQ9YHfNjCwkCEzVR/wek/qNTDQKDb0nROmkFaNZ8ucUqUVKZi074dbwMwRDlK8Q==",
+      "license": "MIT",
       "dependencies": {
-        "color-convert": "^1.9.0"
+        "@algolia/client-common": "5.52.0",
+        "@algolia/requester-browser-xhr": "5.52.0",
+        "@algolia/requester-fetch": "5.52.0",
+        "@algolia/requester-node-http": "5.52.0"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">= 14.0.0"
       }
     },
-    "node_modules/@babel/code-frame/node_modules/chalk": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+    "node_modules/@algolia/requester-browser-xhr": {
+      "version": "5.52.0",
+      "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.52.0.tgz",
+      "integrity": "sha512-b0T/Ca2c9KyEslKsVrGZvbe1UrrKKSdfXhBZ2pbpKahFUzJfziRZ0urbOm7V65O0tO/jwU+Lo/+bIiiyhzGt8w==",
+      "license": "MIT",
       "dependencies": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
+        "@algolia/client-common": "5.52.0"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">= 14.0.0"
       }
     },
-    "node_modules/@babel/code-frame/node_modules/color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+    "node_modules/@algolia/requester-fetch": {
+      "version": "5.52.0",
+      "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.52.0.tgz",
+      "integrity": "sha512-ozBT8J/mtD4H4IAojw8QPirlcL2gHrI1BGuZ4/ZXXO/rTE1yQ4VIPJj4mTTbwo4FbkS1MoJsD/DsrqLzhnc4/g==",
+      "license": "MIT",
       "dependencies": {
-        "color-name": "1.1.3"
-      }
-    },
-    "node_modules/@babel/code-frame/node_modules/color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
-    },
-    "node_modules/@babel/code-frame/node_modules/escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+        "@algolia/client-common": "5.52.0"
+      },
       "engines": {
-        "node": ">=0.8.0"
+        "node": ">= 14.0.0"
       }
     },
-    "node_modules/@babel/code-frame/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+    "node_modules/@algolia/requester-node-http": {
+      "version": "5.52.0",
+      "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.52.0.tgz",
+      "integrity": "sha512-gyyWcLD22tnabmoit4iukCXuoRc5HYJuUjPSEa8a0D/f/NlRafpWi52AlAaa4Uu/rsl7saHsJFTNjTptWbu2+A==",
+      "license": "MIT",
+      "dependencies": {
+        "@algolia/client-common": "5.52.0"
+      },
       "engines": {
-        "node": ">=4"
+        "node": ">= 14.0.0"
       }
     },
-    "node_modules/@babel/code-frame/node_modules/supports-color": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+    "node_modules/@babel/code-frame": {
+      "version": "7.29.0",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
+      "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
+      "license": "MIT",
       "dependencies": {
-        "has-flag": "^3.0.0"
+        "@babel/helper-validator-identifier": "^7.28.5",
+        "js-tokens": "^4.0.0",
+        "picocolors": "^1.1.1"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/compat-data": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz",
-      "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==",
+      "version": "7.29.3",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz",
+      "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==",
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/core": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz",
-      "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==",
-      "dependencies": {
-        "@ampproject/remapping": "^2.2.0",
-        "@babel/code-frame": "^7.22.5",
-        "@babel/generator": "^7.22.5",
-        "@babel/helper-compilation-targets": "^7.22.5",
-        "@babel/helper-module-transforms": "^7.22.5",
-        "@babel/helpers": "^7.22.5",
-        "@babel/parser": "^7.22.5",
-        "@babel/template": "^7.22.5",
-        "@babel/traverse": "^7.22.5",
-        "@babel/types": "^7.22.5",
-        "convert-source-map": "^1.7.0",
+      "version": "7.29.0",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz",
+      "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.29.0",
+        "@babel/generator": "^7.29.0",
+        "@babel/helper-compilation-targets": "^7.28.6",
+        "@babel/helper-module-transforms": "^7.28.6",
+        "@babel/helpers": "^7.28.6",
+        "@babel/parser": "^7.29.0",
+        "@babel/template": "^7.28.6",
+        "@babel/traverse": "^7.29.0",
+        "@babel/types": "^7.29.0",
+        "@jridgewell/remapping": "^2.3.5",
+        "convert-source-map": "^2.0.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.2",
-        "json5": "^2.2.2",
-        "semver": "^6.3.0"
+        "json5": "^2.2.3",
+        "semver": "^6.3.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -309,86 +309,77 @@
       "version": "6.3.1",
       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
       "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.23.0",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz",
-      "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==",
+      "version": "7.29.1",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
+      "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.23.0",
-        "@jridgewell/gen-mapping": "^0.3.2",
-        "@jridgewell/trace-mapping": "^0.3.17",
-        "jsesc": "^2.5.1"
+        "@babel/parser": "^7.29.0",
+        "@babel/types": "^7.29.0",
+        "@jridgewell/gen-mapping": "^0.3.12",
+        "@jridgewell/trace-mapping": "^0.3.28",
+        "jsesc": "^3.0.2"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-annotate-as-pure": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz",
-      "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==",
-      "dependencies": {
-        "@babel/types": "^7.22.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz",
-      "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==",
+      "version": "7.27.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz",
+      "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/types": "^7.27.3"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-compilation-targets": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz",
-      "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==",
-      "dependencies": {
-        "@babel/compat-data": "^7.22.5",
-        "@babel/helper-validator-option": "^7.22.5",
-        "browserslist": "^4.21.3",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
+      "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/compat-data": "^7.28.6",
+        "@babel/helper-validator-option": "^7.27.1",
+        "browserslist": "^4.24.0",
         "lru-cache": "^5.1.1",
-        "semver": "^6.3.0"
+        "semver": "^6.3.1"
       },
       "engines": {
         "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
       }
     },
     "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
       "version": "6.3.1",
       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
       "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
       }
     },
     "node_modules/@babel/helper-create-class-features-plugin": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.5.tgz",
-      "integrity": "sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==",
+      "version": "7.29.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.3.tgz",
+      "integrity": "sha512-RpLYy2sb51oNLjuu1iD3bwBqCBWUzjO0ocp+iaCP/lJtb2CPLcnC2Fftw+4sAzaMELGeWTgExSKADbdo0GFVzA==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-environment-visitor": "^7.22.5",
-        "@babel/helper-function-name": "^7.22.5",
-        "@babel/helper-member-expression-to-functions": "^7.22.5",
-        "@babel/helper-optimise-call-expression": "^7.22.5",
-        "@babel/helper-replace-supers": "^7.22.5",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
-        "@babel/helper-split-export-declaration": "^7.22.5",
-        "semver": "^6.3.0"
+        "@babel/helper-annotate-as-pure": "^7.27.3",
+        "@babel/helper-member-expression-to-functions": "^7.28.5",
+        "@babel/helper-optimise-call-expression": "^7.27.1",
+        "@babel/helper-replace-supers": "^7.28.6",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+        "@babel/traverse": "^7.29.0",
+        "semver": "^6.3.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -401,18 +392,20 @@
       "version": "6.3.1",
       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
       "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
       }
     },
     "node_modules/@babel/helper-create-regexp-features-plugin": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.5.tgz",
-      "integrity": "sha512-1VpEFOIbMRaXyDeUwUfmTIxExLwQ+zkW+Bh5zXpApA3oQedBx9v/updixWxnx/bZpKw7u8VxWjb/qWpIcmPq8A==",
+      "version": "7.28.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz",
+      "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "regexpu-core": "^5.3.1",
-        "semver": "^6.3.0"
+        "@babel/helper-annotate-as-pure": "^7.27.3",
+        "regexpu-core": "^6.3.1",
+        "semver": "^6.3.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -425,133 +418,109 @@
       "version": "6.3.1",
       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
       "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
       }
     },
     "node_modules/@babel/helper-define-polyfill-provider": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz",
-      "integrity": "sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==",
-      "dependencies": {
-        "@babel/helper-compilation-targets": "^7.17.7",
-        "@babel/helper-plugin-utils": "^7.16.7",
-        "debug": "^4.1.1",
+      "version": "0.6.8",
+      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz",
+      "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-compilation-targets": "^7.28.6",
+        "@babel/helper-plugin-utils": "^7.28.6",
+        "debug": "^4.4.3",
         "lodash.debounce": "^4.0.8",
-        "resolve": "^1.14.2",
-        "semver": "^6.1.2"
+        "resolve": "^1.22.11"
       },
       "peerDependencies": {
-        "@babel/core": "^7.4.0-0"
-      }
-    },
-    "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": {
-      "version": "6.3.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/@babel/helper-environment-visitor": {
-      "version": "7.22.20",
-      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
-      "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-function-name": {
-      "version": "7.23.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
-      "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
-      "dependencies": {
-        "@babel/template": "^7.22.15",
-        "@babel/types": "^7.23.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
+        "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
       }
     },
-    "node_modules/@babel/helper-hoist-variables": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
-      "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
-      "dependencies": {
-        "@babel/types": "^7.22.5"
-      },
+    "node_modules/@babel/helper-globals": {
+      "version": "7.28.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
+      "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-member-expression-to-functions": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz",
-      "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==",
+      "version": "7.28.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz",
+      "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/traverse": "^7.28.5",
+        "@babel/types": "^7.28.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-module-imports": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz",
-      "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
+      "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/traverse": "^7.28.6",
+        "@babel/types": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-module-transforms": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz",
-      "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
+      "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-environment-visitor": "^7.22.5",
-        "@babel/helper-module-imports": "^7.22.5",
-        "@babel/helper-simple-access": "^7.22.5",
-        "@babel/helper-split-export-declaration": "^7.22.5",
-        "@babel/helper-validator-identifier": "^7.22.5",
-        "@babel/template": "^7.22.5",
-        "@babel/traverse": "^7.22.5",
-        "@babel/types": "^7.22.5"
+        "@babel/helper-module-imports": "^7.28.6",
+        "@babel/helper-validator-identifier": "^7.28.5",
+        "@babel/traverse": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
       }
     },
     "node_modules/@babel/helper-optimise-call-expression": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz",
-      "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz",
+      "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/types": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-plugin-utils": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
-      "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz",
+      "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==",
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-remap-async-to-generator": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz",
-      "integrity": "sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz",
+      "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-environment-visitor": "^7.22.5",
-        "@babel/helper-wrap-function": "^7.22.5",
-        "@babel/types": "^7.22.5"
+        "@babel/helper-annotate-as-pure": "^7.27.1",
+        "@babel/helper-wrap-function": "^7.27.1",
+        "@babel/traverse": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -561,199 +530,158 @@
       }
     },
     "node_modules/@babel/helper-replace-supers": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz",
-      "integrity": "sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz",
+      "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-environment-visitor": "^7.22.5",
-        "@babel/helper-member-expression-to-functions": "^7.22.5",
-        "@babel/helper-optimise-call-expression": "^7.22.5",
-        "@babel/template": "^7.22.5",
-        "@babel/traverse": "^7.22.5",
-        "@babel/types": "^7.22.5"
+        "@babel/helper-member-expression-to-functions": "^7.28.5",
+        "@babel/helper-optimise-call-expression": "^7.27.1",
+        "@babel/traverse": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-simple-access": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
-      "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
-      "dependencies": {
-        "@babel/types": "^7.22.5"
       },
-      "engines": {
-        "node": ">=6.9.0"
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
       }
     },
     "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz",
-      "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==",
-      "dependencies": {
-        "@babel/types": "^7.22.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-split-export-declaration": {
-      "version": "7.22.6",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
-      "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz",
+      "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/traverse": "^7.27.1",
+        "@babel/types": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-string-parser": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
-      "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+      "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-validator-identifier": {
-      "version": "7.22.20",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
-      "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
+      "version": "7.28.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+      "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-validator-option": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz",
-      "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
+      "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-wrap-function": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz",
-      "integrity": "sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz",
+      "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-function-name": "^7.22.5",
-        "@babel/template": "^7.22.5",
-        "@babel/traverse": "^7.22.5",
-        "@babel/types": "^7.22.5"
+        "@babel/template": "^7.28.6",
+        "@babel/traverse": "^7.28.6",
+        "@babel/types": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helpers": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz",
-      "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==",
+      "version": "7.29.2",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz",
+      "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/template": "^7.22.5",
-        "@babel/traverse": "^7.22.5",
-        "@babel/types": "^7.22.5"
+        "@babel/template": "^7.28.6",
+        "@babel/types": "^7.29.0"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
-    "node_modules/@babel/highlight": {
-      "version": "7.22.20",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz",
-      "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==",
+    "node_modules/@babel/parser": {
+      "version": "7.29.3",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz",
+      "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-validator-identifier": "^7.22.20",
-        "chalk": "^2.4.2",
-        "js-tokens": "^4.0.0"
+        "@babel/types": "^7.29.0"
       },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/highlight/node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dependencies": {
-        "color-convert": "^1.9.0"
+      "bin": {
+        "parser": "bin/babel-parser.js"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">=6.0.0"
       }
     },
-    "node_modules/@babel/highlight/node_modules/chalk": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+    "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+      "version": "7.28.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz",
+      "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==",
+      "license": "MIT",
       "dependencies": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
+        "@babel/helper-plugin-utils": "^7.27.1",
+        "@babel/traverse": "^7.28.5"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
       }
     },
-    "node_modules/@babel/highlight/node_modules/color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+    "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz",
+      "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==",
+      "license": "MIT",
       "dependencies": {
-        "color-name": "1.1.3"
-      }
-    },
-    "node_modules/@babel/highlight/node_modules/color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
-    },
-    "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/@babel/highlight/node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+        "@babel/helper-plugin-utils": "^7.27.1"
+      },
       "engines": {
-        "node": ">=4"
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
       }
     },
-    "node_modules/@babel/highlight/node_modules/supports-color": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+    "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz",
+      "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==",
+      "license": "MIT",
       "dependencies": {
-        "has-flag": "^3.0.0"
+        "@babel/helper-plugin-utils": "^7.27.1"
       },
       "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/@babel/parser": {
-      "version": "7.23.0",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz",
-      "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==",
-      "bin": {
-        "parser": "bin/babel-parser.js"
+        "node": ">=6.9.0"
       },
-      "engines": {
-        "node": ">=6.0.0"
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
       }
     },
-    "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz",
-      "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==",
+    "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": {
+      "version": "7.29.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.3.tgz",
+      "integrity": "sha512-SRS46DFR4HqzUzCVgi90/xMoL+zeBDBvWdKYXSEzh79kXswNFEglUpMKxR04//dPqwYXWUBJ3mpUd933ru9Kmg==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.28.6",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -763,13 +691,14 @@
       }
     },
     "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz",
-      "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz",
+      "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
-        "@babel/plugin-transform-optional-chaining": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.27.1",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+        "@babel/plugin-transform-optional-chaining": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -778,23 +707,27 @@
         "@babel/core": "^7.13.0"
       }
     },
-    "node_modules/@babel/plugin-proposal-object-rest-spread": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz",
-      "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==",
+    "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz",
+      "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
-        "@babel/plugin-transform-parameters": "^7.12.1"
+        "@babel/helper-plugin-utils": "^7.28.6",
+        "@babel/traverse": "^7.28.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       },
       "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
+        "@babel/core": "^7.0.0"
       }
     },
     "node_modules/@babel/plugin-proposal-private-property-in-object": {
       "version": "7.21.0-placeholder-for-preset-env.2",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
       "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       },
@@ -802,49 +735,55 @@
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-proposal-unicode-property-regex": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz",
-      "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==",
+    "node_modules/@babel/plugin-syntax-dynamic-import": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+      "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.18.6",
-        "@babel/helper-plugin-utils": "^7.18.6"
-      },
-      "engines": {
-        "node": ">=4"
+        "@babel/helper-plugin-utils": "^7.8.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-async-generators": {
-      "version": "7.8.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
-      "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+    "node_modules/@babel/plugin-syntax-import-assertions": {
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz",
+      "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
+        "@babel/helper-plugin-utils": "^7.28.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-class-properties": {
-      "version": "7.12.13",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
-      "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+    "node_modules/@babel/plugin-syntax-import-attributes": {
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz",
+      "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.12.13"
+        "@babel/helper-plugin-utils": "^7.28.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-class-static-block": {
-      "version": "7.14.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
-      "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+    "node_modules/@babel/plugin-syntax-jsx": {
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz",
+      "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.14.5"
+        "@babel/helper-plugin-utils": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -853,34 +792,44 @@
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-dynamic-import": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
-      "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+    "node_modules/@babel/plugin-syntax-typescript": {
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz",
+      "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
+        "@babel/helper-plugin-utils": "^7.28.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-export-namespace-from": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
-      "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+    "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+      "version": "7.18.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+      "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.3"
+        "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       },
       "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
+        "@babel/core": "^7.0.0"
       }
     },
-    "node_modules/@babel/plugin-syntax-import-assertions": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz",
-      "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==",
+    "node_modules/@babel/plugin-transform-arrow-functions": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz",
+      "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -889,12 +838,15 @@
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-import-attributes": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz",
-      "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==",
+    "node_modules/@babel/plugin-transform-async-generator-functions": {
+      "version": "7.29.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz",
+      "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.28.6",
+        "@babel/helper-remap-async-to-generator": "^7.27.1",
+        "@babel/traverse": "^7.29.0"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -903,34 +855,45 @@
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-import-meta": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
-      "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+    "node_modules/@babel/plugin-transform-async-to-generator": {
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz",
+      "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-module-imports": "^7.28.6",
+        "@babel/helper-plugin-utils": "^7.28.6",
+        "@babel/helper-remap-async-to-generator": "^7.27.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-json-strings": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
-      "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+    "node_modules/@babel/plugin-transform-block-scoped-functions": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz",
+      "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
+        "@babel/helper-plugin-utils": "^7.27.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-jsx": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz",
-      "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==",
+    "node_modules/@babel/plugin-transform-block-scoping": {
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz",
+      "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -939,78 +902,82 @@
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
-      "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+    "node_modules/@babel/plugin-transform-class-properties": {
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz",
+      "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-create-class-features-plugin": "^7.28.6",
+        "@babel/helper-plugin-utils": "^7.28.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
-      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+    "node_modules/@babel/plugin-transform-class-static-block": {
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz",
+      "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
+        "@babel/helper-create-class-features-plugin": "^7.28.6",
+        "@babel/helper-plugin-utils": "^7.28.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       },
       "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
+        "@babel/core": "^7.12.0"
       }
     },
-    "node_modules/@babel/plugin-syntax-numeric-separator": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
-      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+    "node_modules/@babel/plugin-transform-classes": {
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz",
+      "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-annotate-as-pure": "^7.27.3",
+        "@babel/helper-compilation-targets": "^7.28.6",
+        "@babel/helper-globals": "^7.28.0",
+        "@babel/helper-plugin-utils": "^7.28.6",
+        "@babel/helper-replace-supers": "^7.28.6",
+        "@babel/traverse": "^7.28.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-object-rest-spread": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
-      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+    "node_modules/@babel/plugin-transform-computed-properties": {
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz",
+      "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
+        "@babel/helper-plugin-utils": "^7.28.6",
+        "@babel/template": "^7.28.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-optional-catch-binding": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
-      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+    "node_modules/@babel/plugin-transform-destructuring": {
+      "version": "7.28.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz",
+      "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-optional-chaining": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
-      "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-private-property-in-object": {
-      "version": "7.14.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
-      "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.14.5"
+        "@babel/helper-plugin-utils": "^7.27.1",
+        "@babel/traverse": "^7.28.5"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1019,12 +986,14 @@
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-top-level-await": {
-      "version": "7.14.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
-      "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+    "node_modules/@babel/plugin-transform-dotall-regex": {
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz",
+      "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.14.5"
+        "@babel/helper-create-regexp-features-plugin": "^7.28.5",
+        "@babel/helper-plugin-utils": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1033,12 +1002,13 @@
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-typescript": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz",
-      "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==",
+    "node_modules/@babel/plugin-transform-duplicate-keys": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz",
+      "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1047,13 +1017,14 @@
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
-      "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+    "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+      "version": "7.29.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz",
+      "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.18.6",
-        "@babel/helper-plugin-utils": "^7.18.6"
+        "@babel/helper-create-regexp-features-plugin": "^7.28.5",
+        "@babel/helper-plugin-utils": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1062,184 +1033,13 @@
         "@babel/core": "^7.0.0"
       }
     },
-    "node_modules/@babel/plugin-transform-arrow-functions": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz",
-      "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-async-generator-functions": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.5.tgz",
-      "integrity": "sha512-gGOEvFzm3fWoyD5uZq7vVTD57pPJ3PczPUD/xCFGjzBpUosnklmXyKnGQbbbGs1NPNPskFex0j93yKbHt0cHyg==",
-      "dependencies": {
-        "@babel/helper-environment-visitor": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-remap-async-to-generator": "^7.22.5",
-        "@babel/plugin-syntax-async-generators": "^7.8.4"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-async-to-generator": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz",
-      "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==",
-      "dependencies": {
-        "@babel/helper-module-imports": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-remap-async-to-generator": "^7.22.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-block-scoped-functions": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz",
-      "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-block-scoping": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz",
-      "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-class-properties": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz",
-      "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==",
-      "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-class-static-block": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz",
-      "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==",
-      "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/plugin-syntax-class-static-block": "^7.14.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.12.0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-classes": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.5.tgz",
-      "integrity": "sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ==",
-      "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-compilation-targets": "^7.22.5",
-        "@babel/helper-environment-visitor": "^7.22.5",
-        "@babel/helper-function-name": "^7.22.5",
-        "@babel/helper-optimise-call-expression": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-replace-supers": "^7.22.5",
-        "@babel/helper-split-export-declaration": "^7.22.5",
-        "globals": "^11.1.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-computed-properties": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz",
-      "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/template": "^7.22.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-destructuring": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz",
-      "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-dotall-regex": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz",
-      "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==",
-      "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-duplicate-keys": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz",
-      "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==",
+    "node_modules/@babel/plugin-transform-dynamic-import": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz",
+      "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1248,13 +1048,14 @@
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/plugin-transform-dynamic-import": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz",
-      "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==",
+    "node_modules/@babel/plugin-transform-explicit-resource-management": {
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz",
+      "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.28.6",
+        "@babel/plugin-transform-destructuring": "^7.28.5"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1264,12 +1065,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-exponentiation-operator": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz",
-      "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz",
+      "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1279,12 +1080,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-export-namespace-from": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz",
-      "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz",
+      "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1294,11 +1095,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-for-of": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz",
-      "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz",
+      "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.27.1",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1308,13 +1111,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-function-name": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz",
-      "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz",
+      "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-compilation-targets": "^7.22.5",
-        "@babel/helper-function-name": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-compilation-targets": "^7.27.1",
+        "@babel/helper-plugin-utils": "^7.27.1",
+        "@babel/traverse": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1324,12 +1128,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-json-strings": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz",
-      "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz",
+      "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/plugin-syntax-json-strings": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1339,11 +1143,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-literals": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz",
-      "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz",
+      "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1353,12 +1158,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-logical-assignment-operators": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz",
-      "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz",
+      "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1368,11 +1173,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-member-expression-literals": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz",
-      "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz",
+      "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1382,12 +1188,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-modules-amd": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz",
-      "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz",
+      "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-module-transforms": "^7.27.1",
+        "@babel/helper-plugin-utils": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1397,13 +1204,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-modules-commonjs": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz",
-      "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz",
+      "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-simple-access": "^7.22.5"
+        "@babel/helper-module-transforms": "^7.28.6",
+        "@babel/helper-plugin-utils": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1413,14 +1220,15 @@
       }
     },
     "node_modules/@babel/plugin-transform-modules-systemjs": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz",
-      "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==",
+      "version": "7.29.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz",
+      "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-hoist-variables": "^7.22.5",
-        "@babel/helper-module-transforms": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-validator-identifier": "^7.22.5"
+        "@babel/helper-module-transforms": "^7.28.6",
+        "@babel/helper-plugin-utils": "^7.28.6",
+        "@babel/helper-validator-identifier": "^7.28.5",
+        "@babel/traverse": "^7.29.0"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1430,12 +1238,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-modules-umd": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz",
-      "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz",
+      "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-module-transforms": "^7.27.1",
+        "@babel/helper-plugin-utils": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1445,12 +1254,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz",
-      "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==",
+      "version": "7.29.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz",
+      "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-create-regexp-features-plugin": "^7.28.5",
+        "@babel/helper-plugin-utils": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1460,11 +1270,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-new-target": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz",
-      "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz",
+      "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1474,12 +1285,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz",
-      "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz",
+      "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1489,12 +1300,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-numeric-separator": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz",
-      "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz",
+      "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1504,15 +1315,16 @@
       }
     },
     "node_modules/@babel/plugin-transform-object-rest-spread": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz",
-      "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz",
+      "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/compat-data": "^7.22.5",
-        "@babel/helper-compilation-targets": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-        "@babel/plugin-transform-parameters": "^7.22.5"
+        "@babel/helper-compilation-targets": "^7.28.6",
+        "@babel/helper-plugin-utils": "^7.28.6",
+        "@babel/plugin-transform-destructuring": "^7.28.5",
+        "@babel/plugin-transform-parameters": "^7.27.7",
+        "@babel/traverse": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1522,12 +1334,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-object-super": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz",
-      "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz",
+      "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-replace-supers": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.27.1",
+        "@babel/helper-replace-supers": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1537,12 +1350,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-optional-catch-binding": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz",
-      "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz",
+      "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1552,13 +1365,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-optional-chaining": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.5.tgz",
-      "integrity": "sha512-AconbMKOMkyG+xCng2JogMCDcqW8wedQAqpVIL4cOSescZ7+iW8utC6YDZLMCSUIReEA733gzRSaOSXMAt/4WQ==",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz",
+      "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
-        "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+        "@babel/helper-plugin-utils": "^7.28.6",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1568,11 +1381,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-parameters": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz",
-      "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==",
+      "version": "7.27.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz",
+      "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1582,12 +1396,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-private-methods": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz",
-      "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz",
+      "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-create-class-features-plugin": "^7.28.6",
+        "@babel/helper-plugin-utils": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1597,14 +1412,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-private-property-in-object": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz",
-      "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz",
+      "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-create-class-features-plugin": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+        "@babel/helper-annotate-as-pure": "^7.27.3",
+        "@babel/helper-create-class-features-plugin": "^7.28.6",
+        "@babel/helper-plugin-utils": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1614,11 +1429,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-property-literals": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz",
-      "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz",
+      "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1628,11 +1444,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-react-constant-elements": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz",
-      "integrity": "sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz",
+      "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1642,11 +1459,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-react-display-name": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz",
-      "integrity": "sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==",
+      "version": "7.28.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz",
+      "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1656,15 +1474,16 @@
       }
     },
     "node_modules/@babel/plugin-transform-react-jsx": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz",
-      "integrity": "sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz",
+      "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-module-imports": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/plugin-syntax-jsx": "^7.22.5",
-        "@babel/types": "^7.22.5"
+        "@babel/helper-annotate-as-pure": "^7.27.3",
+        "@babel/helper-module-imports": "^7.28.6",
+        "@babel/helper-plugin-utils": "^7.28.6",
+        "@babel/plugin-syntax-jsx": "^7.28.6",
+        "@babel/types": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1674,11 +1493,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-react-jsx-development": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz",
-      "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz",
+      "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/plugin-transform-react-jsx": "^7.22.5"
+        "@babel/plugin-transform-react-jsx": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1688,12 +1508,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-react-pure-annotations": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz",
-      "integrity": "sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz",
+      "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-annotate-as-pure": "^7.27.1",
+        "@babel/helper-plugin-utils": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1703,12 +1524,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-regenerator": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz",
-      "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==",
+      "version": "7.29.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz",
+      "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "regenerator-transform": "^0.15.1"
+        "@babel/helper-plugin-utils": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1717,12 +1538,29 @@
         "@babel/core": "^7.0.0-0"
       }
     },
+    "node_modules/@babel/plugin-transform-regexp-modifiers": {
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz",
+      "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.28.5",
+        "@babel/helper-plugin-utils": "^7.28.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
     "node_modules/@babel/plugin-transform-reserved-words": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz",
-      "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz",
+      "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1732,16 +1570,17 @@
       }
     },
     "node_modules/@babel/plugin-transform-runtime": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.5.tgz",
-      "integrity": "sha512-bg4Wxd1FWeFx3daHFTWk1pkSWK/AyQuiyAoeZAOkAOUBjnZPH6KT7eMxouV47tQ6hl6ax2zyAWBdWZXbrvXlaw==",
+      "version": "7.29.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz",
+      "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-module-imports": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "babel-plugin-polyfill-corejs2": "^0.4.3",
-        "babel-plugin-polyfill-corejs3": "^0.8.1",
-        "babel-plugin-polyfill-regenerator": "^0.5.0",
-        "semver": "^6.3.0"
+        "@babel/helper-module-imports": "^7.28.6",
+        "@babel/helper-plugin-utils": "^7.28.6",
+        "babel-plugin-polyfill-corejs2": "^0.4.14",
+        "babel-plugin-polyfill-corejs3": "^0.13.0",
+        "babel-plugin-polyfill-regenerator": "^0.6.5",
+        "semver": "^6.3.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1754,16 +1593,18 @@
       "version": "6.3.1",
       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
       "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
       }
     },
     "node_modules/@babel/plugin-transform-shorthand-properties": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz",
-      "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz",
+      "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1773,12 +1614,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-spread": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz",
-      "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz",
+      "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.28.6",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1788,11 +1630,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-sticky-regex": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz",
-      "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz",
+      "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1802,11 +1645,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-template-literals": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz",
-      "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz",
+      "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1816,11 +1660,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-typeof-symbol": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz",
-      "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz",
+      "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1830,14 +1675,16 @@
       }
     },
     "node_modules/@babel/plugin-transform-typescript": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.5.tgz",
-      "integrity": "sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA==",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz",
+      "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-create-class-features-plugin": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/plugin-syntax-typescript": "^7.22.5"
+        "@babel/helper-annotate-as-pure": "^7.27.3",
+        "@babel/helper-create-class-features-plugin": "^7.28.6",
+        "@babel/helper-plugin-utils": "^7.28.6",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+        "@babel/plugin-syntax-typescript": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1847,11 +1694,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-unicode-escapes": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz",
-      "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz",
+      "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1861,12 +1709,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-unicode-property-regex": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz",
-      "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz",
+      "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-create-regexp-features-plugin": "^7.28.5",
+        "@babel/helper-plugin-utils": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1876,12 +1725,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-unicode-regex": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz",
-      "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==",
+      "version": "7.27.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz",
+      "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+        "@babel/helper-plugin-utils": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1891,12 +1741,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-unicode-sets-regex": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz",
-      "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz",
+      "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-create-regexp-features-plugin": "^7.28.5",
+        "@babel/helper-plugin-utils": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1906,90 +1757,82 @@
       }
     },
     "node_modules/@babel/preset-env": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.5.tgz",
-      "integrity": "sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A==",
-      "dependencies": {
-        "@babel/compat-data": "^7.22.5",
-        "@babel/helper-compilation-targets": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-validator-option": "^7.22.5",
-        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5",
-        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5",
+      "version": "7.29.3",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.3.tgz",
+      "integrity": "sha512-ySZypNLAIH1ClygLDQzVMoGQRViATnkHkYYV6TcNDz+8+jwZCdsguGvsb3EY5d9wyWyhmF1iSuFM0Yh5XPnqSA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/compat-data": "^7.29.3",
+        "@babel/helper-compilation-targets": "^7.28.6",
+        "@babel/helper-plugin-utils": "^7.28.6",
+        "@babel/helper-validator-option": "^7.27.1",
+        "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5",
+        "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1",
+        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1",
+        "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.3",
+        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1",
+        "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6",
         "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
-        "@babel/plugin-syntax-async-generators": "^7.8.4",
-        "@babel/plugin-syntax-class-properties": "^7.12.13",
-        "@babel/plugin-syntax-class-static-block": "^7.14.5",
-        "@babel/plugin-syntax-dynamic-import": "^7.8.3",
-        "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
-        "@babel/plugin-syntax-import-assertions": "^7.22.5",
-        "@babel/plugin-syntax-import-attributes": "^7.22.5",
-        "@babel/plugin-syntax-import-meta": "^7.10.4",
-        "@babel/plugin-syntax-json-strings": "^7.8.3",
-        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
-        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
-        "@babel/plugin-syntax-numeric-separator": "^7.10.4",
-        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
-        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
-        "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
-        "@babel/plugin-syntax-top-level-await": "^7.14.5",
+        "@babel/plugin-syntax-import-assertions": "^7.28.6",
+        "@babel/plugin-syntax-import-attributes": "^7.28.6",
         "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
-        "@babel/plugin-transform-arrow-functions": "^7.22.5",
-        "@babel/plugin-transform-async-generator-functions": "^7.22.5",
-        "@babel/plugin-transform-async-to-generator": "^7.22.5",
-        "@babel/plugin-transform-block-scoped-functions": "^7.22.5",
-        "@babel/plugin-transform-block-scoping": "^7.22.5",
-        "@babel/plugin-transform-class-properties": "^7.22.5",
-        "@babel/plugin-transform-class-static-block": "^7.22.5",
-        "@babel/plugin-transform-classes": "^7.22.5",
-        "@babel/plugin-transform-computed-properties": "^7.22.5",
-        "@babel/plugin-transform-destructuring": "^7.22.5",
-        "@babel/plugin-transform-dotall-regex": "^7.22.5",
-        "@babel/plugin-transform-duplicate-keys": "^7.22.5",
-        "@babel/plugin-transform-dynamic-import": "^7.22.5",
-        "@babel/plugin-transform-exponentiation-operator": "^7.22.5",
-        "@babel/plugin-transform-export-namespace-from": "^7.22.5",
-        "@babel/plugin-transform-for-of": "^7.22.5",
-        "@babel/plugin-transform-function-name": "^7.22.5",
-        "@babel/plugin-transform-json-strings": "^7.22.5",
-        "@babel/plugin-transform-literals": "^7.22.5",
-        "@babel/plugin-transform-logical-assignment-operators": "^7.22.5",
-        "@babel/plugin-transform-member-expression-literals": "^7.22.5",
-        "@babel/plugin-transform-modules-amd": "^7.22.5",
-        "@babel/plugin-transform-modules-commonjs": "^7.22.5",
-        "@babel/plugin-transform-modules-systemjs": "^7.22.5",
-        "@babel/plugin-transform-modules-umd": "^7.22.5",
-        "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5",
-        "@babel/plugin-transform-new-target": "^7.22.5",
-        "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5",
-        "@babel/plugin-transform-numeric-separator": "^7.22.5",
-        "@babel/plugin-transform-object-rest-spread": "^7.22.5",
-        "@babel/plugin-transform-object-super": "^7.22.5",
-        "@babel/plugin-transform-optional-catch-binding": "^7.22.5",
-        "@babel/plugin-transform-optional-chaining": "^7.22.5",
-        "@babel/plugin-transform-parameters": "^7.22.5",
-        "@babel/plugin-transform-private-methods": "^7.22.5",
-        "@babel/plugin-transform-private-property-in-object": "^7.22.5",
-        "@babel/plugin-transform-property-literals": "^7.22.5",
-        "@babel/plugin-transform-regenerator": "^7.22.5",
-        "@babel/plugin-transform-reserved-words": "^7.22.5",
-        "@babel/plugin-transform-shorthand-properties": "^7.22.5",
-        "@babel/plugin-transform-spread": "^7.22.5",
-        "@babel/plugin-transform-sticky-regex": "^7.22.5",
-        "@babel/plugin-transform-template-literals": "^7.22.5",
-        "@babel/plugin-transform-typeof-symbol": "^7.22.5",
-        "@babel/plugin-transform-unicode-escapes": "^7.22.5",
-        "@babel/plugin-transform-unicode-property-regex": "^7.22.5",
-        "@babel/plugin-transform-unicode-regex": "^7.22.5",
-        "@babel/plugin-transform-unicode-sets-regex": "^7.22.5",
-        "@babel/preset-modules": "^0.1.5",
-        "@babel/types": "^7.22.5",
-        "babel-plugin-polyfill-corejs2": "^0.4.3",
-        "babel-plugin-polyfill-corejs3": "^0.8.1",
-        "babel-plugin-polyfill-regenerator": "^0.5.0",
-        "core-js-compat": "^3.30.2",
-        "semver": "^6.3.0"
+        "@babel/plugin-transform-arrow-functions": "^7.27.1",
+        "@babel/plugin-transform-async-generator-functions": "^7.29.0",
+        "@babel/plugin-transform-async-to-generator": "^7.28.6",
+        "@babel/plugin-transform-block-scoped-functions": "^7.27.1",
+        "@babel/plugin-transform-block-scoping": "^7.28.6",
+        "@babel/plugin-transform-class-properties": "^7.28.6",
+        "@babel/plugin-transform-class-static-block": "^7.28.6",
+        "@babel/plugin-transform-classes": "^7.28.6",
+        "@babel/plugin-transform-computed-properties": "^7.28.6",
+        "@babel/plugin-transform-destructuring": "^7.28.5",
+        "@babel/plugin-transform-dotall-regex": "^7.28.6",
+        "@babel/plugin-transform-duplicate-keys": "^7.27.1",
+        "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0",
+        "@babel/plugin-transform-dynamic-import": "^7.27.1",
+        "@babel/plugin-transform-explicit-resource-management": "^7.28.6",
+        "@babel/plugin-transform-exponentiation-operator": "^7.28.6",
+        "@babel/plugin-transform-export-namespace-from": "^7.27.1",
+        "@babel/plugin-transform-for-of": "^7.27.1",
+        "@babel/plugin-transform-function-name": "^7.27.1",
+        "@babel/plugin-transform-json-strings": "^7.28.6",
+        "@babel/plugin-transform-literals": "^7.27.1",
+        "@babel/plugin-transform-logical-assignment-operators": "^7.28.6",
+        "@babel/plugin-transform-member-expression-literals": "^7.27.1",
+        "@babel/plugin-transform-modules-amd": "^7.27.1",
+        "@babel/plugin-transform-modules-commonjs": "^7.28.6",
+        "@babel/plugin-transform-modules-systemjs": "^7.29.0",
+        "@babel/plugin-transform-modules-umd": "^7.27.1",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0",
+        "@babel/plugin-transform-new-target": "^7.27.1",
+        "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6",
+        "@babel/plugin-transform-numeric-separator": "^7.28.6",
+        "@babel/plugin-transform-object-rest-spread": "^7.28.6",
+        "@babel/plugin-transform-object-super": "^7.27.1",
+        "@babel/plugin-transform-optional-catch-binding": "^7.28.6",
+        "@babel/plugin-transform-optional-chaining": "^7.28.6",
+        "@babel/plugin-transform-parameters": "^7.27.7",
+        "@babel/plugin-transform-private-methods": "^7.28.6",
+        "@babel/plugin-transform-private-property-in-object": "^7.28.6",
+        "@babel/plugin-transform-property-literals": "^7.27.1",
+        "@babel/plugin-transform-regenerator": "^7.29.0",
+        "@babel/plugin-transform-regexp-modifiers": "^7.28.6",
+        "@babel/plugin-transform-reserved-words": "^7.27.1",
+        "@babel/plugin-transform-shorthand-properties": "^7.27.1",
+        "@babel/plugin-transform-spread": "^7.28.6",
+        "@babel/plugin-transform-sticky-regex": "^7.27.1",
+        "@babel/plugin-transform-template-literals": "^7.27.1",
+        "@babel/plugin-transform-typeof-symbol": "^7.27.1",
+        "@babel/plugin-transform-unicode-escapes": "^7.27.1",
+        "@babel/plugin-transform-unicode-property-regex": "^7.28.6",
+        "@babel/plugin-transform-unicode-regex": "^7.27.1",
+        "@babel/plugin-transform-unicode-sets-regex": "^7.28.6",
+        "@babel/preset-modules": "0.1.6-no-external-plugins",
+        "babel-plugin-polyfill-corejs2": "^0.4.15",
+        "babel-plugin-polyfill-corejs3": "^0.14.0",
+        "babel-plugin-polyfill-regenerator": "^0.6.6",
+        "core-js-compat": "^3.48.0",
+        "semver": "^6.3.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1998,40 +1841,54 @@
         "@babel/core": "^7.0.0-0"
       }
     },
+    "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": {
+      "version": "0.14.2",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz",
+      "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-define-polyfill-provider": "^0.6.8",
+        "core-js-compat": "^3.48.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+      }
+    },
     "node_modules/@babel/preset-env/node_modules/semver": {
       "version": "6.3.1",
       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
       "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
       }
     },
     "node_modules/@babel/preset-modules": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz",
-      "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==",
+      "version": "0.1.6-no-external-plugins",
+      "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+      "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
-        "@babel/plugin-transform-dotall-regex": "^7.4.4",
         "@babel/types": "^7.4.4",
         "esutils": "^2.0.2"
       },
       "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
+        "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
       }
     },
     "node_modules/@babel/preset-react": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.5.tgz",
-      "integrity": "sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ==",
+      "version": "7.28.5",
+      "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz",
+      "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-validator-option": "^7.22.5",
-        "@babel/plugin-transform-react-display-name": "^7.22.5",
-        "@babel/plugin-transform-react-jsx": "^7.22.5",
-        "@babel/plugin-transform-react-jsx-development": "^7.22.5",
-        "@babel/plugin-transform-react-pure-annotations": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.27.1",
+        "@babel/helper-validator-option": "^7.27.1",
+        "@babel/plugin-transform-react-display-name": "^7.28.0",
+        "@babel/plugin-transform-react-jsx": "^7.27.1",
+        "@babel/plugin-transform-react-jsx-development": "^7.27.1",
+        "@babel/plugin-transform-react-pure-annotations": "^7.27.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -2041,15 +1898,16 @@
       }
     },
     "node_modules/@babel/preset-typescript": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz",
-      "integrity": "sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==",
+      "version": "7.28.5",
+      "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz",
+      "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-validator-option": "^7.22.5",
-        "@babel/plugin-syntax-jsx": "^7.22.5",
-        "@babel/plugin-transform-modules-commonjs": "^7.22.5",
-        "@babel/plugin-transform-typescript": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.27.1",
+        "@babel/helper-validator-option": "^7.27.1",
+        "@babel/plugin-syntax-jsx": "^7.27.1",
+        "@babel/plugin-transform-modules-commonjs": "^7.27.1",
+        "@babel/plugin-transform-typescript": "^7.28.5"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -2058,75 +1916,55 @@
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/regjsgen": {
-      "version": "0.8.0",
-      "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
-      "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA=="
-    },
     "node_modules/@babel/runtime": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz",
-      "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==",
-      "dependencies": {
-        "regenerator-runtime": "^0.13.11"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/runtime-corejs3": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.22.5.tgz",
-      "integrity": "sha512-TNPDN6aBFaUox2Lu+H/Y1dKKQgr4ucz/FGyCz67RVYLsBpVpUFf1dDngzg+Od8aqbrqwyztkaZjtWCZEUOT8zA==",
-      "dependencies": {
-        "core-js-pure": "^3.30.2",
-        "regenerator-runtime": "^0.13.11"
-      },
+      "version": "7.29.2",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+      "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/template": {
-      "version": "7.22.15",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
-      "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
+      "version": "7.28.6",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
+      "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/code-frame": "^7.22.13",
-        "@babel/parser": "^7.22.15",
-        "@babel/types": "^7.22.15"
+        "@babel/code-frame": "^7.28.6",
+        "@babel/parser": "^7.28.6",
+        "@babel/types": "^7.28.6"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.23.2",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz",
-      "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==",
-      "dependencies": {
-        "@babel/code-frame": "^7.22.13",
-        "@babel/generator": "^7.23.0",
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-function-name": "^7.23.0",
-        "@babel/helper-hoist-variables": "^7.22.5",
-        "@babel/helper-split-export-declaration": "^7.22.6",
-        "@babel/parser": "^7.23.0",
-        "@babel/types": "^7.23.0",
-        "debug": "^4.1.0",
-        "globals": "^11.1.0"
+      "version": "7.29.0",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
+      "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.29.0",
+        "@babel/generator": "^7.29.0",
+        "@babel/helper-globals": "^7.28.0",
+        "@babel/parser": "^7.29.0",
+        "@babel/template": "^7.28.6",
+        "@babel/types": "^7.29.0",
+        "debug": "^4.3.1"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/types": {
-      "version": "7.23.0",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz",
-      "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==",
+      "version": "7.29.0",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
+      "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-string-parser": "^7.22.5",
-        "@babel/helper-validator-identifier": "^7.22.20",
-        "to-fast-properties": "^2.0.0"
+        "@babel/helper-string-parser": "^7.27.1",
+        "@babel/helper-validator-identifier": "^7.28.5"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -2136,5446 +1974,6685 @@
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
       "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=0.1.90"
       }
     },
-    "node_modules/@discoveryjs/json-ext": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
-      "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
+    "node_modules/@csstools/cascade-layer-name-parser": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz",
+      "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/csstools"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/csstools"
+        }
+      ],
+      "license": "MIT",
       "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "node_modules/@docsearch/css": {
-      "version": "3.5.1",
-      "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.1.tgz",
-      "integrity": "sha512-2Pu9HDg/uP/IT10rbQ+4OrTQuxIWdKVUEdcw9/w7kZJv9NeHS6skJx1xuRiFyoGKwAzcHXnLp7csE99sj+O1YA=="
-    },
-    "node_modules/@docsearch/react": {
-      "version": "3.5.1",
-      "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.1.tgz",
-      "integrity": "sha512-t5mEODdLzZq4PTFAm/dvqcvZFdPDMdfPE5rJS5SC8OUq9mPzxEy6b+9THIqNM9P0ocCb4UC5jqBrxKclnuIbzQ==",
-      "dependencies": {
-        "@algolia/autocomplete-core": "1.9.3",
-        "@algolia/autocomplete-preset-algolia": "1.9.3",
-        "@docsearch/css": "3.5.1",
-        "algoliasearch": "^4.0.0"
+        "node": ">=18"
       },
       "peerDependencies": {
-        "@types/react": ">= 16.8.0 < 19.0.0",
-        "react": ">= 16.8.0 < 19.0.0",
-        "react-dom": ">= 16.8.0 < 19.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/react": {
-          "optional": true
-        },
-        "react": {
-          "optional": true
+        "@csstools/css-parser-algorithms": "^3.0.5",
+        "@csstools/css-tokenizer": "^3.0.4"
+      }
+    },
+    "node_modules/@csstools/color-helpers": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz",
+      "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/csstools"
         },
-        "react-dom": {
-          "optional": true
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/csstools"
         }
+      ],
+      "license": "MIT-0",
+      "engines": {
+        "node": ">=18"
       }
     },
-    "node_modules/@docusaurus/core": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.1.tgz",
-      "integrity": "sha512-SNsY7PshK3Ri7vtsLXVeAJGS50nJN3RgF836zkyUfAD01Fq+sAk5EwWgLw+nnm5KVNGDu7PRR2kRGDsWvqpo0g==",
-      "dependencies": {
-        "@babel/core": "^7.18.6",
-        "@babel/generator": "^7.18.7",
-        "@babel/plugin-syntax-dynamic-import": "^7.8.3",
-        "@babel/plugin-transform-runtime": "^7.18.6",
-        "@babel/preset-env": "^7.18.6",
-        "@babel/preset-react": "^7.18.6",
-        "@babel/preset-typescript": "^7.18.6",
-        "@babel/runtime": "^7.18.6",
-        "@babel/runtime-corejs3": "^7.18.6",
-        "@babel/traverse": "^7.18.8",
-        "@docusaurus/cssnano-preset": "2.4.1",
-        "@docusaurus/logger": "2.4.1",
-        "@docusaurus/mdx-loader": "2.4.1",
-        "@docusaurus/react-loadable": "5.5.2",
-        "@docusaurus/utils": "2.4.1",
-        "@docusaurus/utils-common": "2.4.1",
-        "@docusaurus/utils-validation": "2.4.1",
-        "@slorber/static-site-generator-webpack-plugin": "^4.0.7",
-        "@svgr/webpack": "^6.2.1",
-        "autoprefixer": "^10.4.7",
-        "babel-loader": "^8.2.5",
-        "babel-plugin-dynamic-import-node": "^2.3.3",
-        "boxen": "^6.2.1",
-        "chalk": "^4.1.2",
-        "chokidar": "^3.5.3",
-        "clean-css": "^5.3.0",
-        "cli-table3": "^0.6.2",
-        "combine-promises": "^1.1.0",
-        "commander": "^5.1.0",
-        "copy-webpack-plugin": "^11.0.0",
-        "core-js": "^3.23.3",
-        "css-loader": "^6.7.1",
-        "css-minimizer-webpack-plugin": "^4.0.0",
-        "cssnano": "^5.1.12",
-        "del": "^6.1.1",
-        "detect-port": "^1.3.0",
-        "escape-html": "^1.0.3",
-        "eta": "^2.0.0",
-        "file-loader": "^6.2.0",
-        "fs-extra": "^10.1.0",
-        "html-minifier-terser": "^6.1.0",
-        "html-tags": "^3.2.0",
-        "html-webpack-plugin": "^5.5.0",
-        "import-fresh": "^3.3.0",
-        "leven": "^3.1.0",
-        "lodash": "^4.17.21",
-        "mini-css-extract-plugin": "^2.6.1",
-        "postcss": "^8.4.14",
-        "postcss-loader": "^7.0.0",
-        "prompts": "^2.4.2",
-        "react-dev-utils": "^12.0.1",
-        "react-helmet-async": "^1.3.0",
-        "react-loadable": "npm:@docusaurus/react-loadable@5.5.2",
-        "react-loadable-ssr-addon-v5-slorber": "^1.0.1",
-        "react-router": "^5.3.3",
-        "react-router-config": "^5.1.1",
-        "react-router-dom": "^5.3.3",
-        "rtl-detect": "^1.0.4",
-        "semver": "^7.3.7",
-        "serve-handler": "^6.1.3",
-        "shelljs": "^0.8.5",
-        "terser-webpack-plugin": "^5.3.3",
-        "tslib": "^2.4.0",
-        "update-notifier": "^5.1.0",
-        "url-loader": "^4.1.1",
-        "wait-on": "^6.0.1",
-        "webpack": "^5.73.0",
-        "webpack-bundle-analyzer": "^4.5.0",
-        "webpack-dev-server": "^4.9.3",
-        "webpack-merge": "^5.8.0",
-        "webpackbar": "^5.0.2"
-      },
-      "bin": {
-        "docusaurus": "bin/docusaurus.mjs"
-      },
+    "node_modules/@csstools/css-calc": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz",
+      "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/csstools"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/csstools"
+        }
+      ],
+      "license": "MIT",
       "engines": {
-        "node": ">=16.14"
+        "node": ">=18"
       },
       "peerDependencies": {
-        "react": "^16.8.4 || ^17.0.0",
-        "react-dom": "^16.8.4 || ^17.0.0"
+        "@csstools/css-parser-algorithms": "^3.0.5",
+        "@csstools/css-tokenizer": "^3.0.4"
       }
     },
-    "node_modules/@docusaurus/cssnano-preset": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.1.tgz",
-      "integrity": "sha512-ka+vqXwtcW1NbXxWsh6yA1Ckii1klY9E53cJ4O9J09nkMBgrNX3iEFED1fWdv8wf4mJjvGi5RLZ2p9hJNjsLyQ==",
+    "node_modules/@csstools/css-color-parser": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz",
+      "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/csstools"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/csstools"
+        }
+      ],
+      "license": "MIT",
       "dependencies": {
-        "cssnano-preset-advanced": "^5.3.8",
-        "postcss": "^8.4.14",
-        "postcss-sort-media-queries": "^4.2.1",
-        "tslib": "^2.4.0"
+        "@csstools/color-helpers": "^5.1.0",
+        "@csstools/css-calc": "^2.1.4"
       },
       "engines": {
-        "node": ">=16.14"
-      }
-    },
-    "node_modules/@docusaurus/logger": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.1.tgz",
-      "integrity": "sha512-5h5ysIIWYIDHyTVd8BjheZmQZmEgWDR54aQ1BX9pjFfpyzFo5puKXKYrYJXbjEHGyVhEzmB9UXwbxGfaZhOjcg==",
-      "dependencies": {
-        "chalk": "^4.1.2",
-        "tslib": "^2.4.0"
+        "node": ">=18"
       },
-      "engines": {
-        "node": ">=16.14"
+      "peerDependencies": {
+        "@csstools/css-parser-algorithms": "^3.0.5",
+        "@csstools/css-tokenizer": "^3.0.4"
       }
     },
-    "node_modules/@docusaurus/mdx-loader": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.1.tgz",
-      "integrity": "sha512-4KhUhEavteIAmbBj7LVFnrVYDiU51H5YWW1zY6SmBSte/YLhDutztLTBE0PQl1Grux1jzUJeaSvAzHpTn6JJDQ==",
-      "dependencies": {
-        "@babel/parser": "^7.18.8",
-        "@babel/traverse": "^7.18.8",
-        "@docusaurus/logger": "2.4.1",
-        "@docusaurus/utils": "2.4.1",
-        "@mdx-js/mdx": "^1.6.22",
-        "escape-html": "^1.0.3",
-        "file-loader": "^6.2.0",
-        "fs-extra": "^10.1.0",
-        "image-size": "^1.0.1",
-        "mdast-util-to-string": "^2.0.0",
-        "remark-emoji": "^2.2.0",
-        "stringify-object": "^3.3.0",
-        "tslib": "^2.4.0",
-        "unified": "^9.2.2",
-        "unist-util-visit": "^2.0.3",
-        "url-loader": "^4.1.1",
-        "webpack": "^5.73.0"
-      },
+    "node_modules/@csstools/css-parser-algorithms": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz",
+      "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/csstools"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/csstools"
+        }
+      ],
+      "license": "MIT",
       "engines": {
-        "node": ">=16.14"
+        "node": ">=18"
       },
       "peerDependencies": {
-        "react": "^16.8.4 || ^17.0.0",
-        "react-dom": "^16.8.4 || ^17.0.0"
+        "@csstools/css-tokenizer": "^3.0.4"
       }
     },
-    "node_modules/@docusaurus/module-type-aliases": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.1.tgz",
-      "integrity": "sha512-gLBuIFM8Dp2XOCWffUDSjtxY7jQgKvYujt7Mx5s4FCTfoL5dN1EVbnrn+O2Wvh8b0a77D57qoIDY7ghgmatR1A==",
-      "dependencies": {
-        "@docusaurus/react-loadable": "5.5.2",
-        "@docusaurus/types": "2.4.1",
-        "@types/history": "^4.7.11",
-        "@types/react": "*",
-        "@types/react-router-config": "*",
-        "@types/react-router-dom": "*",
-        "react-helmet-async": "*",
-        "react-loadable": "npm:@docusaurus/react-loadable@5.5.2"
-      },
-      "peerDependencies": {
-        "react": "*",
-        "react-dom": "*"
+    "node_modules/@csstools/css-tokenizer": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz",
+      "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/csstools"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/csstools"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
       }
     },
-    "node_modules/@docusaurus/plugin-client-redirects": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-2.4.1.tgz",
-      "integrity": "sha512-tp0j16gaLIJ4p+IR0P6KDOFsTOGGMY54MNPnmM61Vaqqt5omLqsuKUO8UlCGU1oW/4EIQOhXYy99XYY5MjE+7A==",
-      "dependencies": {
-        "@docusaurus/core": "2.4.1",
-        "@docusaurus/logger": "2.4.1",
-        "@docusaurus/utils": "2.4.1",
-        "@docusaurus/utils-common": "2.4.1",
-        "@docusaurus/utils-validation": "2.4.1",
-        "eta": "^2.0.0",
-        "fs-extra": "^10.1.0",
-        "lodash": "^4.17.21",
-        "tslib": "^2.4.0"
-      },
+    "node_modules/@csstools/media-query-list-parser": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz",
+      "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/csstools"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/csstools"
+        }
+      ],
+      "license": "MIT",
       "engines": {
-        "node": ">=16.14"
+        "node": ">=18"
       },
       "peerDependencies": {
-        "react": "^16.8.4 || ^17.0.0",
-        "react-dom": "^16.8.4 || ^17.0.0"
+        "@csstools/css-parser-algorithms": "^3.0.5",
+        "@csstools/css-tokenizer": "^3.0.4"
       }
     },
-    "node_modules/@docusaurus/plugin-content-blog": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.1.tgz",
-      "integrity": "sha512-E2i7Knz5YIbE1XELI6RlTnZnGgS52cUO4BlCiCUCvQHbR+s1xeIWz4C6BtaVnlug0Ccz7nFSksfwDpVlkujg5Q==",
-      "dependencies": {
-        "@docusaurus/core": "2.4.1",
-        "@docusaurus/logger": "2.4.1",
-        "@docusaurus/mdx-loader": "2.4.1",
-        "@docusaurus/types": "2.4.1",
-        "@docusaurus/utils": "2.4.1",
-        "@docusaurus/utils-common": "2.4.1",
-        "@docusaurus/utils-validation": "2.4.1",
-        "cheerio": "^1.0.0-rc.12",
-        "feed": "^4.2.2",
-        "fs-extra": "^10.1.0",
-        "lodash": "^4.17.21",
-        "reading-time": "^1.5.0",
-        "tslib": "^2.4.0",
-        "unist-util-visit": "^2.0.3",
-        "utility-types": "^3.10.0",
-        "webpack": "^5.73.0"
+    "node_modules/@csstools/postcss-alpha-function": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz",
+      "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/csstools"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/csstools"
+        }
+      ],
+      "license": "MIT-0",
+      "dependencies": {
+        "@csstools/css-color-parser": "^3.1.0",
+        "@csstools/css-parser-algorithms": "^3.0.5",
+        "@csstools/css-tokenizer": "^3.0.4",
+        "@csstools/postcss-progressive-custom-properties": "^4.2.1",
+        "@csstools/utilities": "^2.0.0"
       },
       "engines": {
-        "node": ">=16.14"
+        "node": ">=18"
       },
       "peerDependencies": {
-        "react": "^16.8.4 || ^17.0.0",
-        "react-dom": "^16.8.4 || ^17.0.0"
+        "postcss": "^8.4"
       }
     },
-    "node_modules/@docusaurus/plugin-content-docs": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.1.tgz",
-      "integrity": "sha512-Lo7lSIcpswa2Kv4HEeUcGYqaasMUQNpjTXpV0N8G6jXgZaQurqp7E8NGYeGbDXnb48czmHWbzDL4S3+BbK0VzA==",
-      "dependencies": {
-        "@docusaurus/core": "2.4.1",
-        "@docusaurus/logger": "2.4.1",
-        "@docusaurus/mdx-loader": "2.4.1",
-        "@docusaurus/module-type-aliases": "2.4.1",
-        "@docusaurus/types": "2.4.1",
-        "@docusaurus/utils": "2.4.1",
-        "@docusaurus/utils-validation": "2.4.1",
-        "@types/react-router-config": "^5.0.6",
-        "combine-promises": "^1.1.0",
-        "fs-extra": "^10.1.0",
-        "import-fresh": "^3.3.0",
-        "js-yaml": "^4.1.0",
-        "lodash": "^4.17.21",
-        "tslib": "^2.4.0",
-        "utility-types": "^3.10.0",
-        "webpack": "^5.73.0"
+    "node_modules/@csstools/postcss-cascade-layers": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz",
+      "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/csstools"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/csstools"
+        }
+      ],
+      "license": "MIT-0",
+      "dependencies": {
+        "@csstools/selector-specificity": "^5.0.0",
+        "postcss-selector-parser": "^7.0.0"
       },
       "engines": {
... 78644 lines suppressed ...


(streampipes-website) 04/08: Add screenshots

Posted by ri...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dominikriemer pushed a commit to branch refactor-website
in repository https://gitbox.apache.org/repos/asf/streampipes-website.git

commit c04cde2c9396bd84189b970fe1ab5d3d8c3e2d50
Author: Dominik Riemer <do...@gmail.com>
AuthorDate: Tue Jun 2 23:09:12 2026 +0200

    Add screenshots
---
 docs/01_overview.md                                |  72 +++++++++++++++------
 docs/02_quick-start-guide.md                       |  54 ----------------
 .../static/img/2026/adapter-details-code.png       | Bin 0 -> 599527 bytes
 .../static/img/2026/adapter-details-data.png       | Bin 0 -> 132936 bytes
 .../static/img/2026/adapter-details-metrics.png    | Bin 0 -> 110654 bytes
 website-v2/static/img/2026/asset-filter.png        | Bin 0 -> 228124 bytes
 .../static/img/2026/chart-advanced-filter.png      | Bin 0 -> 200279 bytes
 website-v2/static/img/2026/chart-appearance.png    | Bin 0 -> 56230 bytes
 .../static/img/2026/chart-data-aggregation.png     | Bin 0 -> 57497 bytes
 website-v2/static/img/2026/chart-data-fields.png   | Bin 0 -> 86237 bytes
 website-v2/static/img/2026/chart-density.png       | Bin 0 -> 641276 bytes
 website-v2/static/img/2026/chart-gauge.png         | Bin 0 -> 240977 bytes
 website-v2/static/img/2026/chart-histogram.png     | Bin 0 -> 185167 bytes
 website-v2/static/img/2026/chart-indicator.png     | Bin 0 -> 136845 bytes
 website-v2/static/img/2026/chart-pie.png           | Bin 0 -> 189369 bytes
 website-v2/static/img/2026/chart-scatter.png       | Bin 0 -> 215251 bytes
 .../static/img/2026/chart-status-heatmap.png       | Bin 0 -> 194311 bytes
 website-v2/static/img/2026/chart-status.png        | Bin 0 -> 283585 bytes
 website-v2/static/img/2026/chart-table.png         | Bin 0 -> 194311 bytes
 .../static/img/2026/chart-time-selection.png       | Bin 0 -> 260281 bytes
 .../static/img/2026/chart-timeseries-heatmap.png   | Bin 0 -> 229258 bytes
 website-v2/static/img/2026/chart-timeseries.png    | Bin 0 -> 328993 bytes
 website-v2/static/img/2026/chart-traffic-light.png | Bin 0 -> 211159 bytes
 .../static/img/2026/chart-value-distribution.png   | Bin 0 -> 211122 bytes
 website-v2/static/img/2026/dashboard-create.png    | Bin 0 -> 204723 bytes
 website-v2/static/img/2026/dashboard-preview.png   | Bin 0 -> 152299 bytes
 website-v2/static/img/2026/dashboard-settings.png  | Bin 0 -> 159219 bytes
 website-v2/static/img/2026/login.png               | Bin 29630 -> 123816 bytes
 website-v2/static/img/2026/pipeline-details.png    | Bin 0 -> 148088 bytes
 .../static/img/2026/pipeline-editor-empty.png      | Bin 0 -> 188980 bytes
 .../static/img/2026/pipeline-editor-example.png    | Bin 0 -> 290137 bytes
 .../static/img/2026/pipeline-editor-save.png       | Bin 0 -> 449344 bytes
 .../static/img/2026/pipeline-overview-grouped.png  | Bin 0 -> 159089 bytes
 website-v2/static/img/2026/security-add-group.png  | Bin 0 -> 215659 bytes
 website-v2/static/img/2026/security-edit-roles.png | Bin 0 -> 276605 bytes
 website-v2/static/img/2026/security-edit-user.png  | Bin 0 -> 235039 bytes
 website-v2/static/img/2026/security-overview.png   | Bin 0 -> 196197 bytes
 website-v2/static/img/2026/settings-export.png     | Bin 0 -> 230709 bytes
 .../img/2026/settings-extension-services.png       | Bin 0 -> 205654 bytes
 website-v2/static/img/2026/settings-extensions.png | Bin 0 -> 305428 bytes
 website-v2/static/img/2026/settings-general.png    | Bin 0 -> 190439 bytes
 website-v2/static/img/2026/settings-labels.png     | Bin 0 -> 164716 bytes
 .../static/img/2026/settings-mail-template.png     | Bin 0 -> 231587 bytes
 43 files changed, 54 insertions(+), 72 deletions(-)

diff --git a/docs/01_overview.md b/docs/01_overview.md
index 4cd8b60b2..817d4c0c0 100644
--- a/docs/01_overview.md
+++ b/docs/01_overview.md
@@ -7,10 +7,11 @@ sidebar_label: Overview
 import StepFlow from '@site/src/components/docs/StepFlow.tsx';
 import FeatureList from '@site/src/components/docs/FeatureList.tsx';
 import UseCaseExample from '@site/src/components/docs/UseCaseExample.tsx';
-import DocVisualPlaceholder from '@site/src/components/docs/DocVisualPlaceholder.tsx';
+import ScreenshotSlideshow from '@site/src/components/docs/ScreenshotSlideshow';
 
-Apache StreamPipes is an open-source IoT and industrial data platform for building complete data infrastructure on your own terms.
+Apache StreamPipes is an open-source data platform for the Industrial IoT.
 It helps teams set up an on-premise, extensible environment for connecting machines and software systems, turning incoming events into reusable data streams, processing those streams in real time, persisting historical data, and building charts and dashboards on top.
+For developers, StreamPipes offers interfaces to extend the software with custom plugins, and provides client libraries to interact with resources programmatically.
 
 This page is the entry point to the documentation.
 It helps you understand what StreamPipes does, what the documentation covers, and where to start depending on your goal.
@@ -21,7 +22,7 @@ It helps you understand what StreamPipes does, what the documentation covers, an
   items={[
     {
       title: 'StreamPipes is an industrial data platform',
-      text: 'It is not only a pipeline editor. It is a complete IoT and industrial data platform that covers ingestion, stream processing, historical data, visualization, context modeling, and platform administration.',
+      text: 'A complete IoT and industrial data platform that covers ingestion, stream processing, historical data, visualization, context modeling, and platform administration.',
     },
     {
       title: 'It can serve as your open-source IoT data infrastructure',
@@ -35,24 +36,59 @@ It helps you understand what StreamPipes does, what the documentation covers, an
       title: 'Live and historical data work together',
       text: 'StreamPipes supports both data in motion and data at rest. A stream can drive live processing while also becoming a dataset for later exploration and visualization.',
     },
-    {
-      title: 'The platform is built for industrial reuse',
-      text: 'Adapters, pipelines, datasets, charts, dashboards, assets, and extensions are managed as reusable platform resources rather than one-off scripts or isolated views.',
-    },
     {
       title: 'The platform is intentionally extensible',
       text: 'You can start with the built-in capabilities and extend the platform later with custom adapters, processors, sinks, and UI modules when your infrastructure or domain requires it.',
-    },
-    {
-      title: 'The documentation is organized by task',
-      text: 'Use the Quick Start for first success, Concepts for the mental model, Features for day-to-day usage, Configure & Operate for administration, and Extend for development.',
-    },
+    }
   ]}
 />
 
-<DocVisualPlaceholder
-  title="Product overview"
-  purpose="Show the main StreamPipes modules such as Connect, Pipelines, Datasets, Charts, Dashboards, and Assets in one current product view."
+## Screenshots
+
+Here are some screenshots that help you understand what you can do with StreamPipes:
+
+<ScreenshotSlideshow
+title="StreamPipes Features"
+eyebrow="Style Check"
+badge="Preview"
+items={[
+{
+src: '/img/2026/home-map.png',
+alt: 'Home screen',
+title: 'Home screen',
+caption: 'The home screen shows a list of assets and resources in a map-style or table view.',
+},
+{
+src: '/img/2026/connect-create-select-adapter.png',
+alt: 'Adapters for industrial connectivity',
+title: 'Adapters for industrial connectivity',
+caption: 'Connect data from a large number of supported protocols like S7, OPC UA, Modbus or MQTT.',
+},
+{
+src: '/img/2026/chart-timeseries.png',
+alt: 'Chart library',
+title: 'Chart library',
+caption: 'Visualize data in a single platform using an extensive chart library.',
+},
+{
+src: '/img/2026/dashboard-create.png',
+alt: 'Dashboards',
+title: 'Dashboards',
+caption: 'Configure dashboards for shopfloor monitoring and more.',
+},
+{
+src: '/img/2026/pipeline-editor-example.png',
+alt: 'Pipelines',
+title: 'Pipelines',
+caption: 'Create pipelines for streaming data analytics to analyze machine data on-the-fly.',
+},
+{
+src: '/img/2026/asset-create.png',
+alt: 'Assets',
+title: 'Assets',
+caption: 'Assign resources to assets to organize your industrial data sources.',
+},
+]}
 />
 
 ## What you can do with StreamPipes
@@ -63,7 +99,7 @@ In practice, StreamPipes combines several jobs that are often spread across sepa
   steps={[
     {
       title: 'Connect industrial and software sources',
-      body: 'Use adapters to bring machine data, broker data, file-based data, and other source events into the platform.',
+      body: 'Use adapters to bring machine data, broker data, and other source events into the platform.',
     },
     {
       title: 'Refine and govern event structures',
@@ -84,8 +120,8 @@ In practice, StreamPipes combines several jobs that are often spread across sepa
   ]}
 />
 
-<UseCaseExample title="A typical StreamPipes workflow">
-  A team connects a machine source, refines the schema so the fields are meaningful, persists the stream as a dataset, creates a chart to validate the data, and then adds that chart to a dashboard used by operators and engineers.
+<UseCaseExample title="A simple StreamPipes workflow">
+  A team connects a machine data source from OPC UA, persists the stream as a dataset, creates a chart to validate the data, and then adds that chart to a dashboard used by operators and engineers.
 </UseCaseExample>
 
 ## StreamPipes as infrastructure
diff --git a/docs/02_quick-start-guide.md b/docs/02_quick-start-guide.md
index 86712f030..a696994d0 100644
--- a/docs/02_quick-start-guide.md
+++ b/docs/02_quick-start-guide.md
@@ -10,7 +10,6 @@ import DocVisualPlaceholder from '@site/src/components/docs/DocVisualPlaceholder
 import UseCaseExample from '@site/src/components/docs/UseCaseExample.tsx';
 import ScreenshotFigure from '@site/src/components/docs/ScreenshotFigure';
 import ScreenshotComparison from '@site/src/components/docs/ScreenshotComparison';
-import ScreenshotSlideshow from '@site/src/components/docs/ScreenshotSlideshow';
 
 This guide helps you get from a fresh installation to a first working result in StreamPipes.
 
@@ -20,59 +19,6 @@ The guide begins with installation and then walks through one complete first-run
 
 The easiest way to install StreamPipes is the Docker-based installation.
 
-<ScreenshotFigure
-src="/img/2026/home-map.png"
-alt="StreamPipes home page with the factory map overview"
-title="Quickstart Home Overview"
-caption="The quickstart home page highlights the main entry points and gives users a high-level overview of the available factory assets."
-/>
-
-<ScreenshotComparison
-  title="Comparison Example"
-  eyebrow="Style Check"
-  summary="Use this component when documentation needs to contrast two related screens, for example two dashboard states or two setup outcomes."
-  items={[
-    {
-      src: '/img/2026/home-map.png',
-      alt: 'Home page with the map-based overview',
-      title: 'Map-centric Overview',
-      caption: 'A broad landing view that emphasizes navigation and spatial context.',
-    },
-    {
-      src: '/img/2026/home-table.png',
-      alt: 'Home page with the table-based overview',
-      title: 'Table-centric Overview',
-      caption: 'A denser operational view that emphasizes records and structured status information.',
-    },
-  ]}
-/>
-
-<ScreenshotSlideshow
-  title="Slideshow Example"
-  eyebrow="Style Check"
-  badge="Preview"
-  items={[
-    {
-      src: '/img/2026/login.png',
-      alt: 'Login screen',
-      title: 'Login',
-      caption: 'The first step after installation is authenticating with the initial credentials.',
-    },
-    {
-      src: '/img/2026/home-map.png',
-      alt: 'Home page with map overview',
-      title: 'Home Overview',
-      caption: 'After sign-in, users land on the home screen and can orient themselves in the product.',
-    },
-    {
-      src: '/img/2026/settings-site-create.png',
-      alt: 'Site creation settings screen',
-      title: 'Initial Configuration',
-      caption: 'A later setup step can introduce more structured configuration views and forms.',
-    },
-  ]}
-/>
-
 
 ### Prerequisites
 
diff --git a/website-v2/static/img/2026/adapter-details-code.png b/website-v2/static/img/2026/adapter-details-code.png
new file mode 100644
index 000000000..c3d3955a7
Binary files /dev/null and b/website-v2/static/img/2026/adapter-details-code.png differ
diff --git a/website-v2/static/img/2026/adapter-details-data.png b/website-v2/static/img/2026/adapter-details-data.png
new file mode 100644
index 000000000..7d0c7d21f
Binary files /dev/null and b/website-v2/static/img/2026/adapter-details-data.png differ
diff --git a/website-v2/static/img/2026/adapter-details-metrics.png b/website-v2/static/img/2026/adapter-details-metrics.png
new file mode 100644
index 000000000..83afaaba5
Binary files /dev/null and b/website-v2/static/img/2026/adapter-details-metrics.png differ
diff --git a/website-v2/static/img/2026/asset-filter.png b/website-v2/static/img/2026/asset-filter.png
new file mode 100644
index 000000000..f28c77e92
Binary files /dev/null and b/website-v2/static/img/2026/asset-filter.png differ
diff --git a/website-v2/static/img/2026/chart-advanced-filter.png b/website-v2/static/img/2026/chart-advanced-filter.png
new file mode 100644
index 000000000..d64fd5618
Binary files /dev/null and b/website-v2/static/img/2026/chart-advanced-filter.png differ
diff --git a/website-v2/static/img/2026/chart-appearance.png b/website-v2/static/img/2026/chart-appearance.png
new file mode 100644
index 000000000..cda6fb4f6
Binary files /dev/null and b/website-v2/static/img/2026/chart-appearance.png differ
diff --git a/website-v2/static/img/2026/chart-data-aggregation.png b/website-v2/static/img/2026/chart-data-aggregation.png
new file mode 100644
index 000000000..22343f97e
Binary files /dev/null and b/website-v2/static/img/2026/chart-data-aggregation.png differ
diff --git a/website-v2/static/img/2026/chart-data-fields.png b/website-v2/static/img/2026/chart-data-fields.png
new file mode 100644
index 000000000..c3d34e903
Binary files /dev/null and b/website-v2/static/img/2026/chart-data-fields.png differ
diff --git a/website-v2/static/img/2026/chart-density.png b/website-v2/static/img/2026/chart-density.png
new file mode 100644
index 000000000..2927aec55
Binary files /dev/null and b/website-v2/static/img/2026/chart-density.png differ
diff --git a/website-v2/static/img/2026/chart-gauge.png b/website-v2/static/img/2026/chart-gauge.png
new file mode 100644
index 000000000..219e16df5
Binary files /dev/null and b/website-v2/static/img/2026/chart-gauge.png differ
diff --git a/website-v2/static/img/2026/chart-histogram.png b/website-v2/static/img/2026/chart-histogram.png
new file mode 100644
index 000000000..1def66e4f
Binary files /dev/null and b/website-v2/static/img/2026/chart-histogram.png differ
diff --git a/website-v2/static/img/2026/chart-indicator.png b/website-v2/static/img/2026/chart-indicator.png
new file mode 100644
index 000000000..1963f6c17
Binary files /dev/null and b/website-v2/static/img/2026/chart-indicator.png differ
diff --git a/website-v2/static/img/2026/chart-pie.png b/website-v2/static/img/2026/chart-pie.png
new file mode 100644
index 000000000..ba1a35414
Binary files /dev/null and b/website-v2/static/img/2026/chart-pie.png differ
diff --git a/website-v2/static/img/2026/chart-scatter.png b/website-v2/static/img/2026/chart-scatter.png
new file mode 100644
index 000000000..dace4fe3c
Binary files /dev/null and b/website-v2/static/img/2026/chart-scatter.png differ
diff --git a/website-v2/static/img/2026/chart-status-heatmap.png b/website-v2/static/img/2026/chart-status-heatmap.png
new file mode 100644
index 000000000..0425c822d
Binary files /dev/null and b/website-v2/static/img/2026/chart-status-heatmap.png differ
diff --git a/website-v2/static/img/2026/chart-status.png b/website-v2/static/img/2026/chart-status.png
new file mode 100644
index 000000000..f27c6251d
Binary files /dev/null and b/website-v2/static/img/2026/chart-status.png differ
diff --git a/website-v2/static/img/2026/chart-table.png b/website-v2/static/img/2026/chart-table.png
new file mode 100644
index 000000000..0425c822d
Binary files /dev/null and b/website-v2/static/img/2026/chart-table.png differ
diff --git a/website-v2/static/img/2026/chart-time-selection.png b/website-v2/static/img/2026/chart-time-selection.png
new file mode 100644
index 000000000..d7940518f
Binary files /dev/null and b/website-v2/static/img/2026/chart-time-selection.png differ
diff --git a/website-v2/static/img/2026/chart-timeseries-heatmap.png b/website-v2/static/img/2026/chart-timeseries-heatmap.png
new file mode 100644
index 000000000..8485bfec7
Binary files /dev/null and b/website-v2/static/img/2026/chart-timeseries-heatmap.png differ
diff --git a/website-v2/static/img/2026/chart-timeseries.png b/website-v2/static/img/2026/chart-timeseries.png
new file mode 100644
index 000000000..b0853b0fb
Binary files /dev/null and b/website-v2/static/img/2026/chart-timeseries.png differ
diff --git a/website-v2/static/img/2026/chart-traffic-light.png b/website-v2/static/img/2026/chart-traffic-light.png
new file mode 100644
index 000000000..b34d81e2b
Binary files /dev/null and b/website-v2/static/img/2026/chart-traffic-light.png differ
diff --git a/website-v2/static/img/2026/chart-value-distribution.png b/website-v2/static/img/2026/chart-value-distribution.png
new file mode 100644
index 000000000..c71e86964
Binary files /dev/null and b/website-v2/static/img/2026/chart-value-distribution.png differ
diff --git a/website-v2/static/img/2026/dashboard-create.png b/website-v2/static/img/2026/dashboard-create.png
new file mode 100644
index 000000000..2f5c871f4
Binary files /dev/null and b/website-v2/static/img/2026/dashboard-create.png differ
diff --git a/website-v2/static/img/2026/dashboard-preview.png b/website-v2/static/img/2026/dashboard-preview.png
new file mode 100644
index 000000000..612f56e8a
Binary files /dev/null and b/website-v2/static/img/2026/dashboard-preview.png differ
diff --git a/website-v2/static/img/2026/dashboard-settings.png b/website-v2/static/img/2026/dashboard-settings.png
new file mode 100644
index 000000000..e8604a73f
Binary files /dev/null and b/website-v2/static/img/2026/dashboard-settings.png differ
diff --git a/website-v2/static/img/2026/login.png b/website-v2/static/img/2026/login.png
index d399ce9c2..3bcc044e1 100644
Binary files a/website-v2/static/img/2026/login.png and b/website-v2/static/img/2026/login.png differ
diff --git a/website-v2/static/img/2026/pipeline-details.png b/website-v2/static/img/2026/pipeline-details.png
new file mode 100644
index 000000000..fabac3e3f
Binary files /dev/null and b/website-v2/static/img/2026/pipeline-details.png differ
diff --git a/website-v2/static/img/2026/pipeline-editor-empty.png b/website-v2/static/img/2026/pipeline-editor-empty.png
new file mode 100644
index 000000000..f0672c07d
Binary files /dev/null and b/website-v2/static/img/2026/pipeline-editor-empty.png differ
diff --git a/website-v2/static/img/2026/pipeline-editor-example.png b/website-v2/static/img/2026/pipeline-editor-example.png
new file mode 100644
index 000000000..16c0bc469
Binary files /dev/null and b/website-v2/static/img/2026/pipeline-editor-example.png differ
diff --git a/website-v2/static/img/2026/pipeline-editor-save.png b/website-v2/static/img/2026/pipeline-editor-save.png
new file mode 100644
index 000000000..99958eb55
Binary files /dev/null and b/website-v2/static/img/2026/pipeline-editor-save.png differ
diff --git a/website-v2/static/img/2026/pipeline-overview-grouped.png b/website-v2/static/img/2026/pipeline-overview-grouped.png
new file mode 100644
index 000000000..4ed7cd963
Binary files /dev/null and b/website-v2/static/img/2026/pipeline-overview-grouped.png differ
diff --git a/website-v2/static/img/2026/security-add-group.png b/website-v2/static/img/2026/security-add-group.png
new file mode 100644
index 000000000..b9c4176ac
Binary files /dev/null and b/website-v2/static/img/2026/security-add-group.png differ
diff --git a/website-v2/static/img/2026/security-edit-roles.png b/website-v2/static/img/2026/security-edit-roles.png
new file mode 100644
index 000000000..7d607a578
Binary files /dev/null and b/website-v2/static/img/2026/security-edit-roles.png differ
diff --git a/website-v2/static/img/2026/security-edit-user.png b/website-v2/static/img/2026/security-edit-user.png
new file mode 100644
index 000000000..52ef61999
Binary files /dev/null and b/website-v2/static/img/2026/security-edit-user.png differ
diff --git a/website-v2/static/img/2026/security-overview.png b/website-v2/static/img/2026/security-overview.png
new file mode 100644
index 000000000..d07a1cc8e
Binary files /dev/null and b/website-v2/static/img/2026/security-overview.png differ
diff --git a/website-v2/static/img/2026/settings-export.png b/website-v2/static/img/2026/settings-export.png
new file mode 100644
index 000000000..30c6fc99c
Binary files /dev/null and b/website-v2/static/img/2026/settings-export.png differ
diff --git a/website-v2/static/img/2026/settings-extension-services.png b/website-v2/static/img/2026/settings-extension-services.png
new file mode 100644
index 000000000..216faf7e7
Binary files /dev/null and b/website-v2/static/img/2026/settings-extension-services.png differ
diff --git a/website-v2/static/img/2026/settings-extensions.png b/website-v2/static/img/2026/settings-extensions.png
new file mode 100644
index 000000000..c407d6392
Binary files /dev/null and b/website-v2/static/img/2026/settings-extensions.png differ
diff --git a/website-v2/static/img/2026/settings-general.png b/website-v2/static/img/2026/settings-general.png
new file mode 100644
index 000000000..3fb63cc30
Binary files /dev/null and b/website-v2/static/img/2026/settings-general.png differ
diff --git a/website-v2/static/img/2026/settings-labels.png b/website-v2/static/img/2026/settings-labels.png
new file mode 100644
index 000000000..59ca92ed0
Binary files /dev/null and b/website-v2/static/img/2026/settings-labels.png differ
diff --git a/website-v2/static/img/2026/settings-mail-template.png b/website-v2/static/img/2026/settings-mail-template.png
new file mode 100644
index 000000000..c2501dd05
Binary files /dev/null and b/website-v2/static/img/2026/settings-mail-template.png differ