some introduction text
### Input
+Description
+description of input tables
+
#### First Table
+some other text
+WRONG:## Configuration Description
+some introduction text
+
#### Input Description
+description of input tables
+
+
+### Component Internals
+
+- Make sure that the amount of consumed **memory does not depend** on the amount of processed data. Use streaming or
+processing in chunks to maintain a limited amount of consumed memory. If not possible, state the expected usage in
+the **Component Limits**.
+- The component must distinguish between [user and application errors](/extend/common-interface/environment/#return-values).
+- The component must [validate](/extend/common-interface/config-file/#validation) its parameters; an invalid configuration must result in a user error. User error messages must clearly state what's wrong and what the user should do to fix the issue. E.g., `Invalid configuration.` is wrong, `Login failed, check your credentials.` is better.
+- The events produced must be reasonable. Provide status messages if possible and with a reasonable frequency. Avoid internal messages with no meaning to the end user. Also avoid flooding the event log or sending data files in the event log.
+- Set up [continuous deployment](/extend/component/deployment/) so that you can keep the component up to date.
+- Use [semantic versioning](http://semver.org/) to mark and deploy versions of your component. Using other tags (e.g.,
+`latest`, `master`) in production is not allowed.
+
+### Checklist
+
+Before requesting to publish a component, please check all rules using [this checklist](/extend/publish/checklist).
diff --git a/src/content/docs/extend/publish/schema-bad.png b/src/content/docs/extend/publish/schema-bad.png
new file mode 100644
index 000000000..ed2450754
Binary files /dev/null and b/src/content/docs/extend/publish/schema-bad.png differ
diff --git a/src/content/docs/extend/publish/schema-good.png b/src/content/docs/extend/publish/schema-good.png
new file mode 100644
index 000000000..8082071b7
Binary files /dev/null and b/src/content/docs/extend/publish/schema-good.png differ
diff --git a/src/content/docs/external-integrations/index.md b/src/content/docs/external-integrations/index.md
index 2bdf56546..fefcecf3c 100644
--- a/src/content/docs/external-integrations/index.md
+++ b/src/content/docs/external-integrations/index.md
@@ -5,7 +5,7 @@ slug: 'external-integrations'
-Keboola's external integration capabilities let you seamlessly extend the platform with your existing tools and workflows. By connecting to Keboola through our [REST API](https://developers.keboola.com/overview/api) or [MCP (Model Context Protocol)](/ai/mcp-server/) server, you can orchestrate data pipelines, trigger jobs, and embed Keboola into a broader automation ecosystem.
+Keboola's external integration capabilities let you seamlessly extend the platform with your existing tools and workflows. By connecting to Keboola through our [REST API](/overview/api/) or [MCP (Model Context Protocol)](/ai/mcp-server/) server, you can orchestrate data pipelines, trigger jobs, and embed Keboola into a broader automation ecosystem.
> Keboola integrates with external tools at multiple levels, from low-level API access to ready-made workflow platforms. This flexibility allows you to choose the approach that best fits your team's needs.
diff --git a/src/content/docs/external-integrations/n8n/index.md b/src/content/docs/external-integrations/n8n/index.md
index c6cecb1af..d852b2a80 100644
--- a/src/content/docs/external-integrations/n8n/index.md
+++ b/src/content/docs/external-integrations/n8n/index.md
@@ -107,7 +107,7 @@ If you need functionality that isn’t covered by the node’s built-in actions,
## Resources
-- [Keboola API Documentation](https://developers.keboola.com/overview/api)
+- [Keboola API Documentation](/overview/api/)
- [n8n Documentation](https://docs.n8n.io)
- [n8n Community Nodes Guide](https://docs.n8n.io/integrations/#community-nodes)
- [NPM Package](https://www.npmjs.com/package/@keboola/n8n-nodes-keboola)
diff --git a/src/content/docs/flows/flows-legacy/index.md b/src/content/docs/flows/flows-legacy/index.md
index 54e76715c..34bacdf1e 100644
--- a/src/content/docs/flows/flows-legacy/index.md
+++ b/src/content/docs/flows/flows-legacy/index.md
@@ -104,7 +104,7 @@ execute more jobs in parallel. Keboola will then concurrently execute the jobs t
- If you are working with APIs that are inconsistent or prone to frequent errors, consider enabling the **Continue on Failure** flag. Each phase (or step) of the flow will only run successfully if all jobs within that phase complete successfully. If a phase fails, no subsequent phases will continue. However, enabling this flag for each task (off by default) allows the flow to continue to subsequent phases, ending with a warning status if errors are encountered.
-- Finally, to modify the parameters sent to the underlying [API call](https://developers.keboola.com/integrate/jobs/#run-a-job), you can set **Task Parameters**.
+- Finally, to modify the parameters sent to the underlying [API call](/integrate/jobs/#run-a-job), you can set **Task Parameters**.
Select the task and click **Set advanced parameters**. When finished, click **Set**.
***Example of the advanced parameter:** changing a variable in transformation:*
diff --git a/src/content/docs/flows/index.md b/src/content/docs/flows/index.md
index c11a48045..a4d72d557 100644
--- a/src/content/docs/flows/index.md
+++ b/src/content/docs/flows/index.md
@@ -2,6 +2,7 @@
title: Conditional Flows
slug: 'flows'
redirect_from:
+ - /integrate/orchestrator/
- /flows/conditional-flows/
---
@@ -48,7 +49,7 @@ You can also set up parallelization **within a component** (configuration), dire
- Failure handling is expressed through [conditions](#conditions) instead of a "Continue on Failure" toggle — you can branch on task or phase status (e.g., `if status == 'error' then ...`) to send notifications, run fallback logic, or end the flow. See also [Retry](#retry) for automatic retries of failed tasks.
-- To modify the parameters sent to the underlying [API call](https://developers.keboola.com/integrate/jobs/#run-a-job), you can set **Task Parameters**.
+- To modify the parameters sent to the underlying [API call](/integrate/jobs/#run-a-job), you can set **Task Parameters**.
Select the task and click **Set advanced parameters**. When finished, click **Set**.
***Example of the advanced parameter:** changing a variable in transformation:*
diff --git a/src/content/docs/integrate/artifacts/artifacts-tutorial-1.png b/src/content/docs/integrate/artifacts/artifacts-tutorial-1.png
new file mode 100644
index 000000000..b35de9b1a
Binary files /dev/null and b/src/content/docs/integrate/artifacts/artifacts-tutorial-1.png differ
diff --git a/src/content/docs/integrate/artifacts/artifacts-tutorial-2.png b/src/content/docs/integrate/artifacts/artifacts-tutorial-2.png
new file mode 100644
index 000000000..3b78098be
Binary files /dev/null and b/src/content/docs/integrate/artifacts/artifacts-tutorial-2.png differ
diff --git a/src/content/docs/integrate/artifacts/artifacts-tutorial-3.png b/src/content/docs/integrate/artifacts/artifacts-tutorial-3.png
new file mode 100644
index 000000000..d9ba47847
Binary files /dev/null and b/src/content/docs/integrate/artifacts/artifacts-tutorial-3.png differ
diff --git a/src/content/docs/integrate/artifacts/artifacts-tutorial-4.png b/src/content/docs/integrate/artifacts/artifacts-tutorial-4.png
new file mode 100644
index 000000000..ae120cc96
Binary files /dev/null and b/src/content/docs/integrate/artifacts/artifacts-tutorial-4.png differ
diff --git a/src/content/docs/integrate/artifacts/index.md b/src/content/docs/integrate/artifacts/index.md
new file mode 100644
index 000000000..ae794729b
--- /dev/null
+++ b/src/content/docs/integrate/artifacts/index.md
@@ -0,0 +1,127 @@
+---
+title: Artifacts
+slug: 'integrate/artifacts'
+---
+
+
+*Note: This is a preview feature and as such may change considerably in the future. The project must have an `artifacts` feature enabled.*
+
+**Artifacts** are additional files that can be produced or consumed by a [component](/extend/component).
+
+See [Tutorial](/integrate/artifacts/tutorial) for step-by-step example.
+
+## Introduction
+In some cases it's useful if a component not only extracts, transforms or uploads data, but also generate some other output, metadata or other runtime-discovered data.
+These could be for example:
+- AI models
+- performance graphs of such models
+- status updates from long-running tasks
+- documentation
+- data quality checks from in-progress tasks
+
+These additional information can be stored in artifacts and processed by another component or 3rd party tool.
+
+## Storage
+Artifacts are stored in Keboola File Storage.
+
+## Types of artifacts
+There are three types of artifacts for now `runs`, `custom` and `shared`.
+The type specifies which components will have access to the artifact or which artifacts to download for the component to process.
+Types are used in a configuration of a consumer component to specify which artifacts to download.
+
+- **runs** - artifacts from previous runs of the same configuration
+
+- **custom** - artifacts from previous runs of a different configuration. The configuration which produced the artifacts will be defined in the consumer configuration (configurationId, componentId, branchId)
+
+- **shared** - artifacts shared within an orchestration
+
+`runs` and `custom` types are the same from the producer point of view. To produce a `shared` artifact, it has to be written into a `shared` folder. Read more in [File structure](#file-structure) section.
+
+## File structure
+Artifact is a unique set of files associated with a successful job, component and configuration.
+A component can either produce or consume artifacts or both.
+
+### Produce
+To produce an artifact, store one or more files in the following `output` directories. Subdirectories are also supported.
+- `/data/artifacts/out/current` to create an artifact of type `runs` / `custom`.
+- `/data/artifacts/out/shared` to create an artifact of type `shared`, which can be accessed by any component within the same orchestration.
+
+After the component job is finished all files and directories inside `current` and `shared` folders will be compressed into an archive and uploaded to File Storage with corresponding tags as a `artifact`.
+
+### Consume
+To consume created artifacts you have to specify, in the configuration of a component, which artifacts (type) to download.
+ - `runs` to download artifacts produced by the same configuration and component. These will be stored in `/data/artifacts/in/runs/jobs/job-%job_id%` directory.
+ - `custom` to download artifacts produced by another configuration or component. These will be stored in `/data/artifacts/in/custom/jobs/job-%job_id%` directory.
+ - `shared` to download artifacts created within the same orchestration by any artifact producing component that has already finished. These will be stored in `/data/artifacts/in/shared/jobs/job-%job_id%` directory.
+
+## Configuration
+Each type of artifact has a separate node in configuration. All the types can be used simultaneously.
+Each type node has an attribute "enabled", which enables or disables download of the corresponding artifact type.
+
+### Runs
+ - **enabled** [true|false] - enable or disable download of this artifact type
+ - **filter**
+ - **date_since** - only artifacts from jobs younger than this will be downloaded
+ - **limit** - maximum number of the latest jobs from which to download artifacts
+
+### Custom
+- **enabled** [true|false] - enable or disable download of this artifact type
+- **filter**
+ - **branch_id**, **component_id**, **config_id** - specify the configuration to download artifacts from
+ - **date_since** - only artifacts from jobs younger than this will be downloaded
+ - **limit** - maximum number of the latest jobs from which to download artifacts
+
+### Shared
+- **enabled** [true|false] - enable or disable download of this artifact type
+
+Full configuration example with all artifact types:
+
+```json
+{
+ "parameters": {},
+ "artifacts": {
+ "runs": {
+ "enabled": true,
+ "filter": {
+ "date_since": "-7 days",
+ "limit": 5
+ }
+ },
+ "custom": {
+ "enabled": true,
+ "filter": {
+ "component_id": "keboola.python-transformation",
+ "config_id": "12345",
+ "branch_id": "default",
+ "date_since": "-7 days",
+ "limit": 5
+ }
+ },
+ "orchestration": {
+ "enabled": true
+ }
+ }
+}
+```
+
+## Artifacts life-cycle in a job
+Job runner checks if the project has enabled `artifacts` feature.
+Job runner checks the configuration of the component.
+If artifacts are enabled, it downloads artifacts to corresponding folders as configured (i.e. `runs`, `custom`, `shared`) and unzips them.
+
+Component process start and the component can:
+
+- access and process the downloaded artifacts in shared or custom directory
+
+- write artifacts to `current` or `shared` directory
+
+Component finishes and job runner does:
+
+- gzip the content of runs/current
+
+- tag the gzipped file with jobId, componentId, configId, runId, branchId and other tags if needed
+
+- upload the file to File Storage
+
+## File size limit
+All the artifacts produced by a job shouldn’t be bigger than 1 GB.
diff --git a/src/content/docs/integrate/artifacts/tutorial/index.md b/src/content/docs/integrate/artifacts/tutorial/index.md
new file mode 100644
index 000000000..2c46d922d
--- /dev/null
+++ b/src/content/docs/integrate/artifacts/tutorial/index.md
@@ -0,0 +1,211 @@
+---
+title: Artifacts Tutorial
+slug: 'integrate/artifacts/tutorial'
+---
+
+
+This tutorial will show you how to work with artifacts.
+In the following example we will use Python Transformation component to produce and consume artifacts.
+But these principles would work inside any component.
+
+In the examples, we use the `curl` console tool to interact with our APIs.
+
+*Note: `artifacts` feature needs to be enabled in your project. Please contact [support@keboola.com](mailto:support@keboola.com) to enable the feature in your project*
+*Note 2: `artifacts` configuration can be created or edited only via [Configuration API](https://api.keboola.com/?service=storage#post-/v2/storage/branch/-branchId-/components/-componentId-/configs) for now*
+
+## Examples
+
+For each example we will need [Storage API Token](/management/project/tokens/) to make the API call.
+
+1. Obtain a Storage API token from the user interface of your project, see this [Guide](/management/project/tokens).
+2. Store the token and url to the environment variable.
+
+ ```shell
+ export STORAGE_API_HOST="https://connection.keboola.com"
+ export TOKEN="..."
+ ```
+
+### 1. Produce artifact
+
+This is very simple example. We will just create a Python Transformation, which will write a file to the artifacts "upload" folder.
+This file will be then uploaded as "artifact" to File Storage.
+
+1. In your Keboola project, create a new Python transformation, and paste this code into it:
+ ```
+ import os
+ with open("/data/artifacts/out/current/myartifact1", "w") as file:
+ file.write("this is my artifact file content")
+ ```
+
+ 
+
+2. Run the transformation - it should upload the file to File Storage as "artifact"
+
+ 
+
+3. The file is now visible in File Storage with appropriate tags
+
+ 
+
+### 2. Produce & consume artifacts
+
+To consume (download) artifacts for component to work with, we need to enable and configure artifacts download in the configuration of a component.
+
+We will create another configuration of the Python transformation via API.
+
+The artifacts part of the configuration will look like this.
+It will enable download of artifacts of type `runs` with limit 5, which means this will download artifacts created by the last 5 runs of the same component configuration
+
+ ```json
+ {
+ "artifacts":{
+ "runs":{
+ "enabled":true,
+ "filter":{
+ "limit":5
+ }
+ }
+ }
+ }
+ ```
+
+The script of the transformation will look like following.
+Files read from `/data/artifacts/in/runs/*/*` will be displayed at output - these are the artifact files downloaded.
+The script will also generate a new artifact and write it to `/data/artifacts/out/current/myartifact1` as in previous example.
+
+ ```python
+ import os
+ import glob
+
+ # Download
+ print(glob.glob("/data/artifacts/in/runs/*/*"))
+
+ # Upload
+ with open("/data/artifacts/out/current/myartifact1", "w") as file:
+ file.write("value1")
+ ```
+1. Run this curl command to create the configuration:
+
+ ```shell
+ curl -X POST "$STORAGE_API_HOST/v2/storage/branch/default/components/keboola.python-transformation-v2/configs" \
+ -H "X-StorageApi-Token: $TOKEN" \
+ -H 'Content-Type: application/x-www-form-urlencoded' \
+ --data-urlencode 'configuration={"parameters":{"blocks":[{"name":"Block 1","codes":[{"name":"artifacts","script":["import os\nimport glob\n\n# Download\nprint(glob.glob(\"/data/artifacts/in/runs/*/*\")) \n\n# Upload\nwith open(\"/data/artifacts/out/current/myartifact1\", \"w\") as file:\n file.write(\"value1\")"]}]}]},"artifacts":{"runs":{"enabled":true,"filter":{"limit":5}}}}' \
+ --data-urlencode 'name=Artifacts upload & download' \
+ --data-urlencode 'description=Test Artifacts upload & download'
+ ```
+
+### 3. Consume artifacts from different component
+Similar to previous example we will create a configuration of Python Transformation component.
+But this time we will download artifacts produced by the configuration from `Example 2`.
+
+1. Export the id of the previously created configuration into an environment variable:
+ ```shell
+ export CONFIG_ID="..."
+ ```
+
+2. Run curl command
+ ```shell
+ curl -X POST "$STORAGE_API_HOST/v2/storage/branch/default/components/keboola.python-transformation-v2/configs" \
+ -H "X-StorageApi-Token: $TOKEN" \
+ -H 'Content-Type: application/x-www-form-urlencoded' \
+ --data-urlencode 'configuration={"parameters":{"blocks":[{"name":"Block 1","codes":[{"name":"artifacts","script":["import os\nimport glob\n\n# Download\nprint(glob.glob(\"/data/artifacts/in/custom/*/*\"))"]}]}]},"artifacts":{"custom":{"enabled":true,"component_id":"keboola.python-transformation","config_id":"$CONFIG_ID","branch_id":"default","filter":{"limit":5}}}}' \
+ --data-urlencode 'name=Artifacts upload & download' \
+ --data-urlencode 'description=Test Artifacts upload & download'
+ ```
+
+The whole configuration now looks like this:
+
+ ```json
+ {
+ "parameters": {
+ "blocks": [
+ {
+ "name": "Block 1",
+ "codes": [
+ {
+ "name": "artifacts",
+ "script": [
+ "import os\nimport glob\n\n# Download\nprint(glob.glob(\"/data/artifacts/in/custom/*/*\"))"
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ "artifacts": {
+ "custom": {
+ "enabled": true,
+ "component_id": "keboola.python-transformation",
+ "config_id": "$CONFIG_ID",
+ "branch_id": "default",
+ "filter": {
+ "limit": 5
+ }
+ }
+ }
+ }
+ ```
+
+### 4. Shared artifacts
+This example will show how to share artifacts within an orchestration
+We will create two configurations of Python Transformation component.
+One will produce a shared artifact and the other will consume it.
+Both configurations needs to be in the same orchestration.
+The configuration producing artifact needs to be in a phase that precedes the consuming one.
+
+1. Create "Producer" configuration
+ The Python code will write a file into a shared folder:
+
+ ```python
+ import os
+ with open(path+\"/myartifact-shared\", \"w\") as file:
+ file.write(\"value1\")"
+ ```
+
+ Run curl command to create the configuration:
+
+ ```shell
+ curl -X POST "$STORAGE_API_HOST/v2/storage/branch/default/components/keboola.python-transformation-v2/configs" \
+ -H "X-StorageApi-Token: $TOKEN" \
+ -H 'Content-Type: application/x-www-form-urlencoded' \
+ --data-urlencode 'configuration={"parameters":{"blocks":[{"name":"Block 1","codes":[{"name":"Upload shared","script":["import os\npath = \"/data/artifacts/out/shared\"\nwith open(path+\"/myartifact3\", \"w\") as file:\n file.write(\"value1\")"]}]}]},"artifacts":{"runs":{"enabled":true,"filter":{"limit":5}}}}' \
+ --data-urlencode 'name=Artifacts shared Producer' \
+ --data-urlencode 'description=Artifacts upload shared'
+ ```
+
+2. Create "Consumer" configuration
+
+ The artifacts configuration:
+ ```json
+ {
+ "artifacts": {
+ "shared": {
+ "enabled": true
+ }
+ }
+ }
+ ```
+
+ The Python script:
+
+ ```python
+ import os
+ import glob
+ print(glob.glob("/data/artifacts/in/shared/*/*"))
+ ```
+
+ Run curl command to create the configurtion:
+
+ ```shell
+ curl -X POST "$STORAGE_API_HOST/v2/storage/branch/default/components/keboola.python-transformation-v2/configs" \
+ -H "X-StorageApi-Token: $TOKEN" \
+ -H 'Content-Type: application/x-www-form-urlencoded' \
+ --data-urlencode 'configuration={"parameters":{"blocks":[{"name":"Block 1","codes":[{"name":"Download shared","script":["import os\nimport glob\n\nprint(glob.glob(\"/data/artifacts/in/shared/*/*\")) "]}]}]},"artifacts":{"shared":{"enabled":true}}}' \
+ --data-urlencode 'name=Artifacts shared Consumer' \
+ --data-urlencode 'description=Artifacts download shared'
+ ```
+
+3. Now put each of the configurations into an Orchestration. "Artifacts shared Producer" into phase 1 and "Artifacts shared Consumer" into phase 2.
+
+ 
diff --git a/src/content/docs/integrate/data-streams/push_data.drawio.png b/src/content/docs/integrate/data-streams/push_data.drawio.png
new file mode 100644
index 000000000..19abce2f6
Binary files /dev/null and b/src/content/docs/integrate/data-streams/push_data.drawio.png differ
diff --git a/src/content/docs/integrate/data-streams/tutorial/gh-settings-webhook-add.png b/src/content/docs/integrate/data-streams/tutorial/gh-settings-webhook-add.png
new file mode 100644
index 000000000..d98d32b94
Binary files /dev/null and b/src/content/docs/integrate/data-streams/tutorial/gh-settings-webhook-add.png differ
diff --git a/src/content/docs/integrate/data-streams/tutorial/gh-settings-webhook-individual-events.png b/src/content/docs/integrate/data-streams/tutorial/gh-settings-webhook-individual-events.png
new file mode 100644
index 000000000..43908f2d6
Binary files /dev/null and b/src/content/docs/integrate/data-streams/tutorial/gh-settings-webhook-individual-events.png differ
diff --git a/src/content/docs/integrate/data-streams/tutorial/gh-settings-webhook-issues.png b/src/content/docs/integrate/data-streams/tutorial/gh-settings-webhook-issues.png
new file mode 100644
index 000000000..0ab61f8f9
Binary files /dev/null and b/src/content/docs/integrate/data-streams/tutorial/gh-settings-webhook-issues.png differ
diff --git a/src/content/docs/integrate/data-streams/tutorial/gh-settings-webhook.png b/src/content/docs/integrate/data-streams/tutorial/gh-settings-webhook.png
new file mode 100644
index 000000000..4b9fecec2
Binary files /dev/null and b/src/content/docs/integrate/data-streams/tutorial/gh-settings-webhook.png differ
diff --git a/src/content/docs/integrate/data-streams/tutorial/gh-tabs.png b/src/content/docs/integrate/data-streams/tutorial/gh-tabs.png
new file mode 100644
index 000000000..a78cb9d47
Binary files /dev/null and b/src/content/docs/integrate/data-streams/tutorial/gh-tabs.png differ
diff --git a/src/content/docs/integrate/data-streams/tutorial/github_webhook_export_file.png b/src/content/docs/integrate/data-streams/tutorial/github_webhook_export_file.png
new file mode 100644
index 000000000..0440b7d7d
Binary files /dev/null and b/src/content/docs/integrate/data-streams/tutorial/github_webhook_export_file.png differ
diff --git a/src/content/docs/integrate/data-streams/tutorial/github_webhook_export_table.png b/src/content/docs/integrate/data-streams/tutorial/github_webhook_export_table.png
new file mode 100644
index 000000000..c13dac3a4
Binary files /dev/null and b/src/content/docs/integrate/data-streams/tutorial/github_webhook_export_table.png differ
diff --git a/src/content/docs/integrate/data-streams/tutorial/github_webhook_export_table_data.png b/src/content/docs/integrate/data-streams/tutorial/github_webhook_export_table_data.png
new file mode 100644
index 000000000..44192eb0a
Binary files /dev/null and b/src/content/docs/integrate/data-streams/tutorial/github_webhook_export_table_data.png differ
diff --git a/src/content/docs/integrate/data-streams/tutorial/github_webhook_export_token.png b/src/content/docs/integrate/data-streams/tutorial/github_webhook_export_token.png
new file mode 100644
index 000000000..b5ecdce29
Binary files /dev/null and b/src/content/docs/integrate/data-streams/tutorial/github_webhook_export_token.png differ
diff --git a/src/content/docs/integrate/data-streams/tutorial/table.png b/src/content/docs/integrate/data-streams/tutorial/table.png
new file mode 100644
index 000000000..7e39f0b9b
Binary files /dev/null and b/src/content/docs/integrate/data-streams/tutorial/table.png differ
diff --git a/src/content/docs/integrate/data-streams/tutorial/token.png b/src/content/docs/integrate/data-streams/tutorial/token.png
new file mode 100644
index 000000000..d6b94c7f2
Binary files /dev/null and b/src/content/docs/integrate/data-streams/tutorial/token.png differ
diff --git a/src/content/docs/integrate/database/ssh-tunnel.jpg b/src/content/docs/integrate/database/ssh-tunnel.jpg
new file mode 100644
index 000000000..d9d9d38a0
Binary files /dev/null and b/src/content/docs/integrate/database/ssh-tunnel.jpg differ
diff --git a/src/content/docs/integrate/index.md b/src/content/docs/integrate/index.md
new file mode 100644
index 000000000..825535809
--- /dev/null
+++ b/src/content/docs/integrate/index.md
@@ -0,0 +1,33 @@
+---
+title: Integration
+slug: 'integrate'
+---
+
+You can look at Keboola as a system of independent and loosely coupled microservices (components).
+
+Each microservice has its own code base, and a publicly accessible API and configuration.
+We do not cheat or have any advantage over other developers; our UI and other components use only these public APIs.
+
+As a result, it is very easy to, for example, write custom scripts to bootstrap a project, or do something that our UI does not offer.
+Let's have a look into this!
+
+One of the very important components is [Storage](/integrate/storage/), which not only stores all data in a
+project, but also provides additional functions such as managing other components and their configurations.
+When you are integrating your systems with Keboola, **chances are that you want to start with [Storage](/integrate/storage/)**.
+
+
\ No newline at end of file
diff --git a/src/content/docs/integrate/jobs/index.md b/src/content/docs/integrate/jobs/index.md
new file mode 100644
index 000000000..c8ec907d3
--- /dev/null
+++ b/src/content/docs/integrate/jobs/index.md
@@ -0,0 +1,496 @@
+---
+title: Component Jobs
+slug: 'integrate/jobs'
+redirect_from:
+ - /overview/jobs/
+---
+
+
+Most operations, such as extracting data or running an application are executed in Keboola as
+background, asynchronous [jobs](/management/jobs/). When an operation is triggered, for example, you run an extractor, a
+*job* is created. The job starts executing or waits in the queue until it can start executing.
+The job execution and queuing are fully automatic. The job execution is asynchronous, so you need to
+
+- *create* (run) a job, and
+- *wait* for it to finish.
+
+The core API for working with jobs is the [Queue API](https://api.keboola.com/?service=job-queue#job-queue). It provides operations for
+running/creating, terminating and listing jobs.
+[Components](/overview/) differ in their upper limits on how long a job can be executing and how much memory it is allowed to consume.
+These limits are set by the component developer and act primarily as a safeguard.
+
+## Job Properties
+When you create a job it automatically transitions through states until it reaches some of the final states.
+When you create or retrieve a job, you'll obtain a JSON with Job object, whose properties are described below in more detail.
+
+api.keboola.com links in the table below open the API documentation portal for the US Virginia AWS stack.
+If you are using a different stack, navigate to your stack's API portal first — see API Documentation Portals below — and then select the service there.
+Using a portal for a different stack than your token's stack will result in Invalid Token errors.
+