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

luoyuxia pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fluss.git


The following commit(s) were added to refs/heads/main by this push:
     new dfa33de7c [docs] Reorganize Streaming Lakehouse documentation to 
higlight deployment and core features  (#2699)
dfa33de7c is described below

commit dfa33de7c589e8d05c13f79ce62f73bfd32ea629
Author: MehulBatra <[email protected]>
AuthorDate: Mon Jul 6 08:58:37 2026 +0530

    [docs] Reorganize Streaming Lakehouse documentation to higlight deployment 
and core features  (#2699)
    
    ---------
    
    Co-authored-by: luoyuxia <[email protected]>
---
 website/build_versioned_docs.sh                    |   8 +
 website/docs/engine-flink/getting-started.md       |   4 +-
 .../deploying-streaming-lakehouse.md               | 250 +++++++++++++++++++++
 website/docs/install-deploy/overview.md            |  12 +-
 website/docs/maintenance/operations/upgrading.md   |   4 +-
 .../maintenance/tiered-storage/_category_.json     |   2 +-
 .../filesystems/_category_.json                    |   2 +-
 .../{ => tiered-storage}/filesystems/azure.md      |   0
 .../{ => tiered-storage}/filesystems/cos.md        |   0
 .../{ => tiered-storage}/filesystems/gs.md         |   0
 .../{ => tiered-storage}/filesystems/hdfs.md       |   0
 .../{ => tiered-storage}/filesystems/obs.md        |   0
 .../{ => tiered-storage}/filesystems/oss.md        |   0
 .../{ => tiered-storage}/filesystems/overview.md   |   0
 .../{ => tiered-storage}/filesystems/s3.md         |   0
 .../tiered-storage/lakehouse-storage.md            | 137 ++++-------
 .../maintenance/tiered-storage/remote-storage.md   |   2 +-
 website/docs/quickstart/flink.md                   |   4 +-
 website/docs/quickstart/lakehouse.md               |   4 +-
 .../datalake-catalogs/_category_.json              |   4 +
 .../catalogs => datalake-catalogs}/lakekeeper.md   |  14 +-
 .../catalogs => datalake-catalogs}/polaris.md      |  12 +-
 .../datalake-formats/_category_.json               |   4 +
 .../formats => datalake-formats}/iceberg.md        |  64 ++++--
 .../formats => datalake-formats}/lance.md          |  17 +-
 .../formats => datalake-formats}/paimon.md         |  12 +-
 .../integrate-data-lakes/_category_.json           |   4 -
 .../integrate-data-lakes/catalogs/_category_.json  |   4 -
 .../integrate-data-lakes/formats/_category_.json   |   4 -
 website/docs/streaming-lakehouse/overview.md       |  13 +-
 .../docs/streaming-lakehouse/tiering-service.md    | 102 +++++++++
 website/docs/streaming-lakehouse/union-read.md     | 113 ++++++++++
 website/docs/table-design/table-types/log-table.md |   2 +-
 website/docusaurus.config.ts                       |  31 ++-
 34 files changed, 650 insertions(+), 179 deletions(-)

diff --git a/website/build_versioned_docs.sh b/website/build_versioned_docs.sh
index cca2f576a..f8a18293d 100755
--- a/website/build_versioned_docs.sh
+++ b/website/build_versioned_docs.sh
@@ -122,6 +122,14 @@ for branch in $branches; do
     # Copy the website/docs directory to the target directory
     $CP_CMD "$version_dir/" || { echo "Failed to copy for branch: 
$clean_branch_name"; continue; }
     echo "Copied documentation for branch '$clean_branch_name' to 
'$version_dir'"
+
+    # Fix absolute links in versioned docs (convert 
/docs/maintenance/filesystems/hdfs.md to relative path)
+    
lakehouse_file="$version_dir/maintenance/tiered-storage/lakehouse-storage.md"
+    if [ -f "$lakehouse_file" ]; then
+      sed -i.bak 
's|/docs/maintenance/filesystems/hdfs\.md|../filesystems/hdfs.md|g' 
"$lakehouse_file"
+      rm -f "$lakehouse_file.bak"
+      echo "Fixed absolute links in '$lakehouse_file'"
+    fi
   else
     echo "The website/docs directory does not exist in branch 
'$clean_branch_name', skipping..."
   fi
diff --git a/website/docs/engine-flink/getting-started.md 
b/website/docs/engine-flink/getting-started.md
index 44d3fe9fe..130851a1c 100644
--- a/website/docs/engine-flink/getting-started.md
+++ b/website/docs/engine-flink/getting-started.md
@@ -85,8 +85,8 @@ Download the Fluss Flink connector JAR from the 
[Dependencies](#dependencies) se
 cp fluss-flink-1.20-$FLUSS_VERSION$.jar <FLINK_HOME>/lib/
 ```
 :::note
-If you use [Amazon S3](http://aws.amazon.com/s3/), [Aliyun 
OSS](https://www.aliyun.com/product/oss) or [HDFS(Hadoop Distributed File 
System)](https://hadoop.apache.org/docs/stable/) as Fluss's [remote 
storage](maintenance/tiered-storage/remote-storage.md),
-you should download the corresponding Fluss filesystem JAR (see 
[Filesystems](../maintenance/filesystems/overview.md)) and also copy it to the 
lib directory of your Flink home.
+If you use [Amazon S3](http://aws.amazon.com/s3/), [Aliyun 
OSS](https://www.aliyun.com/product/oss) or [HDFS(Hadoop Distributed File 
System)](https://hadoop.apache.org/docs/stable/) as Fluss's [remote 
storage](../maintenance/tiered-storage/remote-storage.md),
+you should download the corresponding [Fluss filesystem 
jar](/downloads#filesystem-jars) and also copy it to the lib directory of your 
Flink home.
 :::
 
 - **Start a local cluster**
diff --git a/website/docs/install-deploy/deploying-streaming-lakehouse.md 
b/website/docs/install-deploy/deploying-streaming-lakehouse.md
new file mode 100644
index 000000000..216248ebe
--- /dev/null
+++ b/website/docs/install-deploy/deploying-streaming-lakehouse.md
@@ -0,0 +1,250 @@
+---
+title: "Deploying Streaming Lakehouse"
+sidebar_position: 6
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+# Deploying Streaming Lakehouse
+
+This guide covers how to deploy a Fluss cluster with Streaming Lakehouse 
capabilities. For conceptual overview, see [Lakehouse 
Overview](../streaming-lakehouse/overview.md).
+
+## Prerequisites
+
+1. A running Fluss cluster (see [Deploying Distributed 
Cluster](deploying-distributed-cluster.md))
+2. A running Flink cluster (for the Tiering Service)
+3. Access to a data lake storage system (S3, HDFS, OSS, etc.)
+
+## Cluster Configuration
+
+You can enable Lakehouse storage through:
+1. **Static configuration**: Configure in `server.yaml` before starting the 
cluster
+2. **Dynamic configuration**: Enable at runtime using the 
`set_cluster_configs` procedure
+
+### Method 1: Static Configuration
+
+Configure lakehouse settings in `server.yaml` on all Fluss servers 
(CoordinatorServer and TabletServer).
+
+Fluss follows a simple convention for these keys:
+
+- `datalake.enabled: true` explicitly enables lakehouse capability for the 
cluster. If it is left unset, configuring `datalake.format` alone also enables 
it; whenever `datalake.enabled` is `true`, `datalake.format` must also be set.
+- `datalake.format` selects the lake format for the cluster (`paimon`, 
`iceberg`, or `lance`).
+- Format-specific options use the `datalake.<format>.*` prefix. Fluss strips 
this prefix and passes the remaining keys straight to the corresponding lake 
catalog/client — for example `datalake.paimon.metastore` becomes `metastore` 
and `datalake.iceberg.type` becomes `type`. Any option supported by the lake 
catalog can be set this way.
+- Only configure options for the format selected by `datalake.format`.
+
+:::note
+The [Tiering Service](../streaming-lakehouse/tiering-service.md) is an 
independent Flink job and needs the same `datalake.*` options passed as job 
arguments (see [Starting the Tiering Service](#starting-the-tiering-service)).
+:::
+
+<Tabs groupId="datalake-format">
+<TabItem value="paimon" label="Paimon" default>
+
+```yaml title="server.yaml"
+datalake.enabled: true
+datalake.format: paimon
+datalake.paimon.metastore: filesystem
+datalake.paimon.warehouse: /path/to/paimon/warehouse
+```
+
+For Hive catalog:
+```yaml title="server.yaml"
+datalake.enabled: true
+datalake.format: paimon
+datalake.paimon.metastore: hive
+datalake.paimon.uri: thrift://<hive-metastore-host>:<port>
+datalake.paimon.warehouse: hdfs:///path/to/warehouse
+```
+
+</TabItem>
+<TabItem value="iceberg" label="Iceberg">
+
+```yaml title="server.yaml"
+datalake.enabled: true
+datalake.format: iceberg
+datalake.iceberg.catalog-impl: org.apache.iceberg.jdbc.JdbcCatalog
+datalake.iceberg.name: fluss_catalog
+datalake.iceberg.uri: jdbc:postgresql://postgres-host:5432/iceberg
+datalake.iceberg.jdbc.user: iceberg
+datalake.iceberg.jdbc.password: iceberg
+datalake.iceberg.warehouse: s3://bucket/iceberg
+datalake.iceberg.io-impl: org.apache.iceberg.aws.s3.S3FileIO
+```
+
+</TabItem>
+<TabItem value="lance" label="Lance">
+
+```yaml title="server.yaml"
+datalake.enabled: true
+datalake.format: lance
+datalake.lance.warehouse: s3://bucket/lance
+```
+
+</TabItem>
+</Tabs>
+
+### Method 2: Dynamic Configuration
+
+Enable lakehouse settings at runtime using Flink SQL:
+
+```sql title="Flink SQL"
+USE fluss_catalog;
+
+CALL sys.set_cluster_configs(
+  config_pairs => 'datalake.format', 'paimon',
+                  'datalake.paimon.metastore', 'filesystem',
+                  'datalake.paimon.warehouse', '/path/to/warehouse'
+);
+```
+
+See [set_cluster_configs](../engine-flink/procedures.md#set_cluster_configs) 
for more details.
+
+## Adding Required JARs
+
+### Fluss Server JARs
+
+Add JARs to `${FLUSS_HOME}/plugins/<format>/` based on your configuration:
+
+<Tabs groupId="datalake-format">
+<TabItem value="paimon" label="Paimon" default>
+
+| Scenario | Required JAR |
+|----------|--------------|
+| Paimon with S3 | 
[`paimon-s3-<version>.jar`](https://paimon.apache.org/docs/$PAIMON_VERSION_SHORT$/project/download/),
 matching your Paimon version |
+| Paimon with OSS | 
[`paimon-oss-<version>.jar`](https://paimon.apache.org/docs/$PAIMON_VERSION_SHORT$/project/download/),
 matching your Paimon version |
+| Paimon Hive catalog | [Flink SQL Hive connector 
JAR](https://nightlies.apache.org/flink/flink-docs-stable/docs/connectors/table/hive/overview/#using-bundled-hive-jar)
 |
+
+</TabItem>
+<TabItem value="iceberg" label="Iceberg">
+
+| Scenario | Required JAR |
+|----------|--------------|
+| Iceberg with S3 | [`iceberg-aws-<version>.jar`, 
`iceberg-aws-bundle-<version>.jar`](https://iceberg.apache.org/docs/1.10.1/aws/),
 matching your Iceberg version |
+| Iceberg JDBC catalog | PostgreSQL/MySQL JDBC driver |
+
+</TabItem>
+<TabItem value="lance" label="Lance">
+
+Lance support is built into the Fluss distribution. Cloud storage credentials 
are configured via storage-options.
+
+</TabItem>
+</Tabs>
+
+## Starting the Tiering Service
+
+The Tiering Service is a Flink job that continuously tiers data from Fluss to 
the data lake. For architecture details, see [Tiering 
Service](../streaming-lakehouse/tiering-service.md).
+
+### Prerequisites
+
+1. Download 
[fluss-flink-tiering-$FLUSS_VERSION$.jar](https://repo1.maven.org/maven2/org/apache/fluss/fluss-flink-tiering/$FLUSS_VERSION$/fluss-flink-tiering-$FLUSS_VERSION$.jar)
+
+### Flink JARs
+
+Add the following to `${FLINK_HOME}/lib`:
+
+<Tabs groupId="datalake-format">
+<TabItem value="paimon" label="Paimon" default>
+
+- 
[fluss-flink-1.20-$FLUSS_VERSION$.jar](https://repo1.maven.org/maven2/org/apache/fluss/fluss-flink-1.20/$FLUSS_VERSION$/fluss-flink-1.20-$FLUSS_VERSION$.jar)
+- 
[fluss-lake-paimon-$FLUSS_VERSION$.jar](https://repo1.maven.org/maven2/org/apache/fluss/fluss-lake-paimon/$FLUSS_VERSION$/fluss-lake-paimon-$FLUSS_VERSION$.jar)
+- 
[paimon-bundle-$PAIMON_VERSION$.jar](https://repo.maven.apache.org/maven2/org/apache/paimon/paimon-bundle/$PAIMON_VERSION$/paimon-bundle-$PAIMON_VERSION$.jar)
+- [flink-shaded-hadoop-2-uber-*.jar](https://flink.apache.org/downloads/)
+- Paimon filesystem JAR (e.g., `paimon-s3-<version>.jar` for S3)
+
+</TabItem>
+<TabItem value="iceberg" label="Iceberg">
+
+- 
[fluss-flink-1.20-$FLUSS_VERSION$.jar](https://repo1.maven.org/maven2/org/apache/fluss/fluss-flink-1.20/$FLUSS_VERSION$/fluss-flink-1.20-$FLUSS_VERSION$.jar)
+- 
[fluss-lake-iceberg-$FLUSS_VERSION$.jar](https://repo1.maven.org/maven2/org/apache/fluss/fluss-lake-iceberg/$FLUSS_VERSION$/fluss-lake-iceberg-$FLUSS_VERSION$.jar)
+- 
[iceberg-flink-runtime-1.20-*.jar](https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-flink-runtime-1.20/)
+- Hadoop client JARs — export `HADOOP_CLASSPATH`, download the pre-bundled 
[`hadoop-apache-3.3.5-2.jar`](https://repo1.maven.org/maven2/io/trino/hadoop/hadoop-apache/3.3.5-2/hadoop-apache-3.3.5-2.jar),
 or install a full Hadoop package (see [Iceberg Hadoop 
Dependencies](../streaming-lakehouse/datalake-formats/iceberg.md#prerequisites-hadoop-dependencies))
+- JDBC driver (if using JDBC catalog)
+
+</TabItem>
+<TabItem value="lance" label="Lance">
+
+- 
[fluss-flink-1.20-$FLUSS_VERSION$.jar](https://repo1.maven.org/maven2/org/apache/fluss/fluss-flink-1.20/$FLUSS_VERSION$/fluss-flink-1.20-$FLUSS_VERSION$.jar)
+- 
[fluss-lake-lance-$FLUSS_VERSION$.jar](https://repo1.maven.org/maven2/org/apache/fluss/fluss-lake-lance/$FLUSS_VERSION$/fluss-lake-lance-$FLUSS_VERSION$.jar)
+
+</TabItem>
+</Tabs>
+
+If using S3, OSS, or HDFS as Fluss's [remote 
storage](../maintenance/tiered-storage/remote-storage.md), also add the 
corresponding [Fluss filesystem JAR](/downloads#filesystem-jars).
+
+### Start the Service
+
+<Tabs groupId="datalake-format">
+<TabItem value="paimon" label="Paimon" default>
+
+```shell
+${FLINK_HOME}/bin/flink run /path/to/fluss-flink-tiering-$FLUSS_VERSION$.jar \
+    --fluss.bootstrap.servers localhost:9123 \
+    --datalake.format paimon \
+    --datalake.paimon.metastore filesystem \
+    --datalake.paimon.warehouse /tmp/paimon
+```
+
+</TabItem>
+<TabItem value="iceberg" label="Iceberg">
+
+```shell
+${FLINK_HOME}/bin/flink run /path/to/fluss-flink-tiering-$FLUSS_VERSION$.jar \
+    --fluss.bootstrap.servers localhost:9123 \
+    --datalake.format iceberg \
+    --datalake.iceberg.catalog-impl org.apache.iceberg.jdbc.JdbcCatalog \
+    --datalake.iceberg.name fluss_catalog \
+    --datalake.iceberg.uri "jdbc:postgresql://postgres:5432/iceberg" \
+    --datalake.iceberg.jdbc.user iceberg \
+    --datalake.iceberg.jdbc.password iceberg \
+    --datalake.iceberg.warehouse "s3://bucket/iceberg"
+```
+
+</TabItem>
+<TabItem value="lance" label="Lance">
+
+```shell
+${FLINK_HOME}/bin/flink run /path/to/fluss-flink-tiering-$FLUSS_VERSION$.jar \
+    --fluss.bootstrap.servers localhost:9123 \
+    --datalake.format lance \
+    --datalake.lance.warehouse s3://bucket/lance
+```
+
+</TabItem>
+</Tabs>
+
+:::note
+- You must pass all `datalake.*` options that were set in `server.yaml` as 
command-line arguments
+- For S3/cloud storage, include additional flags like 
`--datalake.paimon.s3.endpoint`, `--datalake.paimon.s3.access-key`, etc.
+- The Tiering Service is stateless—you can run multiple instances for 
scalability
+- Use `-D` to pass Flink configurations (e.g., `-Dparallelism.default=3`)
+- For complete examples with S3 configuration, see the [Lakehouse 
Quickstart](../quickstart/lakehouse.md)
+:::
+
+## Enabling Lakehouse for Tables
+
+Create tables with lakehouse storage enabled:
+
+```sql title="Flink SQL"
+CREATE TABLE my_table (
+    id BIGINT PRIMARY KEY NOT ENFORCED,
+    name STRING
+) WITH (
+    'table.datalake.enabled' = 'true',
+    'table.datalake.freshness' = '1min'
+);
+```
+
+## Verification
+
+1. Check the Tiering Service job is running in Flink Web UI
+2. After the freshness interval, query the lake table:
+
+```sql title="Flink SQL"
+-- Lake-only query
+SELECT * FROM my_table$lake;
+
+-- Union Read (real-time + historical)
+SELECT * FROM my_table;
+```
+
+See [Union Read](../streaming-lakehouse/union-read.md) for more details.
diff --git a/website/docs/install-deploy/overview.md 
b/website/docs/install-deploy/overview.md
index a6c46b782..48784adb1 100644
--- a/website/docs/install-deploy/overview.md
+++ b/website/docs/install-deploy/overview.md
@@ -103,9 +103,9 @@ We have listed them in the table below the figure.
                 Fluss uses file systems as remote storage to store snapshots 
for Primary-Key Table and store tiered log segments for Log Table.
             </td>
             <td>
-            <li>[HDFS](maintenance/filesystems/hdfs.md)</li>
-            <li>[Aliyun OSS](maintenance/filesystems/oss.md)</li>
-            <li>[Amazon S3](maintenance/filesystems/s3.md)</li>
+            <li>[HDFS](../maintenance/tiered-storage/filesystems/hdfs.md)</li>
+            <li>[Aliyun 
OSS](../maintenance/tiered-storage/filesystems/oss.md)</li>
+            <li>[Amazon 
S3](../maintenance/tiered-storage/filesystems/s3.md)</li>
             </td>
         </tr>
         <tr>
@@ -116,9 +116,9 @@ We have listed them in the table below the figure.
                by query engines such as Flink, Spark, StarRocks, Trino.
             </td>
             <td>
-                
<li>[Paimon](streaming-lakehouse/integrate-data-lakes/formats/paimon.md)</li>
-                
<li>[Iceberg](streaming-lakehouse/integrate-data-lakes/formats/iceberg.md)</li>
-                
<li>[Lance](streaming-lakehouse/integrate-data-lakes/formats/lance.md)</li>
+                
<li>[Paimon](../streaming-lakehouse/datalake-formats/paimon.md)</li>
+                
<li>[Iceberg](../streaming-lakehouse/datalake-formats/iceberg.md)</li>
+                
<li>[Lance](../streaming-lakehouse/datalake-formats/lance.md)</li>
             </td>
         </tr>
         <tr>
diff --git a/website/docs/maintenance/operations/upgrading.md 
b/website/docs/maintenance/operations/upgrading.md
index 1eb768a46..b1312f033 100644
--- a/website/docs/maintenance/operations/upgrading.md
+++ b/website/docs/maintenance/operations/upgrading.md
@@ -34,8 +34,8 @@ tar -xzf fluss-$FLUSS_VERSION$-bin.tgz
 cd fluss-$FLUSS_VERSION$/
 ```
 
-2. If you want to enable [Lakehouse 
Storage](docs/maintenance/tiered-storage/lakehouse-storage.md), you need to 
prepare the required JAR files for the datalake first. For more details,
-   see [Add other jars required by 
datalake](docs/maintenance/tiered-storage/lakehouse-storage.md#add-other-jars-required-by-datalake).
+2. If you want to enable [Lakehouse 
Storage](../tiered-storage/lakehouse-storage.md), you need to prepare the 
required JAR files for the datalake first. For more details,
+   see [Deploying Streaming 
Lakehouse](../../install-deploy/deploying-streaming-lakehouse.md).
 
 3. Next, copy the configuration options from 0.6 
(`fluss-0.6/conf/server.yaml`) to the new configuration
 file (`fluss-$FLUSS_VERSION$/conf/server.yaml`). Adding any new options 
introduced in version $FLUSS_VERSION$ as
diff --git a/website/docs/maintenance/tiered-storage/_category_.json 
b/website/docs/maintenance/tiered-storage/_category_.json
index 0c5af719d..dc54765ee 100644
--- a/website/docs/maintenance/tiered-storage/_category_.json
+++ b/website/docs/maintenance/tiered-storage/_category_.json
@@ -1,4 +1,4 @@
 {
   "label": "Tiered Storage",
-  "position": 3
+  "position": 2
 }
diff --git a/website/docs/maintenance/filesystems/_category_.json 
b/website/docs/maintenance/tiered-storage/filesystems/_category_.json
similarity index 65%
rename from website/docs/maintenance/filesystems/_category_.json
rename to website/docs/maintenance/tiered-storage/filesystems/_category_.json
index 02fd650d3..55a5c75be 100644
--- a/website/docs/maintenance/filesystems/_category_.json
+++ b/website/docs/maintenance/tiered-storage/filesystems/_category_.json
@@ -1,4 +1,4 @@
 {
   "label": "File Systems",
-  "position": 2
+  "position": 4
 }
diff --git a/website/docs/maintenance/filesystems/azure.md 
b/website/docs/maintenance/tiered-storage/filesystems/azure.md
similarity index 100%
rename from website/docs/maintenance/filesystems/azure.md
rename to website/docs/maintenance/tiered-storage/filesystems/azure.md
diff --git a/website/docs/maintenance/filesystems/cos.md 
b/website/docs/maintenance/tiered-storage/filesystems/cos.md
similarity index 100%
rename from website/docs/maintenance/filesystems/cos.md
rename to website/docs/maintenance/tiered-storage/filesystems/cos.md
diff --git a/website/docs/maintenance/filesystems/gs.md 
b/website/docs/maintenance/tiered-storage/filesystems/gs.md
similarity index 100%
rename from website/docs/maintenance/filesystems/gs.md
rename to website/docs/maintenance/tiered-storage/filesystems/gs.md
diff --git a/website/docs/maintenance/filesystems/hdfs.md 
b/website/docs/maintenance/tiered-storage/filesystems/hdfs.md
similarity index 100%
rename from website/docs/maintenance/filesystems/hdfs.md
rename to website/docs/maintenance/tiered-storage/filesystems/hdfs.md
diff --git a/website/docs/maintenance/filesystems/obs.md 
b/website/docs/maintenance/tiered-storage/filesystems/obs.md
similarity index 100%
rename from website/docs/maintenance/filesystems/obs.md
rename to website/docs/maintenance/tiered-storage/filesystems/obs.md
diff --git a/website/docs/maintenance/filesystems/oss.md 
b/website/docs/maintenance/tiered-storage/filesystems/oss.md
similarity index 100%
rename from website/docs/maintenance/filesystems/oss.md
rename to website/docs/maintenance/tiered-storage/filesystems/oss.md
diff --git a/website/docs/maintenance/filesystems/overview.md 
b/website/docs/maintenance/tiered-storage/filesystems/overview.md
similarity index 100%
rename from website/docs/maintenance/filesystems/overview.md
rename to website/docs/maintenance/tiered-storage/filesystems/overview.md
diff --git a/website/docs/maintenance/filesystems/s3.md 
b/website/docs/maintenance/tiered-storage/filesystems/s3.md
similarity index 100%
rename from website/docs/maintenance/filesystems/s3.md
rename to website/docs/maintenance/tiered-storage/filesystems/s3.md
diff --git a/website/docs/maintenance/tiered-storage/lakehouse-storage.md 
b/website/docs/maintenance/tiered-storage/lakehouse-storage.md
index 223037812..a9174073d 100644
--- a/website/docs/maintenance/tiered-storage/lakehouse-storage.md
+++ b/website/docs/maintenance/tiered-storage/lakehouse-storage.md
@@ -5,16 +5,11 @@ sidebar_position: 3
 
 # Lakehouse Storage
 
-Lakehouse represents a new, open architecture that combines the best elements 
of data lakes and data warehouses.
-Lakehouse combines data lake scalability and cost-effectiveness with data 
warehouse reliability and performance.
+Fluss leverages well-known Lakehouse storage solutions like Apache Paimon, 
Apache Iceberg, and Lance as the tiered storage layer. The Tiering Service 
continuously tiers Fluss data to Lakehouse storage, where it can be read by 
Fluss clients in a streaming manner and accessed directly by external systems 
such as Flink, Spark, StarRocks, and others.
 
-Fluss leverages the well-known Lakehouse storage solutions like Apache Paimon, 
Apache Iceberg, Apache Hudi, Delta Lake as
-the tiered storage layer. Currently, only Apache Paimon, Apache Iceberg, Lance 
are supported, with more kinds of Lakehouse storage support are on the way.
-
-Fluss's datalake tiering service will tier Fluss's data to the Lakehouse 
storage continuously. The data in Lakehouse storage can be read both by Fluss's 
client in a streaming manner and accessed directly
-by external systems such as Flink, Spark, StarRocks and others. With data 
tiered in Lakehouse storage, Fluss
-can gain much storage cost reduction and analytics performance improvement.
+For deployment instructions, see [Deploying Streaming 
Lakehouse](../../install-deploy/deploying-streaming-lakehouse.md).
 
+For architecture details, see [Tiering 
Service](../../streaming-lakehouse/tiering-service.md).
 
 ## Dependencies
 
@@ -34,104 +29,56 @@ Maven coordinates:
 </dependency>
 ```
 
-Verify downloaded JARs against the [KEYS 
file](https://downloads.apache.org/incubator/fluss/KEYS) using the 
[verification instructions](/downloads).
-
-
-## Enable Lakehouse Storage
+Verify downloaded JARs against the [KEYS 
file](https://downloads.apache.org/incubator/fluss/KEYS) using the 
[verification instructions](/downloads#verifying-downloads).
 
-Lakehouse Storage is disabled by default, you must enable it manually. 
+## Cluster Configuration
 
-The following example uses Paimon for demonstration—other data lake formats 
follow similar steps, but require different configuration settings and JAR 
files.
-You can refer to the documentation of the corresponding data lake format 
integration for required configurations and JAR files. 
+Lakehouse storage is configured in `server.yaml` using the `datalake.` prefix:
 
-### Lakehouse Storage Cluster Configurations
-#### Modify `server.yaml`
-First, you must configure the lakehouse storage in `server.yaml`. Take Paimon 
as an example, you must configure the following configurations:
-```yaml
-# Paimon configuration
-datalake.enabled: true
+```yaml title="server.yaml"
 datalake.format: paimon
-
-# the catalog config about Paimon, assuming using Filesystem catalog
 datalake.paimon.metastore: filesystem
 datalake.paimon.warehouse: /tmp/paimon
 ```
 
-Fluss processes Paimon configurations by removing the `datalake.paimon.` 
prefix and then use the remaining configuration (without the prefix 
`datalake.paimon.`) to create the Paimon catalog. Checkout the [Paimon 
documentation](https://paimon.apache.org/docs/$PAIMON_VERSION_SHORT$/maintenance/configurations/)
 for more details on the available configurations.
-
-For example, if you want to configure to use Hive catalog, you can configure 
like following:
-```yaml
-datalake.enabled: true
-datalake.format: paimon
-datalake.paimon.metastore: hive
-datalake.paimon.uri: thrift://<hive-metastore-host-name>:<port>
-datalake.paimon.warehouse: hdfs:///path/to/warehouse
-```
-
-#### Add other jars required by datalake
-While Fluss includes the core Paimon library, additional jars may still need 
to be manually added to `${FLUSS_HOME}/plugins/paimon/` according to your needs.
-For example:
-- If you are using Paimon filesystem catalog with OSS filesystem, you need to 
put `paimon-oss-<paimon_version>.jar` into directory 
`${FLUSS_HOME}/plugins/paimon/`.
-- If you are using Paimon Hive catalog, you need to put [the flink sql hive 
connector 
jar](https://nightlies.apache.org/flink/flink-docs-stable/docs/connectors/table/hive/overview/#using-bundled-hive-jar)
 into directory `${FLUSS_HOME}/plugins/paimon/`.
-
-Additionally, when using Paimon with HDFS, you must also configure the Fluss 
server with the Hadoop environment. See the [HDFS setup 
guide](/docs/maintenance/filesystems/hdfs.md) for detailed instructions.
-
-### Start The Datalake Tiering Service
-Then, you must start the datalake tiering service to tier Fluss's data to the 
lakehouse storage.
-#### Prerequisites
-- A running Flink cluster (currently only Flink is supported as the tiering 
backend)
-- Download 
[fluss-flink-tiering-$FLUSS_VERSION$.jar]($FLUSS_MAVEN_REPO_URL$/org/apache/fluss/fluss-flink-tiering/$FLUSS_VERSION$/fluss-flink-tiering-$FLUSS_VERSION$.jar)
 (see [Dependencies](#dependencies))
-
-#### Prepare required jars
-- Put the Fluss Flink connector JAR into `${FLINK_HOME}/lib`; pick the version 
matching your Flink runtime (see 
[Dependencies](../../engine-flink/getting-started.md#dependencies)). For Flink 
1.20, use 
[fluss-flink-1.20-$FLUSS_VERSION$.jar]($FLUSS_MAVEN_REPO_URL$/org/apache/fluss/fluss-flink-1.20/$FLUSS_VERSION$/fluss-flink-1.20-$FLUSS_VERSION$.jar).
-- If you are using [Amazon S3](http://aws.amazon.com/s3/), [Aliyun 
OSS](https://www.aliyun.com/product/oss) or [HDFS(Hadoop Distributed File 
System)](https://hadoop.apache.org/docs/stable/) as Fluss's [remote 
storage](maintenance/tiered-storage/remote-storage.md),
-  you should download the corresponding Fluss filesystem JAR (see 
[Filesystems](../filesystems/overview.md)) and also put it into 
`${FLINK_HOME}/lib`
-- Put 
[fluss-lake-paimon-$FLUSS_VERSION$.jar]($FLUSS_MAVEN_REPO_URL$/org/apache/fluss/fluss-lake-paimon/$FLUSS_VERSION$/fluss-lake-paimon-$FLUSS_VERSION$.jar)
 into `${FLINK_HOME}/lib`
-- Put [paimon-bundle 
jar](https://repo.maven.apache.org/maven2/org/apache/paimon/paimon-bundle/$PAIMON_VERSION$/paimon-bundle-$PAIMON_VERSION$.jar)
 into `${FLINK_HOME}/lib`
-- [Download](https://flink.apache.org/downloads/) pre-bundled Hadoop jar 
`flink-shaded-hadoop-2-uber-*.jar` and put into `${FLINK_HOME}/lib`
-- Put Paimon's [filesystem 
jar](https://paimon.apache.org/docs/$PAIMON_VERSION_SHORT$/project/download/) 
into `${FLINK_HOME}/lib`, if you use s3 to store paimon data, please put 
`paimon-s3` jar into `${FLINK_HOME}/lib`
-- The other jars that Paimon may require, for example, if you use HiveCatalog, 
you will need to put hive related jars
-
-
-#### Start Datalake Tiering Service
-After the Flink Cluster has been started, you can execute the 
`fluss-flink-tiering-$FLUSS_VERSION$.jar` by using the following command to 
start datalake tiering service:
-```shell
-<FLINK_HOME>/bin/flink run /path/to/fluss-flink-tiering-$FLUSS_VERSION$.jar \
-    --fluss.bootstrap.servers localhost:9123 \
-    --datalake.format paimon \
-    --datalake.paimon.metastore filesystem \
-    --datalake.paimon.warehouse /tmp/paimon
-```
-
-**Note:**
-- The `fluss.bootstrap.servers` should be the bootstrap server address of your 
Fluss cluster. You must configure all options with the `datalake.` prefix in 
the [server.yaml](#modify-serveryaml) file to run the tiering service. In this 
case, these parameters are `--datalake.format`, `--datalake.paimon.metastore`, 
and `--datalake.paimon.warehouse`.
-- The Flink tiering service is stateless, and you can run multiple tiering 
services simultaneously to tier tables in Fluss.
-These tiering services are coordinated by the Fluss cluster to ensure 
exactly-once semantics when tiering data to the lake storage. This means you 
can freely scale the service up or down according to your workload.
-- This follows the standard practice for [submitting jobs to 
Flink](https://nightlies.apache.org/flink/flink-docs-release-1.20/docs/deployment/cli/),
 where you can use the `-D` parameter to specify Flink-related configurations.
-For example, if you want to set the tiering service job name to `My Fluss 
Tiering Service1` and use `3` as the job parallelism, you can use the following 
command:
-```shell
-<FLINK_HOME>/bin/flink run \
-    -Dpipeline.name="My Fluss Tiering Service1" \
-    -Dparallelism.default=3 \
-    /path/to/fluss-flink-tiering-$FLUSS_VERSION$.jar \
-    --fluss.bootstrap.servers localhost:9123 \
-    --datalake.format paimon \
-    --datalake.paimon.metastore filesystem \
-    --datalake.paimon.warehouse /tmp/paimon
+Fluss processes configurations by removing the `datalake.<format>.` prefix and 
uses the remaining configuration to create the data lake catalog.
+
+For format-specific configuration, see:
+- [Paimon](../../streaming-lakehouse/datalake-formats/paimon.md)
+- [Iceberg](../../streaming-lakehouse/datalake-formats/iceberg.md)
+- [Lance](../../streaming-lakehouse/datalake-formats/lance.md)
+
+## Table-Level Options
+
+| Option | Type | Default | Description |
+|--------|------|---------|-------------|
+| `table.datalake.enabled` | Boolean | false | Enable lakehouse storage for 
this table |
+| `table.datalake.freshness` | Duration | 3min | Maximum lag between Fluss and 
data lake table |
+| `table.datalake.format` | String | - | Data lake format (paimon, iceberg, 
lance). Inherits from cluster config |
+| `table.datalake.auto-compaction` | Boolean | false | Auto-trigger compaction 
in the data lake |
+| `table.datalake.auto-expire-snapshot` | Boolean | false | Auto-expire 
snapshots in the data lake |
+
+Example:
+```sql title="Flink SQL"
+CREATE TABLE my_table (
+    id BIGINT PRIMARY KEY NOT ENFORCED,
+    name STRING
+) WITH (
+    'table.datalake.enabled' = 'true',
+    'table.datalake.freshness' = '1min'
+);
 ```
 
-### Enable Lakehouse Storage Per Table
-To enable lakehouse storage for a table, the table must be created with the 
option `'table.datalake.enabled' = 'true'`.
+## Tiering Service Options
 
-Another option `table.datalake.freshness`, allows per-table configuration of 
data freshness in the datalake.
-It defines the maximum amount of time that the datalake table's content should 
lag behind updates to the Fluss table. 
-Based on this target freshness, the Fluss tiering service automatically moves 
data from the Fluss table and updates to the datalake table, so that the data 
in the datalake table is kept up to date within this target.
-The default is `3min`, if the data does not need to be as fresh, you can 
specify a longer target freshness time to reduce costs.
+| Option | Type | Default | Description |
+|--------|------|---------|-------------|
+| `lake.tiering.auto-expire-snapshot` | Boolean | false | Auto-trigger 
snapshot expiration on commit, even if `table.datalake.auto-expire-snapshot` is 
false |
 
-# Datalake Tiering Service Options
+## Data Retention
 
-The following table lists the options that can be used to configure the 
datalake tiering service.
+When using lakehouse storage with Union Read:
+- **Expired Fluss log data** (controlled by `table.log.ttl`) remains 
accessible via the lake if previously tiered
+- **Cleaned-up partitions** (controlled by 
`table.auto-partition.num-retention`) remain accessible via the lake if 
previously tiered
 
-| Option                                  | Type     | Default | Description   
                                                                                
                                                                     |
-|-----------------------------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| lake.tiering.auto-expire-snapshot       | Boolean  | false   | If true, 
snapshot expiration will be triggered automatically when tiering service 
commits to the datalake, even if `table.datalake.auto-expire-snapshot` is 
false. |
\ No newline at end of file
+This enables Fluss to store only recent data while the lake serves as a 
complete historical archive.
diff --git a/website/docs/maintenance/tiered-storage/remote-storage.md 
b/website/docs/maintenance/tiered-storage/remote-storage.md
index 0376e0a40..1d00a537d 100644
--- a/website/docs/maintenance/tiered-storage/remote-storage.md
+++ b/website/docs/maintenance/tiered-storage/remote-storage.md
@@ -6,7 +6,7 @@ sidebar_position: 2
 # Remote Storage
 
 Remote storage usually means a cost-efficient and fault-tolerant storage 
comparing to local disk, such as S3, HDFS, OSS.
-See more detail about how to configure remote storage in documentation of 
[filesystems](maintenance/filesystems/overview.md).
+See more detail about how to configure remote storage in documentation of 
[filesystems](filesystems/overview.md).
 
 For log table, Fluss will use remote storage to store the tiered log segments 
of data. For primary key table, Fluss will use remote storage to store the 
snapshot as well as the tiered log segments for change log.
 
diff --git a/website/docs/quickstart/flink.md b/website/docs/quickstart/flink.md
index 8ee3b7ba4..edb92924d 100644
--- a/website/docs/quickstart/flink.md
+++ b/website/docs/quickstart/flink.md
@@ -147,11 +147,11 @@ volumes:
 The Docker Compose environment consists of the following containers:
 - **RustFS:** an S3-compatible object storage for tiered storage. You can 
access the RustFS console at http://localhost:9001 with credentials 
`rustfsadmin/rustfsadmin`. An init container (`rustfs-init`) automatically 
creates the `fluss` bucket on startup.
 - **Fluss Cluster:** a Fluss `CoordinatorServer`, a Fluss `TabletServer` and a 
`ZooKeeper` server.
-   - Credentials are configured directly with `s3.access-key` and 
`s3.secret-key`. The `s3.assumed.role.arn` and `s3.assumed.role.sts.endpoint` 
options configure [AssumeRole 
STS](/maintenance/filesystems/s3.md#assumerole-sts-configuration) which is 
required by RustFS for delegation token support. Production systems should use 
CredentialsProvider chain specific to cloud environments.
+   - Credentials are configured directly with `s3.access-key` and 
`s3.secret-key`. The `s3.assumed.role.arn` and `s3.assumed.role.sts.endpoint` 
options configure [AssumeRole 
STS](../maintenance/tiered-storage/filesystems/s3.md#assumerole-sts-configuration)
 which is required by RustFS for delegation token support. Production systems 
should use CredentialsProvider chain specific to cloud environments.
 - **Flink Cluster**: a Flink `JobManager`, a Flink `TaskManager`, and a Flink 
SQL client container to execute queries. The 
[`apache/fluss-quickstart-flink`](https://hub.docker.com/r/apache/fluss-quickstart-flink)
 image bundles the Fluss Flink connector, 
[flink-faker](https://github.com/knaufk/flink-faker) for demo data generation, 
and S3 filesystem support, so no extra jar downloads are required for this 
guide.
 
 :::tip
-[RustFS](https://github.com/rustfs/rustfs) is used as replacement for S3 in 
this quickstart example, for your production setup you may want to configure 
this to use cloud file system. See [here](/maintenance/filesystems/overview.md) 
for information on how to setup cloud file systems
+[RustFS](https://github.com/rustfs/rustfs) is used as replacement for S3 in 
this quickstart example, for your production setup you may want to configure 
this to use cloud file system. See 
[here](/maintenance/tiered-storage/filesystems/overview.md) for information on 
how to setup cloud file systems
 :::
 
 3. To start all containers, run:
diff --git a/website/docs/quickstart/lakehouse.md 
b/website/docs/quickstart/lakehouse.md
index b9e560a92..3314a7267 100644
--- a/website/docs/quickstart/lakehouse.md
+++ b/website/docs/quickstart/lakehouse.md
@@ -182,7 +182,7 @@ The Docker Compose environment consists of the following 
containers:
 
 
 :::tip
-[RustFS](https://github.com/rustfs/rustfs) is used as replacement for S3 in 
this quickstart example, for your production setup you may want to configure 
this to use cloud file system. See [here](/maintenance/filesystems/overview.md) 
for information on how to setup cloud file systems
+[RustFS](https://github.com/rustfs/rustfs) is used as replacement for S3 in 
this quickstart example, for your production setup you may want to configure 
this to use cloud file system. See 
[here](/maintenance/tiered-storage/filesystems/overview.md) for information on 
how to setup cloud file systems
 :::
 
 4. To start all containers, run:
@@ -396,7 +396,7 @@ The Docker Compose environment consists of the following 
containers:
 - **RustFS**: an S3-compatible storage system used both as Fluss remote 
storage and Iceberg's filesystem warehouse.
 
 :::tip
-[RustFS](https://github.com/rustfs/rustfs) is used as replacement for S3 in 
this quickstart example, for your production setup you may want to configure 
this to use cloud file system. See [here](/maintenance/filesystems/overview.md) 
for information on how to setup cloud file systems
+[RustFS](https://github.com/rustfs/rustfs) is used as replacement for S3 in 
this quickstart example, for your production setup you may want to configure 
this to use cloud file system. See 
[here](/maintenance/tiered-storage/filesystems/overview.md) for information on 
how to setup cloud file systems
 :::
 
 4. To start all containers, run:
diff --git a/website/docs/streaming-lakehouse/datalake-catalogs/_category_.json 
b/website/docs/streaming-lakehouse/datalake-catalogs/_category_.json
new file mode 100644
index 000000000..01d042de8
--- /dev/null
+++ b/website/docs/streaming-lakehouse/datalake-catalogs/_category_.json
@@ -0,0 +1,4 @@
+{
+  "label": "DataLake Catalogs",
+  "position": 5
+}
diff --git 
a/website/docs/streaming-lakehouse/integrate-data-lakes/catalogs/lakekeeper.md 
b/website/docs/streaming-lakehouse/datalake-catalogs/lakekeeper.md
similarity index 85%
rename from 
website/docs/streaming-lakehouse/integrate-data-lakes/catalogs/lakekeeper.md
rename to website/docs/streaming-lakehouse/datalake-catalogs/lakekeeper.md
index b5fbf779c..c20462578 100644
--- 
a/website/docs/streaming-lakehouse/integrate-data-lakes/catalogs/lakekeeper.md
+++ b/website/docs/streaming-lakehouse/datalake-catalogs/lakekeeper.md
@@ -9,7 +9,7 @@ sidebar_position: 1
 
 [Lakekeeper](https://lakekeeper.io/) is an Apache-licensed Iceberg REST 
Catalog written in Rust. It provides a standards-compliant [Iceberg REST 
Catalog](https://iceberg.apache.org/concepts/catalog/#decoupling-using-the-rest-catalog)
 interface, making tiered Iceberg tables discoverable and queryable by any 
Iceberg-compatible engine.
 
-This guide explains how to configure Fluss to use Lakekeeper as its Iceberg 
catalog. For general Iceberg integration details (table mapping, data types, 
limitations), see [Iceberg](../formats/iceberg.md).
+This guide explains how to configure Fluss to use Lakekeeper as its Iceberg 
catalog. For general Iceberg integration details (table mapping, data types, 
limitations), see [Iceberg](../datalake-formats/iceberg.md).
 
 ## Quick Start with Docker Compose
 
@@ -20,7 +20,7 @@ A complete Docker Compose example including Fluss, the 
tiering service, and Lake
 When Fluss is configured with Lakekeeper as its Iceberg REST catalog:
 
 1. Fluss creates and manages Iceberg table metadata through Lakekeeper's REST 
API
-2. The [tiering 
service](maintenance/tiered-storage/lakehouse-storage.md#start-the-datalake-tiering-service)
 writes data to object storage and commits snapshots via Lakekeeper
+2. The [tiering 
service](../../install-deploy/deploying-streaming-lakehouse.md#starting-the-tiering-service)
 writes data to object storage and commits snapshots via Lakekeeper
 3. Any Iceberg-compatible engine (Flink, Spark, Trino, StarRocks, etc.) can 
discover and query the tiered tables through Lakekeeper
 
 ## Prerequisites
@@ -91,11 +91,11 @@ wget -P ${FLUSS_HOME}/plugins/iceberg/ \
     
https://repo1.maven.org/maven2/io/trino/hadoop/hadoop-apache/3.3.5-2/hadoop-apache-3.3.5-2.jar
 ```
 
-See [Iceberg - Hadoop 
Dependencies](../formats/iceberg.md#1-hadoop-dependencies-configuration) for 
alternative approaches.
+See [Iceberg - Hadoop 
Dependencies](../datalake-formats/iceberg.md#1-hadoop-dependencies-configuration)
 for alternative approaches.
 
 ### Start Tiering Service
 
-Follow the [Iceberg tiering service 
setup](../formats/iceberg.md#start-tiering-service-to-iceberg) to prepare the 
required JARs and start the tiering service. Use REST catalog parameters when 
launching the Flink tiering job:
+Follow the [Iceberg tiering service 
setup](../datalake-formats/iceberg.md#start-tiering-service-to-iceberg) to 
prepare the required JARs and start the tiering service. Use REST catalog 
parameters when launching the Flink tiering job:
 
 ```bash
 ${FLINK_HOME}/bin/flink run /path/to/fluss-flink-tiering-$FLUSS_VERSION$.jar \
@@ -137,11 +137,11 @@ SET 'execution.runtime-mode' = 'batch';
 SELECT COUNT(*) FROM orders;
 ```
 
-For details on union reads, streaming reads, and reading with other engines, 
see [Iceberg - Read Tables](../formats/iceberg.md#read-tables).
+For details on union reads, streaming reads, and reading with other engines, 
see [Iceberg - Read Tables](../datalake-formats/iceberg.md#read-tables).
 
 ## Further Reading
 
-- [Iceberg Integration](../formats/iceberg.md) - Table mapping, data types, 
supported catalog types, and limitations
-- [Lakehouse Storage](maintenance/tiered-storage/lakehouse-storage.md) - 
General tiered storage setup
+- [Iceberg Integration](../datalake-formats/iceberg.md) - Table mapping, data 
types, supported catalog types, and limitations
+- [Lakehouse Storage](../../maintenance/tiered-storage/lakehouse-storage.md) - 
General tiered storage setup
 - [Lakekeeper Documentation](https://docs.lakekeeper.io) - Deploying and 
managing Lakekeeper
 - [Lakekeeper Fluss Engine 
Docs](https://docs.lakekeeper.io/docs/nightly/engines/#apache-fluss) - 
Lakekeeper-side configuration reference
diff --git 
a/website/docs/streaming-lakehouse/integrate-data-lakes/catalogs/polaris.md 
b/website/docs/streaming-lakehouse/datalake-catalogs/polaris.md
similarity index 90%
rename from 
website/docs/streaming-lakehouse/integrate-data-lakes/catalogs/polaris.md
rename to website/docs/streaming-lakehouse/datalake-catalogs/polaris.md
index 82a242d36..3ce7bba95 100644
--- a/website/docs/streaming-lakehouse/integrate-data-lakes/catalogs/polaris.md
+++ b/website/docs/streaming-lakehouse/datalake-catalogs/polaris.md
@@ -9,14 +9,14 @@ sidebar_position: 2
 
 [Apache Polaris](https://polaris.apache.org/) is an open-source, 
fully-featured catalog for Apache Iceberg. It implements Iceberg's [REST 
Catalog](https://iceberg.apache.org/concepts/catalog/#decoupling-using-the-rest-catalog)
 interface, making Iceberg tables discoverable and queryable by any 
Iceberg-compatible engine, with role-based access control and credential 
vending built in.
 
-This guide explains how to configure Fluss to use Polaris as its Iceberg 
catalog. For general Iceberg integration details (table mapping, data types, 
limitations), see [Iceberg](../formats/iceberg.md).
+This guide explains how to configure Fluss to use Polaris as its Iceberg 
catalog. For general Iceberg integration details (table mapping, data types, 
limitations), see [Iceberg](../datalake-formats/iceberg.md).
 
 ## How It Works
 
 When Fluss is configured with Polaris as its Iceberg REST catalog:
 
 1. Fluss creates and manages Iceberg table metadata through Polaris's REST API
-2. The [tiering 
service](maintenance/tiered-storage/lakehouse-storage.md#start-the-datalake-tiering-service)
 writes data to object storage and commits snapshots via Polaris
+2. The [tiering 
service](../../install-deploy/deploying-streaming-lakehouse.md#starting-the-tiering-service)
 writes data to object storage and commits snapshots via Polaris
 3. Any Iceberg-compatible engine (Flink, Spark, Trino, StarRocks, etc.) can 
discover and query the tiered tables through Polaris
 
 ## Prerequisites
@@ -90,7 +90,7 @@ Fluss strips the `datalake.iceberg.` prefix and passes the 
remaining properties
 
 ### Start Tiering Service
 
-Follow the [Iceberg tiering service 
setup](../formats/iceberg.md#start-tiering-service-to-iceberg) to prepare the 
required JARs and start the tiering service. Use the REST catalog parameters 
when launching the Flink tiering job:
+Follow the [Iceberg tiering service 
setup](../datalake-formats/iceberg.md#start-tiering-service-to-iceberg) to 
prepare the required JARs and start the tiering service. Use the REST catalog 
parameters when launching the Flink tiering job:
 
 ```bash
 ${FLINK_HOME}/bin/flink run /path/to/fluss-flink-tiering-$FLUSS_VERSION$.jar \
@@ -137,10 +137,10 @@ SET 'execution.runtime-mode' = 'batch';
 SELECT COUNT(*) FROM orders;
 ```
 
-For details on union reads, streaming reads, and reading with other engines, 
see [Iceberg - Read Tables](../formats/iceberg.md#read-tables).
+For details on union reads, streaming reads, and reading with other engines, 
see [Iceberg - Read Tables](../datalake-formats/iceberg.md#read-tables).
 
 ## Further Reading
 
-- [Iceberg Integration](../formats/iceberg.md) - Table mapping, data types, 
supported catalog types, and limitations
-- [Lakehouse Storage](maintenance/tiered-storage/lakehouse-storage.md) - 
General tiered storage setup
+- [Iceberg Integration](../datalake-formats/iceberg.md) - Table mapping, data 
types, supported catalog types, and limitations
+- [Lakehouse Storage](../../maintenance/tiered-storage/lakehouse-storage.md) - 
General tiered storage setup
 - [Apache Polaris Documentation](https://polaris.apache.org/) - Deploying and 
managing Polaris, catalogs, principals, and access control
diff --git a/website/docs/streaming-lakehouse/datalake-formats/_category_.json 
b/website/docs/streaming-lakehouse/datalake-formats/_category_.json
new file mode 100644
index 000000000..b42be6924
--- /dev/null
+++ b/website/docs/streaming-lakehouse/datalake-formats/_category_.json
@@ -0,0 +1,4 @@
+{
+  "label": "DataLake Formats",
+  "position": 4
+}
diff --git 
a/website/docs/streaming-lakehouse/integrate-data-lakes/formats/iceberg.md 
b/website/docs/streaming-lakehouse/datalake-formats/iceberg.md
similarity index 88%
rename from 
website/docs/streaming-lakehouse/integrate-data-lakes/formats/iceberg.md
rename to website/docs/streaming-lakehouse/datalake-formats/iceberg.md
index bb54356c1..48f1eb93d 100644
--- a/website/docs/streaming-lakehouse/integrate-data-lakes/formats/iceberg.md
+++ b/website/docs/streaming-lakehouse/datalake-formats/iceberg.md
@@ -8,7 +8,7 @@ sidebar_position: 2
 ## Introduction
 
 [Apache Iceberg](https://iceberg.apache.org/) is an open table format for huge 
analytic datasets. It provides ACID transactions, schema evolution, and 
efficient data organization for data lakes.
-To integrate Fluss with Iceberg, you must enable lakehouse storage and 
configure Iceberg as the lakehouse storage. For more details, see [Enable 
Lakehouse 
Storage](maintenance/tiered-storage/lakehouse-storage.md#enable-lakehouse-storage).
+To integrate Fluss with Iceberg, you must enable lakehouse storage and 
configure Iceberg as the lakehouse storage. For more details, see [Deploying 
Streaming Lakehouse](../../install-deploy/deploying-streaming-lakehouse.md).
 
 > **NOTE**: Iceberg requires JDK11 or later. Please ensure that both your 
 > Fluss deployment and the Flink cluster used for tiering services are running 
 > on JDK11+.
 
@@ -123,7 +123,7 @@ The Iceberg version that Fluss bundles is based on 
`1.10.1`. Please ensure the J
 
 ### Start Tiering Service to Iceberg
 
-To tier Fluss's data to Iceberg, you must start the datalake tiering service. 
For guidance, you can refer to [Start The Datalake Tiering 
Service](maintenance/tiered-storage/lakehouse-storage.md#start-the-datalake-tiering-service).
 Although the example uses Paimon, the process is also applicable to Iceberg.
+To tier Fluss's data to Iceberg, you must start the datalake tiering service. 
For guidance, you can refer to [Deploying Streaming 
Lakehouse](../../install-deploy/deploying-streaming-lakehouse.md). Although the 
example uses Paimon, the process is also applicable to Iceberg.
 
 #### Prerequisites: Hadoop Dependencies
 
@@ -166,17 +166,17 @@ export HADOOP_CLASSPATH=`$HADOOP_HOME/bin/hadoop 
classpath`
 
 #### Prepare Required JARs
 
-Follow the dependency management guidelines below for the [Prepare required 
jars](maintenance/tiered-storage/lakehouse-storage.md#prepare-required-jars) 
step:
+Follow the dependency management guidelines below for required JARs:
 
 ##### 1. Core Fluss Components
-- **Fluss Flink Connector**: Put the Fluss Flink connector JAR into 
`${FLINK_HOME}/lib` — see 
[Dependencies](../../../engine-flink/getting-started.md#dependencies) for all 
supported Flink versions.
+- **Fluss Flink Connector**: Put the Fluss Flink connector JAR into 
`${FLINK_HOME}/lib` — see 
[Dependencies](../../engine-flink/getting-started.md#dependencies) for all 
supported Flink versions.
   - For Flink 1.20: 
[fluss-flink-1.20-$FLUSS_VERSION$.jar]($FLUSS_MAVEN_REPO_URL$/org/apache/fluss/fluss-flink-1.20/$FLUSS_VERSION$/fluss-flink-1.20-$FLUSS_VERSION$.jar)
 
 ##### 2. Remote Storage Support
 If you are using remote storage, download the corresponding Fluss filesystem 
JAR and place it into `${FLINK_HOME}/lib`:
-- **Amazon S3**: see [S3 
Dependencies](../../../maintenance/filesystems/s3.md#dependencies)
-- **Aliyun OSS**: see [OSS 
Dependencies](../../../maintenance/filesystems/oss.md#dependencies)
-- **HDFS**: see [HDFS 
Dependencies](../../../maintenance/filesystems/hdfs.md#dependencies)
+- **Amazon S3**: see [S3 
Dependencies](../../maintenance/tiered-storage/filesystems/s3.md#dependencies)
+- **Aliyun OSS**: see [OSS 
Dependencies](../../maintenance/tiered-storage/filesystems/oss.md#dependencies)
+- **HDFS**: see [HDFS 
Dependencies](../../maintenance/tiered-storage/filesystems/hdfs.md#dependencies)
 
 ##### 3. Iceberg Lake Connector
 - **Fluss Lake Iceberg**: Put 
[fluss-lake-iceberg-$FLUSS_VERSION$.jar]($FLUSS_MAVEN_REPO_URL$/org/apache/fluss/fluss-lake-iceberg/$FLUSS_VERSION$/fluss-lake-iceberg-$FLUSS_VERSION$.jar)
 into `${FLINK_HOME}/lib`
@@ -197,7 +197,7 @@ failsafe-3.3.2.jar
 
 #### Start Datalake Tiering Service
 
-When following the [Start Datalake Tiering 
Service](maintenance/tiered-storage/lakehouse-storage.md#start-datalake-tiering-service)
 guide, use Iceberg-specific configurations as parameters when starting the 
Flink tiering job:
+Use Iceberg-specific configurations as parameters when starting the Flink 
tiering job:
 
 ```bash
 <FLINK_HOME>/bin/flink run /path/to/fluss-flink-tiering-$FLUSS_VERSION$.jar \
@@ -262,7 +262,7 @@ CREATE TABLE fluss_order_with_lake (
  ) WITH (
      'table.datalake.enabled' = 'true',
      'table.datalake.freshness' = '30s',
-     'table.datalake.auto-maintenance' = 'true',
+     'table.datalake.auto-compaction' = 'true',
      'iceberg.write.format.default' = 'orc',
      'iceberg.commit.retry.num-retries' = '5'
 );
@@ -441,28 +441,56 @@ You need to place the JARs required by Iceberg to read 
data into `${FLINK_HOME}/
 
 ##### Union Read
 
-To read the full dataset, which includes both Fluss (fresh) and Iceberg 
(historical) data, simply query the table without any suffix. The following 
example illustrates this:
+To read the full dataset, which includes both Fluss (fresh) and Iceberg 
(historical) data, simply query the table without any suffix.
 
-```sql
--- Set execution mode to streaming or batch, here just take batch as an example
+**Table type support:**
+- **Log tables**: Supported in both batch and streaming mode.
+- **Primary key tables**: Supported in both batch and streaming mode. Updates 
tiered to Iceberg are written as equality deletes.
+
+```sql title="Batch mode"
 SET 'execution.runtime-mode' = 'batch';
 
 -- Query will union data from Fluss and Iceberg
-select SUM(visit_count) from fluss_access_log;
-```
+SELECT SUM(visit_count) FROM fluss_access_log;
 
-It supports both batch and streaming modes, utilizing Iceberg for historical 
data and Fluss for fresh data:
+-- Aggregations work across both data sources
+SELECT COUNT(*), SUM(visit_count) FROM fluss_access_log;
 
-- **Batch mode** (only log table)
+-- Predicates are applied across both Fluss and Iceberg data
+SELECT * FROM fluss_access_log WHERE visit_date >= '2024-01-01';
+```
 
-- **Streaming mode** (primary key table and log table)
+```sql title="Streaming mode"
+SET 'execution.runtime-mode' = 'streaming';
 
-  Flink first reads the latest Iceberg snapshot (tiered via tiering service), 
then switches to Fluss starting from the log offset matching that snapshot. 
This design minimizes Fluss storage requirements (reducing costs) while using 
Iceberg as a complete historical archive.
+-- Reads the latest Iceberg snapshot first, then continues from Fluss
+SELECT * FROM fluss_access_log;
+```
+
+Flink first reads the latest Iceberg snapshot (tiered via tiering service), 
then switches to Fluss starting from the log offset matching that snapshot. 
This design minimizes Fluss storage requirements (reducing costs) while using 
Iceberg as a complete historical archive.
 
 Key behavior for data retention:
 - **Expired Fluss log data** (controlled by `table.log.ttl`) remains 
accessible via Iceberg if previously tiered
 - **Cleaned-up partitions** in partitioned tables (controlled by 
`table.auto-partition.num-retention`) remain accessible via Iceberg if 
previously tiered
 
+#### Lake-Only Read
+
+To query only the data already tiered to Iceberg, add the `$lake` suffix to 
the table name:
+
+```sql title="Lake-only read"
+-- Reads only the data tiered to Iceberg, not the fresh data still in Fluss
+SELECT * FROM fluss_access_log$lake;
+```
+
+Data becomes visible through `$lake` as soon as the tiering service commits 
it: each tiering round produces one Iceberg snapshot, and the commit is 
readable immediately once it succeeds — there's no separate flush or refresh 
step.
+
+You can also query Iceberg's system tables through the `$lake$<system-table>` 
suffix, for example to inspect commit history via the `snapshots` table:
+
+```sql title="Read Iceberg snapshots metadata"
+-- Each row corresponds to one tiering commit
+SELECT committed_at, snapshot_id, operation, summary FROM 
fluss_access_log$lake$snapshots;
+```
+
 ### Reading with Other Engines
 
 Since data tiered to Iceberg from Fluss is stored as standard Iceberg tables, 
you can use any Iceberg-compatible engine. Below is an example using 
[StarRocks](https://docs.starrocks.io/docs/data_source/catalog/iceberg/iceberg_catalog/):
diff --git 
a/website/docs/streaming-lakehouse/integrate-data-lakes/formats/lance.md 
b/website/docs/streaming-lakehouse/datalake-formats/lance.md
similarity index 89%
rename from 
website/docs/streaming-lakehouse/integrate-data-lakes/formats/lance.md
rename to website/docs/streaming-lakehouse/datalake-formats/lance.md
index 85f159dc1..0b016539e 100644
--- a/website/docs/streaming-lakehouse/integrate-data-lakes/formats/lance.md
+++ b/website/docs/streaming-lakehouse/datalake-formats/lance.md
@@ -8,7 +8,7 @@ sidebar_position: 3
 ## Introduction
 
 [Lance](https://lancedb.github.io/lance/) is a modern table format optimized 
for machine learning and AI applications. 
-To integrate Fluss with Lance, you must enable lakehouse storage and configure 
Lance as the lakehouse storage. For more details, see [Enable Lakehouse 
Storage](maintenance/tiered-storage/lakehouse-storage.md#enable-lakehouse-storage).
+To integrate Fluss with Lance, you must enable lakehouse storage and configure 
Lance as the lakehouse storage. For more details, see [Deploying Streaming 
Lakehouse](../../install-deploy/deploying-streaming-lakehouse.md).
 
 ## Dependencies
 
@@ -69,16 +69,15 @@ CREATE TABLE fluss_order_with_lake (
 ```
 
 ### Start Tiering Service to Lance
-Then, you must start the datalake tiering service to tier Fluss's data to 
Lance. For guidance, you can refer to [Start The Datalake Tiering Service
-](maintenance/tiered-storage/lakehouse-storage.md#start-the-datalake-tiering-service).
 Although the example uses Paimon, the process is also applicable to Lance. 
+Then, you must start the datalake tiering service to tier Fluss's data to 
Lance. For guidance, you can refer to [Deploying Streaming 
Lakehouse](../../install-deploy/deploying-streaming-lakehouse.md). Although the 
example uses Paimon, the process is also applicable to Lance.
 
-But in [Prepare required 
jars](maintenance/tiered-storage/lakehouse-storage.md#prepare-required-jars) 
step, you should follow this guidance:
-- Put the Fluss Flink connector JAR into `${FLINK_HOME}/lib`; pick the 
connector matching your Flink version (see 
[Dependencies](../../../engine-flink/getting-started.md#dependencies)). For 
Flink 1.20, use 
[fluss-flink-1.20-$FLUSS_VERSION$.jar]($FLUSS_MAVEN_REPO_URL$/org/apache/fluss/fluss-flink-1.20/$FLUSS_VERSION$/fluss-flink-1.20-$FLUSS_VERSION$.jar).
-- If you are using [Amazon S3](http://aws.amazon.com/s3/), [Aliyun 
OSS](https://www.aliyun.com/product/oss) or [HDFS(Hadoop Distributed File 
System)](https://hadoop.apache.org/docs/stable/) as Fluss's [remote 
storage](maintenance/tiered-storage/remote-storage.md),
-  you should download the corresponding Fluss filesystem JAR (see the 
[Filesystems](../../../maintenance/filesystems/overview.md) section) and also 
put it into `${FLINK_HOME}/lib`.
+For required JARs, you should follow this guidance:
+- Put the Fluss Flink connector JAR into `${FLINK_HOME}/lib`; pick the 
connector matching your Flink version (see 
[Dependencies](../../engine-flink/getting-started.md#dependencies)). For Flink 
1.20, use 
[fluss-flink-1.20-$FLUSS_VERSION$.jar]($FLUSS_MAVEN_REPO_URL$/org/apache/fluss/fluss-flink-1.20/$FLUSS_VERSION$/fluss-flink-1.20-$FLUSS_VERSION$.jar).
+- If you are using [Amazon S3](http://aws.amazon.com/s3/), [Aliyun 
OSS](https://www.aliyun.com/product/oss) or [HDFS(Hadoop Distributed File 
System)](https://hadoop.apache.org/docs/stable/) as Fluss's [remote 
storage](../../maintenance/tiered-storage/remote-storage.md),
+  you should download the corresponding Fluss filesystem JAR (see 
[Filesystems](../../maintenance/tiered-storage/filesystems/overview.md)) and 
also put it into `${FLINK_HOME}/lib`.
 - Put 
[fluss-lake-lance-$FLUSS_VERSION$.jar]($FLUSS_MAVEN_REPO_URL$/org/apache/fluss/fluss-lake-lance/$FLUSS_VERSION$/fluss-lake-lance-$FLUSS_VERSION$.jar)
 into `${FLINK_HOME}/lib`.
 
-Additionally, when following the [Start Datalake Tiering 
Service](maintenance/tiered-storage/lakehouse-storage.md#start-datalake-tiering-service)
 guide, make sure to use Lance-specific configurations as parameters when 
starting the Flink tiering job:
+Make sure to use Lance-specific configurations as parameters when starting the 
Flink tiering job:
 ```shell
 <FLINK_HOME>/bin/flink run /path/to/fluss-flink-tiering-$FLUSS_VERSION$.jar \
     --fluss.bootstrap.servers localhost:9123 \
@@ -126,7 +125,7 @@ ds = 
lance.dataset("<warehouse_path>/<database_name>/<table_name>.lance")
 
 Lance internally stores data in Arrow format.
 When integrating with Lance, Fluss automatically converts between Fluss data 
types and Lance data types.  
-The following table shows the mapping between [Fluss data 
types](table-design/data-types.md) and Lance data types:
+The following table shows the mapping between [Fluss data 
types](../../table-design/data-types.md) and Lance data types:
 
 | Fluss Data Type               | Lance Data Type           |
 |-------------------------------|---------------------------|
diff --git 
a/website/docs/streaming-lakehouse/integrate-data-lakes/formats/paimon.md 
b/website/docs/streaming-lakehouse/datalake-formats/paimon.md
similarity index 95%
rename from 
website/docs/streaming-lakehouse/integrate-data-lakes/formats/paimon.md
rename to website/docs/streaming-lakehouse/datalake-formats/paimon.md
index 595c5cb28..4a9e42ef7 100644
--- a/website/docs/streaming-lakehouse/integrate-data-lakes/formats/paimon.md
+++ b/website/docs/streaming-lakehouse/datalake-formats/paimon.md
@@ -8,7 +8,7 @@ sidebar_position: 1
 ## Introduction
 
 [Apache Paimon](https://paimon.apache.org/) innovatively combines a lake 
format with an LSM (Log-Structured Merge-tree) structure, bringing efficient 
updates into the lake architecture. 
-To integrate Fluss with Paimon, you must enable lakehouse storage and 
configure Paimon as the lakehouse storage. For more details, see [Enable 
Lakehouse 
Storage](maintenance/tiered-storage/lakehouse-storage.md#enable-lakehouse-storage).
+To integrate Fluss with Paimon, you must enable lakehouse storage and 
configure Paimon as the lakehouse storage. For more details, see [Deploying 
Streaming Lakehouse](../../install-deploy/deploying-streaming-lakehouse.md).
 
 ## Dependencies
 
@@ -39,7 +39,7 @@ Verify downloaded JARs against the [KEYS 
file](https://downloads.apache.org/incu
 
 ## Configure Paimon as LakeHouse Storage
 
-For general guidance on configuring Paimon as the lakehouse storage, you can 
refer to [Lakehouse Storage](maintenance/tiered-storage/lakehouse-storage.md) 
documentation. When starting the tiering service, make sure to use 
Paimon-specific configurations as parameters.
+For general guidance on configuring Paimon as the lakehouse storage, you can 
refer to [Deploying Streaming 
Lakehouse](../../install-deploy/deploying-streaming-lakehouse.md) 
documentation. When starting the tiering service, make sure to use 
Paimon-specific configurations as parameters.
 
 When a table is created or altered with the option `'table.datalake.enabled' = 
'true'`, Fluss will automatically create a corresponding Paimon table with the 
same table path.
 The schema of the Paimon table matches that of the Fluss table, except for the 
addition of three system columns at the end: `__bucket`, `__offset`, and 
`__timestamp`.  
@@ -147,8 +147,8 @@ It supports both batch and streaming modes, using Paimon 
for historical data and
   This design enables Fluss to store only a small portion of the dataset in 
the Fluss cluster, reducing costs, while Paimon serves as the source of 
complete historical data when needed. 
 
 Key behavior for data retention:
-- **Expired Fluss log data** (controlled by `table.log.ttl`) remains 
accessible via Iceberg if previously tiered
-- **Cleaned-up partitions** in partitioned tables (controlled by 
`table.auto-partition.num-retention`) remain accessible via Iceberg if 
previously tiered
+- **Expired Fluss log data** (controlled by `table.log.ttl`) remains 
accessible via Paimon if previously tiered
+- **Cleaned-up partitions** in partitioned tables (controlled by 
`table.auto-partition.num-retention`) remain accessible via Paimon if 
previously tiered
 
 ### Reading with other Engines
 
@@ -182,7 +182,7 @@ SELECT * FROM 
paimon_catalog.fluss.enriched_orders$snapshots;
 ## Data Type Mapping
 
 When integrating with Paimon, Fluss automatically converts between Fluss data 
types and Paimon data types.  
-The following table shows the mapping between [Fluss data 
types](table-design/data-types.md) and Paimon data types:
+The following table shows the mapping between [Fluss data 
types](../../table-design/data-types.md) and Paimon data types:
 
 | Fluss Data Type                                                 | Paimon 
Data Type                                                |
 
|-----------------------------------------------------------------|-----------------------------------------------------------------|
@@ -253,4 +253,4 @@ For partitioned tables, the metadata structure includes 
partition information:
 | `partition_id`   | Unique identifier in Fluss for the partition | `0`, `1`   
                  |
 | `bucket`         | Bucket identifier within the partition       | `0`, `1`, 
`2`                |
 | `partition_name` | Human-readable partition name                | 
`"date=2025"`, `"date=2026"` |
-| `offset`         | Offset within the partition's log            | `3`, 
`1000`                  |
\ No newline at end of file
+| `offset`         | Offset within the partition's log            | `3`, 
`1000`                  |
diff --git 
a/website/docs/streaming-lakehouse/integrate-data-lakes/_category_.json 
b/website/docs/streaming-lakehouse/integrate-data-lakes/_category_.json
deleted file mode 100644
index 095e56dff..000000000
--- a/website/docs/streaming-lakehouse/integrate-data-lakes/_category_.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "label": "Integrate Data Lakes",
-  "position": 2
-}
diff --git 
a/website/docs/streaming-lakehouse/integrate-data-lakes/catalogs/_category_.json
 
b/website/docs/streaming-lakehouse/integrate-data-lakes/catalogs/_category_.json
deleted file mode 100644
index 0586a8325..000000000
--- 
a/website/docs/streaming-lakehouse/integrate-data-lakes/catalogs/_category_.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "label": "Data Lake Catalogs",
-  "position": 2
-}
diff --git 
a/website/docs/streaming-lakehouse/integrate-data-lakes/formats/_category_.json 
b/website/docs/streaming-lakehouse/integrate-data-lakes/formats/_category_.json
deleted file mode 100644
index b6c3a5fdc..000000000
--- 
a/website/docs/streaming-lakehouse/integrate-data-lakes/formats/_category_.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "label": "Data Lake Formats",
-  "position": 1
-}
diff --git a/website/docs/streaming-lakehouse/overview.md 
b/website/docs/streaming-lakehouse/overview.md
index 476ec6813..d86ab3e57 100644
--- a/website/docs/streaming-lakehouse/overview.md
+++ b/website/docs/streaming-lakehouse/overview.md
@@ -25,7 +25,7 @@ Overall, these data lake formats typically achieve data 
freshness at best within
 ## Streaming Lakehouse: Unified Stream & Lakehouse
 
 Fluss is a streaming storage supporting streaming reads and writes with 
sub-second low latency.
-With [Lakehouse Storage](maintenance/tiered-storage/lakehouse-storage.md), 
Fluss unifies data streaming and data Lakehouse by serving real-time streaming 
data on top of Lakehouse.
+With [Lakehouse Storage](../maintenance/tiered-storage/lakehouse-storage.md), 
Fluss unifies data streaming and data Lakehouse by serving real-time streaming 
data on top of Lakehouse.
 This not only brings low latency to data Lakehouse, but also adds powerful 
analytics to data streams.
 
 To build a Streaming Lakehouse, Fluss maintains a tiering service that 
compacts real-time data from the Fluss cluster into the data lake format stored 
in the Lakehouse Storage.
@@ -43,4 +43,13 @@ Some powerful features it provides are:
 - **Analytical Streams**: The union reads help data streams to have the 
powerful analytics capabilities. This reduces complexity when developing 
streaming applications, simplifies debugging, and allows for immediate access 
to live data insights.
 - **Connect to Lakehouse Ecosystem**: Fluss keeps the table metadata in sync 
with data lake catalogs while compacting data into Lakehouse. As a result, 
external engines like Spark, StarRocks, Flink, and Trino can read the data 
directly. They simply connect to the data lake catalog.
 
-Currently, Fluss supports 
[Paimon](streaming-lakehouse/integrate-data-lakes/formats/paimon.md), 
[Iceberg](streaming-lakehouse/integrate-data-lakes/formats/iceberg.md), and 
[Lance](streaming-lakehouse/integrate-data-lakes/formats/lance.md) as Lakehouse 
Storage, more kinds of data lake formats are on the roadmap.
+Currently, Fluss supports [Paimon](datalake-formats/paimon.md), 
[Iceberg](datalake-formats/iceberg.md), and [Lance](datalake-formats/lance.md) 
as Lakehouse Storage, more kinds of data lake formats are on the roadmap.
+
+## Getting Started
+
+Ready to build your Streaming Lakehouse? Here's a recommended path:
+
+1. **Hands-on Tutorial**: Follow the [Lakehouse 
Quickstart](../quickstart/lakehouse.md) to build a working Streaming Lakehouse 
in minutes using Docker
+2. **Understand the Architecture**: Learn how [Tiering 
Service](tiering-service.md) continuously syncs data to your data lake
+3. **Query Your Data**: Explore [Union Read](union-read.md) to query real-time 
and historical data together
+4. **Production Deployment**: See [Deploying Streaming 
Lakehouse](../install-deploy/deploying-streaming-lakehouse.md) for cluster setup
diff --git a/website/docs/streaming-lakehouse/tiering-service.md 
b/website/docs/streaming-lakehouse/tiering-service.md
new file mode 100644
index 000000000..f92815931
--- /dev/null
+++ b/website/docs/streaming-lakehouse/tiering-service.md
@@ -0,0 +1,102 @@
+---
+title: "Tiering Service"
+sidebar_position: 2
+---
+
+# Tiering Service
+
+The Tiering Service continuously compacts real-time data from Fluss into the 
configured lake format (Paimon, Iceberg, or Lance) for cost-efficient long-term 
storage and analytics.
+
+## Overview
+
+The Tiering Service is implemented as an Apache Flink job that:
+- Reads records from Fluss tables with lakehouse storage enabled
+- Writes data to the configured data lake format (Paimon, Iceberg, or Lance)
+- Maintains exactly-once semantics between Fluss and the data lake
+- Operates incrementally, syncing only missing data segments
+
+For deployment instructions, see [Deploying Streaming 
Lakehouse](../install-deploy/deploying-streaming-lakehouse.md).
+
+## Architecture
+
+The Tiering Service consists of three Flink operators:
+
+| Operator | Description |
+|----------|-------------|
+| **TieringSource** | Reads records from Fluss and writes to the data lake via 
LakeWriter |
+| **TieringCommitter** | Commits batches and advances offsets in both Fluss 
and lake |
+| **No-Op Sink** | Dummy sink required by Flink's topology |
+
+### How It Works
+
+1. **Enumerator** sends heartbeat to Fluss CoordinatorService, receives table 
metadata
+2. **SplitGenerator** calculates data delta between Fluss offsets and lake 
snapshot offsets
+3. **Splits** are created for missing data ranges and assigned to readers
+4. **Readers** fetch records from Fluss tablet servers, write via LakeWriter
+5. **Committer** performs two-phase commit: first to lake, then updates Fluss 
coordinator
+6. Cycle repeats based on `table.datalake.freshness` interval
+
+### Split Types
+
+| Table Type | Split Type | Description |
+|------------|------------|-------------|
+| Log Table (append-only) | TieringLogSplit | Defines starting and stopping 
offsets for a contiguous range |
+| Primary Key Table | TieringSnapshotSplit | References snapshot ID and log 
offset for CDC replay |
+
+## Configuration Options
+
+### Tiering Service Options
+
+The tiering job is a standalone Flink job, and its arguments fall into three 
groups:
+
+- `--fluss.*` — Fluss client configuration, e.g. `--fluss.bootstrap.servers 
localhost:9123`
+- `--datalake.<format>.*` — lake catalog/storage configuration; Fluss strips 
the `datalake.<format>.` prefix before passing the remaining keys to the lake 
connector
+- `--lake.tiering.*` — tiering job-level configuration, e.g. 
`--lake.tiering.auto-expire-snapshot true`
+
+For example:
+
+```shell
+${FLINK_HOME}/bin/flink run \
+    -Dparallelism.default=3 \
+    /path/to/fluss-flink-tiering-$FLUSS_VERSION$.jar \
+    --fluss.bootstrap.servers localhost:9123 \
+    --datalake.format paimon \
+    --datalake.paimon.metastore filesystem \
+    --datalake.paimon.warehouse /tmp/paimon \
+    --lake.tiering.auto-expire-snapshot true
+```
+
+The following `--lake.tiering.*` options are set when starting the tiering job:
+
+| Option | Type | Default | Description |
+|--------|------|---------|-------------|
+| `lake.tiering.auto-expire-snapshot` | Boolean | false | Auto-trigger 
snapshot expiration on commit |
+
+### Table-Level Options
+
+The following `table.datalake.*` options are configured per table when 
creating or altering tables, not on the tiering job:
+
+| Option | Type | Default | Description |
+|--------|------|---------|-------------|
+| `table.datalake.enabled` | Boolean | false | Enable lakehouse storage for 
this table |
+| `table.datalake.freshness` | Duration | 3min | Maximum lag between Fluss and 
lake data |
+| `table.datalake.auto-compaction` | Boolean | false | Auto-trigger compaction 
in the data lake |
+| `table.datalake.auto-expire-snapshot` | Boolean | false | Auto-expire 
snapshots in the data lake |
+
+## Scaling
+
+The Tiering Service is stateless and can be scaled by adjusting Flink 
parallelism:
+
+```shell
+${FLINK_HOME}/bin/flink run \
+    -Dparallelism.default=6 \
+    /path/to/fluss-flink-tiering-$FLUSS_VERSION$.jar \
+    --fluss.bootstrap.servers localhost:9123 \
+    ...
+```
+
+Multiple tiering service jobs can run simultaneously. They are coordinated by 
the Fluss cluster to ensure exactly-once semantics and automatic load balancing.
+
+## Monitoring
+
+Key metrics for monitoring the Tiering Service are available through Flink's 
metrics system. See [Monitoring 
Metrics](../maintenance/observability/monitor-metrics.md#tiering-service-metrics)
 for details on lakehouse tiering metrics.
diff --git a/website/docs/streaming-lakehouse/union-read.md 
b/website/docs/streaming-lakehouse/union-read.md
new file mode 100644
index 000000000..e0e901f8f
--- /dev/null
+++ b/website/docs/streaming-lakehouse/union-read.md
@@ -0,0 +1,113 @@
+---
+title: "Union Read"
+sidebar_position: 3
+---
+
+# Union Read
+
+Union Read is a core feature of Fluss's Streaming Lakehouse that combines 
real-time data from Fluss with historical data from the data lake in a single 
query.
+
+## Overview
+
+For a table with `'table.datalake.enabled' = 'true'`, data exists in two 
layers:
+- **Fluss (hot data)**: Sub-second fresh data stored in Arrow format
+- **Data Lake (cold data)**: Historical data stored in the configured lake 
format
+
+Union Read transparently merges data from both sources, providing sub-second 
freshness with full historical coverage.
+
+## Querying Tables
+
+### Union Read (Default)
+
+Query the table directly to read combined Fluss and lake data:
+
+```sql title="Flink SQL"
+-- Union Read: combines real-time Fluss data + historical lake data
+SELECT * FROM my_table;
+
+-- Aggregations work across both data sources
+SELECT COUNT(*), SUM(amount) FROM orders;
+```
+
+### Lake-Only Read
+
+To query only the data stored in the data lake, use the `$lake` suffix:
+
+```sql title="Flink SQL"
+-- Lake-only read: queries only tiered data
+SELECT * FROM my_table$lake;
+
+-- Access lake-specific system tables
+SELECT snapshot_id, total_record_count FROM my_table$lake$snapshots;
+```
+
+Lake-only queries are useful when:
+- Real-time freshness is not required
+- You need to access lake format-specific system tables
+- You want optimized performance for large historical scans
+
+## Execution Modes
+
+Union Read supports both batch and streaming modes:
+
+### Batch Mode
+
+```sql title="Flink SQL"
+SET 'execution.runtime-mode' = 'batch';
+SELECT SUM(total_price) FROM orders;
+```
+
+The query merges rows from both lake and Fluss, returning the most up-to-date 
results. Multiple executions may produce different outputs as data is 
continuously ingested.
+
+### Streaming Mode
+
+```sql title="Flink SQL"
+SET 'execution.runtime-mode' = 'streaming';
+SELECT * FROM orders;
+```
+
+Flink first reads the latest lake snapshot, then switches to Fluss starting 
from the log offset aligned with that snapshot, ensuring exactly-once semantics.
+
+## Data Deduplication
+
+For **primary key tables**, Union Read automatically deduplicates records with 
the same key, keeping the latest version from Fluss if it exists.
+
+For **log tables** (append-only), Union Read concatenates data from both 
sources without deduplication.
+
+## Data Freshness
+
+The `table.datalake.freshness` option controls how often data is tiered to the 
lake:
+
+```sql title="Flink SQL"
+CREATE TABLE orders (
+    order_id BIGINT PRIMARY KEY NOT ENFORCED,
+    amount DECIMAL(15, 2)
+) WITH (
+    'table.datalake.enabled' = 'true',
+    'table.datalake.freshness' = '1min'
+);
+```
+
+- **Shorter freshness** (e.g., `30s`): Lake data stays closer to real-time, 
less data read from Fluss
+- **Longer freshness** (e.g., `10min`): Better lake read performance due to 
larger files, more data read from Fluss
+
+## Data Retention
+
+Key behavior for data retention with Union Read:
+- **Expired Fluss log data** (controlled by `table.log.ttl`) remains 
accessible via the lake if previously tiered
+- **Cleaned-up partitions** in partitioned tables (controlled by 
`table.auto-partition.num-retention`) remain accessible via the lake if 
previously tiered
+
+## Engine Support
+
+| Engine | Union Read | Lake-Only Read |
+|--------|------------|----------------|
+| Apache Flink | ✅ | ✅ Via `$lake` suffix |
+| Apache Spark | ✅ | ✅ Via native lake connectors |
+| Trino | ❌ | ✅ Via native lake connectors |
+| StarRocks | ❌ | ✅ Via native lake connectors |
+
+For Spark union read usage, see [Spark - 
Reads](../engine-spark/reads.md#lake-enabled-tables-union-read).
+
+External engines can access the tiered lake data directly through native lake 
format connectors. See the specific data lake format documentation for examples:
+- [Paimon - Reading with other 
Engines](datalake-formats/paimon.md#reading-with-other-engines)
+- [Iceberg - Reading with other 
Engines](datalake-formats/iceberg.md#reading-with-other-engines)
diff --git a/website/docs/table-design/table-types/log-table.md 
b/website/docs/table-design/table-types/log-table.md
index dca2f78dd..405aa272e 100644
--- a/website/docs/table-design/table-types/log-table.md
+++ b/website/docs/table-design/table-types/log-table.md
@@ -145,4 +145,4 @@ SELECT * FROM log_table$changelog;
 For detailed information, see the [Virtual 
Tables](/table-design/virtual-tables.md) documentation.
 
 ## Log Tiering
-Log Table supports tiering data to different storage tiers. See more details 
about [Remote Log](maintenance/tiered-storage/remote-storage.md).
+Log Table supports tiering data to different storage tiers. See more details 
about [Remote Log](../../maintenance/tiered-storage/remote-storage.md).
diff --git a/website/docusaurus.config.ts b/website/docusaurus.config.ts
index 1e8b4e81a..1ab7eeb92 100644
--- a/website/docusaurus.config.ts
+++ b/website/docusaurus.config.ts
@@ -197,19 +197,38 @@ const config: Config = {
             if (!existingPath.startsWith('/docs/')) {
               return undefined;
             }
-            
+
             // Extract the relative path after /docs/
-            const relativeDocsPath = existingPath.substring(6); 
+            const relativeDocsPath = existingPath.substring(6);
             const firstSegment = relativeDocsPath.split('/')[0];
-            
+
             // Exclude any known version identifiers aligned with existing 
routes
             const existingVersionedRoutes = ['next', 
...Object.keys(versionsMap)];
             if (existingVersionedRoutes.includes(firstSegment)) {
               return undefined;
             }
-            
-            // Redirect the explicit versioned path to the implicit 
unversioned path
-            return [`/docs/${latestVersion}${existingPath.replace('/docs', 
'')}`];
+
+            const redirects = [
+              // Redirect the explicit versioned path to the implicit 
unversioned path
+              `/docs/${latestVersion}${existingPath.replace('/docs', '')}`,
+            ];
+
+            // Preserve the previously published URLs for docs pages that were
+            // moved/renamed. These are keyed off the new (existing) route, so 
the
+            // redirect target is always valid, and the old URL is preserved 
once
+            // the restructured version becomes the latest unversioned release.
+            const renameRules = [
+              { from: '/maintenance/filesystems/', to: 
'/maintenance/tiered-storage/filesystems/' },
+              { from: '/streaming-lakehouse/integrate-data-lakes/formats/', 
to: '/streaming-lakehouse/datalake-formats/' },
+              { from: '/streaming-lakehouse/integrate-data-lakes/catalogs/', 
to: '/streaming-lakehouse/datalake-catalogs/' },
+            ];
+            for (const rule of renameRules) {
+              if (existingPath.includes(rule.to)) {
+                redirects.push(existingPath.replace(rule.to, rule.from));
+              }
+            }
+
+            return redirects;
         },
       },
     ],

Reply via email to