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

hello-stephen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris-website.git


The following commit(s) were added to refs/heads/master by this push:
     new cf733a936d0 [blog] add eight blogs (2026-07 ~ 2026-08) and render 
external-link stubs as MDX (#4104)
cf733a936d0 is described below

commit cf733a936d024e50552d61bc0766ba4f86b56395
Author: Mingyu Chen (Rayner) <[email protected]>
AuthorDate: Tue Sep 1 16:39:32 2026 +0800

    [blog] add eight blogs (2026-07 ~ 2026-08) and render external-link stubs 
as MDX (#4104)
    
    ## Versions
    
    - [ ] dev
    - [ ] 4.x
    - [ ] 3.x
    - [ ] 2.1 or older (not covered by version/language sync gate)
    
    ## Languages
    
    - [ ] Chinese
    - [x] English
    - [ ] Japanese candidate translation needed
    
    ## Docs Checklist
    
    - [x] Checked by AI
    - [ ] Test Cases Built
    - [x] Updated required version and language counterparts, or explained
    why not
    - [x] If only one language changed, confirmed whether source/translation
    counterparts need sync
    
    ---
    
    Blog-only change. The site blog is English-only, so there is no
    localized or versioned counterpart to update.
    
    ### 1. `dbt-for-apache-doris 1.1.0` blog
    
    Adds the post and a follow-up wording pass over its summary and body.
    
    ### 2. Eight new blog entries (2026-07-10 → 2026-08-27)
    
    Added as external-link entries, following the pattern of #3996, with
    cover images under `static/images/blogs/`.
    
    | Date | Title | Tag |
    | --- | --- | --- |
    | 2026-07-10 | Databricks RT and LTAP are here. How does it fit into
    OLTP, OLAP, real-time OLAP, and HTAP | Tech Sharing |
    | 2026-07-17 | Apache Doris Gets Rust-Native Streaming Ingestion with
    Apache Iggy | Tech Sharing |
    | 2026-07-24 | Search in Apache Doris 4.1: Unifying Full-Text Log Search
    and Real-Time SQL Analytics | Tech Sharing |
    | 2026-07-31 | How Meituan Consolidated Its Analytics Stack on Apache
    Doris | Best Practice |
    | 2026-08-06 | Apache Doris Python UDF: Calling the Python Ecosystem
    from SQL for Agent-Era | Tech Sharing |
    | 2026-08-12 | From Spark to Apache Doris: How Kwai Made A/B Testing
    Metrics 145x Faster at Scale | Best Practice |
    | 2026-08-21 | PostgreSQL CDC to Apache Doris: Real-Time Sync with One
    SQL Statement | Tech Sharing |
    | 2026-08-27 | Dynamic JSON in Agent Workloads: Apache Doris vs
    ClickHouse, Elasticsearch, and OpenSearch | Tech Sharing |
    
    The Blog header selection (`picked`/`order`) moves onto the four newest
    of these, and `src/components/recent-blogs/recent-blogs.data.ts` and
    `src/constant/newsletter.data.ts` are refreshed to match.
    
    Titles and summaries are kept vendor-neutral: the Iggy post is titled
    "Apache Doris Gets Rust-Native Streaming Ingestion with Apache Iggy",
    and the Search 4.1 summary reads "Apache Doris 4.1 uses `search()` …".
    Authors follow the original posts and the existing `Company · Name`
    convention.
    
    ### 3. Render the remaining external-link stubs as MDX
    
    28 external-link stubs were still `.md`. `markdown.format` is `detect`,
    so those files were parsed as CommonMark: their two `import` lines
    rendered as literal body text on the post page, and the `see more` link
    never rendered at all. Renaming them to `.mdx` fixes both.
    
    Before / after, on
    `/blog/how-stepfun-built-agent-observability-platform-with-apache-doris`:
    
    ```
    import { BlogLink } from '../src/components/blogs/components/blog-link'; 
import { SeeMore } from '../src/components/blogs/components/see-more';
    StepFun built StepTrace, a PB-scale agent observability platform ...        
  <- no link
    ```
    ```
    StepFun built StepTrace, a PB-scale agent observability platform ...see 
more  -> velodb.io/blog/...
    ```
    
    The file extension is not part of the slug, so every URL is unchanged.
    Full-content `.md` posts that merely carry an `externalLink` render
    correctly as CommonMark and are left alone; converting them would risk
    MDX compile failures on their raw HTML.
    
    ### Validation
    
    Local dev server (`SKIP_DOCS=true SKIP_COMMUNITY=true SKIP_RELEASES=true
    SKIP_COURSE=true SKIP_SEARCH=true yarn start`):
    
    - compiles with no errors or warnings;
    - all 76 external-link stub pages render without literal `import` text
    and with a working outbound link;
    - `/blog` shows `Total 200 items`, no broken images, no console errors;
    - 207 blog routes generated, unchanged by the renames.
    
    🤖 Generated with [Claude Code](https://claude.com/claude-code)
    
    https://claude.ai/code/session_01K1oeAcA8WQ3XKYeNxLDKbW
    
    ---------
    
    Co-authored-by: morningman <[email protected]>
    Co-authored-by: Claude Fable 5 <[email protected]>
---
 blog/{HTAP-pg-doris.md => HTAP-pg-doris.mdx}       |   0
 ...eberg-v3.md => apache-doris-4-1-iceberg-v3.mdx} |   0
 ...-disk.md => apache-doris-4-1-spill-to-disk.mdx} |   0
 ...e-doris-and-polaris-per-user-identity-mode.mdx} |   0
 ...che-doris-min-io.md => apache-doris-min-io.mdx} |   0
 ...n-udf-calling-the-python-ecosystem-from-sql.mdx |  16 ++
 ...native-streaming-ingestion-with-apache-iggy.mdx |  14 ++
 ...mark-apache-doris-vs-clickhouse-and-duckdb.mdx} |   2 -
 ...md => autonomous-driving-multimodal-search.mdx} |   0
 ...case.md => bytedance-hybrid-search-usecase.mdx} |   0
 ...cookbook.md => chunking-embedding-cookbook.mdx} |   0
 ...-and-ltap-oltp-olap-real-time-olap-and-htap.mdx |  14 ++
 blog/dbt-for-apache-doris-1.1.0-five-demos.md      | 189 +++++++++++++++++++++
 ...d-search.md => doris4-native-hybrid-search.mdx} |   0
 ...ris-clickhouse-elasticsearch-and-opensearch.mdx |  16 ++
 ...ckhouse-elasticsearch-to-apache-doris-kwai.mdx} |   0
 ...los.md => from-data-silos-to-context-silos.mdx} |   0
 ...-doris-tuhu-cars-unified-olap-architecture.mdx} |   2 -
 ...de-a-b-testing-metrics-145x-faster-at-scale.mdx |  16 ++
 ...lidated-its-analytics-stack-on-apache-doris.mdx |  14 ++
 ...t-observability-platform-with-apache-doris.mdx} |   2 -
 ...t-production-vector-search-in-apache-doris.mdx} |   2 -
 ...dex-deepdive.md => inverted-index-deepdive.mdx} |   0
 ...riant-and-inverted-indexes-in-apache-doris.mdx} |   0
 ...mexican-mining-giant-azure-to-apache-doris.mdx} |   0
 ...d => netease-games-unified-doris-lakehouse.mdx} |   0
 ...rg-and-doris.md => olake-iceberg-and-doris.mdx} |   0
 ...doris-real-time-sync-with-one-sql-statement.mdx |  16 ++
 ...apache-doris.md => puppygraph-apache-doris.mdx} |   0
 ...text-log-search-and-real-time-sql-analytics.mdx |  14 ++
 ...-202601.md => variant-tech-deepdive-202601.mdx} |   0
 blog/{web3-doris-flink.md => web3-doris-flink.mdx} |   0
 ...{web3-doris-paimon.md => web3-doris-paimon.mdx} |   0
 ...s.md => when-to-scale-postgresql-analytics.mdx} |   0
 ...need-real-time-analytics-and-hybrid-search.mdx} |   0
 ...pache-doris.md => xanhsm-with-apache-doris.mdx} |   0
 ...ified-usecase.md => xiaomi-unified-usecase.mdx} |   0
 src/components/recent-blogs/recent-blogs.data.ts   |  16 +-
 src/constant/newsletter.data.ts                    |  38 ++---
 static/images/blogs/202607_Iggy_horizontal.jpeg    | Bin 0 -> 126209 bytes
 static/images/blogs/202607_LTAP_horizontal.jpeg    | Bin 0 -> 130040 bytes
 static/images/blogs/202607_Meituan_horizontal.jpeg | Bin 0 -> 111917 bytes
 .../blogs/202607_Search_Doris41_horizontal.jpeg    | Bin 0 -> 120136 bytes
 .../images/blogs/202608_Kwai_spark_horizontal.jpeg | Bin 0 -> 143349 bytes
 static/images/blogs/202608_PG_CDC_horizontal.jpeg  | Bin 0 -> 111357 bytes
 .../images/blogs/202608_Python_UDF_horizontal.jpeg | Bin 0 -> 117240 bytes
 .../blogs/202608_dynamic_json_horizontal.jpeg      | Bin 0 -> 163495 bytes
 .../cover.png                                      | Bin 0 -> 263391 bytes
 .../demo01-daily-order-summary-flow.jpg            | Bin 0 -> 309919 bytes
 .../demo04-late-arriving-orders-flow.jpg           | Bin 0 -> 307112 bytes
 50 files changed, 336 insertions(+), 35 deletions(-)

diff --git a/blog/HTAP-pg-doris.md b/blog/HTAP-pg-doris.mdx
similarity index 100%
rename from blog/HTAP-pg-doris.md
rename to blog/HTAP-pg-doris.mdx
diff --git a/blog/apache-doris-4-1-iceberg-v3.md 
b/blog/apache-doris-4-1-iceberg-v3.mdx
similarity index 100%
rename from blog/apache-doris-4-1-iceberg-v3.md
rename to blog/apache-doris-4-1-iceberg-v3.mdx
diff --git a/blog/apache-doris-4-1-spill-to-disk.md 
b/blog/apache-doris-4-1-spill-to-disk.mdx
similarity index 100%
rename from blog/apache-doris-4-1-spill-to-disk.md
rename to blog/apache-doris-4-1-spill-to-disk.mdx
diff --git a/blog/apache-doris-and-polaris-per-user-identity-mode.md 
b/blog/apache-doris-and-polaris-per-user-identity-mode.mdx
similarity index 100%
rename from blog/apache-doris-and-polaris-per-user-identity-mode.md
rename to blog/apache-doris-and-polaris-per-user-identity-mode.mdx
diff --git a/blog/apache-doris-min-io.md b/blog/apache-doris-min-io.mdx
similarity index 100%
rename from blog/apache-doris-min-io.md
rename to blog/apache-doris-min-io.mdx
diff --git 
a/blog/apache-doris-python-udf-calling-the-python-ecosystem-from-sql.mdx 
b/blog/apache-doris-python-udf-calling-the-python-ecosystem-from-sql.mdx
new file mode 100644
index 00000000000..a3ac17e9ce9
--- /dev/null
+++ b/blog/apache-doris-python-udf-calling-the-python-ecosystem-from-sql.mdx
@@ -0,0 +1,16 @@
+---
+    'title': 'Apache Doris Python UDF: Calling the Python Ecosystem from SQL 
for Agent-Era'
+    'summary': 'Apache Doris adds Python UDF in 4.1.3. This enables teams to 
create and call Python functions directly in SQL, bringing Pandas, PyArrow, and 
the rest of the Python ecosystem into the Doris query path.'
+    'description': 'Apache Doris adds Python UDF in 4.1.3. This enables teams 
to create and call Python functions directly in SQL, bringing Pandas, PyArrow, 
and the rest of the Python ecosystem into the Doris query path.'
+    'picked': "true"
+    'order': "4"
+    'date': '2026-8-6'
+    'author': 'velodb.io · Haopeng Li & Zhenqi Lin'
+    'externalLink': 
'https://www.velodb.io/blog/apache-doris-python-udf-calling-the-python-from-sql-for-agent-era'
+    'tags': ['Tech Sharing']
+    "image": '/images/blogs/202608_Python_UDF_horizontal.jpeg'
+---
+import { BlogLink } from '../src/components/blogs/components/blog-link';
+import { SeeMore } from '../src/components/blogs/components/see-more';
+
+> <BlogLink rel="noopener noreferrer" target='_blank' 
href='https://www.velodb.io/blog/apache-doris-python-udf-calling-the-python-from-sql-for-agent-era'>Apache
 Doris adds Python UDF in 4.1.3. This enables teams to create and call Python 
functions directly in SQL, bringing Pandas, PyArrow, and the rest of the Python 
ecosystem into the Doris query path. <SeeMore /></BlogLink>
diff --git 
a/blog/apache-doris-rust-native-streaming-ingestion-with-apache-iggy.mdx 
b/blog/apache-doris-rust-native-streaming-ingestion-with-apache-iggy.mdx
new file mode 100644
index 00000000000..e2dda797d10
--- /dev/null
+++ b/blog/apache-doris-rust-native-streaming-ingestion-with-apache-iggy.mdx
@@ -0,0 +1,14 @@
+---
+    'title': 'Apache Doris Gets Rust-Native Streaming Ingestion with Apache 
Iggy'
+    'summary': 'Apache Doris now supports Rust-native streaming ingestion from 
Apache Iggy through a new sink connector built with LaserData.'
+    'description': 'Apache Doris now supports Rust-native streaming ingestion 
from Apache Iggy through a new sink connector built with LaserData.'
+    'date': '2026-7-17'
+    'author': 'velodb.io · VeloDB Product Team & LaserData'
+    'externalLink': 
'https://www.velodb.io/blog/velodb-and-apache-doris-get-rust-native-streaming-ingestion-with-apache-iggy'
+    'tags': ['Tech Sharing']
+    "image": '/images/blogs/202607_Iggy_horizontal.jpeg'
+---
+import { BlogLink } from '../src/components/blogs/components/blog-link';
+import { SeeMore } from '../src/components/blogs/components/see-more';
+
+> <BlogLink rel="noopener noreferrer" target='_blank' 
href='https://www.velodb.io/blog/velodb-and-apache-doris-get-rust-native-streaming-ingestion-with-apache-iggy'>Apache
 Doris now supports Rust-native streaming ingestion from Apache Iggy through a 
new sink connector built with LaserData. <SeeMore /></BlogLink>
diff --git a/blog/asof-join-benchmark-apache-doris-vs-clickhouse-and-duckdb.md 
b/blog/asof-join-benchmark-apache-doris-vs-clickhouse-and-duckdb.mdx
similarity index 96%
rename from blog/asof-join-benchmark-apache-doris-vs-clickhouse-and-duckdb.md
rename to blog/asof-join-benchmark-apache-doris-vs-clickhouse-and-duckdb.mdx
index 5beb0f89f2f..26f218b5d8d 100644
--- a/blog/asof-join-benchmark-apache-doris-vs-clickhouse-and-duckdb.md
+++ b/blog/asof-join-benchmark-apache-doris-vs-clickhouse-and-duckdb.mdx
@@ -2,8 +2,6 @@
     'title': 'ASOF JOIN Benchmark: Apache Doris vs ClickHouse and DuckDB'
     'summary': 'Apache Doris 4.1 outperforms ClickHouse and DuckDB on ASOF 
JOIN across all 11 benchmark scenarios.'
     'description': 'Apache Doris 4.1 outperforms ClickHouse and DuckDB on ASOF 
JOIN across all 11 benchmark scenarios.'
-    'picked': "true"
-    'order': "3"
     'date': '2026-6-11'
     'author': 'velodb.io · Changle Zhao'
     'externalLink': 
'https://www.velodb.io/blog/asof-join-benchmark-apache-doris-vs-clickhouse-and-duckdb'
diff --git a/blog/autonomous-driving-multimodal-search.md 
b/blog/autonomous-driving-multimodal-search.mdx
similarity index 100%
rename from blog/autonomous-driving-multimodal-search.md
rename to blog/autonomous-driving-multimodal-search.mdx
diff --git a/blog/bytedance-hybrid-search-usecase.md 
b/blog/bytedance-hybrid-search-usecase.mdx
similarity index 100%
rename from blog/bytedance-hybrid-search-usecase.md
rename to blog/bytedance-hybrid-search-usecase.mdx
diff --git a/blog/chunking-embedding-cookbook.md 
b/blog/chunking-embedding-cookbook.mdx
similarity index 100%
rename from blog/chunking-embedding-cookbook.md
rename to blog/chunking-embedding-cookbook.mdx
diff --git a/blog/databricks-rt-and-ltap-oltp-olap-real-time-olap-and-htap.mdx 
b/blog/databricks-rt-and-ltap-oltp-olap-real-time-olap-and-htap.mdx
new file mode 100644
index 00000000000..0c91876ab4a
--- /dev/null
+++ b/blog/databricks-rt-and-ltap-oltp-olap-real-time-olap-and-htap.mdx
@@ -0,0 +1,14 @@
+---
+    'title': 'Databricks RT and LTAP are here. How does it fit into OLTP, 
OLAP, real-time OLAP, and HTAP'
+    'summary': "Real-time database categories now span across OLTP, OLAP, 
real-time OLAP, HTAP, and Databricks' new LTAP, but each makes different 
trade-offs across freshness, query latency, concurrency, and updates."
+    'description': "Real-time database categories now span across OLTP, OLAP, 
real-time OLAP, HTAP, and Databricks' new LTAP, but each makes different 
trade-offs across freshness, query latency, concurrency, and updates."
+    'date': '2026-7-10'
+    'author': 'velodb.io · Kevin Shen'
+    'externalLink': 
'https://www.velodb.io/blog/databricks-rt-and-ltap-are-here-how-does-it-fit-into-oltp-olap-real-time-olap-and-htap'
+    'tags': ['Tech Sharing']
+    "image": '/images/blogs/202607_LTAP_horizontal.jpeg'
+---
+import { BlogLink } from '../src/components/blogs/components/blog-link';
+import { SeeMore } from '../src/components/blogs/components/see-more';
+
+> <BlogLink rel="noopener noreferrer" target='_blank' 
href='https://www.velodb.io/blog/databricks-rt-and-ltap-are-here-how-does-it-fit-into-oltp-olap-real-time-olap-and-htap'>Real-time
 database categories now span across OLTP, OLAP, real-time OLAP, HTAP, and 
Databricks' new LTAP, but each makes different trade-offs across freshness, 
query latency, concurrency, and updates. <SeeMore /></BlogLink>
diff --git a/blog/dbt-for-apache-doris-1.1.0-five-demos.md 
b/blog/dbt-for-apache-doris-1.1.0-five-demos.md
new file mode 100644
index 00000000000..5553298a9a2
--- /dev/null
+++ b/blog/dbt-for-apache-doris-1.1.0-five-demos.md
@@ -0,0 +1,189 @@
+---
+title: 'dbt-for-apache-doris 1.1.0 Released: Five Business Demos to Get 
Started with Doris Data Engineering'
+summary: 'dbt-for-apache-doris 1.1.0 targets dbt Core 1.12 and manages Apache 
Doris asynchronous materialized views through the standard dbt 
materialized_view. Five demos walk through the Doris + dbt workflow, from 
source tables to tested result tables.'
+description: 'dbt-for-apache-doris 1.1.0 targets dbt Core 1.12, manages Apache 
Doris asynchronous materialized views through the standard dbt 
materialized_view, and covers Table, View, Incremental, Snapshot, Seed, and 
Data Test workflows. Five business demos show how dbt and Apache Doris handle 
daily order summaries, late-arriving orders, and more.'
+keywords:
+  - 'Apache Doris'
+  - 'dbt'
+  - 'dbt-for-apache-doris'
+  - 'dbt adapter'
+  - 'asynchronous materialized view'
+  - 'incremental model'
+  - 'data engineering'
+date: '2026-09-01'
+author: 'Junwei Chen'
+tags:
+  - 'Tech Sharing'
+image: '/images/blogs/dbt-for-apache-doris-1.1.0-five-demos/cover.png'
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+[dbt-for-apache-doris](https://github.com/velodb/dbt-for-apache-doris) 1.1.0 
was released on August 12, 2026. It targets dbt Core 1.12, manages Apache Doris 
asynchronous materialized views through the standard dbt `materialized_view` 
materialization, and covers the everyday workflows: Table, View, Incremental, 
Snapshot, Seed, and Data Test.
+
+```bash
+python -m pip install "dbt-for-apache-doris==1.1.0"
+```
+
+The rest of this post covers what each of the two systems is responsible for, 
what the adapter supports today, and five demos that run a full pipeline in 
Doris.
+
+## 1. dbt, Doris, and what 1.1.0 adds
+
+### 1.1 What is dbt
+
+dbt (data build tool) is an open-source data transformation framework that 
handles the T of ELT inside a data warehouse. Every model is a SQL `SELECT` 
statement, and models reference each other with `ref()`. dbt compiles them into 
the target database's table creation and write statements, runs them in 
dependency order, and materializes each one as a table, view, incremental 
table, or snapshot according to its configuration.
+
+It exists because the transformation layer spent years without much 
engineering discipline:
+
+- SQL is scattered across schedulers, repos, and personal machines. 
Dependencies are maintained by hand, and nobody can say for certain what a 
change will break.
+- Nothing is tested automatically, so a wrong metric usually surfaces when 
someone in the business questions a number on a report.
+- There is no version control, no code review, and no separation between 
development and production, which makes changes hard to trace afterwards.
+- The same boilerplate for creating tables, writing incrementally, and keeping 
history gets rewritten in every project.
+
+dbt's answer is models as code, a dependency graph derived from `ref()`, 
declarative Data Tests, built-in materializations (Table, View, Incremental, 
Snapshot), generated documentation and lineage, and a package ecosystem of 
Jinja macros such as `dbt_utils`.
+
+### 1.2 What dbt and Doris solve together
+
+dbt does not compute anything itself. Every transformation is pushed down to 
the target database, so that database sets the ceiling for the project. Apache 
Doris is an MPP real-time analytical database that speaks the MySQL protocol 
and runs aggregations, multi-table JOINs, and window functions in place. 
`dbt-for-apache-doris` connects the two: dbt organizes, orchestrates, and 
validates the transformation logic; Doris stores the data and executes the SQL.
+
+Putting them together settles a few things that data teams otherwise handle by 
convention. Table conventions become part of the code, since Doris Key models, 
partitions, buckets, and table properties are declared in the model's 
`config()` and go through version control and code review with everything else, 
rather than living in someone's memory. Late-arriving data gets a defined path 
too: a write to a Doris Unique Key table is an Upsert, and dbt Incremental 
`merge` sits directly on that  [...]
+
+Pre-aggregation stops being a separate system. Doris asynchronous materialized 
views join the dbt dependency graph through the standard `materialized_view` 
materialization, with build and refresh strategy in the model configuration, so 
they change and get tested alongside the models they read from. The computation 
never leaves Doris. dbt only ships SQL, so no second engine is needed to move 
data around. Quality checks run in the same place: Data Tests, Unit Tests, and 
Model Contracts all [...]
+
+### 1.3 Adapter feature support
+
+1. **Materializations**
+
+   | Capability | Status | Current scope and boundaries |
+   |-|-|-|
+   | Table | ✅ | Duplicate Key CTAS; configurable HASH bucketing and bucket 
count, RANGE / LIST partitioning, table properties, Contracts, docs, Grants, 
and Hooks. Unique Key tables are created by Incremental `merge` |
+   | View | ✅ | Standard lifecycle, Contracts, docs, Grants, and Hooks; 
switching relation types is not zero-downtime |
+   | Incremental | ✅ | Four strategies, `append`, `merge`, `insert_overwrite`, 
and `microbatch`, plus every `on_schema_change` mode (strategy details in the 
next table) |
+   | Snapshot | ✅ | `check` / `timestamp` strategies, hard-delete handling, 
schema evolution, atomic replacement and recovery; jobs targeting the same 
relation must be serialized by the scheduler |
+   | Materialized view | ✅ | Standard dbt `materialized_view`, implemented as 
a Doris Async MV; covers the build / refresh lifecycle, task waiting, 
configuration changes, atomic replacement and recovery; dbt jobs targeting the 
same relation must be serialized |
+   | Seed | ✅ | CSV loading, type inference, `column_types`, and `ref()` |
+   | Ephemeral | ✅ | Compiled and inlined by dbt Core |
+2. **Incremental strategies and Doris target tables**. When no strategy is 
specified explicitly, models configured with a `unique_key` use `merge` and all 
others use `append`.
+
+   | Strategy | Doris target table | Behavior |
+   |-|-|-|
+   | `append` | Duplicate Key table | Appends rows with `INSERT INTO` |
+   | `merge` | Unique Key table (MoW or MoR) | Full-row `INSERT INTO` Upsert 
based on Unique Key semantics; requires `unique_key`, does not generate `MERGE 
INTO` |
+   | `insert_overwrite` | Any writable Doris table | `INSERT OVERWRITE` of the 
whole table, specified partitions, or dynamic partitions; does not accept 
`unique_key` |
+   | `microbatch` | Duplicate Key table with exact RANGE partitions | Each dbt 
time window overwrites one named partition; supports hour / day / month / year 
windows, and batches run serially |
+3. **dbt engineering capabilities**
+
+   | Capability | Status | Current scope and boundaries |
+   |-|-|-|
+   | Sources and freshness | ✅ | `loaded_at_field`, filter, and 
`loaded_at_query`; cross-database access is implemented as database-as-schema, 
not through an External Catalog |
+   | Data Test | ✅ | Singular, Generic, and Ephemeral tests, plus 
`store_failures` |
+   | Unit Test | ✅ | Inline and CSV fixtures, case-insensitive column names, 
invalid-input validation, reserved-word quoting, and data type fixtures adapted 
to Doris |
+   | Model Contract | ✅ | Column name and type constraints for Table, View, 
and Incremental; not mapped to database primary keys or NOT NULL constraints |
+   | Persisted docs | ✅ | Table / column comments for Table, View, 
Incremental, Snapshot, Seed, and Async MV; updating a View comment, or a 
comment that contains both kinds of quotes, may require a rebuild or full 
refresh |
+   | Grants | ✅ | Reconciles Doris table-level privileges for Table, View, 
Incremental, Seed, Snapshot, and Async MV, supporting `user` and `user@host` 
grantees; role grantees are not handled |
+   | Hooks | ✅ | pre-hook and post-hook for every materialization; Doris does 
not provide transactional rollback for hook side effects |
+   | Metadata and dbt docs catalog | ✅ | Relation discovery and documentation 
catalog for Doris databases, tables, views, columns, comments, and Async MVs |
+   | Cross-database Sources | ✅ | References Sources in other Doris databases, 
including definitions that only declare a database; three-part External Catalog 
names are not supported |
+
+### 1.4 What's new in 1.1.0
+
+1.1.0 is the first release of `dbt-for-apache-doris` from its own repository, 
and the first published to PyPI. It targets dbt Core 1.12 on Python 3.10 and 
above, manages Doris Async Materialized Views through the standard dbt 
`materialized_view` materialization, and ships with explicit version 
constraints and a stated support boundary.
+
+A `materialized_view` model maps to a Doris Async MV, and the build mode, 
refresh strategy, and task waiting are all written in the model configuration:
+
+```sql
+{{ config(
+    materialized='materialized_view',
+    refresh_trigger='manual',
+    wait_for_refresh=true
+) }}
+
+select order_date, sum(amount) as sales
+from {{ ref('orders') }}
+group by order_date
+```
+
+## 2. Five demos
+
+Each demo starts from a business question:
+
+| # | Demo | Business question | Transformation and result | Key capabilities |
+|-|-|-|-|-|
+| 01 | Daily order summary | How many valid orders and how much revenue per 
day and per month? | Filter out cancelled, returned, and failed orders; produce 
a daily Table and a monthly Async MV | Source, Table, Data Test, partitioning 
and bucketing, Async MV |
+| 02 | Customer geography analysis | Which states are customers, orders, and 
revenue concentrated in? | Read addresses and orders from two Doris databases; 
output state-level business metrics | Cross-database Source, View, `ref()`, 
Table |
+| 03 | Ad data integration | How to unify Google, Meta, and TikTok data? | 
Load three kinds of CSV with Seeds, align fields, and deduplicate; output daily 
channel details | Seed, `dbt_utils`, `QUALIFY`, Data Test |
+| 04 | Late-arriving orders | How to absorb late corrections and avoid 
duplicate orders? | Identify order versions and maintain the current state with 
Incremental `merge` | Incremental, Unique Key, idempotency |
+| 05 | Customer history tracking | How to keep the history of attribute 
changes and hard deletes? | Two Snapshot rounds produce SCD Type 2 history and 
a current customer dimension table | Snapshot, Hard Delete, `ref()`, Data Test |
+
+> The demos are selected and adapted from the Snowflake Labs 
[`data-eng-bench`](https://github.com/Snowflake-Labs/data-eng-bench) scenarios 
(the original project is licensed under the Apache License 2.0). We rewrote the 
profiles, SQL, fixtures, verifiers, and notebooks for Apache Doris and 
`dbt-for-apache-doris`.
+>
+> Demo repository: 
[https://github.com/velodb/dbt-for-apache-doris/tree/main/examples](https://github.com/velodb/dbt-for-apache-doris/tree/main/examples)
+
+Two of them are walked through below. For the other three, customer geography 
analysis, ad data integration, and customer history tracking, the [Doris dbt 
demos 
README](https://github.com/velodb/dbt-for-apache-doris/tree/main/examples/doris-demos)
 has the business description, the model list, and the exact commands.
+
+### 2.1 Demo 01: Order summary and asynchronous materialized views
+
+The demo starts from 6 orders in Doris, drops the `CANCELLED`, `RETURNED`, and 
`FAILED` ones, and builds `daily_order_summary`. Data Tests check that dates 
are unique and key columns are not null, and `monthly_order_summary_mv` then 
aggregates the daily table through `ref()`.
+
+![Demo 01 transformation flow: on the dbt side, source(), Table, ref(), and 
materialized_view; the orders source is filtered into daily_order_summary, 
checked by Data Tests, and aggregated into monthly_order_summary_mv; on the 
Doris side, Duplicate Key, Range Partition, Hash Bucket, and Async 
MV](/images/blogs/dbt-for-apache-doris-1.1.0-five-demos/demo01-daily-order-summary-flow.jpg)
+
+*Figure 1: The chain from raw orders to the monthly asynchronous materialized 
view. The top row is what dbt handles: model dependencies, materialization, and 
tests. The bottom row is what Doris provides for the table model and the 
materialized view.*
+
+Three orders survive the filter, for a monthly revenue of `220.20`. dbt owns 
the model dependencies (`source()` through `ref()`), the materializations, and 
the Data Tests. Doris decides how the two result tables are stored and how fast 
they answer:
+
+| Doris capability | What it does here |
+|-|-|
+| Duplicate Key model | `daily_order_summary` is created with `order_date` as 
its sort key. Rows are stored as written, with no aggregation or merging. Date 
range queries use the prefix index, so daily report queries hit it directly. 
dbt `table` rebuilds the whole table with CTAS on every run, so the result is 
reproducible |
+| RANGE partitioning (by `order_date`) | The model pre-creates the `p202608` 
partition and the catch-all `pmax` partition through `partition_by_init`. A 
monthly query scans one partition, and old data can be archived or dropped by 
month |
+| HASH bucketing (by `order_date`) | Data is distributed across BE nodes by 
the bucket key and computed in parallel. The demo runs on a single node with 1 
bucket; production raises the bucket count as data grows |
+| Asynchronous materialized view (Async MV) | `monthly_order_summary_mv` 
pre-aggregates on top of the daily table, so the monthly dashboard reads 
precomputed results and does not re-aggregate on every open. 
`build_mode='immediate'` produces data as soon as the view is built, 
`refresh_method='auto'` lets Doris choose between a full refresh and a 
partition-level one, and `refresh_trigger='manual'` makes each dbt run trigger 
a refresh and wait for it; a scheduled refresh (`schedule`) or a r [...]
+
+### 2.2 Demo 04: Incremental updates for late-arriving orders
+
+The demo writes orders 101, 102, and 103, then receives two late events: the 
amount of order 101 is corrected from `100.00` to `125.00`, and a new order 104 
arrives.
+
+Two steps absorb them:
+
+1. `order_version_history` uses window functions to identify the current 
version of each order.
+2. `incremental_daily_sales` takes `order_id` as its business key and runs 
Incremental `merge` on top of the Upsert semantics of the Doris Unique Key 
model.
+
+![Demo 04 transformation flow: late events for orders 101 and 104 enter the 
order events table, order_version_history identifies order versions, 
incremental_daily_sales is updated by Incremental merge with unique_key = 
order_id and stays unchanged on re-run, and reconciliation models are checked 
by Data Tests; on the Doris side, window functions, Unique Key upsert, and Hash 
Bucket](/images/blogs/dbt-for-apache-doris-1.1.0-five-demos/demo04-late-arriving-orders-flow.jpg)
+
+*Figure 2: Late events reach the source table, then version identification and 
Incremental `merge` update the current orders; a re-run with no new data leaves 
the result alone. The top row is what dbt handles, the bottom row is what Doris 
provides.*
+
+Run it again with no new data and nothing moves. `incremental_daily_sales` 
holds 4 orders, order 101 now at `125.00`, and revenue for August 1 in the 
downstream `daily_sales_summary` becomes `245.00`. The same project also builds 
data quality, arrival latency, and revenue reconciliation models. dbt's part is 
the incremental model definition, the `is_incremental()` filter, and the 
uniqueness test on `order_id`. The "no duplicates, safe to re-run" property 
comes from Doris:
+
+| Doris capability | What it does here |
+|-|-|
+| Unique Key model | `incremental_daily_sales` is created with `order_id` as 
its Unique Key. A new version of an order overwrites the old one on write, so 
the table always holds exactly one row per order and the `unique` test passes. 
The adapter enables Merge-on-Write by default, so deduplication happens at 
write time and queries have nothing left to merge |
+| Upsert on write (Incremental `merge`) | The adapter performs a full-row 
Upsert with a plain `INSERT INTO`, with no `MERGE INTO` and no 
delete-then-insert. The correction to order 101 and the new order 104 take the 
same write path, and re-running with no new data leaves the result unchanged, 
which is what makes backfills and retries safe |
+| HASH bucketing (by `order_id`) | The bucket key matches the primary key, so 
every version of an order lands in the same tablet, and primary key 
deduplication and updates complete inside it without comparing across nodes |
+| Window functions | `order_version_history` uses `row_number()` and `lead()` 
inside Doris to mark the current version of each order and compute `valid_from` 
/ `valid_to`. The version history is auditable, and no external program is 
involved |
+| Online schema change | The model sets 
`on_schema_change='append_new_columns'`. When an upstream model adds a column, 
the adapter syncs the table structure with `ALTER TABLE ... ADD COLUMN` and 
waits for the change to finish, so the incremental table never needs a rebuild |
+
+All five demos run as JupyterLab notebooks, one step per cell, so you can stop 
at any cell and look at what Doris wrote. They live in the repository's 
`examples/` directory, with 
[`examples/doris-demos`](https://github.com/velodb/dbt-for-apache-doris/tree/main/examples/doris-demos)
 as the entry point; its README has the full run instructions.
+
+## Links
+
+- GitHub repository: 
[https://github.com/velodb/dbt-for-apache-doris](https://github.com/velodb/dbt-for-apache-doris)
+- 1.1.0 release: 
[https://github.com/velodb/dbt-for-apache-doris/releases/tag/v1.1.0](https://github.com/velodb/dbt-for-apache-doris/releases/tag/v1.1.0)
+- PyPI: 
[https://pypi.org/project/dbt-for-apache-doris/1.1.0/](https://pypi.org/project/dbt-for-apache-doris/1.1.0/)
+- Demo entry point: 
[https://github.com/velodb/dbt-for-apache-doris/tree/main/examples/doris-demos](https://github.com/velodb/dbt-for-apache-doris/tree/main/examples/doris-demos)
+- Apache Doris all-in-one image: 
[https://doris.apache.org/community/developer-guide/all-in-one-image](https://doris.apache.org/community/developer-guide/all-in-one-image)
diff --git a/blog/doris4-native-hybrid-search.md 
b/blog/doris4-native-hybrid-search.mdx
similarity index 100%
rename from blog/doris4-native-hybrid-search.md
rename to blog/doris4-native-hybrid-search.mdx
diff --git 
a/blog/dynamic-json-in-agent-workloads-apache-doris-clickhouse-elasticsearch-and-opensearch.mdx
 
b/blog/dynamic-json-in-agent-workloads-apache-doris-clickhouse-elasticsearch-and-opensearch.mdx
new file mode 100644
index 00000000000..c5405a52181
--- /dev/null
+++ 
b/blog/dynamic-json-in-agent-workloads-apache-doris-clickhouse-elasticsearch-and-opensearch.mdx
@@ -0,0 +1,16 @@
+---
+    'title': 'Dynamic JSON in Agent Workloads: Apache Doris vs ClickHouse, 
Elasticsearch, and OpenSearch'
+    'summary': 'AI agent logs create wide, fast-changing JSON payloads that 
are difficult to analyze with predictable latency. We compare how Apache Doris, 
ClickHouse, Elasticsearch, and OpenSearch perform in such scenario.'
+    'description': 'AI agent logs create wide, fast-changing JSON payloads 
that are difficult to analyze with predictable latency. We compare how Apache 
Doris, ClickHouse, Elasticsearch, and OpenSearch perform in such scenario.'
+    'picked': "true"
+    'order': "1"
+    'date': '2026-8-27'
+    'author': 'velodb.io · Max Li'
+    'externalLink': 
'https://www.velodb.io/blog/dynamic-json-in-agent-workloads-apache-doris-clickhouse-elasticsearch-and-opensearch'
+    'tags': ['Tech Sharing']
+    "image": '/images/blogs/202608_dynamic_json_horizontal.jpeg'
+---
+import { BlogLink } from '../src/components/blogs/components/blog-link';
+import { SeeMore } from '../src/components/blogs/components/see-more';
+
+> <BlogLink rel="noopener noreferrer" target='_blank' 
href='https://www.velodb.io/blog/dynamic-json-in-agent-workloads-apache-doris-clickhouse-elasticsearch-and-opensearch'>AI
 agent logs create wide, fast-changing JSON payloads that are difficult to 
analyze with predictable latency. We compare how Apache Doris, ClickHouse, 
Elasticsearch, and OpenSearch perform in such scenario. <SeeMore /></BlogLink>
diff --git a/blog/from-clickhouse-elasticsearch-to-apache-doris-kwai.md 
b/blog/from-clickhouse-elasticsearch-to-apache-doris-kwai.mdx
similarity index 100%
rename from blog/from-clickhouse-elasticsearch-to-apache-doris-kwai.md
rename to blog/from-clickhouse-elasticsearch-to-apache-doris-kwai.mdx
diff --git a/blog/from-data-silos-to-context-silos.md 
b/blog/from-data-silos-to-context-silos.mdx
similarity index 100%
rename from blog/from-data-silos-to-context-silos.md
rename to blog/from-data-silos-to-context-silos.mdx
diff --git 
a/blog/from-hive-hbase-and-trino-to-apache-doris-tuhu-cars-unified-olap-architecture.md
 
b/blog/from-hive-hbase-and-trino-to-apache-doris-tuhu-cars-unified-olap-architecture.mdx
similarity index 97%
rename from 
blog/from-hive-hbase-and-trino-to-apache-doris-tuhu-cars-unified-olap-architecture.md
rename to 
blog/from-hive-hbase-and-trino-to-apache-doris-tuhu-cars-unified-olap-architecture.mdx
index 57a79a96b71..2993b5b23ce 100644
--- 
a/blog/from-hive-hbase-and-trino-to-apache-doris-tuhu-cars-unified-olap-architecture.md
+++ 
b/blog/from-hive-hbase-and-trino-to-apache-doris-tuhu-cars-unified-olap-architecture.mdx
@@ -2,8 +2,6 @@
     'title': "From Hive, HBase, MySQL, and Trino to Apache Doris: Tuhu Car's 
Unified OLAP Architecture"
     'summary': 'Tuhu Car rebuilt its fragmented Hive, HBase, MySQL, and Trino 
OLAP stack with Apache Doris, improving audience segmentation, user profiling, 
BI analysis, and real-time analytics.'
     'description': 'Tuhu Car rebuilt its fragmented Hive, HBase, MySQL, and 
Trino OLAP stack with Apache Doris, improving audience segmentation, user 
profiling, BI analysis, and real-time analytics.'
-    'picked': "true"
-    'order': "2"
     'date': '2026-7-3'
     'author': 'Tuhu Car · Wenbo Wang'
     'externalLink': 
'https://www.velodb.io/blog/from-hive-hbase-and-trino-to-apache-doris-tuhu-cars-unified-olap-architecture'
diff --git 
a/blog/from-spark-to-apache-doris-how-kwai-made-a-b-testing-metrics-145x-faster-at-scale.mdx
 
b/blog/from-spark-to-apache-doris-how-kwai-made-a-b-testing-metrics-145x-faster-at-scale.mdx
new file mode 100644
index 00000000000..11be348410f
--- /dev/null
+++ 
b/blog/from-spark-to-apache-doris-how-kwai-made-a-b-testing-metrics-145x-faster-at-scale.mdx
@@ -0,0 +1,16 @@
+---
+    'title': 'From Spark to Apache Doris: How Kwai Made A/B Testing Metrics 
145x Faster at Scale'
+    'summary': 'Kwai migrated its company-wide A/B testing metrics pipeline 
from Spark to Apache Doris. The rebuild delivered 145x faster metrics 
computation and cut resource consumption by 72%.'
+    'description': 'Kwai migrated its company-wide A/B testing metrics 
pipeline from Spark to Apache Doris. The rebuild delivered 145x faster metrics 
computation and cut resource consumption by 72%.'
+    'picked': "true"
+    'order': "3"
+    'date': '2026-8-12'
+    'author': 'Kwai · Siwei Zeng'
+    'externalLink': 
'https://www.velodb.io/blog/from-spark-to-apache-doris-how-kwai-made-a-b-testing-metrics-145x-faster-at-scale'
+    'tags': ['Best Practice']
+    "image": '/images/blogs/202608_Kwai_spark_horizontal.jpeg'
+---
+import { BlogLink } from '../src/components/blogs/components/blog-link';
+import { SeeMore } from '../src/components/blogs/components/see-more';
+
+> <BlogLink rel="noopener noreferrer" target='_blank' 
href='https://www.velodb.io/blog/from-spark-to-apache-doris-how-kwai-made-a-b-testing-metrics-145x-faster-at-scale'>Kwai
 migrated its company-wide A/B testing metrics pipeline from Spark to Apache 
Doris. The rebuild delivered 145x faster metrics computation and cut resource 
consumption by 72%. <SeeMore /></BlogLink>
diff --git 
a/blog/how-meituan-consolidated-its-analytics-stack-on-apache-doris.mdx 
b/blog/how-meituan-consolidated-its-analytics-stack-on-apache-doris.mdx
new file mode 100644
index 00000000000..1c7bae1ea1e
--- /dev/null
+++ b/blog/how-meituan-consolidated-its-analytics-stack-on-apache-doris.mdx
@@ -0,0 +1,14 @@
+---
+    'title': 'How Meituan Consolidated Its Analytics Stack on Apache Doris'
+    'summary': 'Meituan replaced a multi-engine analytics stack of Hadoop, 
Kylin, and Druid with a single Apache Doris platform spanning 300+ clusters and 
tens of PB of data.'
+    'description': 'Meituan replaced a multi-engine analytics stack of Hadoop, 
Kylin, and Druid with a single Apache Doris platform spanning 300+ clusters and 
tens of PB of data.'
+    'date': '2026-7-31'
+    'author': 'Apache Doris'
+    'externalLink': 
'https://www.velodb.io/blog/how-meituan-consolidated-its-analytics-stack-on-apache-doris'
+    'tags': ['Best Practice']
+    "image": '/images/blogs/202607_Meituan_horizontal.jpeg'
+---
+import { BlogLink } from '../src/components/blogs/components/blog-link';
+import { SeeMore } from '../src/components/blogs/components/see-more';
+
+> <BlogLink rel="noopener noreferrer" target='_blank' 
href='https://www.velodb.io/blog/how-meituan-consolidated-its-analytics-stack-on-apache-doris'>Meituan
 replaced a multi-engine analytics stack of Hadoop, Kylin, and Druid with a 
single Apache Doris platform spanning 300+ clusters and tens of PB of data. 
<SeeMore /></BlogLink>
diff --git 
a/blog/how-stepfun-built-agent-observability-platform-with-apache-doris.md 
b/blog/how-stepfun-built-agent-observability-platform-with-apache-doris.mdx
similarity index 97%
rename from 
blog/how-stepfun-built-agent-observability-platform-with-apache-doris.md
rename to 
blog/how-stepfun-built-agent-observability-platform-with-apache-doris.mdx
index 01e06ba7f82..32d124b6d7d 100644
--- a/blog/how-stepfun-built-agent-observability-platform-with-apache-doris.md
+++ b/blog/how-stepfun-built-agent-observability-platform-with-apache-doris.mdx
@@ -2,8 +2,6 @@
     'title': 'How StepFun Built a PB-Scale Agent Observability Platform with 
Apache Doris'
     'summary': 'StepFun built StepTrace, a PB-scale agent observability 
platform on Apache Doris, to analyze agent traces, costs, search, evaluation 
loops, and infrastructure behavior in real time.'
     'description': 'StepFun built StepTrace, a PB-scale agent observability 
platform on Apache Doris, to analyze agent traces, costs, search, evaluation 
loops, and infrastructure behavior in real time.'
-    'picked': "true"
-    'order': "1"
     'date': '2026-7-8'
     'author': 'StepFun · Ric Li'
     'externalLink': 
'https://www.velodb.io/blog/how-stepfun-built-agent-observability-platform-with-apache-doris'
diff --git a/blog/how-we-built-production-vector-search-in-apache-doris.md 
b/blog/how-we-built-production-vector-search-in-apache-doris.mdx
similarity index 96%
rename from blog/how-we-built-production-vector-search-in-apache-doris.md
rename to blog/how-we-built-production-vector-search-in-apache-doris.mdx
index 83d4d846b25..a1d400092f1 100644
--- a/blog/how-we-built-production-vector-search-in-apache-doris.md
+++ b/blog/how-we-built-production-vector-search-in-apache-doris.mdx
@@ -2,8 +2,6 @@
     'title': 'How We Built Production Vector Search in Apache Doris'
     'summary': 'Apache Doris 4.1 adds more native ANN vector indexes, IVF and 
IVF_ON_DISK, directly inside its OLAP engine, reaching 900 QPS at 97% recall on 
VectorDBBench.'
     'description': 'Apache Doris 4.1 adds more native ANN vector indexes, IVF 
and IVF_ON_DISK, directly inside its OLAP engine, reaching 900 QPS at 97% 
recall on VectorDBBench.'
-    'picked': "true"
-    'order': "4"
     'date': '2026-5-28'
     'author': 'velodb.io · Rayner Chen'
     'externalLink': 
'https://www.velodb.io/blog/how-we-built-production-vector-search-in-apache-doris'
diff --git a/blog/inverted-index-deepdive.md b/blog/inverted-index-deepdive.mdx
similarity index 100%
rename from blog/inverted-index-deepdive.md
rename to blog/inverted-index-deepdive.mdx
diff --git 
a/blog/json-in-agent-observability-variant-and-inverted-indexes-in-apache-doris.md
 
b/blog/json-in-agent-observability-variant-and-inverted-indexes-in-apache-doris.mdx
similarity index 100%
rename from 
blog/json-in-agent-observability-variant-and-inverted-indexes-in-apache-doris.md
rename to 
blog/json-in-agent-observability-variant-and-inverted-indexes-in-apache-doris.mdx
diff --git a/blog/mexican-mining-giant-azure-to-apache-doris.md 
b/blog/mexican-mining-giant-azure-to-apache-doris.mdx
similarity index 100%
rename from blog/mexican-mining-giant-azure-to-apache-doris.md
rename to blog/mexican-mining-giant-azure-to-apache-doris.mdx
diff --git a/blog/netease-games-unified-doris-lakehouse.md 
b/blog/netease-games-unified-doris-lakehouse.mdx
similarity index 100%
rename from blog/netease-games-unified-doris-lakehouse.md
rename to blog/netease-games-unified-doris-lakehouse.mdx
diff --git a/blog/olake-iceberg-and-doris.md b/blog/olake-iceberg-and-doris.mdx
similarity index 100%
rename from blog/olake-iceberg-and-doris.md
rename to blog/olake-iceberg-and-doris.mdx
diff --git 
a/blog/postgresql-cdc-to-apache-doris-real-time-sync-with-one-sql-statement.mdx 
b/blog/postgresql-cdc-to-apache-doris-real-time-sync-with-one-sql-statement.mdx
new file mode 100644
index 00000000000..a88b5aed534
--- /dev/null
+++ 
b/blog/postgresql-cdc-to-apache-doris-real-time-sync-with-one-sql-statement.mdx
@@ -0,0 +1,16 @@
+---
+    'title': 'PostgreSQL CDC to Apache Doris: Real-Time Sync with One SQL 
Statement'
+    'summary': 'Apache Doris offers native CDC for PostgreSQL, replacing 
separate CDC, Kafka, Flink, or Spark components with one built-in streaming 
job.'
+    'description': 'Apache Doris offers native CDC for PostgreSQL, replacing 
separate CDC, Kafka, Flink, or Spark components with one built-in streaming 
job.'
+    'picked': "true"
+    'order': "2"
+    'date': '2026-8-21'
+    'author': 'velodb.io · Dylan Wu'
+    'externalLink': 
'https://www.velodb.io/blog/postgresql-cdc-to-apache-doris-real-time-sync-with-one-sql-statement'
+    'tags': ['Tech Sharing']
+    "image": '/images/blogs/202608_PG_CDC_horizontal.jpeg'
+---
+import { BlogLink } from '../src/components/blogs/components/blog-link';
+import { SeeMore } from '../src/components/blogs/components/see-more';
+
+> <BlogLink rel="noopener noreferrer" target='_blank' 
href='https://www.velodb.io/blog/postgresql-cdc-to-apache-doris-real-time-sync-with-one-sql-statement'>Apache
 Doris offers native CDC for PostgreSQL, replacing separate CDC, Kafka, Flink, 
or Spark components with one built-in streaming job. <SeeMore /></BlogLink>
diff --git a/blog/puppygraph-apache-doris.md b/blog/puppygraph-apache-doris.mdx
similarity index 100%
rename from blog/puppygraph-apache-doris.md
rename to blog/puppygraph-apache-doris.mdx
diff --git 
a/blog/search-in-apache-doris-4-1-unifying-full-text-log-search-and-real-time-sql-analytics.mdx
 
b/blog/search-in-apache-doris-4-1-unifying-full-text-log-search-and-real-time-sql-analytics.mdx
new file mode 100644
index 00000000000..3643df97c63
--- /dev/null
+++ 
b/blog/search-in-apache-doris-4-1-unifying-full-text-log-search-and-real-time-sql-analytics.mdx
@@ -0,0 +1,14 @@
+---
+    'title': 'Search in Apache Doris 4.1: Unifying Full-Text Log Search and 
Real-Time SQL Analytics'
+    'summary': 'Apache Doris 4.1 uses search(), inverted indexes, BM25 
scoring, and standard SQL to unify full-text log search with real-time 
analytics for observability, SIEM, and product search workloads.'
+    'description': 'Apache Doris 4.1 uses search(), inverted indexes, BM25 
scoring, and standard SQL to unify full-text log search with real-time 
analytics for observability, SIEM, and product search workloads.'
+    'date': '2026-7-24'
+    'author': 'velodb.io · Tom Zhang'
+    'externalLink': 
'https://www.velodb.io/blog/search-in-apache-doris-4-1-unifying-full-text-log-search-and-real-time-sql-analytics'
+    'tags': ['Tech Sharing']
+    "image": '/images/blogs/202607_Search_Doris41_horizontal.jpeg'
+---
+import { BlogLink } from '../src/components/blogs/components/blog-link';
+import { SeeMore } from '../src/components/blogs/components/see-more';
+
+> <BlogLink rel="noopener noreferrer" target='_blank' 
href='https://www.velodb.io/blog/search-in-apache-doris-4-1-unifying-full-text-log-search-and-real-time-sql-analytics'>Apache
 Doris 4.1 uses search(), inverted indexes, BM25 scoring, and standard SQL to 
unify full-text log search with real-time analytics for observability, SIEM, 
and product search workloads. <SeeMore /></BlogLink>
diff --git a/blog/variant-tech-deepdive-202601.md 
b/blog/variant-tech-deepdive-202601.mdx
similarity index 100%
rename from blog/variant-tech-deepdive-202601.md
rename to blog/variant-tech-deepdive-202601.mdx
diff --git a/blog/web3-doris-flink.md b/blog/web3-doris-flink.mdx
similarity index 100%
rename from blog/web3-doris-flink.md
rename to blog/web3-doris-flink.mdx
diff --git a/blog/web3-doris-paimon.md b/blog/web3-doris-paimon.mdx
similarity index 100%
rename from blog/web3-doris-paimon.md
rename to blog/web3-doris-paimon.mdx
diff --git a/blog/when-to-scale-postgresql-analytics.md 
b/blog/when-to-scale-postgresql-analytics.mdx
similarity index 100%
rename from blog/when-to-scale-postgresql-analytics.md
rename to blog/when-to-scale-postgresql-analytics.mdx
diff --git a/blog/why-ai-agents-need-real-time-analytics-and-hybrid-search.md 
b/blog/why-ai-agents-need-real-time-analytics-and-hybrid-search.mdx
similarity index 100%
rename from blog/why-ai-agents-need-real-time-analytics-and-hybrid-search.md
rename to blog/why-ai-agents-need-real-time-analytics-and-hybrid-search.mdx
diff --git a/blog/xanhsm-with-apache-doris.md 
b/blog/xanhsm-with-apache-doris.mdx
similarity index 100%
rename from blog/xanhsm-with-apache-doris.md
rename to blog/xanhsm-with-apache-doris.mdx
diff --git a/blog/xiaomi-unified-usecase.md b/blog/xiaomi-unified-usecase.mdx
similarity index 100%
rename from blog/xiaomi-unified-usecase.md
rename to blog/xiaomi-unified-usecase.mdx
diff --git a/src/components/recent-blogs/recent-blogs.data.ts 
b/src/components/recent-blogs/recent-blogs.data.ts
index 1a1f369ab6a..c8d1f21ed58 100644
--- a/src/components/recent-blogs/recent-blogs.data.ts
+++ b/src/components/recent-blogs/recent-blogs.data.ts
@@ -1,19 +1,19 @@
 export const RECENT_BLOGS_POSTS = [
     {
-        label: 'How StepFun Built a PB-Scale Agent Observability Platform with 
Apache Doris',
-        link: 
'https://www.velodb.io/blog/how-stepfun-built-agent-observability-platform-with-apache-doris',
+        label: 'Dynamic JSON in Agent Workloads: Apache Doris vs ClickHouse, 
Elasticsearch, and OpenSearch',
+        link: 
'https://www.velodb.io/blog/dynamic-json-in-agent-workloads-apache-doris-clickhouse-elasticsearch-and-opensearch',
     },
     {
-        label: "From Hive, HBase, MySQL, and Trino to Apache Doris: Tuhu Car's 
Unified OLAP Architecture",
-        link: 
'https://www.velodb.io/blog/from-hive-hbase-and-trino-to-apache-doris-tuhu-cars-unified-olap-architecture',
+        label: 'PostgreSQL CDC to Apache Doris: Real-Time Sync with One SQL 
Statement',
+        link: 
'https://www.velodb.io/blog/postgresql-cdc-to-apache-doris-real-time-sync-with-one-sql-statement',
     },
     {
-        label: 'ASOF JOIN Benchmark: Apache Doris vs ClickHouse and DuckDB',
-        link: 
'https://www.velodb.io/blog/asof-join-benchmark-apache-doris-vs-clickhouse-and-duckdb',
+        label: 'From Spark to Apache Doris: How Kwai Made A/B Testing Metrics 
145x Faster at Scale',
+        link: 
'https://www.velodb.io/blog/from-spark-to-apache-doris-how-kwai-made-a-b-testing-metrics-145x-faster-at-scale',
     },
     {
-        label: 'How We Built Production Vector Search in Apache Doris',
-        link: 
'https://www.velodb.io/blog/how-we-built-production-vector-search-in-apache-doris',
+        label: 'Apache Doris Python UDF: Calling the Python Ecosystem from SQL 
for Agent-Era',
+        link: 
'https://www.velodb.io/blog/apache-doris-python-udf-calling-the-python-from-sql-for-agent-era',
     },
 
 ];
diff --git a/src/constant/newsletter.data.ts b/src/constant/newsletter.data.ts
index 6f763ba366f..af139941742 100644
--- a/src/constant/newsletter.data.ts
+++ b/src/constant/newsletter.data.ts
@@ -1,30 +1,30 @@
 export const NEWSLETTER_DATA = [
     {
-        tags: ['Best Practice'],
-        title: "How StepFun Built a PB-Scale Agent Observability Platform with 
Apache Doris",
-        content: `StepFun built StepTrace, a PB-scale agent observability 
platform on Apache Doris, to analyze agent traces, costs, search, evaluation 
loops, and infrastructure behavior in real time.`,
-        to: 
'https://www.velodb.io/blog/how-stepfun-built-agent-observability-platform-with-apache-doris',
-        image: 'blogs/202607_StepFun_horizontal.jpeg',
+        tags: ['Tech Sharing'],
+        title: "Dynamic JSON in Agent Workloads: Apache Doris vs ClickHouse, 
Elasticsearch, and OpenSearch",
+        content: `AI agent logs create wide, fast-changing JSON payloads that 
are difficult to analyze with predictable latency. We compare how Apache Doris, 
ClickHouse, Elasticsearch, and OpenSearch perform in such scenario.`,
+        to: 
'https://www.velodb.io/blog/dynamic-json-in-agent-workloads-apache-doris-clickhouse-elasticsearch-and-opensearch',
+        image: 'blogs/202608_dynamic_json_horizontal.jpeg',
     },
     {
-        tags: ['Best Practice'],
-        title: "From Hive, HBase, MySQL, and Trino to Apache Doris: Tuhu Car's 
Unified OLAP Architecture",
-        content: `Tuhu Car rebuilt its fragmented Hive, HBase, MySQL, and 
Trino OLAP stack with Apache Doris, improving audience segmentation, user 
profiling, BI analysis, and real-time analytics.`,
-        to: 
'https://www.velodb.io/blog/from-hive-hbase-and-trino-to-apache-doris-tuhu-cars-unified-olap-architecture',
-        image: 'blogs/202607_Tuhu_horizontal.jpeg',
+        tags: ['Tech Sharing'],
+        title: "PostgreSQL CDC to Apache Doris: Real-Time Sync with One SQL 
Statement",
+        content: `Apache Doris offers native CDC for PostgreSQL, replacing 
separate CDC, Kafka, Flink, or Spark components with one built-in streaming 
job.`,
+        to: 
'https://www.velodb.io/blog/postgresql-cdc-to-apache-doris-real-time-sync-with-one-sql-statement',
+        image: 'blogs/202608_PG_CDC_horizontal.jpeg',
     },
     {
-        tags: ['Tech Sharing'],
-        title: "ASOF JOIN Benchmark: Apache Doris vs ClickHouse and DuckDB",
-        content: `Apache Doris 4.1 outperforms ClickHouse and DuckDB on ASOF 
JOIN across all 11 benchmark scenarios.`,
-        to: 
'https://www.velodb.io/blog/asof-join-benchmark-apache-doris-vs-clickhouse-and-duckdb',
-        image: 'blogs/202606_ASOF_JOIN_Benchmark_horizontal.png',
+        tags: ['Best Practice'],
+        title: "From Spark to Apache Doris: How Kwai Made A/B Testing Metrics 
145x Faster at Scale",
+        content: `Kwai migrated its company-wide A/B testing metrics pipeline 
from Spark to Apache Doris. The rebuild delivered 145x faster metrics 
computation and cut resource consumption by 72%.`,
+        to: 
'https://www.velodb.io/blog/from-spark-to-apache-doris-how-kwai-made-a-b-testing-metrics-145x-faster-at-scale',
+        image: 'blogs/202608_Kwai_spark_horizontal.jpeg',
     },
     {
         tags: ['Tech Sharing'],
-        title: "How We Built Production Vector Search in Apache Doris",
-        content: `Apache Doris 4.1 adds more native ANN vector indexes, IVF 
and IVF_ON_DISK, directly inside its OLAP engine, reaching 900 QPS at 97% 
recall on VectorDBBench.`,
-        to: 
'https://www.velodb.io/blog/how-we-built-production-vector-search-in-apache-doris',
-        image: 'blogs/202605_vector_search_header_horizontal.jpeg',
+        title: "Apache Doris Python UDF: Calling the Python Ecosystem from SQL 
for Agent-Era",
+        content: `Apache Doris adds Python UDF in 4.1.3. This enables teams to 
create and call Python functions directly in SQL, bringing Pandas, PyArrow, and 
the rest of the Python ecosystem into the Doris query path.`,
+        to: 
'https://www.velodb.io/blog/apache-doris-python-udf-calling-the-python-from-sql-for-agent-era',
+        image: 'blogs/202608_Python_UDF_horizontal.jpeg',
     },
 ];
diff --git a/static/images/blogs/202607_Iggy_horizontal.jpeg 
b/static/images/blogs/202607_Iggy_horizontal.jpeg
new file mode 100644
index 00000000000..21714066969
Binary files /dev/null and b/static/images/blogs/202607_Iggy_horizontal.jpeg 
differ
diff --git a/static/images/blogs/202607_LTAP_horizontal.jpeg 
b/static/images/blogs/202607_LTAP_horizontal.jpeg
new file mode 100644
index 00000000000..862f16098ea
Binary files /dev/null and b/static/images/blogs/202607_LTAP_horizontal.jpeg 
differ
diff --git a/static/images/blogs/202607_Meituan_horizontal.jpeg 
b/static/images/blogs/202607_Meituan_horizontal.jpeg
new file mode 100644
index 00000000000..2701095dfca
Binary files /dev/null and b/static/images/blogs/202607_Meituan_horizontal.jpeg 
differ
diff --git a/static/images/blogs/202607_Search_Doris41_horizontal.jpeg 
b/static/images/blogs/202607_Search_Doris41_horizontal.jpeg
new file mode 100644
index 00000000000..111e6731acb
Binary files /dev/null and 
b/static/images/blogs/202607_Search_Doris41_horizontal.jpeg differ
diff --git a/static/images/blogs/202608_Kwai_spark_horizontal.jpeg 
b/static/images/blogs/202608_Kwai_spark_horizontal.jpeg
new file mode 100644
index 00000000000..252f4826785
Binary files /dev/null and 
b/static/images/blogs/202608_Kwai_spark_horizontal.jpeg differ
diff --git a/static/images/blogs/202608_PG_CDC_horizontal.jpeg 
b/static/images/blogs/202608_PG_CDC_horizontal.jpeg
new file mode 100644
index 00000000000..0f56ed8baf1
Binary files /dev/null and b/static/images/blogs/202608_PG_CDC_horizontal.jpeg 
differ
diff --git a/static/images/blogs/202608_Python_UDF_horizontal.jpeg 
b/static/images/blogs/202608_Python_UDF_horizontal.jpeg
new file mode 100644
index 00000000000..3b38f7c31a3
Binary files /dev/null and 
b/static/images/blogs/202608_Python_UDF_horizontal.jpeg differ
diff --git a/static/images/blogs/202608_dynamic_json_horizontal.jpeg 
b/static/images/blogs/202608_dynamic_json_horizontal.jpeg
new file mode 100644
index 00000000000..7dafbbbcd36
Binary files /dev/null and 
b/static/images/blogs/202608_dynamic_json_horizontal.jpeg differ
diff --git 
a/static/images/blogs/dbt-for-apache-doris-1.1.0-five-demos/cover.png 
b/static/images/blogs/dbt-for-apache-doris-1.1.0-five-demos/cover.png
new file mode 100644
index 00000000000..d4fd8491ad8
Binary files /dev/null and 
b/static/images/blogs/dbt-for-apache-doris-1.1.0-five-demos/cover.png differ
diff --git 
a/static/images/blogs/dbt-for-apache-doris-1.1.0-five-demos/demo01-daily-order-summary-flow.jpg
 
b/static/images/blogs/dbt-for-apache-doris-1.1.0-five-demos/demo01-daily-order-summary-flow.jpg
new file mode 100644
index 00000000000..38715eeab0a
Binary files /dev/null and 
b/static/images/blogs/dbt-for-apache-doris-1.1.0-five-demos/demo01-daily-order-summary-flow.jpg
 differ
diff --git 
a/static/images/blogs/dbt-for-apache-doris-1.1.0-five-demos/demo04-late-arriving-orders-flow.jpg
 
b/static/images/blogs/dbt-for-apache-doris-1.1.0-five-demos/demo04-late-arriving-orders-flow.jpg
new file mode 100644
index 00000000000..33a57c66fb4
Binary files /dev/null and 
b/static/images/blogs/dbt-for-apache-doris-1.1.0-five-demos/demo04-late-arriving-orders-flow.jpg
 differ


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to