You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fluss.apache.org by gi...@apache.org on 2026/03/04 02:13:10 UTC

(fluss-rust) 01/01: Deploy website from 2ceb5128

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

github-bot pushed a commit to branch gh-pages
in repository https://gitbox.apache.org/repos/asf/fluss-rust.git

commit d4db88dca098c40ff8e1d1a3678e591afa77dd7f
Author: github-actions[bot] <gi...@users.noreply.github.com>
AuthorDate: Wed Mar 4 02:13:01 2026 +0000

    Deploy website from 2ceb5128
---
 404.html                                           |  18 ++
 CNAME                                              |   1 +
 assets/css/styles.ffd6893e.css                     |   1 +
 ...ease-guide-31289e18e49c6d63d34856e111c4fd7d.png | Bin 0 -> 363329 bytes
 assets/js/0c1d904d.76f06ab8.js                     |   1 +
 assets/js/17896441.26cae3b8.js                     |   1 +
 assets/js/1870c74d.18a35df5.js                     |   1 +
 assets/js/19b9b563.c7a4dd56.js                     |   1 +
 assets/js/1a9f158c.eef16f15.js                     |   1 +
 assets/js/21a3ccbd.aeb8fec8.js                     |   1 +
 assets/js/22dd74f7.60660093.js                     |   1 +
 assets/js/237.556fb200.js                          |   1 +
 assets/js/2606e8f0.1164a36d.js                     |   1 +
 assets/js/2ccec619.13448f77.js                     |   1 +
 assets/js/334.bb7f7a54.js                          |   1 +
 assets/js/362.c7458be2.js                          |   1 +
 assets/js/40d3bd0c.6c709cbe.js                     |   1 +
 assets/js/445dfbc8.58346f7b.js                     |   1 +
 assets/js/4929aa57.d1bc856a.js                     |   1 +
 assets/js/535c914a.d192ce16.js                     |   1 +
 assets/js/563a3698.2ae45962.js                     |   1 +
 assets/js/5be6a790.8aa9c7d2.js                     |   1 +
 assets/js/5cbabd65.5687f108.js                     |   1 +
 assets/js/5e95c892.e61a3d6b.js                     |   1 +
 assets/js/632d88cf.84804e2c.js                     |   1 +
 assets/js/657ca811.6f3c60f4.js                     |   1 +
 assets/js/67a63da5.47b9e20a.js                     |   1 +
 assets/js/687602b6.9090bcf7.js                     |   1 +
 assets/js/692614d6.aa27e052.js                     |   1 +
 assets/js/730.02fcba47.js                          |   1 +
 assets/js/7458a8dd.0a521aef.js                     |   1 +
 assets/js/745ce156.a102bba7.js                     |   1 +
 assets/js/76210954.911af642.js                     |   1 +
 assets/js/8c75c7ee.f1376dd9.js                     |   1 +
 assets/js/8fca9180.c0590ff5.js                     |   1 +
 assets/js/9e35809b.663c4d9d.js                     |   1 +
 assets/js/a09c8d71.12b52f58.js                     |   1 +
 assets/js/a7bd4aaa.b1498e94.js                     |   1 +
 assets/js/a94703ab.f0548e96.js                     |   1 +
 assets/js/aaf64d1a.a01dd21a.js                     |   1 +
 assets/js/ab9b3dd7.41cc7284.js                     |   1 +
 assets/js/aba21aa0.916bf8b1.js                     |   1 +
 assets/js/ac8c0136.450b05b7.js                     |   1 +
 assets/js/be3b534d.9ce339b1.js                     |   1 +
 assets/js/c377a04b.a112f5f4.js                     |   1 +
 assets/js/d6584c60.3e2c98f6.js                     |   1 +
 assets/js/dfb4c545.2de2ed1c.js                     |   1 +
 assets/js/e0d78237.c7a8636c.js                     |   1 +
 assets/js/e64b0739.ca67e6c0.js                     |   1 +
 assets/js/main.5b88a321.js                         |   2 +
 assets/js/main.5b88a321.js.LICENSE.txt             |  51 +++++
 assets/js/runtime~main.613ff8f6.js                 |   1 +
 developer-guide/contributing/index.html            |  62 ++++++
 img/logo/fluss_favicon.svg                         |  19 ++
 img/logo/png/colored_logo.png                      | Bin 0 -> 45184 bytes
 img/logo/svg/colored_logo.svg                      |  19 ++
 img/release-guide.png                              | Bin 0 -> 363329 bytes
 index.html                                         |  44 ++++
 manifest.json                                      |  17 ++
 release/create-release/index.html                  | 237 +++++++++++++++++++++
 release/generate-release-note/index.html           |  26 +++
 release/verifying-a-release-candidate/index.html   |  86 ++++++++
 sitemap.xml                                        |   1 +
 sw.js                                              |   1 +
 user-guide/cpp/api-reference/index.html            | 152 +++++++++++++
 user-guide/cpp/data-types/index.html               |  44 ++++
 user-guide/cpp/error-handling/index.html           |  57 +++++
 user-guide/cpp/example/admin-operations/index.html |  33 +++
 user-guide/cpp/example/configuration/index.html    |  26 +++
 user-guide/cpp/example/index.html                  |  20 ++
 user-guide/cpp/example/log-tables/index.html       |  38 ++++
 .../cpp/example/partitioned-tables/index.html      |  45 ++++
 .../cpp/example/primary-key-tables/index.html      |  33 +++
 user-guide/cpp/installation/index.html             |  41 ++++
 user-guide/python/api-reference/index.html         |  96 +++++++++
 user-guide/python/data-types/index.html            |  28 +++
 user-guide/python/error-handling/index.html        |  43 ++++
 .../python/example/admin-operations/index.html     |  32 +++
 user-guide/python/example/configuration/index.html |  30 +++
 user-guide/python/example/index.html               |  20 ++
 user-guide/python/example/log-tables/index.html    |  49 +++++
 .../python/example/partitioned-tables/index.html   |  33 +++
 .../python/example/primary-key-tables/index.html   |  27 +++
 user-guide/python/installation/index.html          |  28 +++
 user-guide/rust/api-reference/index.html           | 116 ++++++++++
 user-guide/rust/data-types/index.html              |  27 +++
 user-guide/rust/error-handling/index.html          |  49 +++++
 .../rust/example/admin-operations/index.html       |  31 +++
 user-guide/rust/example/configuration/index.html   |  25 +++
 user-guide/rust/example/index.html                 |  20 ++
 user-guide/rust/example/log-tables/index.html      |  41 ++++
 .../rust/example/partitioned-tables/index.html     |  45 ++++
 .../rust/example/primary-key-tables/index.html     |  33 +++
 user-guide/rust/installation/index.html            |  43 ++++
 94 files changed, 1936 insertions(+)

diff --git a/404.html b/404.html
new file mode 100644
index 0000000..48aa829
--- /dev/null
+++ b/404.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Apache Fluss Clients</title><meta data-rh="true" property="og:title" content="Apache Fluss Clients"><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colore [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/CNAME b/CNAME
new file mode 100644
index 0000000..6298936
--- /dev/null
+++ b/CNAME
@@ -0,0 +1 @@
+clients.fluss.apache.org
diff --git a/assets/css/styles.ffd6893e.css b/assets/css/styles.ffd6893e.css
new file mode 100644
index 0000000..2d394ec
--- /dev/null
+++ b/assets/css/styles.ffd6893e.css
@@ -0,0 +1 @@
+@import url(https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap);.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button [...]
\ No newline at end of file
diff --git a/assets/images/release-guide-31289e18e49c6d63d34856e111c4fd7d.png b/assets/images/release-guide-31289e18e49c6d63d34856e111c4fd7d.png
new file mode 100644
index 0000000..bf7602d
Binary files /dev/null and b/assets/images/release-guide-31289e18e49c6d63d34856e111c4fd7d.png differ
diff --git a/assets/js/0c1d904d.76f06ab8.js b/assets/js/0c1d904d.76f06ab8.js
new file mode 100644
index 0000000..3e9094a
--- /dev/null
+++ b/assets/js/0c1d904d.76f06ab8.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[192],{5244(e,a,t){t.r(a),t.d(a,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>o});const r=JSON.parse('{"id":"user-guide/python/example/primary-key-tables","title":"Primary Key Tables","description":"Primary key tables support upsert, delete, and point lookup operations.","source":"@site/docs/user-guide/python/example/primary-key-tabl [...]
\ No newline at end of file
diff --git a/assets/js/17896441.26cae3b8.js b/assets/js/17896441.26cae3b8.js
new file mode 100644
index 0000000..8df7d9d
--- /dev/null
+++ b/assets/js/17896441.26cae3b8.js
@@ -0,0 +1 @@
+(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[401],{8252(e,n,t){"use strict";t.r(n),t.d(n,{default:()=>Vt});var s=t(6540),a=t(5500),i=t(9532),r=t(4848);const o=s.createContext(null);function c({children:e,content:n}){const t=function(e){return(0,s.useMemo)(()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc}),[e])}(n);return(0,r.jsx)(o.Provider,{value:t,children:e})}function l() [...]
\ No newline at end of file
diff --git a/assets/js/1870c74d.18a35df5.js b/assets/js/1870c74d.18a35df5.js
new file mode 100644
index 0000000..6e6849a
--- /dev/null
+++ b/assets/js/1870c74d.18a35df5.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[511],{3415(e,d,s){s.r(d),s.d(d,{assets:()=>l,contentTitle:()=>r,default:()=>x,frontMatter:()=>c,metadata:()=>i,toc:()=>o});const i=JSON.parse('{"id":"user-guide/rust/data-types","title":"Data Types","description":"| Fluss Type      | Rust Type      | Getter                               | Setter                         |","source":"@site/docs/user-guide/rust/data-types.md", [...]
\ No newline at end of file
diff --git a/assets/js/19b9b563.c7a4dd56.js b/assets/js/19b9b563.c7a4dd56.js
new file mode 100644
index 0000000..58774fb
--- /dev/null
+++ b/assets/js/19b9b563.c7a4dd56.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[664],{2454(e,r,n){n.r(r),n.d(r,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"user-guide/cpp/error-handling","title":"Error Handling","description":"All C++ client operations return a fluss::Result struct instead of throwing exceptions. This gives you explicit control over error handling.","source":"@si [...]
\ No newline at end of file
diff --git a/assets/js/1a9f158c.eef16f15.js b/assets/js/1a9f158c.eef16f15.js
new file mode 100644
index 0000000..faaf419
--- /dev/null
+++ b/assets/js/1a9f158c.eef16f15.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[169],{49(e,t,s){s.r(t),s.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"release/generate-release-note","title":"Generate Release Note","description":"Use GitHub\'s Generate release notes to produce a draft from merged PRs between tags. Categories (Added, Fixed, Docs, etc.) are configured in .github/ [...]
\ No newline at end of file
diff --git a/assets/js/21a3ccbd.aeb8fec8.js b/assets/js/21a3ccbd.aeb8fec8.js
new file mode 100644
index 0000000..b65bca0
--- /dev/null
+++ b/assets/js/21a3ccbd.aeb8fec8.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[452],{7305(e,n,r){r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>i});const s=JSON.parse('{"id":"user-guide/cpp/example/log-tables","title":"Log Tables","description":"Log tables are append-only tables without primary keys, suitable for event streaming.","source":"@site/docs/user-guide/cpp/example/log-tables.md","sourceDi [...]
\ No newline at end of file
diff --git a/assets/js/22dd74f7.60660093.js b/assets/js/22dd74f7.60660093.js
new file mode 100644
index 0000000..3c88e75
--- /dev/null
+++ b/assets/js/22dd74f7.60660093.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[567],{5226(e){e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docsSidebar":[{"type":"link","href":"/","label":"Introduction","docId":"index","unlisted":false},{"type":"category","label":"Clients","items":[{"type":"category", [...]
\ No newline at end of file
diff --git a/assets/js/237.556fb200.js b/assets/js/237.556fb200.js
new file mode 100644
index 0000000..8d8aecc
--- /dev/null
+++ b/assets/js/237.556fb200.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[237],{3363(e,t,i){i.d(t,{A:()=>a});i(6540);var s=i(4164),n=i(1312),o=i(1107),l=i(4848);function a({className:e}){return(0,l.jsx)("main",{className:(0,s.A)("container margin-vert--xl",e),children:(0,l.jsx)("div",{className:"row",children:(0,l.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,l.jsx)(o.A,{as:"h1",className:"hero__title",children:(0,l.jsx)(n.A,{id: [...]
\ No newline at end of file
diff --git a/assets/js/2606e8f0.1164a36d.js b/assets/js/2606e8f0.1164a36d.js
new file mode 100644
index 0000000..d7548a7
--- /dev/null
+++ b/assets/js/2606e8f0.1164a36d.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[308],{3633(e,s,n){n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>o});const t=JSON.parse('{"id":"release/create-release","title":"Creating a Fluss Rust Client Release","description":"This document describes in detail how to create a release of the Fluss clients (fluss-rust, fluss-python, fluss-cpp) from the fluss-rust rep [...]
\ No newline at end of file
diff --git a/assets/js/2ccec619.13448f77.js b/assets/js/2ccec619.13448f77.js
new file mode 100644
index 0000000..9ceb3f7
--- /dev/null
+++ b/assets/js/2ccec619.13448f77.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[371],{3207(e,n,i){i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>c,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"developer-guide/contributing","title":"Contributing","description":"Welcome to the development guide for fluss-rust! This project builds the Fluss Rust client and language-specific bindings (Python, C++).","source":"@site/docs [...]
\ No newline at end of file
diff --git a/assets/js/334.bb7f7a54.js b/assets/js/334.bb7f7a54.js
new file mode 100644
index 0000000..3909fd4
--- /dev/null
+++ b/assets/js/334.bb7f7a54.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[334],{4334(e,t,n){n.d(t,{renderReloadPopup:()=>d});n(6540);var s=n(5338),o=n(4848);const c="pwa-popup-container";function d(e){const t=document.getElementById(c)??(()=>{const e=document.createElement("div");return e.id=c,document.body.appendChild(e),e})();return Promise.all([n.e(869),n.e(362)]).then(n.bind(n,2362)).then(({default:n})=>{(0,s.createRoot)(t).render((0,o.jsx)(n [...]
\ No newline at end of file
diff --git a/assets/js/362.c7458be2.js b/assets/js/362.c7458be2.js
new file mode 100644
index 0000000..873b6f5
--- /dev/null
+++ b/assets/js/362.c7458be2.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[362],{2362(e,t,o){o.d(t,{default:()=>c});var s=o(6540),l=o(4164),a=o(1312);const n="popup_wph0",i="buttonContainer_ox5C";var r=o(4848);function c({onReload:e}){const[t,o]=(0,s.useState)(!0);return t&&(0,r.jsxs)("div",{className:(0,l.A)("alert","alert--secondary",n),children:[(0,r.jsx)("p",{children:(0,r.jsx)(a.A,{id:"theme.PwaReloadPopup.info",description:"The text for PWA  [...]
\ No newline at end of file
diff --git a/assets/js/40d3bd0c.6c709cbe.js b/assets/js/40d3bd0c.6c709cbe.js
new file mode 100644
index 0000000..60dcf6a
--- /dev/null
+++ b/assets/js/40d3bd0c.6c709cbe.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[645],{6145(e,n,t){t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"user-guide/cpp/example/index","title":"Example","description":"Minimal working example: connect to Fluss, create a table, write data, and read it back.","source":"@site/docs/user-guide/cpp/example/index.md","sourceDirName":"us [...]
\ No newline at end of file
diff --git a/assets/js/445dfbc8.58346f7b.js b/assets/js/445dfbc8.58346f7b.js
new file mode 100644
index 0000000..6a2b924
--- /dev/null
+++ b/assets/js/445dfbc8.58346f7b.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[933],{4925(e,s,d){d.r(s),d.d(s,{assets:()=>l,contentTitle:()=>c,default:()=>x,frontMatter:()=>n,metadata:()=>r,toc:()=>h});const r=JSON.parse('{"id":"user-guide/rust/api-reference","title":"API Reference","description":"Complete API reference for the Fluss Rust client.","source":"@site/docs/user-guide/rust/api-reference.md","sourceDirName":"user-guide/rust","slug":"/user-gu [...]
\ No newline at end of file
diff --git a/assets/js/4929aa57.d1bc856a.js b/assets/js/4929aa57.d1bc856a.js
new file mode 100644
index 0000000..855594d
--- /dev/null
+++ b/assets/js/4929aa57.d1bc856a.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[963],{5900(e,n,t){t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>d,frontMatter:()=>r,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"user-guide/cpp/example/configuration","title":"Configuration","description":"Connection Setup","source":"@site/docs/user-guide/cpp/example/configuration.md","sourceDirName":"user-guide/cpp/example","slug":"/user-guide/cpp/exam [...]
\ No newline at end of file
diff --git a/assets/js/535c914a.d192ce16.js b/assets/js/535c914a.d192ce16.js
new file mode 100644
index 0000000..dce8649
--- /dev/null
+++ b/assets/js/535c914a.d192ce16.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[552],{3778(e,r,t){t.r(r),t.d(r,{assets:()=>o,contentTitle:()=>l,default:()=>p,frontMatter:()=>s,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"user-guide/rust/example/primary-key-tables","title":"Primary Key Tables","description":"Primary key tables (KV tables) support upsert, delete, and lookup operations.","source":"@site/docs/user-guide/rust/example/primary-key-ta [...]
\ No newline at end of file
diff --git a/assets/js/563a3698.2ae45962.js b/assets/js/563a3698.2ae45962.js
new file mode 100644
index 0000000..d93c20c
--- /dev/null
+++ b/assets/js/563a3698.2ae45962.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[750],{7165(e,r,n){n.r(r),n.d(r,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>d,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"user-guide/python/error-handling","title":"Error Handling","description":"The client raises fluss.FlussError for all Fluss-specific errors. Each error carries a message and an error_code.","source":"@site/docs/user-guide/pytho [...]
\ No newline at end of file
diff --git a/assets/js/5be6a790.8aa9c7d2.js b/assets/js/5be6a790.8aa9c7d2.js
new file mode 100644
index 0000000..49797a4
--- /dev/null
+++ b/assets/js/5be6a790.8aa9c7d2.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[600],{9073(e,r,n){n.r(r),n.d(r,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"user-guide/rust/error-handling","title":"Error Handling","description":"The Fluss Rust client uses a unified Error type and a Result alias for all fallible operations.","source":"@site/docs/user-guide/rust/error-handling.md"," [...]
\ No newline at end of file
diff --git a/assets/js/5cbabd65.5687f108.js b/assets/js/5cbabd65.5687f108.js
new file mode 100644
index 0000000..e317e2d
--- /dev/null
+++ b/assets/js/5cbabd65.5687f108.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[941],{5317(e,t,n){n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>o,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"user-guide/rust/example/partitioned-tables","title":"Partitioned Tables","description":"Partitioned tables distribute data across partitions based on partition column values, enabling efficient data organization and querying.  [...]
\ No newline at end of file
diff --git a/assets/js/5e95c892.e61a3d6b.js b/assets/js/5e95c892.e61a3d6b.js
new file mode 100644
index 0000000..9f38021
--- /dev/null
+++ b/assets/js/5e95c892.e61a3d6b.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[647],{7121(s,e,l){l.r(e),l.d(e,{default:()=>n});l(6540);var r=l(4164),t=l(7559),u=l(5500),a=l(2831),c=l(1656),i=l(4848);function n(s){return(0,i.jsx)(u.e3,{className:(0,r.A)(t.G.wrapper.docsPages),children:(0,i.jsx)(c.A,{children:(0,a.v)(s.route.routes)})})}}}]);
\ No newline at end of file
diff --git a/assets/js/632d88cf.84804e2c.js b/assets/js/632d88cf.84804e2c.js
new file mode 100644
index 0000000..b73b81a
--- /dev/null
+++ b/assets/js/632d88cf.84804e2c.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[607],{7723(e,n,t){t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>l});const a=JSON.parse('{"id":"user-guide/python/example/index","title":"Example","description":"Minimal working example: connect to Fluss, create a table, write data, and read it back.","source":"@site/docs/user-guide/python/example/index.md","sourceDirNam [...]
\ No newline at end of file
diff --git a/assets/js/657ca811.6f3c60f4.js b/assets/js/657ca811.6f3c60f4.js
new file mode 100644
index 0000000..8581ae0
--- /dev/null
+++ b/assets/js/657ca811.6f3c60f4.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[315],{5765(e,r,t){t.r(r),t.d(r,{assets:()=>o,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>n,toc:()=>p});const n=JSON.parse('{"id":"user-guide/cpp/example/primary-key-tables","title":"Primary Key Tables","description":"Primary key tables (KV tables) support upsert, delete, and lookup operations.","source":"@site/docs/user-guide/cpp/example/primary-key-tabl [...]
\ No newline at end of file
diff --git a/assets/js/67a63da5.47b9e20a.js b/assets/js/67a63da5.47b9e20a.js
new file mode 100644
index 0000000..5088553
--- /dev/null
+++ b/assets/js/67a63da5.47b9e20a.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[484],{7443(e,s,i){i.r(s),i.d(s,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>o});const n=JSON.parse('{"id":"release/verifying-a-release-candidate","title":"How to Verify a Release Candidate","description":"This document describes how to verify a release candidate (RC) of the Fluss clients (fluss-rust, fluss-python, fluss-cpp) from t [...]
\ No newline at end of file
diff --git a/assets/js/687602b6.9090bcf7.js b/assets/js/687602b6.9090bcf7.js
new file mode 100644
index 0000000..b1e70b1
--- /dev/null
+++ b/assets/js/687602b6.9090bcf7.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[496],{7598(e,d,s){s.r(d),s.d(d,{assets:()=>l,contentTitle:()=>c,default:()=>o,frontMatter:()=>n,metadata:()=>t,toc:()=>h});const t=JSON.parse('{"id":"user-guide/cpp/api-reference","title":"API Reference","description":"Complete API reference for the Fluss C++ client.","source":"@site/docs/user-guide/cpp/api-reference.md","sourceDirName":"user-guide/cpp","slug":"/user-guide/ [...]
\ No newline at end of file
diff --git a/assets/js/692614d6.aa27e052.js b/assets/js/692614d6.aa27e052.js
new file mode 100644
index 0000000..2326691
--- /dev/null
+++ b/assets/js/692614d6.aa27e052.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[461],{4434(e,n,t){t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"user-guide/rust/example/index","title":"Example","description":"Minimal working examples: connect to Fluss, create a table, write data, and read it back.","source":"@site/docs/user-guide/rust/example/index.md","sourceDirName": [...]
\ No newline at end of file
diff --git a/assets/js/730.02fcba47.js b/assets/js/730.02fcba47.js
new file mode 100644
index 0000000..8cc24b6
--- /dev/null
+++ b/assets/js/730.02fcba47.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[730],{9730(n,t,e){e.r(t),e.d(t,{Workbox:()=>g,WorkboxEvent:()=>v,messageSW:()=>r});try{self["workbox:window:7.3.0"]&&_()}catch(r){}function r(n,t){return new Promise(function(e){var r=new MessageChannel;r.port1.onmessage=function(n){e(n.data)},n.postMessage(t,[r.port2])})}function i(n,t){(null==t||t>n.length)&&(t=n.length);for(var e=0,r=Array(t);e<t;e++)r[e]=n[e];return r}f [...]
\ No newline at end of file
diff --git a/assets/js/7458a8dd.0a521aef.js b/assets/js/7458a8dd.0a521aef.js
new file mode 100644
index 0000000..fbea52c
--- /dev/null
+++ b/assets/js/7458a8dd.0a521aef.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[614],{2663(e,t,s){s.r(t),s.d(t,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>l});const a=JSON.parse('{"id":"user-guide/python/example/admin-operations","title":"Admin Operations","description":"Databases","source":"@site/docs/user-guide/python/example/admin-operations.md","sourceDirName":"user-guide/python/example","slug":"/user-gui [...]
\ No newline at end of file
diff --git a/assets/js/745ce156.a102bba7.js b/assets/js/745ce156.a102bba7.js
new file mode 100644
index 0000000..efbaf0c
--- /dev/null
+++ b/assets/js/745ce156.a102bba7.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[433],{3654(e,n,r){r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"user-guide/python/example/log-tables","title":"Log Tables","description":"Log tables are append-only tables without primary keys, suitable for event streaming.","source":"@site/docs/user-guide/python/example/log-tables.md","so [...]
\ No newline at end of file
diff --git a/assets/js/76210954.911af642.js b/assets/js/76210954.911af642.js
new file mode 100644
index 0000000..64d5121
--- /dev/null
+++ b/assets/js/76210954.911af642.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[625],{3214(e,n,s){s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>d,default:()=>a,frontMatter:()=>c,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"user-guide/python/example/configuration","title":"Configuration","description":"Connection Setup","source":"@site/docs/user-guide/python/example/configuration.md","sourceDirName":"user-guide/python/example","slug":"/user-guide [...]
\ No newline at end of file
diff --git a/assets/js/8c75c7ee.f1376dd9.js b/assets/js/8c75c7ee.f1376dd9.js
new file mode 100644
index 0000000..da2bf03
--- /dev/null
+++ b/assets/js/8c75c7ee.f1376dd9.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[388],{8170(e,n,s){s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>t,toc:()=>u});const t=JSON.parse('{"id":"user-guide/python/installation","title":"Installation","description":"Building From Source (Optional)","source":"@site/docs/user-guide/python/installation.md","sourceDirName":"user-guide/python","slug":"/user-guide/python/inst [...]
\ No newline at end of file
diff --git a/assets/js/8fca9180.c0590ff5.js b/assets/js/8fca9180.c0590ff5.js
new file mode 100644
index 0000000..00a113e
--- /dev/null
+++ b/assets/js/8fca9180.c0590ff5.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[279],{6881(e,n,t){t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"user-guide/rust/example/log-tables","title":"Log Tables","description":"Log tables are append-only tables without primary keys, suitable for event streaming.","source":"@site/docs/user-guide/rust/example/log-tables.md","source [...]
\ No newline at end of file
diff --git a/assets/js/9e35809b.663c4d9d.js b/assets/js/9e35809b.663c4d9d.js
new file mode 100644
index 0000000..5487e26
--- /dev/null
+++ b/assets/js/9e35809b.663c4d9d.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[56],{413(e,i,n){n.r(i),n.d(i,{assets:()=>l,contentTitle:()=>o,default:()=>c,frontMatter:()=>s,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"user-guide/python/example/partitioned-tables","title":"Partitioned Tables","description":"Partitioned tables distribute data across partitions based on column values. Partitions must exist before writing data, otherwise the clie [...]
\ No newline at end of file
diff --git a/assets/js/a09c8d71.12b52f58.js b/assets/js/a09c8d71.12b52f58.js
new file mode 100644
index 0000000..d7d569f
--- /dev/null
+++ b/assets/js/a09c8d71.12b52f58.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[660],{501(e,d,s){s.r(d),s.d(d,{assets:()=>l,contentTitle:()=>n,default:()=>a,frontMatter:()=>i,metadata:()=>r,toc:()=>h});const r=JSON.parse('{"id":"user-guide/python/api-reference","title":"API Reference","description":"Complete API reference for the Fluss Python client.","source":"@site/docs/user-guide/python/api-reference.md","sourceDirName":"user-guide/python","slug":"/ [...]
\ No newline at end of file
diff --git a/assets/js/a7bd4aaa.b1498e94.js b/assets/js/a7bd4aaa.b1498e94.js
new file mode 100644
index 0000000..00f0568
--- /dev/null
+++ b/assets/js/a7bd4aaa.b1498e94.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[98],{1723(n,s,e){e.r(s),e.d(s,{default:()=>d});e(6540);var r=e(5500);function t(n,s){return`docs-${n}-${s}`}var o=e(3025),i=e(2831),c=e(1463),l=e(4848);function u(n){const{version:s}=n;return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(c.A,{version:s.version,tag:t(s.pluginId,s.version)}),(0,l.jsx)(r.be,{children:s.noIndex&&(0,l.jsx)("meta",{name:"robots",content:"noindex, nof [...]
\ No newline at end of file
diff --git a/assets/js/a94703ab.f0548e96.js b/assets/js/a94703ab.f0548e96.js
new file mode 100644
index 0000000..72f68a2
--- /dev/null
+++ b/assets/js/a94703ab.f0548e96.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[48],{8115(e,t,n){n.r(t),n.d(t,{default:()=>Se});var a=n(6540),i=n(4164),s=n(5500),o=n(7559),l=n(4718),r=n(609),c=n(1312),d=n(3104),u=n(5062);const m="backToTopButton_sjWU",b="backToTopButtonShow_xfvO";var h=n(4848);function p(){const{shown:e,scrollToTop:t}=function({threshold:e}){const[t,n]=(0,a.useState)(!1),i=(0,a.useRef)(!1),{startScroll:s,cancelScroll:o}=(0,d.gk)();retu [...]
\ No newline at end of file
diff --git a/assets/js/aaf64d1a.a01dd21a.js b/assets/js/aaf64d1a.a01dd21a.js
new file mode 100644
index 0000000..0c4c4a5
--- /dev/null
+++ b/assets/js/aaf64d1a.a01dd21a.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[587],{505(e,n,s){s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>d,default:()=>a,frontMatter:()=>c,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"user-guide/rust/example/configuration","title":"Configuration","description":"Connection Setup","source":"@site/docs/user-guide/rust/example/configuration.md","sourceDirName":"user-guide/rust/example","slug":"/user-guide/rust/e [...]
\ No newline at end of file
diff --git a/assets/js/ab9b3dd7.41cc7284.js b/assets/js/ab9b3dd7.41cc7284.js
new file mode 100644
index 0000000..5823033
--- /dev/null
+++ b/assets/js/ab9b3dd7.41cc7284.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[345],{835(e,n,s){s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>i,metadata:()=>t,toc:()=>o});const t=JSON.parse('{"id":"user-guide/cpp/data-types","title":"Data Types","description":"Schema DataTypes","source":"@site/docs/user-guide/cpp/data-types.md","sourceDirName":"user-guide/cpp","slug":"/user-guide/cpp/data-types","permalink":"/user-guide/c [...]
\ No newline at end of file
diff --git a/assets/js/aba21aa0.916bf8b1.js b/assets/js/aba21aa0.916bf8b1.js
new file mode 100644
index 0000000..4726eb0
--- /dev/null
+++ b/assets/js/aba21aa0.916bf8b1.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[742],{7093(s){s.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]);
\ No newline at end of file
diff --git a/assets/js/ac8c0136.450b05b7.js b/assets/js/ac8c0136.450b05b7.js
new file mode 100644
index 0000000..e6323ca
--- /dev/null
+++ b/assets/js/ac8c0136.450b05b7.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[970],{810(e,t,n){n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>s,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"user-guide/cpp/example/partitioned-tables","title":"Partitioned Tables","description":"Partitioned tables distribute data across partitions based on partition column values, enabling efficient data organization and querying. Bo [...]
\ No newline at end of file
diff --git a/assets/js/be3b534d.9ce339b1.js b/assets/js/be3b534d.9ce339b1.js
new file mode 100644
index 0000000..2ea40c0
--- /dev/null
+++ b/assets/js/be3b534d.9ce339b1.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[892],{497(e,t,n){n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>a,toc:()=>l});const a=JSON.parse('{"id":"user-guide/cpp/example/admin-operations","title":"Admin Operations","description":"Get Admin Interface","source":"@site/docs/user-guide/cpp/example/admin-operations.md","sourceDirName":"user-guide/cpp/example","slug":"/user-gui [...]
\ No newline at end of file
diff --git a/assets/js/c377a04b.a112f5f4.js b/assets/js/c377a04b.a112f5f4.js
new file mode 100644
index 0000000..46ef4a4
--- /dev/null
+++ b/assets/js/c377a04b.a112f5f4.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[361],{2939(e,s,t){t.r(s),t.d(s,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"index","title":"Introduction","description":"Apache Fluss (incubating) is a streaming storage system built for real-time analytics, serving as the real-time data layer for Lakehouse architectures.","source":"@site/docs/index.m [...]
\ No newline at end of file
diff --git a/assets/js/d6584c60.3e2c98f6.js b/assets/js/d6584c60.3e2c98f6.js
new file mode 100644
index 0000000..d631865
--- /dev/null
+++ b/assets/js/d6584c60.3e2c98f6.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[839],{8534(e,s,n){n.r(s),n.d(s,{assets:()=>o,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"user-guide/rust/installation","title":"Installation","description":"The Fluss Rust client is published to crates.io as fluss-rs. The crate\'s library name is fluss, so you import it with use fluss::....","source":"@site/docs/u [...]
\ No newline at end of file
diff --git a/assets/js/dfb4c545.2de2ed1c.js b/assets/js/dfb4c545.2de2ed1c.js
new file mode 100644
index 0000000..91ffed0
--- /dev/null
+++ b/assets/js/dfb4c545.2de2ed1c.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[122],{967(e,t,a){a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>c,frontMatter:()=>r,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"user-guide/rust/example/admin-operations","title":"Admin Operations","description":"Get Admin Interface","source":"@site/docs/user-guide/rust/example/admin-operations.md","sourceDirName":"user-guide/rust/example","slug":"/user- [...]
\ No newline at end of file
diff --git a/assets/js/e0d78237.c7a8636c.js b/assets/js/e0d78237.c7a8636c.js
new file mode 100644
index 0000000..f2b18b5
--- /dev/null
+++ b/assets/js/e0d78237.c7a8636c.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[855],{6559(e,n,s){s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>o});const i=JSON.parse('{"id":"user-guide/cpp/installation","title":"Installation","description":"The C++ bindings are not yet published as a package. You need to build from source.","source":"@site/docs/user-guide/cpp/installation.md","sourceDirName":"user [...]
\ No newline at end of file
diff --git a/assets/js/e64b0739.ca67e6c0.js b/assets/js/e64b0739.ca67e6c0.js
new file mode 100644
index 0000000..fb09f11
--- /dev/null
+++ b/assets/js/e64b0739.ca67e6c0.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[259],{3236(e,t,n){n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>s,metadata:()=>d,toc:()=>l});const d=JSON.parse('{"id":"user-guide/python/data-types","title":"Data Types","description":"The Python client uses PyArrow types for schema definitions:","source":"@site/docs/user-guide/python/data-types.md","sourceDirName":"user-guide/python","slug":" [...]
\ No newline at end of file
diff --git a/assets/js/main.5b88a321.js b/assets/js/main.5b88a321.js
new file mode 100644
index 0000000..1b633f2
--- /dev/null
+++ b/assets/js/main.5b88a321.js
@@ -0,0 +1,2 @@
+/*! For license information please see main.5b88a321.js.LICENSE.txt */
+(globalThis.webpackChunkfluss_clients_website=globalThis.webpackChunkfluss_clients_website||[]).push([[792],{8328(e,t,n){"use strict";n.d(t,{A:()=>p});n(6540);var r=n(3259),a=n.n(r),o=n(4054);const i={"0c1d904d":[()=>n.e(192).then(n.bind(n,5244)),"@site/docs/user-guide/python/example/primary-key-tables.md",5244],17896441:[()=>Promise.all([n.e(869),n.e(401)]).then(n.bind(n,8252)),"@theme/DocItem",8252],"1870c74d":[()=>n.e(511).then(n.bind(n,3415)),"@site/docs/user-guide/rust/data-types.md [...]
\ No newline at end of file
diff --git a/assets/js/main.5b88a321.js.LICENSE.txt b/assets/js/main.5b88a321.js.LICENSE.txt
new file mode 100644
index 0000000..647fcb4
--- /dev/null
+++ b/assets/js/main.5b88a321.js.LICENSE.txt
@@ -0,0 +1,51 @@
+/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress
+ * @license MIT */
+
+/**
+ * @license React
+ * react-dom.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * react-jsx-runtime.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * react.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * scheduler.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/** @license React v16.13.1
+ * react-is.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
diff --git a/assets/js/runtime~main.613ff8f6.js b/assets/js/runtime~main.613ff8f6.js
new file mode 100644
index 0000000..6e2a01d
--- /dev/null
+++ b/assets/js/runtime~main.613ff8f6.js
@@ -0,0 +1 @@
+(()=>{"use strict";var e,a,t,c,r,d={},b={};function f(e){var a=b[e];if(void 0!==a)return a.exports;var t=b[e]={exports:{}};return d[e].call(t.exports,t,t.exports,f),t.exports}f.m=d,e=[],f.O=(a,t,c,r)=>{if(!t){var d=1/0;for(i=0;i<e.length;i++){for(var[t,c,r]=e[i],b=!0,o=0;o<t.length;o++)(!1&r||d>=r)&&Object.keys(f.O).every(e=>f.O[e](t[o]))?t.splice(o--,1):(b=!1,r<d&&(d=r));if(b){e.splice(i--,1);var n=c();void 0!==n&&(a=n)}}return a}r=r||0;for(var i=e.length;i>0&&e[i-1][2]>r;i--)e[i]=e[i-1 [...]
\ No newline at end of file
diff --git a/developer-guide/contributing/index.html b/developer-guide/contributing/index.html
new file mode 100644
index 0000000..0aafece
--- /dev/null
+++ b/developer-guide/contributing/index.html
@@ -0,0 +1,62 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-developer-guide/contributing" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Contributing | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" conten [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>Welcome to the development guide for <code>fluss-rust</code>! This project builds the Fluss Rust client and language-specific bindings (Python, C++).</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h2>
+<ul>
+<li class="">Rust 1.85+ (see <a href="https://github.com/apache/fluss-rust/blob/main/rust-toolchain.toml" target="_blank" rel="noopener noreferrer" class="">rust-toolchain.toml</a>)</li>
+<li class="">Protobuf compiler (<code>protoc</code>)</li>
+</ul>
+<p>Install using your preferred package/version manager:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)"># Using mise</span><span class="token plain"></span><br>< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ide-setup">IDE Setup<a href="#ide-setup" class="hash-link" aria-label="Direct link to IDE Setup" title="Direct link to IDE Setup" translate="no">​</a></h2>
+<p>We recommend <a href="https://www.jetbrains.com/rust/" target="_blank" rel="noopener noreferrer" class="">RustRover</a> IDE.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="importing-the-project">Importing the Project<a href="#importing-the-project" class="hash-link" aria-label="Direct link to Importing the Project" title="Direct link to Importing the Project" translate="no">​</a></h3>
+<ol>
+<li class="">Clone the repository:<!-- -->
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">git</span><span class="token plain"> clone https://gith [...]
+</li>
+<li class="">Open RustRover, go to the <code>Projects</code> tab, click <code>Open</code>, and navigate to the root directory.</li>
+<li class="">Click <code>Open</code>.</li>
+</ol>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="copyright-profile">Copyright Profile<a href="#copyright-profile" class="hash-link" aria-label="Direct link to Copyright Profile" title="Direct link to Copyright Profile" translate="no">​</a></h3>
+<p>Fluss is an Apache project, every file needs an Apache licence header. To automate this in RustRover:</p>
+<ol>
+<li class="">Go to <code>Settings</code> &gt; <code>Editor</code> &gt; <code>Copyright</code> &gt; <code>Copyright Profiles</code>.</li>
+<li class="">Add a new profile named <code>Apache</code> with this text:<!-- -->
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">Licensed to the Apache Software Foundation (ASF) under one</span><br></span><span class="to [...]
+</li>
+<li class="">Go to <code>Editor</code> &gt; <code>Copyright</code> and set <code>Apache</code> as the default profile.</li>
+<li class="">Go to <code>Editor</code> &gt; <code>Copyright</code> &gt; <code>Formatting</code> &gt; <code>Rust</code>, choose <code>Use custom formatting</code>, then <code>Use line comment</code>.</li>
+<li class="">Click <code>Apply</code>.</li>
+</ol>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="project-structure">Project Structure<a href="#project-structure" class="hash-link" aria-label="Direct link to Project Structure" title="Direct link to Project Structure" translate="no">​</a></h2>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">crates/fluss        (Fluss Rust client crate)</span><br></span><span class="token-line" sty [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="building-and-testing">Building and Testing<a href="#building-and-testing" class="hash-link" aria-label="Direct link to Building and Testing" title="Direct link to Building and Testing" translate="no">​</a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="rust-client">Rust Client<a href="#rust-client" class="hash-link" aria-label="Direct link to Rust Client" title="Direct link to Rust Client" translate="no">​</a></h3>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)"># Build everything</span><span class="token plain"></span [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="python-bindings">Python Bindings<a href="#python-bindings" class="hash-link" aria-label="Direct link to Python Bindings" title="Direct link to Python Bindings" translate="no">​</a></h3>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token builtin class-name" style="color:rgb(78, 201, 176)">cd</span><span class="token plain"> bindings/p [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="c-bindings">C++ Bindings<a href="#c-bindings" class="hash-link" aria-label="Direct link to C++ Bindings" title="Direct link to C++ Bindings" translate="no">​</a></h3>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token builtin class-name" style="color:rgb(78, 201, 176)">cd</span><span class="token plain"> bindings/c [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="license-check-cargo-deny">License Check (cargo-deny)<a href="#license-check-cargo-deny" class="hash-link" aria-label="Direct link to License Check (cargo-deny)" title="Direct link to License Check (cargo-deny)" translate="no">​</a></h2>
+<p>We use <a href="https://embarkstudios.github.io/cargo-deny/" target="_blank" rel="noopener noreferrer" class="">cargo-deny</a> to ensure all dependency licenses are Apache-compatible:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">cargo</span><span class="token plain"> </span><span cla [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="formatting-and-clippy">Formatting and Clippy<a href="#formatting-and-clippy" class="hash-link" aria-label="Direct link to Formatting and Clippy" title="Direct link to Formatting and Clippy" translate="no">​</a></h2>
+<p>CI runs formatting and clippy checks. Run these before submitting a PR:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">cargo</span><span class="token plain"> </span><span cla [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/img/logo/fluss_favicon.svg b/img/logo/fluss_favicon.svg
new file mode 100644
index 0000000..7c044d5
--- /dev/null
+++ b/img/logo/fluss_favicon.svg
@@ -0,0 +1,19 @@
+<!--
+ 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.
+-->
+
+<svg width="142" height="144" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" overflow="hidden"><defs><clipPath id="clip0"><rect x="118" y="81" width="142" height="144"/></clipPath><clipPath id="clip1"><rect x="118" y="81" width="142" height="144"/></clipPath><clipPath id="clip2"><rect x="119" y="82" width="141" height="143"/></clipPath><clipPath id="clip3"><rect x="119" y="82" width="141" height="143"/></clipPath><clipPath id="clip4"><r [...]
\ No newline at end of file
diff --git a/img/logo/png/colored_logo.png b/img/logo/png/colored_logo.png
new file mode 100644
index 0000000..2cd7dd3
Binary files /dev/null and b/img/logo/png/colored_logo.png differ
diff --git a/img/logo/svg/colored_logo.svg b/img/logo/svg/colored_logo.svg
new file mode 100644
index 0000000..3b136ac
--- /dev/null
+++ b/img/logo/svg/colored_logo.svg
@@ -0,0 +1,19 @@
+<!--
+ 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.
+-->
+
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="403.4100341796875" height="171.5" viewBox="0 0 403.4100341796875 171.5"><defs><clipPath id="master_svg0_14_8989"><rect x="180" y="54.5" width="223.41001892089844" height="91.2300033569336" rx="0"/></clipPath><linearGradient x1="0.5" y1="0" x2="0.5" y2="1" id="master_svg1_14_05037"><stop offset="0%" stop-color="#FFFFFF" stop-opacity="1"/><stop offset="33.571428060531616%" st [...]
\ No newline at end of file
diff --git a/img/release-guide.png b/img/release-guide.png
new file mode 100644
index 0000000..bf7602d
Binary files /dev/null and b/img/release-guide.png differ
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..801cf70
--- /dev/null
+++ b/index.html
@@ -0,0 +1,44 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-index" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Introduction | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" conten [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p><a href="https://fluss.apache.org/" target="_blank" rel="noopener noreferrer" class="">Apache Fluss</a> (incubating) is a streaming storage system built for real-time analytics, serving as the real-time data layer for Lakehouse architectures.</p>
+<p>This documentation covers the <strong>Fluss client libraries</strong> for Rust, Python, C++, and <a href="https://fluss.apache.org/docs/0.9/apis/java-client/" target="_blank" rel="noopener noreferrer" class="">Java</a>, which are developed in the <a href="https://github.com/apache/fluss-rust" target="_blank" rel="noopener noreferrer" class="">fluss-rust</a> repository (Java client is part of the <a href="https://github.com/apache/fluss" target="_blank" rel="noopener noreferrer" class= [...]
+<ul>
+<li class=""><strong>Create and manage</strong> databases, tables, and partitions</li>
+<li class=""><strong>Write</strong> data to log tables (append-only) and primary key tables (upsert/delete)</li>
+<li class=""><strong>Read</strong> data via log scanning and key lookups</li>
+<li class=""><strong>Integrate</strong> with the broader Fluss ecosystem including lakehouse snapshots</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h2>
+<p>You need a running Fluss cluster to use any of the client libraries. See the <a href="https://fluss.apache.org/docs/install-deploy/deploying-local-cluster/" target="_blank" rel="noopener noreferrer" class="">Deploying a Local Cluster</a> guide to get started.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-concepts">Key Concepts<a href="#key-concepts" class="hash-link" aria-label="Direct link to Key Concepts" title="Direct link to Key Concepts" translate="no">​</a></h2>
+<ul>
+<li class=""><strong>Log table</strong> — an append-only table (no primary key). Records are immutable once written. Use for event streams, logs, and audit trails.<!-- -->
+<ul>
+<li class=""><strong>Offset</strong> — the position of a record within a log table&#x27;s bucket. Used to track reading progress. Start from <code>EARLIEST_OFFSET</code> to read all data, or resolve the current latest offset via <code>list_offsets</code> to only read new records.</li>
+</ul>
+</li>
+<li class=""><strong>Primary key (PK) table</strong> — a table with a primary key. Supports upsert, delete, and point lookups.</li>
+<li class=""><strong>Bucket</strong> — the unit of parallelism within a table (similar to Kafka partitions). Each table has one or more buckets. Readers subscribe to individual buckets.</li>
+<li class=""><strong>Partition</strong> — a way to organize data by column values (e.g. by date or region). Each partition contains its own set of buckets. Partitions must be created explicitly before writing.</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="client-overview">Client Overview<a href="#client-overview" class="hash-link" aria-label="Direct link to Client Overview" title="Direct link to Client Overview" translate="no">​</a></h2>
+<table><thead><tr><th></th><th>Rust</th><th>Python</th><th>C++</th></tr></thead><tbody><tr><td><strong>Package</strong></td><td><a href="https://crates.io/crates/fluss-rs" target="_blank" rel="noopener noreferrer" class="">fluss-rs</a> on crates.io</td><td>Build from source (PyO3)</td><td>Build from source (CMake)</td></tr><tr><td><strong>Async runtime</strong></td><td>Tokio</td><td>asyncio</td><td>Synchronous (Tokio runtime managed internally)</td></tr><tr><td><strong>Data format</stron [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-this-guide-is-organised">How This Guide Is Organised<a href="#how-this-guide-is-organised" class="hash-link" aria-label="Direct link to How This Guide Is Organised" title="Direct link to How This Guide Is Organised" translate="no">​</a></h2>
+<p>The <strong>Clients</strong> section walks through installation, configuration, and working with each table type across all three languages. Code examples are shown side by side under <strong>Rust</strong>, <strong>Python</strong>, and <strong>C++</strong> headings.</p>
+<p>The <strong>Contributing</strong> guide covers building from source, running tests, and the release process for contributors.</p></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col noPrint_WFHX"><a href="https://github.com/apache/fluss-rust/edit/main/website/docs/index.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0  [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/manifest.json b/manifest.json
new file mode 100644
index 0000000..7cd3b56
--- /dev/null
+++ b/manifest.json
@@ -0,0 +1,17 @@
+{
+  "short_name": "Fluss Clients",
+  "name": "Apache Fluss Clients: Rust, Python, and C++",
+  "description": "Rust, Python, and C++ clients for Apache Fluss",
+  "start_url": "/",
+  "scope": "/",
+  "display": "standalone",
+  "background_color": "#000000",
+  "theme_color": "#0071e3",
+  "icons": [
+    {
+      "src": "img/logo/svg/colored_logo.svg",
+      "sizes": "any",
+      "type": "image/svg+xml"
+    }
+  ]
+}
diff --git a/release/create-release/index.html b/release/create-release/index.html
new file mode 100644
index 0000000..edd1e32
--- /dev/null
+++ b/release/create-release/index.html
@@ -0,0 +1,237 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-release/create-release" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Creating a Fluss Rust Client Release | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true"  [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>This document describes in detail how to create a release of the <strong>Fluss clients</strong> (fluss-rust, fluss-python, fluss-cpp) from the <a href="https://github.com/apache/fluss-rust" target="_blank" rel="noopener noreferrer" class="">fluss-rust</a> repository. It is based on the <a href="https://fluss.apache.org/community/how-to-release/creating-a-fluss-release/" target="_blank" rel="noopener noreferrer" class="">Creating a Fluss Release</a> guide of the Apache Fluss project an [...]
+<p>Publishing software has legal consequences. This guide complements the foundation-wide <a href="https://www.apache.org/legal/release-policy.html" target="_blank" rel="noopener noreferrer" class="">Product Release Policy</a> and <a href="https://infra.apache.org/release-distribution.html" target="_blank" rel="noopener noreferrer" class="">Release Distribution Policy</a>.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no">​</a></h2>
+<p><img decoding="async" loading="lazy" alt="Release process overview" src="/assets/images/release-guide-31289e18e49c6d63d34856e111c4fd7d.png" width="3600" height="575" class="img_ev3q"></p>
+<p>The release process consists of:</p>
+<ol>
+<li class=""><a href="#decide-to-release" class="">Decide to release</a></li>
+<li class=""><a href="#prepare-for-the-release" class="">Prepare for the release</a></li>
+<li class=""><a href="#build-a-release-candidate" class="">Build a release candidate</a></li>
+<li class=""><a href="#vote-on-the-release-candidate" class="">Vote on the release candidate</a></li>
+<li class=""><a href="#fix-any-issues" class="">If necessary, fix any issues and go back to step 3</a></li>
+<li class=""><a href="#finalize-the-release" class="">Finalize the release</a></li>
+<li class=""><a href="#promote-the-release" class="">Promote the release</a></li>
+</ol>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="decide-to-release">Decide to release<a href="#decide-to-release" class="hash-link" aria-label="Direct link to Decide to release" title="Direct link to Decide to release" translate="no">​</a></h2>
+<p>Deciding to release and selecting a Release Manager is the first step. This is a consensus-based decision of the community.</p>
+<p>Anybody can propose a release (e.g. on the dev <a href="https://fluss.apache.org/community/welcome/" target="_blank" rel="noopener noreferrer" class="">mailing list</a>), giving a short rationale and nominating a committer as Release Manager (including themselves). Any objections should be resolved by consensus before starting.</p>
+<p><strong>Checklist to proceed</strong></p>
+<ul class="contains-task-list containsTaskList_mC6p">
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Community agrees to release</li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->A Release Manager is selected</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prepare-for-the-release">Prepare for the release<a href="#prepare-for-the-release" class="hash-link" aria-label="Direct link to Prepare for the release" title="Direct link to Prepare for the release" translate="no">​</a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-one-time-release-manager-setup">0. One-time Release Manager setup<a href="#0-one-time-release-manager-setup" class="hash-link" aria-label="Direct link to 0. One-time Release Manager setup" title="Direct link to 0. One-time Release Manager setup" translate="no">​</a></h3>
+<p>Before your first release, perform one-time configuration. See <strong><a href="https://fluss.apache.org/community/how-to-release/release-manager-preparation/" target="_blank" rel="noopener noreferrer" class="">Release Manager Preparation</a></strong> (GPG key, etc.). For fluss-rust you do <strong>not</strong> need Nexus/Maven; you only need GPG for signing the source archive and (optionally) git signing.</p>
+<p><strong>Checklist (one-time)</strong></p>
+<ul class="contains-task-list containsTaskList_mC6p">
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->GPG key set up and published to <a href="https://downloads.apache.org/incubator/fluss/KEYS" target="_blank" rel="noopener noreferrer" class="">KEYS</a> or Apache account</li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Git configured to use your GPG key for signing tags</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-install-rust-and-optional-just">1. Install Rust (and optional: just)<a href="#1-install-rust-and-optional-just" class="hash-link" aria-label="Direct link to 1. Install Rust (and optional: just)" title="Direct link to 1. Install Rust (and optional: just)" translate="no">​</a></h3>
+<p>The release script (<code>just release</code> or <code>./scripts/release.sh</code>) uses <code>git archive</code> and <code>gpg</code>; building or verifying the project locally requires <strong>Rust</strong>. Install the <a href="https://rustup.rs/" target="_blank" rel="noopener noreferrer" class="">Rust toolchain</a> (the version should match <a href="https://github.com/apache/fluss-rust/blob/main/rust-toolchain.toml" target="_blank" rel="noopener noreferrer" class="">rust-toolchain [...]
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">rustc </span><span class="token parameter variable" style="color:rgb(156, 220, 254)">--vers [...]
+<p>To use <code>just release</code>, install <a href="https://github.com/casey/just" target="_blank" rel="noopener noreferrer" class="">just</a> (e.g. <code>cargo install just</code> or your system package manager). If you prefer not to use just, run <code>./scripts/release.sh $RELEASE_VERSION</code> instead.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-optional-create-a-new-milestone-in-github">2. Optional: Create a new Milestone in GitHub<a href="#2-optional-create-a-new-milestone-in-github" class="hash-link" aria-label="Direct link to 2. Optional: Create a new Milestone in GitHub" title="Direct link to 2. Optional: Create a new Milestone in GitHub" translate="no">​</a></h3>
+<p>If the project uses GitHub milestones for release tracking, create a new milestone for the <strong>next</strong> version (e.g. <code>v0.2</code> if you are releasing <code>0.1.x</code>). This helps contributors target issues to the correct release.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-optional-triage-release-blocking-issues">3. Optional: Triage release-blocking issues<a href="#3-optional-triage-release-blocking-issues" class="hash-link" aria-label="Direct link to 3. Optional: Triage release-blocking issues" title="Direct link to 3. Optional: Triage release-blocking issues" translate="no">​</a></h3>
+<p>Check open issues that might block the release. Resolve, defer to the next milestone, or mark as blocker and do not proceed until they are fixed.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-clone-fluss-rust-into-a-fresh-workspace">4. Clone fluss-rust into a fresh workspace<a href="#4-clone-fluss-rust-into-a-fresh-workspace" class="hash-link" aria-label="Direct link to 4. Clone fluss-rust into a fresh workspace" title="Direct link to 4. Clone fluss-rust into a fresh workspace" translate="no">​</a></h3>
+<p>Use a clean clone to avoid local changes affecting the release.</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">git</span><span class="token plain"> clone https://gith [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-set-up-environment-variables">5. Set up environment variables<a href="#5-set-up-environment-variables" class="hash-link" aria-label="Direct link to 5. Set up environment variables" title="Direct link to 5. Set up environment variables" translate="no">​</a></h3>
+<p>Set these once and use them in all following commands. (Bash syntax.)</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token builtin class-name" style="color:rgb(78, 201, 176)">export</span><span class="token plain"> </span [...]
+<p>For the <strong>first release</strong> there is no previous version; leave <code>LAST_VERSION</code> unset or omit it when using the compare link in the DISCUSS thread and release notes.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-generate-dependencies-list">6. Generate dependencies list<a href="#6-generate-dependencies-list" class="hash-link" aria-label="Direct link to 6. Generate dependencies list" title="Direct link to 6. Generate dependencies list" translate="no">​</a></h3>
+<p><a href="https://www.apache.org/legal/release-policy.html" target="_blank" rel="noopener noreferrer" class="">ASF release policy</a> requires that every release comply with <a href="https://www.apache.org/legal/resolved.html" target="_blank" rel="noopener noreferrer" class="">ASF licensing policy</a> and that an <strong>audit be performed before a full release</strong>. Generating and committing a dependency list (and using cargo-deny) documents third-party components and supports thi [...]
+<p>Do this on <code>main</code> <strong>before</strong> creating the release branch. Then both the release branch (when created from <code>main</code>) and <code>main</code> will have the same dependency list.</p>
+<ol>
+<li class="">Download and set up <a href="https://embarkstudios.github.io/cargo-deny/cli/index.html" target="_blank" rel="noopener noreferrer" class="">cargo-deny</a> (see cargo-deny docs).</li>
+<li class="">Run the script to update the dependency list (requires <strong>Python 3.11+</strong> for the release tooling), then commit on <code>main</code>:</li>
+</ol>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">git</span><span class="token plain"> checkout main</spa [...]
+<p>To only check licenses (no file update): <code>python3 scripts/dependencies.py check</code>.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-optional-start-a-discuss-thread">7. Optional: Start a [DISCUSS] thread<a href="#7-optional-start-a-discuss-thread" class="hash-link" aria-label="Direct link to 7. Optional: Start a [DISCUSS] thread" title="Direct link to 7. Optional: Start a [DISCUSS] thread" translate="no">​</a></h3>
+<p>On <a href="https://github.com/apache/fluss-rust/discussions" target="_blank" rel="noopener noreferrer" class="">Fluss Discussions</a> or the dev list:</p>
+<ul>
+<li class=""><strong>Subject:</strong> <code>[DISCUSS] Release Apache Fluss clients (fluss-rust, fluss-python, fluss-cpp) $RELEASE_VERSION</code></li>
+<li class=""><strong>Body:</strong> Short rationale; if there is a previous release, add compare link: <code>https://github.com/apache/fluss-rust/compare/v${LAST_VERSION}...main</code>. Ask for comments.</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-create-a-release-branch">8. Create a release branch<a href="#8-create-a-release-branch" class="hash-link" aria-label="Direct link to 8. Create a release branch" title="Direct link to 8. Create a release branch" translate="no">​</a></h3>
+<p>From <code>main</code>, create a release branch. All release artifacts will be built from this branch. The tag (RC or release) is created later when building the release candidate.</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">git</span><span class="token plain"> checkout main</spa [...]
+<p>Do <strong>not</strong> create or push the release/RC tag yet; that happens in <a href="#build-a-release-candidate" class="">Build a release candidate</a> after the source artifacts are staged.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="9-bump-version-on-main-for-the-next-development-cycle">9. Bump version on main for the next development cycle<a href="#9-bump-version-on-main-for-the-next-development-cycle" class="hash-link" aria-label="Direct link to 9. Bump version on main for the next development cycle" title="Direct link to 9. Bump version on main for the next development cycle" translate="no">​</a></h3>
+<p>So that <code>main</code> moves to the next version immediately after the release branch is cut, run the bump script and commit:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">git</span><span class="token plain"> checkout main</spa [...]
+<p>The script updates the root <code>Cargo.toml</code> ([workspace.package] and [workspace.dependencies] fluss-rs). crates/fluss and bindings inherit <code>version</code> from the workspace.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="10-optional-create-prs-for-release-blog-and-download-page">10. Optional: Create PRs for release blog and download page<a href="#10-optional-create-prs-for-release-blog-and-download-page" class="hash-link" aria-label="Direct link to 10. Optional: Create PRs for release blog and download page" title="Direct link to 10. Optional: Create PRs for release blog and download page" translate="no">​</a></h3>
+<p>You can open a pull request in the <strong>Apache Fluss</strong> repository for the release blog (announcement). If the project website has a download page, also create a PR to add the new version there. <strong>Do not merge these PRs until the release is finalized.</strong></p>
+<hr>
+<p><strong>Checklist to proceed to the next step</strong></p>
+<ul class="contains-task-list containsTaskList_mC6p">
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Rust (and optionally just) installed and on PATH</li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Python 3.11+ for dependency list script</li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->No release-blocking issues (or triaged)</li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Environment variables set</li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Release branch created and pushed</li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Main branch bumped to <code>NEXT_VERSION</code> and pushed</li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Dependencies list generated and committed on main</li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->(Optional) DISCUSS thread and/or tracking issue created</li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->(Optional) PRs for blog and download page created but not merged</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="build-a-release-candidate">Build a release candidate<a href="#build-a-release-candidate" class="hash-link" aria-label="Direct link to Build a release candidate" title="Direct link to Build a release candidate" translate="no">​</a></h2>
+<p>Each release candidate is built from the release branch, signed, and staged to the dev area of dist.apache.org. If an RC fails the vote, fix issues and repeat this section with an incremented <code>RC_NUM</code> (see <a href="#fix-any-issues" class="">Fix any issues</a>).</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-set-rc-environment-variables">1. Set RC environment variables<a href="#1-set-rc-environment-variables" class="hash-link" aria-label="Direct link to 1. Set RC environment variables" title="Direct link to 1. Set RC environment variables" translate="no">​</a></h3>
+<p>Set these when building a <strong>release candidate</strong>. Start with <code>RC_NUM=1</code>; if the vote fails and you build a new candidate, increment to <code>2</code>, then <code>3</code>, etc.</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token builtin class-name" style="color:rgb(78, 201, 176)">export</span><span class="token plain"> </span [...]
+<p>For a <strong>direct release</strong> (no RC), skip these and use <code>RELEASE_TAG</code> and <code>SVN_RELEASE_DIR</code> from the Prepare step instead.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-check-out-the-release-branch-and-create-the-tag">2. Check out the release branch and create the tag<a href="#2-check-out-the-release-branch-and-create-the-tag" class="hash-link" aria-label="Direct link to 2. Check out the release branch and create the tag" title="Direct link to 2. Check out the release branch and create the tag" translate="no">​</a></h3>
+<p>Check out the release branch at the commit you want to release, create the signed tag, then push it. Use <code>RC_TAG</code> for a release candidate or <code>RELEASE_TAG</code> for a direct release. Pushing the tag triggers GitHub Actions (for an RC tag, fluss-python is published to TestPyPI).</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">git</span><span class="token plain"> checkout release-< [...]
+<p>Check CI: <a href="https://github.com/apache/fluss-rust/actions" target="_blank" rel="noopener noreferrer" class="">Actions</a> (Release Rust, Release Python).</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-create-source-release-artifacts">3. Create source release artifacts<a href="#3-create-source-release-artifacts" class="hash-link" aria-label="Direct link to 3. Create source release artifacts" title="Direct link to 3. Create source release artifacts" translate="no">​</a></h3>
+<p>From the repository root (on the release branch, at the commit you tagged):</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">just release </span><span class="token variable" style="color:rgb(156, 220, 254)">$RELEASE_ [...]
+<p>This creates under <code>dist/</code>:</p>
+<ul>
+<li class=""><code>fluss-rust-${RELEASE_VERSION}-incubating.tgz</code></li>
+<li class=""><code>fluss-rust-${RELEASE_VERSION}-incubating.tgz.sha512</code></li>
+<li class=""><code>fluss-rust-${RELEASE_VERSION}-incubating.tgz.asc</code></li>
+</ul>
+<p>(Incubator policy requires the word &quot;incubating&quot; in release artifact names.)</p>
+<p>Verify with: <code>gpg --verify dist/fluss-rust-${RELEASE_VERSION}-incubating.tgz.asc dist/fluss-rust-${RELEASE_VERSION}-incubating.tgz</code></p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-stage-artifacts-to-svn-distapacheorg-dev">4. Stage artifacts to SVN (dist.apache.org dev)<a href="#4-stage-artifacts-to-svn-distapacheorg-dev" class="hash-link" aria-label="Direct link to 4. Stage artifacts to SVN (dist.apache.org dev)" title="Direct link to 4. Stage artifacts to SVN (dist.apache.org dev)" translate="no">​</a></h3>
+<p>From the <strong>fluss-rust</strong> repo root, check out the Fluss dev area and add the release artifacts.</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">svn checkout https://dist.apache.org/repos/dist/dev/incubator/fluss fluss-dist-dev </span>< [...]
+<p>Verify: <a href="https://dist.apache.org/repos/dist/dev/incubator/fluss/" target="_blank" rel="noopener noreferrer" class="">https://dist.apache.org/repos/dist/dev/incubator/fluss/</a></p>
+<hr>
+<p><strong>Checklist to proceed to the next step</strong></p>
+<ul class="contains-task-list containsTaskList_mC6p">
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Source distribution built and signed under <code>dist/</code></li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Artifacts staged to <a href="https://dist.apache.org/repos/dist/dev/incubator/fluss/" target="_blank" rel="noopener noreferrer" class="">dist.apache.org dev</a> under <code>$SVN_RC_DIR</code></li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->RC (or release) tag pushed to GitHub</li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->CI for Release Rust / Release Python succeeded</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vote-on-the-release-candidate">Vote on the release candidate<a href="#vote-on-the-release-candidate" class="hash-link" aria-label="Direct link to Vote on the release candidate" title="Direct link to Vote on the release candidate" translate="no">​</a></h2>
+<p>Share the release candidate for community review. If the project is in incubation, a <a href="https://incubator.apache.org/cookbook/#two_phase_vote_on_podling_releases" target="_blank" rel="noopener noreferrer" class="">two-phase vote</a> (Fluss community then Incubator PMC) may be required; otherwise one community vote is enough.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="fluss-community-vote">Fluss community vote<a href="#fluss-community-vote" class="hash-link" aria-label="Direct link to Fluss community vote" title="Direct link to Fluss community vote" translate="no">​</a></h3>
+<p>Start the vote on the dev@ mailing list.</p>
+<p><strong>Subject:</strong> <code>[VOTE] Release Apache Fluss clients (fluss-rust, fluss-python, fluss-cpp) ${RELEASE_VERSION} (RC${RC_NUM})</code></p>
+<p><strong>Body template:</strong></p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">Hi everyone,</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="t [...]
+<p>If issues are found, cancel the vote and go to <a href="#fix-any-issues" class="">Fix any issues</a>. If the vote passes, close it and tally the result in a follow-up:</p>
+<p><strong>Subject:</strong> <code>[RESULT][VOTE] Release Apache Fluss clients ${RELEASE_VERSION} (RC${RC_NUM})</code></p>
+<p><strong>Body:</strong> Summarize binding and non-binding votes and link to the vote thread.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="incubator-pmc-vote-if-applicable">Incubator PMC vote (if applicable)<a href="#incubator-pmc-vote-if-applicable" class="hash-link" aria-label="Direct link to Incubator PMC vote (if applicable)" title="Direct link to Incubator PMC vote (if applicable)" translate="no">​</a></h3>
+<p>If the project is in incubation, start a vote on <a href="mailto:general@incubator.apache.org" target="_blank" rel="noopener noreferrer" class="">general@incubator.apache.org</a> after the Fluss community vote passes. Use the same structure: link to the community vote thread, release candidate URL, KEYS, tag, and ask IPMC to vote within 72 hours. Then send the result to the same list.</p>
+<hr>
+<p><strong>Checklist to proceed to finalization</strong></p>
+<ul class="contains-task-list containsTaskList_mC6p">
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Community vote passed (at least 3 binding +1, more +1 than -1)</li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->(If incubating) Incubator PMC vote passed</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fix-any-issues">Fix any issues<a href="#fix-any-issues" class="hash-link" aria-label="Direct link to Fix any issues" title="Direct link to Fix any issues" translate="no">​</a></h2>
+<p>If the vote revealed issues:</p>
+<ol>
+<li class="">Fix them on <code>main</code> (or the release branch) via normal PRs; cherry-pick fixes into the release branch as needed.</li>
+<li class="">Remove the old RC from dist.apache.org dev (optional but recommended):</li>
+</ol>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">svn checkout https://dist.apache.org/repos/dist/dev/incubator/fluss fluss-dist-dev </span>< [...]
+<ol start="3">
+<li class="">Increment <code>RC_NUM</code> (e.g. set <code>RC_NUM=&quot;2&quot;</code>), recreate <code>RC_TAG</code> and <code>SVN_RC_DIR</code>, then go back to <a href="#build-a-release-candidate" class="">Build a release candidate</a> and repeat until a candidate is approved.</li>
+</ol>
+<p><strong>Checklist</strong></p>
+<ul class="contains-task-list containsTaskList_mC6p">
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Issues resolved and changes merged/cherry-picked to the release branch</li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->New RC built and voted on (or same RC re-voted if only minor fixes)</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="finalize-the-release">Finalize the release<a href="#finalize-the-release" class="hash-link" aria-label="Direct link to Finalize the release" title="Direct link to Finalize the release" translate="no">​</a></h2>
+<p>Once a release candidate has been approved, finalize the release.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-push-the-release-git-tag-if-the-vote-was-on-an-rc">1. Push the release git tag (if the vote was on an RC)<a href="#1-push-the-release-git-tag-if-the-vote-was-on-an-rc" class="hash-link" aria-label="Direct link to 1. Push the release git tag (if the vote was on an RC)" title="Direct link to 1. Push the release git tag (if the vote was on an RC)" translate="no">​</a></h3>
+<p>If the community voted on an RC tag, create and push the formal release tag so CI publishes to crates.io and PyPI:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">git</span><span class="token plain"> checkout </span><s [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-deploy-source-artifacts-to-the-release-repository">2. Deploy source artifacts to the release repository<a href="#2-deploy-source-artifacts-to-the-release-repository" class="hash-link" aria-label="Direct link to 2. Deploy source artifacts to the release repository" title="Direct link to 2. Deploy source artifacts to the release repository" translate="no">​</a></h3>
+<p>Move the staged artifacts from dev to release:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">svn </span><span class="token function" style="color:rgb(220, 220, 170)">mv</span><span cla [...]
+<p>(Only PPMC members may have write access to the release repository; if you get permission errors, ask on the mailing list.)</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-remove-old-rcs-from-dev-optional">3. Remove old RC(s) from dev (optional)<a href="#3-remove-old-rcs-from-dev-optional" class="hash-link" aria-label="Direct link to 3. Remove old RC(s) from dev (optional)" title="Direct link to 3. Remove old RC(s) from dev (optional)" translate="no">​</a></h3>
+<p>Clean up the dev area so only the current RC or the moved release remains:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token builtin class-name" style="color:rgb(78, 201, 176)">cd</span><span class="token plain"> fluss-dist [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-verify-language-artifacts">4. Verify language artifacts<a href="#4-verify-language-artifacts" class="hash-link" aria-label="Direct link to 4. Verify language artifacts" title="Direct link to 4. Verify language artifacts" translate="no">​</a></h3>
+<ul>
+<li class=""><strong>fluss-rust:</strong> <a href="https://crates.io/crates/fluss-rs" target="_blank" rel="noopener noreferrer" class="">crates.io/crates/fluss-rs</a> shows version <code>$RELEASE_VERSION</code></li>
+<li class=""><strong>fluss-python:</strong> <a href="https://pypi.org/project/pyfluss/" target="_blank" rel="noopener noreferrer" class="">PyPI – pyfluss</a> shows version <code>$RELEASE_VERSION</code></li>
+<li class=""><strong>fluss-cpp:</strong> Distributed via the source archive; no separate registry</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-create-github-release">5. Create GitHub Release<a href="#5-create-github-release" class="hash-link" aria-label="Direct link to 5. Create GitHub Release" title="Direct link to 5. Create GitHub Release" translate="no">​</a></h3>
+<ol>
+<li class="">Go to <a href="https://github.com/apache/fluss-rust/releases/new" target="_blank" rel="noopener noreferrer" class="">Releases → New release</a>.</li>
+<li class="">Choose tag <code>$RELEASE_TAG</code>.</li>
+<li class="">Set the target to the release branch <code>release-${RELEASE_VERSION}</code> (i.e., the branch/commit used to create <code>$RELEASE_TAG</code>).</li>
+<li class="">Click <strong>Generate release notes</strong>, then add: notable changes, breaking changes (if any) from component upgrade docs, <strong>official download link</strong> (source archive and verification), and install instructions for fluss-rust, fluss-python, fluss-cpp.<!-- -->
+<ul>
+<li class=""><strong>Download link:</strong> <code>https://downloads.apache.org/incubator/fluss/fluss-rust-${RELEASE_VERSION}/</code> (or the project download page). In the release description, include checksums and GPG verification steps.</li>
+</ul>
+</li>
+<li class="">Click <strong>Publish release</strong>.</li>
+</ol>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-update-changelogmd-on-main">6. Update CHANGELOG.md on main<a href="#6-update-changelogmd-on-main" class="hash-link" aria-label="Direct link to 6. Update CHANGELOG.md on main" title="Direct link to 6. Update CHANGELOG.md on main" translate="no">​</a></h3>
+<p>Add an entry for <code>$RELEASE_VERSION</code> with the list of changes (use <a class="" href="/release/generate-release-note">Generate Release Note</a> from the release tag). Commit and push to <code>main</code>.</p>
+<hr>
+<p><strong>Checklist to proceed to promotion</strong></p>
+<ul class="contains-task-list containsTaskList_mC6p">
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Release tag pushed; CI published to crates.io and PyPI</li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Source artifacts in <a href="https://dist.apache.org/repos/dist/release/incubator/fluss/" target="_blank" rel="noopener noreferrer" class="">dist release</a></li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->GitHub Release created</li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->CHANGELOG.md updated on main</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="promote-the-release">Promote the release<a href="#promote-the-release" class="hash-link" aria-label="Direct link to Promote the release" title="Direct link to Promote the release" translate="no">​</a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="merge-website-prs">Merge website PRs<a href="#merge-website-prs" class="hash-link" aria-label="Direct link to Merge website PRs" title="Direct link to Merge website PRs" translate="no">​</a></h3>
+<p>Merge the pull requests for the release blog and download page that were created in <a href="#10-optional-create-prs-for-release-blog-and-download-page" class="">Prepare for the release</a>.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="announce-the-release">Announce the release<a href="#announce-the-release" class="hash-link" aria-label="Direct link to Announce the release" title="Direct link to Announce the release" translate="no">​</a></h3>
+<p>Wait at least 24 hours after finalizing, per <a href="https://www.apache.org/legal/release-policy.html#release-announcements" target="_blank" rel="noopener noreferrer" class="">ASF release policy</a>.</p>
+<ul>
+<li class="">Announce on the dev mailing list that the release is complete.</li>
+<li class="">Announce on <a href="https://github.com/apache/fluss-rust/discussions" target="_blank" rel="noopener noreferrer" class="">Fluss Discussions – Announcements</a> (if that category exists).</li>
+<li class="">Send the release announcement to <strong><a href="mailto:announce@apache.org" target="_blank" rel="noopener noreferrer" class="">announce@apache.org</a></strong>.</li>
+</ul>
+<p>Use the <code>@apache.org</code> email address and <strong>plain text</strong> for the body; otherwise the list may reject the message.</p>
+<p><strong>Subject:</strong> <code>[ANNOUNCE] Release Apache Fluss clients (fluss-rust, fluss-python, fluss-cpp) ${RELEASE_VERSION}</code></p>
+<p><strong>Body template:</strong></p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">The Apache Fluss community is pleased to announce the release of Apache Fluss clients (flus [...]
+<hr>
+<p><strong>Checklist to declare the process completed</strong></p>
+<ul class="contains-task-list containsTaskList_mC6p">
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Release announced on dev list and (if applicable) user list</li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Release announced on <a href="mailto:announce@apache.org" target="_blank" rel="noopener noreferrer" class="">announce@apache.org</a></li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Release blog published (if applicable)</li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Download page updated (if applicable)</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="improve-the-process">Improve the process<a href="#improve-the-process" class="hash-link" aria-label="Direct link to Improve the process" title="Direct link to Improve the process" translate="no">​</a></h2>
+<p>After finishing the release, consider what could be improved (simplifications, clearer steps, automation). Propose changes on the dev list or via a pull request to this guide.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-also">See also<a href="#see-also" class="hash-link" aria-label="Direct link to See also" title="Direct link to See also" translate="no">​</a></h2>
+<ul>
+<li class=""><a href="https://fluss.apache.org/community/how-to-release/release-manager-preparation/" target="_blank" rel="noopener noreferrer" class="">Release Manager Preparation</a> — GPG and one-time setup</li>
+<li class=""><a class="" href="/release/verifying-a-release-candidate">How to Verify a Release Candidate</a> — Verify signatures, checksums, build, and tests for a release candidate</li>
+<li class=""><a href="https://www.apache.org/legal/release-policy.html" target="_blank" rel="noopener noreferrer" class="">ASF Release Policy</a></li>
+</ul></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col noPrint_WFHX"><a href="https://github.com/apache/fluss-rust/edit/main/website/docs/release/create-release.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1. [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/release/generate-release-note/index.html b/release/generate-release-note/index.html
new file mode 100644
index 0000000..d951be3
--- /dev/null
+++ b/release/generate-release-note/index.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-release/generate-release-note" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Generate Release Note | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:ur [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>Use GitHub&#x27;s <strong>Generate release notes</strong> to produce a draft from merged PRs between tags. Categories (Added, Fixed, Docs, etc.) are configured in <a href="https://github.com/apache/fluss-rust/blob/main/.github/release.yml" target="_blank" rel="noopener noreferrer" class="">.github/release.yml</a>.</p>
+<ol>
+<li class="">Go to <a class="" href="/release/create-release">Creating a Fluss Client Release</a>.</li>
+<li class="">In <strong>Choose a tag</strong>, pick the release tag (e.g. <code>v0.1.0</code>).</li>
+<li class="">Click <strong>Generate release notes</strong>.</li>
+<li class="">Copy the generated content for <strong>CHANGELOG.md</strong> or the GitHub Release description. When publishing the release, add the official download link, checksums/verification, and install instructions (see <a class="" href="/release/create-release">Creating a Fluss Rust Client Release</a>).</li>
+</ol>
+<p>See <a class="" href="/release/create-release">Creating a Fluss Rust Client Release</a> and <a href="https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes" target="_blank" rel="noopener noreferrer" class="">GitHub: Automatically generated release notes</a>.</p></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col noPrint_WFHX"><a href="https://github.co [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/release/verifying-a-release-candidate/index.html b/release/verifying-a-release-candidate/index.html
new file mode 100644
index 0000000..84fd55e
--- /dev/null
+++ b/release/verifying-a-release-candidate/index.html
@@ -0,0 +1,86 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-release/verifying-a-release-candidate" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">How to Verify a Release Candidate | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" pro [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>This document describes how to verify a release candidate (RC) of the <strong>Fluss clients</strong> (fluss-rust, fluss-python, fluss-cpp) from the <a href="https://github.com/apache/fluss-rust" target="_blank" rel="noopener noreferrer" class="">fluss-rust</a> repository. It is intended for anyone participating in the release vote (binding or non-binding) and is based on <a href="https://fluss.apache.org/community/how-to-release/verifying-a-fluss-release/" target="_blank" rel="noopene [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="validating-distributions">Validating distributions<a href="#validating-distributions" class="hash-link" aria-label="Direct link to Validating distributions" title="Direct link to Validating distributions" translate="no">​</a></h2>
+<p>The release vote email includes links to:</p>
+<ul>
+<li class=""><strong>Distribution archive:</strong> source tarball (<code>fluss-rust-${RELEASE_VERSION}-incubating.tgz</code>) on <a href="https://dist.apache.org/repos/dist/dev/incubator/fluss/" target="_blank" rel="noopener noreferrer" class="">dist.apache.org dev</a></li>
+<li class=""><strong>Signature file:</strong> <code>fluss-rust-${RELEASE_VERSION}-incubating.tgz.asc</code></li>
+<li class=""><strong>Checksum file:</strong> <code>fluss-rust-${RELEASE_VERSION}-incubating.tgz.sha512</code></li>
+<li class=""><strong>KEYS file:</strong> <a href="https://downloads.apache.org/incubator/fluss/KEYS" target="_blank" rel="noopener noreferrer" class="">https://downloads.apache.org/incubator/fluss/KEYS</a></li>
+</ul>
+<p>Download the archive (<code>.tgz</code>), <code>.asc</code>, and <code>.sha512</code> from the RC directory (e.g. <code>fluss-rust-0.1.0-rc1/</code>) and the KEYS file. Then follow the steps below to verify signatures and checksums.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="verifying-signatures">Verifying signatures<a href="#verifying-signatures" class="hash-link" aria-label="Direct link to Verifying signatures" title="Direct link to Verifying signatures" translate="no">​</a></h2>
+<p>First, import the keys into your local keyring:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">curl</span><span class="token plain"> https://downloads [...]
+<p>Next, verify all <code>.asc</code> files:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> </span><span class=" [...]
+<p>If verification succeeds, you will see a message like:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">gpg: Signature made ...</span><br></span><span class="token-line" style="color:#9CDCFE"><sp [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="verifying-checksums">Verifying checksums<a href="#verifying-checksums" class="hash-link" aria-label="Direct link to Verifying checksums" title="Direct link to Verifying checksums" translate="no">​</a></h2>
+<p>Next, verify the tarball(s) using the provided <code>.sha512</code> file(s). Each <code>.sha512</code> file lists the expected SHA-512 hash for the corresponding archive; <code>-c</code> reads that file and checks the archive.</p>
+<p><strong>On macOS (shasum):</strong></p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">shasum </span><span class="token parameter variable" style="color:rgb(156, 220, 254)">-a</s [...]
+<p><strong>On Linux (sha512sum):</strong></p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">sha512sum </span><span class="token parameter variable" style="color:rgb(156, 220, 254)">-c [...]
+<p>If you have multiple archives, run <code>-c</code> on each <code>.sha512</code> file (or use <code>shasum -a 512 -c *.sha512</code> / <code>sha512sum -c *.sha512</code>).</p>
+<p>If the verification is successful, you will see a message like this:</p>
+<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss-rust-0.1.0-incubating.tgz: OK</span><br></span></code></pre></div></div>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="verifying-build">Verifying build<a href="#verifying-build" class="hash-link" aria-label="Direct link to Verifying build" title="Direct link to Verifying build" translate="no">​</a></h2>
+<p>Extract the source release archive and verify that it builds (and optionally that tests pass). You need <strong>Rust</strong> (see <a href="https://github.com/apache/fluss-rust/blob/main/rust-toolchain.toml" target="_blank" rel="noopener noreferrer" class="">rust-toolchain.toml</a> for the expected version) and, for full builds, <strong>protobuf</strong> and <strong>Python 3.9+</strong> for bindings.</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">tar</span><span class="token plain"> </span><span class [...]
+<p>Build the workspace:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">cargo</span><span class="token plain"> build </span><sp [...]
+<p>For Python bindings, see the project <a href="https://github.com/apache/fluss-rust#readme" target="_blank" rel="noopener noreferrer" class="">README</a> and <a href="https://github.com/apache/fluss-rust/blob/main/DEVELOPMENT.md" target="_blank" rel="noopener noreferrer" class="">Development Guide</a>. For C++ bindings, see <code>bindings/cpp/</code>.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="verifying-license-and-notice">Verifying LICENSE and NOTICE<a href="#verifying-license-and-notice" class="hash-link" aria-label="Direct link to Verifying LICENSE and NOTICE" title="Direct link to Verifying LICENSE and NOTICE" translate="no">​</a></h2>
+<p>Unzip the source release archive and verify that:</p>
+<ol>
+<li class="">The <strong>LICENSE</strong> and <strong>NOTICE</strong> files in the root directory are correct and refer to dependencies in the source release (e.g. files in the repository such as fonts, CSS, JavaScript, images).</li>
+<li class="">All files that need it have ASF license headers.</li>
+<li class="">All dependencies have been checked for their license and the license is ASL 2.0 compatible (<a href="http://www.apache.org/legal/resolved.html#category-x" target="_blank" rel="noopener noreferrer" class="">ASF third-party license policy</a>).</li>
+<li class="">Compatible non-ASL 2.0 licenses are documented (e.g. in NOTICE or in dependency audit files such as <code>DEPENDENCIES*.tsv</code>).</li>
+</ol>
+<p>The project uses <a href="https://embarkstudios.github.io/cargo-deny/" target="_blank" rel="noopener noreferrer" class="">cargo-deny</a> for license checks; see <a class="" href="/release/create-release">Creating a Fluss Rust Client Release</a> for how the dependency list is generated before a release.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="testing-features">Testing features<a href="#testing-features" class="hash-link" aria-label="Direct link to Testing features" title="Direct link to Testing features" translate="no">​</a></h2>
+<p>For any user-facing feature included in a release, we aim to ensure it is functional, usable, and well-documented. Release managers may create testing issues that outline key scenarios to validate; these are open to all community members.</p>
+<p><strong>Per-language verification:</strong> For <strong>Rust</strong> and <strong>C++</strong>, build from the source release and write your own test cases to verify. For <strong>Python</strong>, the RC is published to <strong>TestPyPI</strong>; install the client from TestPyPI and write your own test cases (e.g. connect, create table, read/write) to verify. Use the README in each component as the entry point:</p>
+<ul>
+<li class=""><strong>Rust client:</strong> You can depend on the RC via its git tag (e.g. in your <code>Cargo.toml</code>: <code>fluss-rs = { git = &quot;https://github.com/apache/fluss-rust&quot;, tag = &quot;v${RELEASE_VERSION}-rc${RC_NUM}&quot; }</code>) and build your own test project to verify. Alternatively, build from the source release; see <a class="" href="/user-guide/rust/installation">Rust Installation Guide</a>.</li>
+<li class=""><strong>Python bindings:</strong> See <a class="" href="/user-guide/python/installation">Python Installation Guide</a> for how to add the Python client (for an RC, install from <strong>TestPyPI</strong>: <code>pip install -i https://test.pypi.org/simple/ pyfluss==${RELEASE_VERSION}</code>); then write test cases to verify.</li>
+<li class=""><strong>C++ bindings:</strong> See <a class="" href="/user-guide/cpp/installation">C++ Installation Guide</a> for how to build and link the C++ client; then write test cases to verify.</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="incubator-release-checklist">Incubator release checklist<a href="#incubator-release-checklist" class="hash-link" aria-label="Direct link to Incubator release checklist" title="Direct link to Incubator release checklist" translate="no">​</a></h2>
+<p>If the project is in incubation, the ASF Incubator provides a release checklist. You can refer to it when verifying the release:</p>
+<ul>
+<li class=""><a href="https://cwiki.apache.org/confluence/display/INCUBATOR/Incubator+Release+Checklist" target="_blank" rel="noopener noreferrer" class="">Incubator Release Checklist</a></li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="voting">Voting<a href="#voting" class="hash-link" aria-label="Direct link to Voting" title="Direct link to Voting" translate="no">​</a></h2>
+<p>Votes are cast by replying to the vote email on the dev mailing list with <strong>+1</strong>, <strong>0</strong>, or <strong>-1</strong>.</p>
+<p>In addition to your vote, it is customary to state whether your vote is <strong>binding</strong> or <strong>non-binding</strong>. Only members of the PPMC and mentors have formally binding votes (and the IPMC on the Incubator general list). If unsure, you can state that your vote is non-binding. See <a href="https://www.apache.org/foundation/voting.html" target="_blank" rel="noopener noreferrer" class="">Apache Foundation Voting</a>.</p>
+<p>It is recommended to include a short list of what you verified (e.g. signatures, checksums, build, tests, LICENSE/NOTICE). This helps the community see what has been checked and what might still be missing.</p>
+<p><strong>Checklist you can reference in your vote:</strong></p>
+<ul class="contains-task-list containsTaskList_mC6p">
+<li class="task-list-item"><input type="checkbox" disabled=""> <a href="#validating-distributions" class="">Validating distributions</a></li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <a href="#verifying-signatures" class="">Verifying signatures</a></li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <a href="#verifying-checksums" class="">Verifying checksums</a></li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <a href="#verifying-build" class="">Verifying build</a></li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <a href="#verifying-license-and-notice" class="">Verifying LICENSE and NOTICE</a></li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <a href="#testing-features" class="">Testing features</a></li>
+<li class="task-list-item"><input type="checkbox" disabled=""> <a href="#incubator-release-checklist" class="">Incubator release checklist</a> (if applicable)</li>
+</ul></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col noPrint_WFHX"><a href="https://github.com/apache/fluss-rust/edit/main/website/docs/release/verifying-a-release-candidate.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5 [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/sitemap.xml b/sitemap.xml
new file mode 100644
index 0000000..f41613b
--- /dev/null
+++ b/sitemap.xml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://clients.fluss.apache.org/developer-guide/contributing</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://clients.flu [...]
\ No newline at end of file
diff --git a/sw.js b/sw.js
new file mode 100644
index 0000000..ecbc678
--- /dev/null
+++ b/sw.js
@@ -0,0 +1 @@
+(()=>{"use strict";var e={136(){try{self["workbox:core:7.3.0"]&&_()}catch(e){}},447(){try{self["workbox:precaching:7.3.0"]&&_()}catch(e){}},227(){try{self["workbox:routing:7.3.0"]&&_()}catch(e){}},390(){try{self["workbox:strategies:7.3.0"]&&_()}catch(e){}}},t={};function s(a){var n=t[a];if(void 0!==n)return n.exports;var i=t[a]={exports:{}};return e[a](i,i.exports,s),i.exports}s(136);const a=(e,...t)=>{let s=e;return t.length>0&&(s+=` :: ${JSON.stringify(t)}`),s};class n extends Error{co [...]
\ No newline at end of file
diff --git a/user-guide/cpp/api-reference/index.html b/user-guide/cpp/api-reference/index.html
new file mode 100644
index 0000000..916cdf6
--- /dev/null
+++ b/user-guide/cpp/api-reference/index.html
@@ -0,0 +1,152 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/cpp/api-reference" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">API Reference | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" conte [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>Complete API reference for the Fluss C++ client.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="result"><code>Result</code><a href="#result" class="hash-link" aria-label="Direct link to result" title="Direct link to result" translate="no">​</a></h2>
+<table><thead><tr><th>Field / Method</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>error_code</code></td><td><code>int32_t</code></td><td>0 for success, non-zero for errors</td></tr><tr><td><code>error_message</code></td><td><code>std::string</code></td><td>Human-readable error description</td></tr><tr><td><code>Ok()</code></td><td><code>bool</code></td><td>Returns <code>true</code> if operation succeeded (<code>error_code == 0</code>)</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration"><code>Configuration</code><a href="#configuration" class="hash-link" aria-label="Direct link to configuration" title="Direct link to configuration" translate="no">​</a></h2>
+<table><thead><tr><th>Field</th><th>Type</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>bootstrap_servers</code></td><td><code>std::string</code></td><td><code>&quot;127.0.0.1:9123&quot;</code></td><td>Coordinator server address</td></tr><tr><td><code>writer_request_max_size</code></td><td><code>int32_t</code></td><td><code>10485760</code> (10 MB)</td><td>Maximum request size in bytes</td></tr><tr><td><code>writer_acks</code></td><td><code>std::string</code></t [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="connection"><code>Connection</code><a href="#connection" class="hash-link" aria-label="Direct link to connection" title="Direct link to connection" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>static Create(const Configuration&amp; config, Connection&amp; out) -&gt; Result</code></td><td>Create a connection to a Fluss cluster</td></tr><tr><td><code>GetAdmin(Admin&amp; out) -&gt; Result</code></td><td>Get the admin interface</td></tr><tr><td><code>GetTable(const TablePath&amp; table_path, Table&amp; out) -&gt; Result</code></td><td>Get a table for read/write operations</td></tr><tr><td><code> [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="admin"><code>Admin</code><a href="#admin" class="hash-link" aria-label="Direct link to admin" title="Direct link to admin" translate="no">​</a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="database-operations">Database Operations<a href="#database-operations" class="hash-link" aria-label="Direct link to Database Operations" title="Direct link to Database Operations" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>CreateDatabase(const std::string&amp; database_name, const DatabaseDescriptor&amp; descriptor, bool ignore_if_exists) -&gt; Result</code></td><td>Create a database</td></tr><tr><td><code>DropDatabase(const std::string&amp; name, bool ignore_if_not_exists, bool cascade) -&gt; Result</code></td><td>Drop a database</td></tr><tr><td><code>ListDatabases(std::vector&lt;std::string&gt;&amp; out) -&gt; Result< [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="table-operations">Table Operations<a href="#table-operations" class="hash-link" aria-label="Direct link to Table Operations" title="Direct link to Table Operations" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>CreateTable(const TablePath&amp; path, const TableDescriptor&amp; descriptor, bool ignore_if_exists) -&gt; Result</code></td><td>Create a table</td></tr><tr><td><code>DropTable(const TablePath&amp; path, bool ignore_if_not_exists) -&gt; Result</code></td><td>Drop a table</td></tr><tr><td><code>GetTableInfo(const TablePath&amp; path, TableInfo&amp; out) -&gt; Result</code></td><td>Get table metadata</td [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="partition-operations">Partition Operations<a href="#partition-operations" class="hash-link" aria-label="Direct link to Partition Operations" title="Direct link to Partition Operations" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>CreatePartition(const TablePath&amp; path, const std::unordered_map&lt;std::string, std::string&gt;&amp; partition_spec, bool ignore_if_exists) -&gt; Result</code></td><td>Create a partition</td></tr><tr><td><code>DropPartition(const TablePath&amp; path, const std::unordered_map&lt;std::string, std::string&gt;&amp; partition_spec, bool ignore_if_not_exists) -&gt; Result</code></td><td>Drop a partition< [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="offset-operations">Offset Operations<a href="#offset-operations" class="hash-link" aria-label="Direct link to Offset Operations" title="Direct link to Offset Operations" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>ListOffsets(const TablePath&amp; path, const std::vector&lt;int32_t&gt;&amp; bucket_ids, const OffsetSpec&amp; query, std::unordered_map&lt;int32_t, int64_t&gt;&amp; out) -&gt; Result</code></td><td>Get offsets for buckets</td></tr><tr><td><code>ListPartitionOffsets(const TablePath&amp; path, const std::string&amp; partition_name, const std::vector&lt;int32_t&gt;&amp; bucket_ids, const OffsetSpec&amp;  [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="lake-operations">Lake Operations<a href="#lake-operations" class="hash-link" aria-label="Direct link to Lake Operations" title="Direct link to Lake Operations" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>GetLatestLakeSnapshot(const TablePath&amp; path, LakeSnapshot&amp; out) -&gt; Result</code></td><td>Get the latest lake snapshot</td></tr></tbody></table>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cluster-operations">Cluster Operations<a href="#cluster-operations" class="hash-link" aria-label="Direct link to Cluster Operations" title="Direct link to Cluster Operations" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>GetServerNodes(std::vector&lt;ServerNode&gt;&amp; out) -&gt; Result</code></td><td>Get all alive server nodes (coordinator + tablets)</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="servernode"><code>ServerNode</code><a href="#servernode" class="hash-link" aria-label="Direct link to servernode" title="Direct link to servernode" translate="no">​</a></h2>
+<table><thead><tr><th>Field</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>id</code></td><td><code>int32_t</code></td><td>Server node ID</td></tr><tr><td><code>host</code></td><td><code>std::string</code></td><td>Hostname of the server</td></tr><tr><td><code>port</code></td><td><code>uint32_t</code></td><td>Port number</td></tr><tr><td><code>server_type</code></td><td><code>std::string</code></td><td>Server type (<code>&quot;CoordinatorServer&quot;</code> or <code [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="table"><code>Table</code><a href="#table" class="hash-link" aria-label="Direct link to table" title="Direct link to table" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>NewRow() -&gt; GenericRow</code></td><td>Create a schema-aware row for this table</td></tr><tr><td><code>NewAppend() -&gt; TableAppend</code></td><td>Create an append builder for log tables</td></tr><tr><td><code>NewUpsert() -&gt; TableUpsert</code></td><td>Create an upsert builder for PK tables</td></tr><tr><td><code>NewLookup() -&gt; TableLookup</code></td><td>Create a lookup builder for PK tables</t [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tableappend"><code>TableAppend</code><a href="#tableappend" class="hash-link" aria-label="Direct link to tableappend" title="Direct link to tableappend" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>CreateWriter(AppendWriter&amp; out) -&gt; Result</code></td><td>Create an append writer</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tableupsert"><code>TableUpsert</code><a href="#tableupsert" class="hash-link" aria-label="Direct link to tableupsert" title="Direct link to tableupsert" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>PartialUpdateByIndex(std::vector&lt;size_t&gt; column_indices) -&gt; TableUpsert&amp;</code></td><td>Configure partial update by column indices</td></tr><tr><td><code>PartialUpdateByName(std::vector&lt;std::string&gt; column_names) -&gt; TableUpsert&amp;</code></td><td>Configure partial update by column names</td></tr><tr><td><code>CreateWriter(UpsertWriter&amp; out) -&gt; Result</code></td><td>Create  [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tablelookup"><code>TableLookup</code><a href="#tablelookup" class="hash-link" aria-label="Direct link to tablelookup" title="Direct link to tablelookup" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>CreateLookuper(Lookuper&amp; out) -&gt; Result</code></td><td>Create a lookuper for point lookups</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tablescan"><code>TableScan</code><a href="#tablescan" class="hash-link" aria-label="Direct link to tablescan" title="Direct link to tablescan" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>ProjectByIndex(std::vector&lt;size_t&gt; column_indices) -&gt; TableScan&amp;</code></td><td>Project columns by index</td></tr><tr><td><code>ProjectByName(std::vector&lt;std::string&gt; column_names) -&gt; TableScan&amp;</code></td><td>Project columns by name</td></tr><tr><td><code>CreateLogScanner(LogScanner&amp; out) -&gt; Result</code></td><td>Create a record-based log scanner</td></tr><tr><td><code [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="appendwriter"><code>AppendWriter</code><a href="#appendwriter" class="hash-link" aria-label="Direct link to appendwriter" title="Direct link to appendwriter" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>Append(const GenericRow&amp; row) -&gt; Result</code></td><td>Append a row (fire-and-forget)</td></tr><tr><td><code>Append(const GenericRow&amp; row, WriteResult&amp; out) -&gt; Result</code></td><td>Append a row with write acknowledgment</td></tr><tr><td><code>Flush() -&gt; Result</code></td><td>Flush all pending writes</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upsertwriter"><code>UpsertWriter</code><a href="#upsertwriter" class="hash-link" aria-label="Direct link to upsertwriter" title="Direct link to upsertwriter" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>Upsert(const GenericRow&amp; row) -&gt; Result</code></td><td>Upsert a row (fire-and-forget)</td></tr><tr><td><code>Upsert(const GenericRow&amp; row, WriteResult&amp; out) -&gt; Result</code></td><td>Upsert a row with write acknowledgment</td></tr><tr><td><code>Delete(const GenericRow&amp; row) -&gt; Result</code></td><td>Delete a row by primary key (fire-and-forget)</td></tr><tr><td><code>Delete(const [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="writeresult"><code>WriteResult</code><a href="#writeresult" class="hash-link" aria-label="Direct link to writeresult" title="Direct link to writeresult" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>Wait() -&gt; Result</code></td><td>Wait for server acknowledgment of the write</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lookuper"><code>Lookuper</code><a href="#lookuper" class="hash-link" aria-label="Direct link to lookuper" title="Direct link to lookuper" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>Lookup(const GenericRow&amp; pk_row, LookupResult&amp; out) -&gt; Result</code></td><td>Lookup a row by primary key</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="logscanner"><code>LogScanner</code><a href="#logscanner" class="hash-link" aria-label="Direct link to logscanner" title="Direct link to logscanner" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>Subscribe(int32_t bucket_id, int64_t offset) -&gt; Result</code></td><td>Subscribe to a single bucket at an offset</td></tr><tr><td><code>Subscribe(const std::vector&lt;BucketSubscription&gt;&amp; bucket_offsets) -&gt; Result</code></td><td>Subscribe to multiple buckets</td></tr><tr><td><code>SubscribePartitionBuckets(int64_t partition_id, int32_t bucket_id, int64_t start_offset) -&gt; Result</code></t [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="genericrow"><code>GenericRow</code><a href="#genericrow" class="hash-link" aria-label="Direct link to genericrow" title="Direct link to genericrow" translate="no">​</a></h2>
+<p><code>GenericRow</code> is a <strong>write-only</strong> row used for append, upsert, delete, and lookup key construction. For reading field values from scan or lookup results, see <a href="#rowview" class=""><code>RowView</code></a> and <a href="#lookupresult" class=""><code>LookupResult</code></a>.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="index-based-setters">Index-Based Setters<a href="#index-based-setters" class="hash-link" aria-label="Direct link to Index-Based Setters" title="Direct link to Index-Based Setters" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>SetNull(size_t idx)</code></td><td>Set field to null</td></tr><tr><td><code>SetBool(size_t idx, bool value)</code></td><td>Set boolean value</td></tr><tr><td><code>SetInt32(size_t idx, int32_t value)</code></td><td>Set 32-bit integer</td></tr><tr><td><code>SetInt64(size_t idx, int64_t value)</code></td><td>Set 64-bit integer</td></tr><tr><td><code>SetFloat32(size_t idx, float value)</code></td><td>Set  [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="name-based-setters">Name-Based Setters<a href="#name-based-setters" class="hash-link" aria-label="Direct link to Name-Based Setters" title="Direct link to Name-Based Setters" translate="no">​</a></h3>
+<p>When using <code>table.NewRow()</code>, the <code>Set()</code> method auto-routes to the correct type based on the schema:</p>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>Set(const std::string&amp; name, std::nullptr_t)</code></td><td>Set field to null by column name</td></tr><tr><td><code>Set(const std::string&amp; name, bool value)</code></td><td>Set boolean by column name</td></tr><tr><td><code>Set(const std::string&amp; name, int32_t value)</code></td><td>Set integer by column name</td></tr><tr><td><code>Set(const std::string&amp; name, int64_t value)</code></td><td [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="rowview"><code>RowView</code><a href="#rowview" class="hash-link" aria-label="Direct link to rowview" title="Direct link to rowview" translate="no">​</a></h2>
+<p>Read-only row view for scan results. Provides zero-copy access to string and bytes data. <code>RowView</code> shares ownership of the underlying scan data via reference counting, so it can safely outlive the <code>ScanRecords</code> that produced it.</p>
+<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.6 [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="index-based-getters">Index-Based Getters<a href="#index-based-getters" class="hash-link" aria-label="Direct link to Index-Based Getters" title="Direct link to Index-Based Getters" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>FieldCount() -&gt; size_t</code></td><td>Get the number of fields</td></tr><tr><td><code>GetType(size_t idx) -&gt; TypeId</code></td><td>Get the type at index</td></tr><tr><td><code>IsNull(size_t idx) -&gt; bool</code></td><td>Check if field is null</td></tr><tr><td><code>GetBool(size_t idx) -&gt; bool</code></td><td>Get boolean value at index</td></tr><tr><td><code>GetInt32(size_t idx) -&gt; int32_t</ [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="name-based-getters">Name-Based Getters<a href="#name-based-getters" class="hash-link" aria-label="Direct link to Name-Based Getters" title="Direct link to Name-Based Getters" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>IsNull(const std::string&amp; name) -&gt; bool</code></td><td>Check if field is null by name</td></tr><tr><td><code>GetBool(const std::string&amp; name) -&gt; bool</code></td><td>Get boolean by column name</td></tr><tr><td><code>GetInt32(const std::string&amp; name) -&gt; int32_t</code></td><td>Get 32-bit integer by column name</td></tr><tr><td><code>GetInt64(const std::string&amp; name) -&gt; int64_t< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="scanrecord"><code>ScanRecord</code><a href="#scanrecord" class="hash-link" aria-label="Direct link to scanrecord" title="Direct link to scanrecord" translate="no">​</a></h2>
+<p><code>ScanRecord</code> is a value type that can be freely copied, stored, and accumulated across multiple <code>Poll()</code> calls. It shares ownership of the underlying scan data via reference counting.</p>
+<table><thead><tr><th>Field</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>offset</code></td><td><code>int64_t</code></td><td>Record offset in the log</td></tr><tr><td><code>timestamp</code></td><td><code>int64_t</code></td><td>Record timestamp</td></tr><tr><td><code>change_type</code></td><td><code>ChangeType</code></td><td>Change type (AppendOnly, Insert, UpdateBefore, UpdateAfter, Delete)</td></tr><tr><td><code>row</code></td><td><code>RowView</code></td><td>Ro [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="scanrecords"><code>ScanRecords</code><a href="#scanrecords" class="hash-link" aria-label="Direct link to scanrecords" title="Direct link to scanrecords" translate="no">​</a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="flat-access">Flat Access<a href="#flat-access" class="hash-link" aria-label="Direct link to Flat Access" title="Direct link to Flat Access" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>Count() -&gt; size_t</code></td><td>Total number of records across all buckets</td></tr><tr><td><code>IsEmpty() -&gt; bool</code></td><td>Check if empty</td></tr><tr><td><code>begin() / end()</code></td><td>Iterator support for range-based for loops</td></tr></tbody></table>
+<p>Flat iteration over all records (regardless of bucket):</p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> </span><span class="to [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="per-bucket-access">Per-Bucket Access<a href="#per-bucket-access" class="hash-link" aria-label="Direct link to Per-Bucket Access" title="Direct link to Per-Bucket Access" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>BucketCount() -&gt; size_t</code></td><td>Number of distinct buckets</td></tr><tr><td><code>Buckets() -&gt; std::vector&lt;TableBucket&gt;</code></td><td>List of distinct buckets</td></tr><tr><td><code>Records(const TableBucket&amp; bucket) -&gt; BucketRecords</code></td><td>Records for a specific bucket (empty if bucket not present)</td></tr><tr><td><code>BucketAt(size_t idx) -&gt; BucketRecords</code [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bucketrecords"><code>BucketRecords</code><a href="#bucketrecords" class="hash-link" aria-label="Direct link to bucketrecords" title="Direct link to bucketrecords" translate="no">​</a></h2>
+<p>A bundle of scan records belonging to a single bucket. Obtained from <code>ScanRecords::Records()</code> or <code>ScanRecords::BucketAt()</code>. <code>BucketRecords</code> is a value type — it shares ownership of the underlying scan data via reference counting, so it can safely outlive the <code>ScanRecords</code> that produced it.</p>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>Size() -&gt; size_t</code></td><td>Number of records in this bucket</td></tr><tr><td><code>Empty() -&gt; bool</code></td><td>Check if empty</td></tr><tr><td><code>Bucket() -&gt; const TableBucket&amp;</code></td><td>Get the bucket</td></tr><tr><td><code>operator[](size_t idx) -&gt; ScanRecord</code></td><td>Access record by index within this bucket</td></tr><tr><td><code>begin() / end()</code></td><td> [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tablebucket"><code>TableBucket</code><a href="#tablebucket" class="hash-link" aria-label="Direct link to tablebucket" title="Direct link to tablebucket" translate="no">​</a></h2>
+<table><thead><tr><th>Field / Method</th><th>Description</th></tr></thead><tbody><tr><td><code>table_id -&gt; int64_t</code></td><td>Table ID</td></tr><tr><td><code>bucket_id -&gt; int32_t</code></td><td>Bucket ID</td></tr><tr><td><code>partition_id -&gt; std::optional&lt;int64_t&gt;</code></td><td>Partition ID (empty if non-partitioned)</td></tr><tr><td><code>operator==(const TableBucket&amp;) -&gt; bool</code></td><td>Equality comparison</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lookupresult"><code>LookupResult</code><a href="#lookupresult" class="hash-link" aria-label="Direct link to lookupresult" title="Direct link to lookupresult" translate="no">​</a></h2>
+<p>Read-only result for lookup operations. Provides zero-copy access to field values.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="metadata">Metadata<a href="#metadata" class="hash-link" aria-label="Direct link to Metadata" title="Direct link to Metadata" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>Found() -&gt; bool</code></td><td>Whether a matching row was found</td></tr><tr><td><code>FieldCount() -&gt; size_t</code></td><td>Get the number of fields</td></tr></tbody></table>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="index-based-getters-1">Index-Based Getters<a href="#index-based-getters-1" class="hash-link" aria-label="Direct link to Index-Based Getters" title="Direct link to Index-Based Getters" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>GetType(size_t idx) -&gt; TypeId</code></td><td>Get the type at index</td></tr><tr><td><code>IsNull(size_t idx) -&gt; bool</code></td><td>Check if field is null</td></tr><tr><td><code>GetBool(size_t idx) -&gt; bool</code></td><td>Get boolean value at index</td></tr><tr><td><code>GetInt32(size_t idx) -&gt; int32_t</code></td><td>Get 32-bit integer at index</td></tr><tr><td><code>GetInt64(size_t idx) -&g [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="name-based-getters-1">Name-Based Getters<a href="#name-based-getters-1" class="hash-link" aria-label="Direct link to Name-Based Getters" title="Direct link to Name-Based Getters" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>IsNull(const std::string&amp; name) -&gt; bool</code></td><td>Check if field is null by name</td></tr><tr><td><code>GetBool(const std::string&amp; name) -&gt; bool</code></td><td>Get boolean by column name</td></tr><tr><td><code>GetInt32(const std::string&amp; name) -&gt; int32_t</code></td><td>Get 32-bit integer by column name</td></tr><tr><td><code>GetInt64(const std::string&amp; name) -&gt; int64_t< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="arrowrecordbatch"><code>ArrowRecordBatch</code><a href="#arrowrecordbatch" class="hash-link" aria-label="Direct link to arrowrecordbatch" title="Direct link to arrowrecordbatch" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>GetArrowRecordBatch() -&gt; std::shared_ptr&lt;arrow::RecordBatch&gt;</code></td><td>Get the underlying Arrow RecordBatch</td></tr><tr><td><code>Available() -&gt; bool</code></td><td>Check if the batch is valid</td></tr><tr><td><code>NumRows() -&gt; int64_t</code></td><td>Number of rows in the batch</td></tr><tr><td><code>GetTableId() -&gt; int64_t</code></td><td>Table ID</td></tr><tr><td><code>GetPart [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="arrowrecordbatches"><code>ArrowRecordBatches</code><a href="#arrowrecordbatches" class="hash-link" aria-label="Direct link to arrowrecordbatches" title="Direct link to arrowrecordbatches" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>Size() -&gt; size_t</code></td><td>Number of batches</td></tr><tr><td><code>Empty() -&gt; bool</code></td><td>Check if empty</td></tr><tr><td><code>operator[](size_t idx)</code></td><td>Access batch by index</td></tr><tr><td><code>begin() / end()</code></td><td>Iterator support for range-based for loops</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="schema"><code>Schema</code><a href="#schema" class="hash-link" aria-label="Direct link to schema" title="Direct link to schema" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>NewBuilder() -&gt; Schema::Builder</code></td><td>Create a new schema builder</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="schemabuilder"><code>Schema::Builder</code><a href="#schemabuilder" class="hash-link" aria-label="Direct link to schemabuilder" title="Direct link to schemabuilder" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>AddColumn(const std::string&amp; name, const DataType&amp; type) -&gt; Builder&amp;</code></td><td>Add a column</td></tr><tr><td><code>SetPrimaryKeys(const std::vector&lt;std::string&gt;&amp; keys) -&gt; Builder&amp;</code></td><td>Set primary key columns</td></tr><tr><td><code>Build() -&gt; Schema</code></td><td>Build the schema</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tabledescriptor"><code>TableDescriptor</code><a href="#tabledescriptor" class="hash-link" aria-label="Direct link to tabledescriptor" title="Direct link to tabledescriptor" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>NewBuilder() -&gt; TableDescriptor::Builder</code></td><td>Create a new table descriptor builder</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tabledescriptorbuilder"><code>TableDescriptor::Builder</code><a href="#tabledescriptorbuilder" class="hash-link" aria-label="Direct link to tabledescriptorbuilder" title="Direct link to tabledescriptorbuilder" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>SetSchema(const Schema&amp; schema) -&gt; Builder&amp;</code></td><td>Set the table schema</td></tr><tr><td><code>SetPartitionKeys(const std::vector&lt;std::string&gt;&amp; keys) -&gt; Builder&amp;</code></td><td>Set partition key columns</td></tr><tr><td><code>SetBucketCount(int32_t count) -&gt; Builder&amp;</code></td><td>Set the number of buckets</td></tr><tr><td><code>SetBucketKeys(const std::vecto [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="datatype"><code>DataType</code><a href="#datatype" class="hash-link" aria-label="Direct link to datatype" title="Direct link to datatype" translate="no">​</a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="factory-methods">Factory Methods<a href="#factory-methods" class="hash-link" aria-label="Direct link to Factory Methods" title="Direct link to Factory Methods" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>DataType::Boolean()</code></td><td>Boolean type</td></tr><tr><td><code>DataType::TinyInt()</code></td><td>8-bit signed integer</td></tr><tr><td><code>DataType::SmallInt()</code></td><td>16-bit signed integer</td></tr><tr><td><code>DataType::Int()</code></td><td>32-bit signed integer</td></tr><tr><td><code>DataType::BigInt()</code></td><td>64-bit signed integer</td></tr><tr><td><code>DataType::Float()</ [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="accessors">Accessors<a href="#accessors" class="hash-link" aria-label="Direct link to Accessors" title="Direct link to Accessors" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>id() -&gt; TypeId</code></td><td>Get the type ID</td></tr><tr><td><code>precision() -&gt; int</code></td><td>Get precision (for Decimal/Timestamp types)</td></tr><tr><td><code>scale() -&gt; int</code></td><td>Get scale (for Decimal type)</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tablepath"><code>TablePath</code><a href="#tablepath" class="hash-link" aria-label="Direct link to tablepath" title="Direct link to tablepath" translate="no">​</a></h2>
+<table><thead><tr><th>Method / Field</th><th>Description</th></tr></thead><tbody><tr><td><code>TablePath(const std::string&amp; database, const std::string&amp; table)</code></td><td>Create a table path</td></tr><tr><td><code>database_name -&gt; std::string</code></td><td>Database name</td></tr><tr><td><code>table_name -&gt; std::string</code></td><td>Table name</td></tr><tr><td><code>ToString() -&gt; std::string</code></td><td>String representation</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tableinfo"><code>TableInfo</code><a href="#tableinfo" class="hash-link" aria-label="Direct link to tableinfo" title="Direct link to tableinfo" translate="no">​</a></h2>
+<table><thead><tr><th>Field</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>table_id</code></td><td><code>int64_t</code></td><td>Table ID</td></tr><tr><td><code>schema_id</code></td><td><code>int32_t</code></td><td>Schema ID</td></tr><tr><td><code>table_path</code></td><td><code>TablePath</code></td><td>Table path</td></tr><tr><td><code>created_time</code></td><td><code>int64_t</code></td><td>Creation timestamp</td></tr><tr><td><code>modified_time</code></td><td><c [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="temporal-types">Temporal Types<a href="#temporal-types" class="hash-link" aria-label="Direct link to Temporal Types" title="Direct link to Temporal Types" translate="no">​</a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="date"><code>Date</code><a href="#date" class="hash-link" aria-label="Direct link to date" title="Direct link to date" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>Date::FromDays(int32_t days)</code></td><td>Create from days since epoch</td></tr><tr><td><code>Date::FromYMD(int year, int month, int day)</code></td><td>Create from year, month, day</td></tr><tr><td><code>Year() -&gt; int</code></td><td>Get year</td></tr><tr><td><code>Month() -&gt; int</code></td><td>Get month</td></tr><tr><td><code>Day() -&gt; int</code></td><td>Get day</td></tr></tbody></table>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="time"><code>Time</code><a href="#time" class="hash-link" aria-label="Direct link to time" title="Direct link to time" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>Time::FromMillis(int32_t millis)</code></td><td>Create from milliseconds since midnight</td></tr><tr><td><code>Time::FromHMS(int hour, int minute, int second)</code></td><td>Create from hour, minute, second</td></tr><tr><td><code>Hour() -&gt; int</code></td><td>Get hour</td></tr><tr><td><code>Minute() -&gt; int</code></td><td>Get minute</td></tr><tr><td><code>Second() -&gt; int</code></td><td>Get secon [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="timestamp"><code>Timestamp</code><a href="#timestamp" class="hash-link" aria-label="Direct link to timestamp" title="Direct link to timestamp" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>Timestamp::FromMillis(int64_t millis)</code></td><td>Create from milliseconds since epoch</td></tr><tr><td><code>Timestamp::FromMillisNanos(int64_t millis, int32_t nanos)</code></td><td>Create from milliseconds and nanoseconds</td></tr><tr><td><code>Timestamp::FromTimePoint(std::chrono::system_clock::time_point tp)</code></td><td>Create from a time point</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partitioninfo"><code>PartitionInfo</code><a href="#partitioninfo" class="hash-link" aria-label="Direct link to partitioninfo" title="Direct link to partitioninfo" translate="no">​</a></h2>
+<table><thead><tr><th>Field</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>partition_id</code></td><td><code>int64_t</code></td><td>Partition ID</td></tr><tr><td><code>partition_name</code></td><td><code>std::string</code></td><td>Partition name</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="databasedescriptor"><code>DatabaseDescriptor</code><a href="#databasedescriptor" class="hash-link" aria-label="Direct link to databasedescriptor" title="Direct link to databasedescriptor" translate="no">​</a></h2>
+<table><thead><tr><th>Field</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>comment</code></td><td><code>std::string</code></td><td>Database comment</td></tr><tr><td><code>properties</code></td><td><code>std::unordered_map&lt;std::string, std::string&gt;</code></td><td>Custom properties</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="databaseinfo"><code>DatabaseInfo</code><a href="#databaseinfo" class="hash-link" aria-label="Direct link to databaseinfo" title="Direct link to databaseinfo" translate="no">​</a></h2>
+<table><thead><tr><th>Field</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>database_name</code></td><td><code>std::string</code></td><td>Database name</td></tr><tr><td><code>comment</code></td><td><code>std::string</code></td><td>Database comment</td></tr><tr><td><code>properties</code></td><td><code>std::unordered_map&lt;std::string, std::string&gt;</code></td><td>Custom properties</td></tr><tr><td><code>created_time</code></td><td><code>int64_t</code></td><td>Cr [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lakesnapshot"><code>LakeSnapshot</code><a href="#lakesnapshot" class="hash-link" aria-label="Direct link to lakesnapshot" title="Direct link to lakesnapshot" translate="no">​</a></h2>
+<table><thead><tr><th>Field</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>snapshot_id</code></td><td><code>int64_t</code></td><td>Snapshot ID</td></tr><tr><td><code>bucket_offsets</code></td><td><code>std::vector&lt;BucketOffset&gt;</code></td><td>All bucket offsets</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bucketoffset"><code>BucketOffset</code><a href="#bucketoffset" class="hash-link" aria-label="Direct link to bucketoffset" title="Direct link to bucketoffset" translate="no">​</a></h2>
+<table><thead><tr><th>Field</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>table_id</code></td><td><code>int64_t</code></td><td>Table ID</td></tr><tr><td><code>partition_id</code></td><td><code>int64_t</code></td><td>Partition ID</td></tr><tr><td><code>bucket_id</code></td><td><code>int32_t</code></td><td>Bucket ID</td></tr><tr><td><code>offset</code></td><td><code>int64_t</code></td><td>Offset value</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="offsetspec"><code>OffsetSpec</code><a href="#offsetspec" class="hash-link" aria-label="Direct link to offsetspec" title="Direct link to offsetspec" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>OffsetSpec::Earliest()</code></td><td>Query for the earliest available offset</td></tr><tr><td><code>OffsetSpec::Latest()</code></td><td>Query for the latest offset</td></tr><tr><td><code>OffsetSpec::Timestamp(int64_t timestamp_ms)</code></td><td>Query offset at a specific timestamp</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="constants">Constants<a href="#constants" class="hash-link" aria-label="Direct link to Constants" title="Direct link to Constants" translate="no">​</a></h2>
+<table><thead><tr><th>Constant</th><th>Value</th><th>Description</th></tr></thead><tbody><tr><td><code>fluss::EARLIEST_OFFSET</code></td><td><code>-2</code></td><td>Start reading from the earliest available offset</td></tr></tbody></table>
+<p>To start reading from the latest offset (only new records), resolve the current offset via <code>ListOffsets</code> before subscribing:</p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">std</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::</s [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="enums">Enums<a href="#enums" class="hash-link" aria-label="Direct link to Enums" title="Direct link to Enums" translate="no">​</a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="changetype"><code>ChangeType</code><a href="#changetype" class="hash-link" aria-label="Direct link to changetype" title="Direct link to changetype" translate="no">​</a></h3>
+<table><thead><tr><th>Value</th><th>Short String</th><th>Description</th></tr></thead><tbody><tr><td><code>AppendOnly</code></td><td><code>+A</code></td><td>Append-only record</td></tr><tr><td><code>Insert</code></td><td><code>+I</code></td><td>Inserted row</td></tr><tr><td><code>UpdateBefore</code></td><td><code>-U</code></td><td>Previous value of an updated row</td></tr><tr><td><code>UpdateAfter</code></td><td><code>+U</code></td><td>New value of an updated row</td></tr><tr><td><code>D [...]
+<p>You may refer to the following example to convert ChangeType enum to its short string representation.</p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">inline</span><span class="token plain"> </span><span class= [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="typeid"><code>TypeId</code><a href="#typeid" class="hash-link" aria-label="Direct link to typeid" title="Direct link to typeid" translate="no">​</a></h3>
+<table><thead><tr><th>Value</th><th>Description</th></tr></thead><tbody><tr><td><code>Boolean</code></td><td>Boolean type</td></tr><tr><td><code>TinyInt</code></td><td>8-bit signed integer</td></tr><tr><td><code>SmallInt</code></td><td>16-bit signed integer</td></tr><tr><td><code>Int</code></td><td>32-bit signed integer</td></tr><tr><td><code>BigInt</code></td><td>64-bit signed integer</td></tr><tr><td><code>Float</code></td><td>32-bit floating point</td></tr><tr><td><code>Double</code>< [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="changetype-1"><code>ChangeType</code><a href="#changetype-1" class="hash-link" aria-label="Direct link to changetype-1" title="Direct link to changetype-1" translate="no">​</a></h3>
+<table><thead><tr><th>Value</th><th>Description</th></tr></thead><tbody><tr><td><code>AppendOnly</code></td><td>Append-only record (log tables)</td></tr><tr><td><code>Insert</code></td><td>Inserted row (PK tables)</td></tr><tr><td><code>UpdateBefore</code></td><td>Row value before an update (PK tables)</td></tr><tr><td><code>UpdateAfter</code></td><td>Row value after an update (PK tables)</td></tr><tr><td><code>Delete</code></td><td>Deleted row (PK tables)</td></tr></tbody></table>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="offsetspec-1"><code>OffsetSpec</code><a href="#offsetspec-1" class="hash-link" aria-label="Direct link to offsetspec-1" title="Direct link to offsetspec-1" translate="no">​</a></h3>
+<table><thead><tr><th>Value</th><th>Description</th></tr></thead><tbody><tr><td><code>Earliest</code></td><td>Earliest available offset</td></tr><tr><td><code>Latest</code></td><td>Latest offset</td></tr><tr><td><code>Timestamp</code></td><td>Offset at a specific timestamp</td></tr></tbody></table></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col noPrint_WFHX"><a href="https://github.com/apache/fluss-rus [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/cpp/data-types/index.html b/user-guide/cpp/data-types/index.html
new file mode 100644
index 0000000..6e6c7b3
--- /dev/null
+++ b/user-guide/cpp/data-types/index.html
@@ -0,0 +1,44 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/cpp/data-types" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Data Types | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" content= [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="schema-datatypes">Schema DataTypes<a href="#schema-datatypes" class="hash-link" aria-label="Direct link to Schema DataTypes" title="Direct link to Schema DataTypes" translate="no">​</a></h2>
+<table><thead><tr><th>DataType</th><th>Description</th></tr></thead><tbody><tr><td><code>DataType::Boolean()</code></td><td>Boolean value</td></tr><tr><td><code>DataType::TinyInt()</code></td><td>8-bit signed integer</td></tr><tr><td><code>DataType::SmallInt()</code></td><td>16-bit signed integer</td></tr><tr><td><code>DataType::Int()</code></td><td>32-bit signed integer</td></tr><tr><td><code>DataType::BigInt()</code></td><td>64-bit signed integer</td></tr><tr><td><code>DataType::Float( [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="genericrow-setters">GenericRow Setters<a href="#genericrow-setters" class="hash-link" aria-label="Direct link to GenericRow Setters" title="Direct link to GenericRow Setters" translate="no">​</a></h2>
+<p><code>SetInt32</code> is used for <code>TinyInt</code>, <code>SmallInt</code>, and <code>Int</code> columns. For <code>TinyInt</code> and <code>SmallInt</code>, the value is validated at write time — an error is returned if it overflows the column&#x27;s range (e.g., [-128, 127] for <code>TinyInt</code>, [-32768, 32767] for <code>SmallInt</code>).</p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="name-based-setters">Name-Based Setters<a href="#name-based-setters" class="hash-link" aria-label="Direct link to Name-Based Setters" title="Direct link to Name-Based Setters" translate="no">​</a></h2>
+<p>When using <code>table.NewRow()</code>, you can set fields by column name. The setter automatically routes to the correct type based on the schema:</p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">auto</span><span class="token plain"> row </span><span clas [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reading-field-values">Reading Field Values<a href="#reading-field-values" class="hash-link" aria-label="Direct link to Reading Field Values" title="Direct link to Reading Field Values" translate="no">​</a></h2>
+<p>Field values are read through <code>RowView</code> (from scan results) and <code>LookupResult</code> (from lookups), not through <code>GenericRow</code>. Both provide the same getter interface with zero-copy access to string and bytes data.</p>
+<p><code>ScanRecord</code> is a value type — it can be freely copied, stored, and accumulated across multiple <code>Poll()</code> calls via reference counting.</p>
+<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.6 [...]
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// ScanRecord is a value type — safe to store and accumulat [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="from-scan-results-rowview">From Scan Results (RowView)<a href="#from-scan-results-rowview" class="hash-link" aria-label="Direct link to From Scan Results (RowView)" title="Direct link to From Scan Results (RowView)" translate="no">​</a></h3>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> </span><span class="to [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="from-lookup-results-lookupresult">From Lookup Results (LookupResult)<a href="#from-lookup-results-lookupresult" class="hash-link" aria-label="Direct link to From Lookup Results (LookupResult)" title="Direct link to From Lookup Results (LookupResult)" translate="no">​</a></h3>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="typeid-enum">TypeId Enum<a href="#typeid-enum" class="hash-link" aria-label="Direct link to TypeId Enum" title="Direct link to TypeId Enum" translate="no">​</a></h2>
+<p><code>TinyInt</code> and <code>SmallInt</code> values are widened to <code>int32_t</code> on read.</p>
+<table><thead><tr><th>TypeId</th><th>C++ Type</th><th>Getter</th></tr></thead><tbody><tr><td><code>Boolean</code></td><td><code>bool</code></td><td><code>GetBool(idx)</code></td></tr><tr><td><code>TinyInt</code></td><td><code>int32_t</code></td><td><code>GetInt32(idx)</code></td></tr><tr><td><code>SmallInt</code></td><td><code>int32_t</code></td><td><code>GetInt32(idx)</code></td></tr><tr><td><code>Int</code></td><td><code>int32_t</code></td><td><code>GetInt32(idx)</code></td></tr><tr><t [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="type-checking">Type Checking<a href="#type-checking" class="hash-link" aria-label="Direct link to Type Checking" title="Direct link to Type Checking" translate="no">​</a></h2>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="tok [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="constants">Constants<a href="#constants" class="hash-link" aria-label="Direct link to Constants" title="Direct link to Constants" translate="no">​</a></h2>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">constexpr</span><span class="token plain"> </span><span cla [...]
+<p>To start reading from the latest offset, resolve the current offset via <code>ListOffsets</code> before subscribing:</p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">std</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::</s [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/cpp/error-handling/index.html b/user-guide/cpp/error-handling/index.html
new file mode 100644
index 0000000..48ebe29
--- /dev/null
+++ b/user-guide/cpp/error-handling/index.html
@@ -0,0 +1,57 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/cpp/error-handling" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Error Handling | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" cont [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>All C++ client operations return a <code>fluss::Result</code> struct instead of throwing exceptions. This gives you explicit control over error handling.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-result-struct">The <code>Result</code> Struct<a href="#the-result-struct" class="hash-link" aria-label="Direct link to the-result-struct" title="Direct link to the-result-struct" translate="no">​</a></h2>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="c [...]
+<table><thead><tr><th>Field / Method</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>error_code</code></td><td><code>int32_t</code></td><td>0 for success, non-zero for errors</td></tr><tr><td><code>error_message</code></td><td><code>std::string</code></td><td>Human-readable error description</td></tr><tr><td><code>Ok()</code></td><td><code>bool</code></td><td>Returns <code>true</code> if the operation succeeded</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="handling-errors">Handling Errors<a href="#handling-errors" class="hash-link" aria-label="Direct link to Handling Errors" title="Direct link to Handling Errors" translate="no">​</a></h2>
+<p>Check the <code>Result</code> after each operation and decide how to respond, e.g. log and continue, retry, or abort:</p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="connection-state-checking">Connection State Checking<a href="#connection-state-checking" class="hash-link" aria-label="Direct link to Connection State Checking" title="Direct link to Connection State Checking" translate="no">​</a></h2>
+<p>Use <code>Available()</code> to verify that a connection or object is valid before using it:</p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="error-codes">Error Codes<a href="#error-codes" class="hash-link" aria-label="Direct link to Error Codes" title="Direct link to Error Codes" translate="no">​</a></h2>
+<p>Server-side errors carry a specific error code (&gt;0 or -1). Client-side errors (connection failures, type mismatches, etc.) use <code>ErrorCode::CLIENT_ERROR</code> (-2). Use <code>fluss::ErrorCode</code> to match on specific codes:</p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::< [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-error-codes">Common Error Codes<a href="#common-error-codes" class="hash-link" aria-label="Direct link to Common Error Codes" title="Direct link to Common Error Codes" translate="no">​</a></h3>
+<table><thead><tr><th>Constant</th><th>Code</th><th>Description</th></tr></thead><tbody><tr><td><code>ErrorCode::CLIENT_ERROR</code></td><td>-2</td><td>Client-side error (not from server)</td></tr><tr><td><code>ErrorCode::UNKNOWN_SERVER_ERROR</code></td><td>-1</td><td>Unexpected server error</td></tr><tr><td><code>ErrorCode::NETWORK_EXCEPTION</code></td><td>1</td><td>Server disconnected before response</td></tr><tr><td><code>ErrorCode::DATABASE_NOT_EXIST</code></td><td>4</td><td>Database [...]
+<p>See <code>fluss::ErrorCode</code> in <code>fluss.hpp</code> for the full list of named constants.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-error-scenarios">Common Error Scenarios<a href="#common-error-scenarios" class="hash-link" aria-label="Direct link to Common Error Scenarios" title="Direct link to Common Error Scenarios" translate="no">​</a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="connection-refused">Connection Refused<a href="#connection-refused" class="hash-link" aria-label="Direct link to Connection Refused" title="Direct link to Connection Refused" translate="no">​</a></h3>
+<p>The cluster is not running or the address is incorrect:</p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::< [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="table-not-found">Table Not Found<a href="#table-not-found" class="hash-link" aria-label="Direct link to Table Not Found" title="Direct link to Table Not Found" translate="no">​</a></h3>
+<p>Attempting to access a table that does not exist:</p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::< [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="partition-not-found">Partition Not Found<a href="#partition-not-found" class="hash-link" aria-label="Direct link to Partition Not Found" title="Direct link to Partition Not Found" translate="no">​</a></h3>
+<p>Writing to a partitioned primary key table before creating partitions:</p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// This will fail if partitions are not created first</span [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="authentication-failed">Authentication Failed<a href="#authentication-failed" class="hash-link" aria-label="Direct link to Authentication Failed" title="Direct link to Authentication Failed" translate="no">​</a></h3>
+<p>SASL credentials are incorrect or the user does not exist:</p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::< [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="schema-mismatch">Schema Mismatch<a href="#schema-mismatch" class="hash-link" aria-label="Direct link to Schema Mismatch" title="Direct link to Schema Mismatch" translate="no">​</a></h3>
+<p>Using incorrect types or column indices when writing:</p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices">Best Practices<a href="#best-practices" class="hash-link" aria-label="Direct link to Best Practices" title="Direct link to Best Practices" translate="no">​</a></h2>
+<ol>
+<li class=""><strong>Always check <code>Result</code></strong>: Never ignore the return value of operations that return <code>Result</code>.</li>
+<li class=""><strong>Handle errors gracefully</strong>: Log errors and retry or fail gracefully rather than crashing.</li>
+<li class=""><strong>Verify connection state</strong>: Use <code>Available()</code> to check connection validity before operations.</li>
+<li class=""><strong>Create partitions before writing</strong>: For partitioned primary key tables, always create partitions before attempting upserts.</li>
+</ol></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col noPrint_WFHX"><a href="https://github.com/apache/fluss-rust/edit/main/website/docs/user-guide/cpp/error-handling.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2 [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/cpp/example/admin-operations/index.html b/user-guide/cpp/example/admin-operations/index.html
new file mode 100644
index 0000000..e8d6894
--- /dev/null
+++ b/user-guide/cpp/example/admin-operations/index.html
@@ -0,0 +1,33 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/cpp/example/admin-operations" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Admin Operations | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" co [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-admin-interface">Get Admin Interface<a href="#get-admin-interface" class="hash-link" aria-label="Direct link to Get Admin Interface" title="Direct link to Get Admin Interface" translate="no">​</a></h2>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="database-operations">Database Operations<a href="#database-operations" class="hash-link" aria-label="Direct link to Database Operations" title="Direct link to Database Operations" translate="no">​</a></h2>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// Create database</span><span class="token plain"></span>< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="table-operations">Table Operations<a href="#table-operations" class="hash-link" aria-label="Direct link to Table Operations" title="Direct link to Table Operations" translate="no">​</a></h2>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="schema-builder-options">Schema Builder Options<a href="#schema-builder-options" class="hash-link" aria-label="Direct link to Schema Builder Options" title="Direct link to Schema Builder Options" translate="no">​</a></h2>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// Schema with primary key</span><span class="token plain"> [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partition-operations">Partition Operations<a href="#partition-operations" class="hash-link" aria-label="Direct link to Partition Operations" title="Direct link to Partition Operations" translate="no">​</a></h2>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// Create a partition</span><span class="token plain"></spa [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="offset-operations">Offset Operations<a href="#offset-operations" class="hash-link" aria-label="Direct link to Offset Operations" title="Direct link to Offset Operations" translate="no">​</a></h2>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">std</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::</s [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lake-snapshot">Lake Snapshot<a href="#lake-snapshot" class="hash-link" aria-label="Direct link to Lake Snapshot" title="Direct link to Lake Snapshot" translate="no">​</a></h2>
+<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.6 [...]
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::< [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/cpp/example/configuration/index.html b/user-guide/cpp/example/configuration/index.html
new file mode 100644
index 0000000..e1d601f
--- /dev/null
+++ b/user-guide/cpp/example/configuration/index.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/cpp/example/configuration" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Configuration | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" conte [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="connection-setup">Connection Setup<a href="#connection-setup" class="hash-link" aria-label="Direct link to Connection Setup" title="Direct link to Connection Setup" translate="no">​</a></h2>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="c [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="connection-configurations">Connection Configurations<a href="#connection-configurations" class="hash-link" aria-label="Direct link to Connection Configurations" title="Direct link to Connection Configurations" translate="no">​</a></h2>
+<p>All fields have sensible defaults. Only <code>bootstrap_servers</code> typically needs to be set.</p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sasl-authentication">SASL Authentication<a href="#sasl-authentication" class="hash-link" aria-label="Direct link to SASL Authentication" title="Direct link to SASL Authentication" translate="no">​</a></h2>
+<p>To connect to a Fluss cluster with SASL/PLAIN authentication enabled:</p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::< [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/cpp/example/index.html b/user-guide/cpp/example/index.html
new file mode 100644
index 0000000..58288cc
--- /dev/null
+++ b/user-guide/cpp/example/index.html
@@ -0,0 +1,20 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/cpp/example/index" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Example | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" content="ht [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>Minimal working example: connect to Fluss, create a table, write data, and read it back.</p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="c [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/cpp/example/log-tables/index.html b/user-guide/cpp/example/log-tables/index.html
new file mode 100644
index 0000000..272be69
--- /dev/null
+++ b/user-guide/cpp/example/log-tables/index.html
@@ -0,0 +1,38 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/cpp/example/log-tables" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Log Tables | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" content= [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>Log tables are append-only tables without primary keys, suitable for event streaming.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-log-table">Creating a Log Table<a href="#creating-a-log-table" class="hash-link" aria-label="Direct link to Creating a Log Table" title="Direct link to Creating a Log Table" translate="no">​</a></h2>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">auto</span><span class="token plain"> schema </span><span c [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="writing-to-log-tables">Writing to Log Tables<a href="#writing-to-log-tables" class="hash-link" aria-label="Direct link to Writing to Log Tables" title="Direct link to Writing to Log Tables" translate="no">​</a></h2>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reading-from-log-tables">Reading from Log Tables<a href="#reading-from-log-tables" class="hash-link" aria-label="Direct link to Reading from Log Tables" title="Direct link to Reading from Log Tables" translate="no">​</a></h2>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::< [...]
+<p><strong>Continuous polling:</strong></p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">while</span><span class="token plain"> </span><span class=" [...]
+<p><strong>Accumulating records across polls:</strong></p>
+<p><code>ScanRecord</code> is a value type — it can be freely copied, stored, and accumulated. The underlying data stays alive via reference counting (zero-copy).</p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">std</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::</s [...]
+<p><strong>Batch subscribe:</strong></p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">std</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::</s [...]
+<p><strong>Unsubscribe from a bucket:</strong></p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// Stop receiving records from bucket 1</span><span class=" [...]
+<p><strong>Arrow RecordBatch polling (high performance):</strong></p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="c [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="column-projection">Column Projection<a href="#column-projection" class="hash-link" aria-label="Direct link to Column Projection" title="Direct link to Column Projection" translate="no">​</a></h2>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// Project by column index</span><span class="token plain"> [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/cpp/example/partitioned-tables/index.html b/user-guide/cpp/example/partitioned-tables/index.html
new file mode 100644
index 0000000..6ed07fb
--- /dev/null
+++ b/user-guide/cpp/example/partitioned-tables/index.html
@@ -0,0 +1,45 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/cpp/example/partitioned-tables" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Partitioned Tables | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url"  [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>Partitioned tables distribute data across partitions based on partition column values, enabling efficient data organization and querying. Both log tables and primary key tables support partitioning.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partitioned-log-tables">Partitioned Log Tables<a href="#partitioned-log-tables" class="hash-link" aria-label="Direct link to Partitioned Log Tables" title="Direct link to Partitioned Log Tables" translate="no">​</a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-partitioned-log-table">Creating a Partitioned Log Table<a href="#creating-a-partitioned-log-table" class="hash-link" aria-label="Direct link to Creating a Partitioned Log Table" title="Direct link to Creating a Partitioned Log Table" translate="no">​</a></h3>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">auto</span><span class="token plain"> schema </span><span c [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="writing-to-partitioned-log-tables">Writing to Partitioned Log Tables<a href="#writing-to-partitioned-log-tables" class="hash-link" aria-label="Direct link to Writing to Partitioned Log Tables" title="Direct link to Writing to Partitioned Log Tables" translate="no">​</a></h3>
+<p><strong>Partitions must exist before writing data, otherwise the client will by default retry indefinitely.</strong> Include partition column values in each row, the client routes records to the correct partition automatically.</p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::< [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="reading-from-partitioned-log-tables">Reading from Partitioned Log Tables<a href="#reading-from-partitioned-log-tables" class="hash-link" aria-label="Direct link to Reading from Partitioned Log Tables" title="Direct link to Reading from Partitioned Log Tables" translate="no">​</a></h3>
+<p>For partitioned tables, use partition-aware subscribe methods.</p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::< [...]
+<p><strong>Unsubscribe from a partition bucket:</strong></p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// Stop receiving records from a specific partition bucket< [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="managing-partitions">Managing Partitions<a href="#managing-partitions" class="hash-link" aria-label="Direct link to Managing Partitions" title="Direct link to Managing Partitions" translate="no">​</a></h3>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// Create a partition</span><span class="token plain"></spa [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partitioned-primary-key-tables">Partitioned Primary Key Tables<a href="#partitioned-primary-key-tables" class="hash-link" aria-label="Direct link to Partitioned Primary Key Tables" title="Direct link to Partitioned Primary Key Tables" translate="no">​</a></h2>
+<p>Partitioned KV tables combine partitioning with primary key operations. Partition columns must be part of the primary key.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-partitioned-primary-key-table">Creating a Partitioned Primary Key Table<a href="#creating-a-partitioned-primary-key-table" class="hash-link" aria-label="Direct link to Creating a Partitioned Primary Key Table" title="Direct link to Creating a Partitioned Primary Key Table" translate="no">​</a></h3>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">auto</span><span class="token plain"> schema </span><span c [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="writing-to-partitioned-primary-key-tables">Writing to Partitioned Primary Key Tables<a href="#writing-to-partitioned-primary-key-tables" class="hash-link" aria-label="Direct link to Writing to Partitioned Primary Key Tables" title="Direct link to Writing to Partitioned Primary Key Tables" translate="no">​</a></h3>
+<p><strong>Partitions must exist before upserting data, otherwise the client will by default retry indefinitely.</strong></p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::< [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="looking-up-records-in-partitioned-tables">Looking Up Records in Partitioned Tables<a href="#looking-up-records-in-partitioned-tables" class="hash-link" aria-label="Direct link to Looking Up Records in Partitioned Tables" title="Direct link to Looking Up Records in Partitioned Tables" translate="no">​</a></h3>
+<p>Lookup requires all primary key columns including partition columns.</p>
+<blockquote>
+<p><strong>Note:</strong> Scanning partitioned primary key tables is not supported. Use lookup operations instead.</p>
+</blockquote>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::< [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/cpp/example/primary-key-tables/index.html b/user-guide/cpp/example/primary-key-tables/index.html
new file mode 100644
index 0000000..5e06cb6
--- /dev/null
+++ b/user-guide/cpp/example/primary-key-tables/index.html
@@ -0,0 +1,33 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/cpp/example/primary-key-tables" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Primary Key Tables | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url"  [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>Primary key tables (KV tables) support upsert, delete, and lookup operations.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-primary-key-table">Creating a Primary Key Table<a href="#creating-a-primary-key-table" class="hash-link" aria-label="Direct link to Creating a Primary Key Table" title="Direct link to Creating a Primary Key Table" translate="no">​</a></h2>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">auto</span><span class="token plain"> schema </span><span c [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upserting-records">Upserting Records<a href="#upserting-records" class="hash-link" aria-label="Direct link to Upserting Records" title="Direct link to Upserting Records" translate="no">​</a></h2>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="updating-records">Updating Records<a href="#updating-records" class="hash-link" aria-label="Direct link to Updating Records" title="Direct link to Updating Records" translate="no">​</a></h2>
+<p>Upsert with the same primary key to update an existing record.</p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">auto</span><span class="token plain"> row </span><span clas [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="deleting-records">Deleting Records<a href="#deleting-records" class="hash-link" aria-label="Direct link to Deleting Records" title="Direct link to Deleting Records" translate="no">​</a></h2>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">auto</span><span class="token plain"> pk_row </span><span c [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partial-updates">Partial Updates<a href="#partial-updates" class="hash-link" aria-label="Direct link to Partial Updates" title="Direct link to Partial Updates" translate="no">​</a></h2>
+<p>Update only specific columns while preserving others.</p>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// By column names</span><span class="token plain"></span>< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="looking-up-records">Looking Up Records<a href="#looking-up-records" class="hash-link" aria-label="Direct link to Looking Up Records" title="Direct link to Looking Up Records" translate="no">​</a></h2>
+<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">fluss</span><span class="token double-colon punctuation" style="color:rgb(212, 212, 212)">::< [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/cpp/installation/index.html b/user-guide/cpp/installation/index.html
new file mode 100644
index 0000000..208d928
--- /dev/null
+++ b/user-guide/cpp/installation/index.html
@@ -0,0 +1,41 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/cpp/installation" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Installation | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" conten [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>The C++ bindings are not yet published as a package. You need to build from source.</p>
+<p><strong>Prerequisites:</strong> CMake 3.22+, C++17 compiler, Rust 1.85+, Apache Arrow C++ library</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">git</span><span class="token plain"> clone https://gith [...]
+<p>Install dependencies:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)"># macOS</span><span class="token plain"></span><br></span [...]
+<p>If Arrow is not available via package manager, build from source:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">git</span><span class="token plain"> clone https://gith [...]
+<p>Build the C++ bindings:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token builtin class-name" style="color:rgb(78, 201, 176)">cd</span><span class="token plain"> bindings/c [...]
+<p>This produces:</p>
+<ul>
+<li class=""><code>libfluss_cpp.a</code> (Static library)</li>
+<li class=""><code>fluss_cpp_example</code> (Example executable)</li>
+<li class="">Header files in <code>include/</code></li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="integrating-into-your-project">Integrating into Your Project<a href="#integrating-into-your-project" class="hash-link" aria-label="Direct link to Integrating into Your Project" title="Direct link to Integrating into Your Project" translate="no">​</a></h2>
+<p><strong>Option 1: CMake FetchContent</strong></p>
+<div class="language-cmake codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmake codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">include</span><span class="token punctuation" style="co [...]
+<p><strong>Option 2: Manual Integration</strong></p>
+<p>Copy the build artifacts and configure CMake:</p>
+<div class="language-cmake codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmake codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">find_package</span><span class="token punctuation" styl [...]
+<p><strong>Option 3: Subdirectory</strong></p>
+<div class="language-cmake codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmake codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">add_subdirectory</span><span class="token punctuation"  [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/python/api-reference/index.html b/user-guide/python/api-reference/index.html
new file mode 100644
index 0000000..34c107b
--- /dev/null
+++ b/user-guide/python/api-reference/index.html
@@ -0,0 +1,96 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/python/api-reference" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">API Reference | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" conte [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>Complete API reference for the Fluss Python client.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="config"><code>Config</code><a href="#config" class="hash-link" aria-label="Direct link to config" title="Direct link to config" translate="no">​</a></h2>
+<table><thead><tr><th>Method / Property</th><th>Description</th></tr></thead><tbody><tr><td><code>Config(properties: dict = None)</code></td><td>Create config from a dict of key-value pairs</td></tr><tr><td><code>bootstrap_servers</code></td><td>Get/set coordinator server address</td></tr><tr><td><code>writer_request_max_size</code></td><td>Get/set max request size in bytes</td></tr><tr><td><code>writer_acks</code></td><td>Get/set acknowledgment setting (<code>&quot;all&quot;</code> for  [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flussconnection"><code>FlussConnection</code><a href="#flussconnection" class="hash-link" aria-label="Direct link to flussconnection" title="Direct link to flussconnection" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>await FlussConnection.create(config) -&gt; FlussConnection</code></td><td>Connect to a Fluss cluster</td></tr><tr><td><code>await conn.get_admin() -&gt; FlussAdmin</code></td><td>Get admin interface</td></tr><tr><td><code>await conn.get_table(table_path) -&gt; FlussTable</code></td><td>Get a table for read/write operations</td></tr><tr><td><code>conn.close()</code></td><td>Close the connection</td></tr [...]
+<p>Supports <code>with</code> statement (context manager).</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flussadmin"><code>FlussAdmin</code><a href="#flussadmin" class="hash-link" aria-label="Direct link to flussadmin" title="Direct link to flussadmin" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>await create_database(name, database_descriptor=None, ignore_if_exists=False)</code></td><td>Create a database</td></tr><tr><td><code>await drop_database(name, ignore_if_not_exists=False, cascade=True)</code></td><td>Drop a database</td></tr><tr><td><code>await list_databases() -&gt; list[str]</code></td><td>List all databases</td></tr><tr><td><code>await database_exists(name) -&gt; bool</code></td><td [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="servernode"><code>ServerNode</code><a href="#servernode" class="hash-link" aria-label="Direct link to servernode" title="Direct link to servernode" translate="no">​</a></h2>
+<table><thead><tr><th>Property</th><th>Description</th></tr></thead><tbody><tr><td><code>.id -&gt; int</code></td><td>Server node ID</td></tr><tr><td><code>.host -&gt; str</code></td><td>Hostname of the server</td></tr><tr><td><code>.port -&gt; int</code></td><td>Port number</td></tr><tr><td><code>.server_type -&gt; str</code></td><td>Server type (<code>&quot;CoordinatorServer&quot;</code> or <code>&quot;TabletServer&quot;</code>)</td></tr><tr><td><code>.uid -&gt; str</code></td><td>Uniq [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flusstable"><code>FlussTable</code><a href="#flusstable" class="hash-link" aria-label="Direct link to flusstable" title="Direct link to flusstable" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>new_scan() -&gt; TableScan</code></td><td>Create a scan builder</td></tr><tr><td><code>new_append() -&gt; TableAppend</code></td><td>Create an append builder for log tables</td></tr><tr><td><code>new_upsert() -&gt; TableUpsert</code></td><td>Create an upsert builder for PK tables</td></tr><tr><td><code>new_lookup() -&gt; TableLookup</code></td><td>Create a lookup builder for PK tables</td></tr><tr><td> [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tablescan"><code>TableScan</code><a href="#tablescan" class="hash-link" aria-label="Direct link to tablescan" title="Direct link to tablescan" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>.project(indices) -&gt; TableScan</code></td><td>Project columns by index</td></tr><tr><td><code>.project_by_name(names) -&gt; TableScan</code></td><td>Project columns by name</td></tr><tr><td><code>await .create_log_scanner() -&gt; LogScanner</code></td><td>Create record-based scanner (for <code>poll()</code>)</td></tr><tr><td><code>await .create_record_batch_log_scanner() -&gt; LogScanner</code></td> [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tableappend"><code>TableAppend</code><a href="#tableappend" class="hash-link" aria-label="Direct link to tableappend" title="Direct link to tableappend" translate="no">​</a></h2>
+<p>Builder for creating an <code>AppendWriter</code>. Obtain via <code>FlussTable.new_append()</code>.</p>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>.create_writer() -&gt; AppendWriter</code></td><td>Create the append writer</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tableupsert"><code>TableUpsert</code><a href="#tableupsert" class="hash-link" aria-label="Direct link to tableupsert" title="Direct link to tableupsert" translate="no">​</a></h2>
+<p>Builder for creating an <code>UpsertWriter</code>. Obtain via <code>FlussTable.new_upsert()</code>.</p>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>.partial_update_by_name(columns) -&gt; TableUpsert</code></td><td>Configure partial update by column names</td></tr><tr><td><code>.partial_update_by_index(indices) -&gt; TableUpsert</code></td><td>Configure partial update by column indices</td></tr><tr><td><code>.create_writer() -&gt; UpsertWriter</code></td><td>Create the upsert writer</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tablelookup"><code>TableLookup</code><a href="#tablelookup" class="hash-link" aria-label="Direct link to tablelookup" title="Direct link to tablelookup" translate="no">​</a></h2>
+<p>Builder for creating a <code>Lookuper</code>. Obtain via <code>FlussTable.new_lookup()</code>.</p>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>.create_lookuper() -&gt; Lookuper</code></td><td>Create the lookuper</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="appendwriter"><code>AppendWriter</code><a href="#appendwriter" class="hash-link" aria-label="Direct link to appendwriter" title="Direct link to appendwriter" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>.append(row) -&gt; WriteResultHandle</code></td><td>Append a row (dict, list, or tuple)</td></tr><tr><td><code>.write_arrow(table)</code></td><td>Write a PyArrow Table</td></tr><tr><td><code>.write_arrow_batch(batch) -&gt; WriteResultHandle</code></td><td>Write a PyArrow RecordBatch</td></tr><tr><td><code>.write_pandas(df)</code></td><td>Write a Pandas DataFrame</td></tr><tr><td><code>await .flush()</c [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upsertwriter"><code>UpsertWriter</code><a href="#upsertwriter" class="hash-link" aria-label="Direct link to upsertwriter" title="Direct link to upsertwriter" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>.upsert(row) -&gt; WriteResultHandle</code></td><td>Upsert a row (insert or update by PK)</td></tr><tr><td><code>.delete(pk) -&gt; WriteResultHandle</code></td><td>Delete a row by primary key</td></tr><tr><td><code>await .flush()</code></td><td>Flush all pending operations</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="writeresulthandle"><code>WriteResultHandle</code><a href="#writeresulthandle" class="hash-link" aria-label="Direct link to writeresulthandle" title="Direct link to writeresulthandle" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>await .wait()</code></td><td>Wait for server acknowledgment of this write</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lookuper"><code>Lookuper</code><a href="#lookuper" class="hash-link" aria-label="Direct link to lookuper" title="Direct link to lookuper" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>await .lookup(pk) -&gt; dict | None</code></td><td>Lookup a row by primary key</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="logscanner"><code>LogScanner</code><a href="#logscanner" class="hash-link" aria-label="Direct link to logscanner" title="Direct link to logscanner" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>.subscribe(bucket_id, start_offset)</code></td><td>Subscribe to a bucket</td></tr><tr><td><code>.subscribe_buckets(bucket_offsets)</code></td><td>Subscribe to multiple buckets (<code>{bucket_id: offset}</code>)</td></tr><tr><td><code>.subscribe_partition(partition_id, bucket_id, start_offset)</code></td><td>Subscribe to a partition bucket</td></tr><tr><td><code>.subscribe_partition_buckets(partition_bu [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="scanrecords"><code>ScanRecords</code><a href="#scanrecords" class="hash-link" aria-label="Direct link to scanrecords" title="Direct link to scanrecords" translate="no">​</a></h2>
+<p>Returned by <code>LogScanner.poll()</code>. Records are grouped by bucket.</p>
+<blockquote>
+<p><strong>Note:</strong> Flat iteration and integer indexing traverse buckets in an arbitrary order that is consistent within a single <code>ScanRecords</code> instance but may differ between <code>poll()</code> calls. Use per-bucket access (<code>.items()</code>, <code>.records(bucket)</code>) when bucket ordering matters.</p>
+</blockquote>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">scan_records </span><span class="token operator" style="color:rgb(212, 212, 212)">=</sp [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="methods">Methods<a href="#methods" class="hash-link" aria-label="Direct link to Methods" title="Direct link to Methods" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>.buckets() -&gt; list[TableBucket]</code></td><td>List of distinct buckets</td></tr><tr><td><code>.records(bucket) -&gt; list[ScanRecord]</code></td><td>Records for a specific bucket (empty list if bucket not present)</td></tr><tr><td><code>.count() -&gt; int</code></td><td>Total record count across all buckets</td></tr><tr><td><code>.is_empty() -&gt; bool</code></td><td>Check if empty</td></tr></tbody [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="indexing">Indexing<a href="#indexing" class="hash-link" aria-label="Direct link to Indexing" title="Direct link to Indexing" translate="no">​</a></h3>
+<table><thead><tr><th>Expression</th><th>Returns</th><th>Description</th></tr></thead><tbody><tr><td><code>scan_records[0]</code></td><td><code>ScanRecord</code></td><td>Record by flat index</td></tr><tr><td><code>scan_records[-1]</code></td><td><code>ScanRecord</code></td><td>Negative indexing</td></tr><tr><td><code>scan_records[1:5]</code></td><td><code>list[ScanRecord]</code></td><td>Slice</td></tr><tr><td><code>scan_records[bucket]</code></td><td><code>list[ScanRecord]</code></td><td [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mapping-protocol">Mapping Protocol<a href="#mapping-protocol" class="hash-link" aria-label="Direct link to Mapping Protocol" title="Direct link to Mapping Protocol" translate="no">​</a></h3>
+<table><thead><tr><th>Method / Protocol</th><th>Description</th></tr></thead><tbody><tr><td><code>.keys()</code></td><td>Same as <code>.buckets()</code></td></tr><tr><td><code>.values()</code></td><td>Lazy iterator over record lists, one per bucket</td></tr><tr><td><code>.items()</code></td><td>Lazy iterator over <code>(bucket, records)</code> pairs</td></tr><tr><td><code>len(scan_records)</code></td><td>Same as <code>.count()</code></td></tr><tr><td><code>bucket in scan_records</code></ [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="scanrecord"><code>ScanRecord</code><a href="#scanrecord" class="hash-link" aria-label="Direct link to scanrecord" title="Direct link to scanrecord" translate="no">​</a></h2>
+<table><thead><tr><th>Property</th><th>Description</th></tr></thead><tbody><tr><td><code>.offset -&gt; int</code></td><td>Record offset in the log</td></tr><tr><td><code>.timestamp -&gt; int</code></td><td>Record timestamp</td></tr><tr><td><code>.change_type -&gt; ChangeType</code></td><td>Change type (AppendOnly, Insert, UpdateBefore, UpdateAfter, Delete)</td></tr><tr><td><code>.row -&gt; dict</code></td><td>Row data as <code>{column_name: value}</code></td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="recordbatch"><code>RecordBatch</code><a href="#recordbatch" class="hash-link" aria-label="Direct link to recordbatch" title="Direct link to recordbatch" translate="no">​</a></h2>
+<table><thead><tr><th>Property</th><th>Description</th></tr></thead><tbody><tr><td><code>.batch -&gt; pa.RecordBatch</code></td><td>Arrow RecordBatch data</td></tr><tr><td><code>.bucket -&gt; TableBucket</code></td><td>Bucket this batch belongs to</td></tr><tr><td><code>.base_offset -&gt; int</code></td><td>First record offset</td></tr><tr><td><code>.last_offset -&gt; int</code></td><td>Last record offset</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="schema"><code>Schema</code><a href="#schema" class="hash-link" aria-label="Direct link to schema" title="Direct link to schema" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>Schema(schema: pa.Schema, primary_keys=None)</code></td><td>Create from PyArrow schema</td></tr><tr><td><code>.get_column_names() -&gt; list[str]</code></td><td>Get column names</td></tr><tr><td><code>.get_column_types() -&gt; list[str]</code></td><td>Get column type names</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tabledescriptor"><code>TableDescriptor</code><a href="#tabledescriptor" class="hash-link" aria-label="Direct link to tabledescriptor" title="Direct link to tabledescriptor" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>TableDescriptor(schema, *, partition_keys=None, bucket_count=None, bucket_keys=None, comment=None, log_format=None, kv_format=None, properties=None, custom_properties=None)</code></td><td>Create table descriptor</td></tr><tr><td><code>.get_schema() -&gt; Schema</code></td><td>Get the schema</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tablepath"><code>TablePath</code><a href="#tablepath" class="hash-link" aria-label="Direct link to tablepath" title="Direct link to tablepath" translate="no">​</a></h2>
+<table><thead><tr><th>Method / Property</th><th>Description</th></tr></thead><tbody><tr><td><code>TablePath(database, table)</code></td><td>Create a table path</td></tr><tr><td><code>.database_name -&gt; str</code></td><td>Database name</td></tr><tr><td><code>.table_name -&gt; str</code></td><td>Table name</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tableinfo"><code>TableInfo</code><a href="#tableinfo" class="hash-link" aria-label="Direct link to tableinfo" title="Direct link to tableinfo" translate="no">​</a></h2>
+<table><thead><tr><th>Property / Method</th><th>Description</th></tr></thead><tbody><tr><td><code>.table_id -&gt; int</code></td><td>Table ID</td></tr><tr><td><code>.table_path -&gt; TablePath</code></td><td>Table path</td></tr><tr><td><code>.num_buckets -&gt; int</code></td><td>Number of buckets</td></tr><tr><td><code>.schema_id -&gt; int</code></td><td>Schema ID</td></tr><tr><td><code>.comment -&gt; str | None</code></td><td>Table comment</td></tr><tr><td><code>.created_time -&gt; int< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partitioninfo"><code>PartitionInfo</code><a href="#partitioninfo" class="hash-link" aria-label="Direct link to partitioninfo" title="Direct link to partitioninfo" translate="no">​</a></h2>
+<table><thead><tr><th>Property</th><th>Description</th></tr></thead><tbody><tr><td><code>.partition_id -&gt; int</code></td><td>Partition ID</td></tr><tr><td><code>.partition_name -&gt; str</code></td><td>Partition name</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="databasedescriptor"><code>DatabaseDescriptor</code><a href="#databasedescriptor" class="hash-link" aria-label="Direct link to databasedescriptor" title="Direct link to databasedescriptor" translate="no">​</a></h2>
+<table><thead><tr><th>Method / Property</th><th>Description</th></tr></thead><tbody><tr><td><code>DatabaseDescriptor(comment=None, custom_properties=None)</code></td><td>Create descriptor</td></tr><tr><td><code>.comment -&gt; str | None</code></td><td>Database comment</td></tr><tr><td><code>.get_custom_properties() -&gt; dict</code></td><td>Custom properties</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="databaseinfo"><code>DatabaseInfo</code><a href="#databaseinfo" class="hash-link" aria-label="Direct link to databaseinfo" title="Direct link to databaseinfo" translate="no">​</a></h2>
+<table><thead><tr><th>Property / Method</th><th>Description</th></tr></thead><tbody><tr><td><code>.database_name -&gt; str</code></td><td>Database name</td></tr><tr><td><code>.created_time -&gt; int</code></td><td>Creation timestamp</td></tr><tr><td><code>.modified_time -&gt; int</code></td><td>Last modification timestamp</td></tr><tr><td><code>.get_database_descriptor() -&gt; DatabaseDescriptor</code></td><td>Get descriptor</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lakesnapshot"><code>LakeSnapshot</code><a href="#lakesnapshot" class="hash-link" aria-label="Direct link to lakesnapshot" title="Direct link to lakesnapshot" translate="no">​</a></h2>
+<table><thead><tr><th>Property / Method</th><th>Description</th></tr></thead><tbody><tr><td><code>.snapshot_id -&gt; int</code></td><td>Snapshot ID</td></tr><tr><td><code>.table_buckets_offset -&gt; dict[TableBucket, int]</code></td><td>All bucket offsets</td></tr><tr><td><code>.get_bucket_offset(bucket) -&gt; int | None</code></td><td>Get offset for a bucket</td></tr><tr><td><code>.get_table_buckets() -&gt; list[TableBucket]</code></td><td>Get all buckets</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tablebucket"><code>TableBucket</code><a href="#tablebucket" class="hash-link" aria-label="Direct link to tablebucket" title="Direct link to tablebucket" translate="no">​</a></h2>
+<table><thead><tr><th>Method / Property</th><th>Description</th></tr></thead><tbody><tr><td><code>TableBucket(table_id, bucket)</code></td><td>Create non-partitioned bucket</td></tr><tr><td><code>TableBucket.with_partition(table_id, partition_id, bucket)</code></td><td>Create partitioned bucket</td></tr><tr><td><code>.table_id -&gt; int</code></td><td>Table ID</td></tr><tr><td><code>.bucket_id -&gt; int</code></td><td>Bucket ID</td></tr><tr><td><code>.partition_id -&gt; int | None</code> [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flusserror"><code>FlussError</code><a href="#flusserror" class="hash-link" aria-label="Direct link to flusserror" title="Direct link to flusserror" translate="no">​</a></h2>
+<table><thead><tr><th>Property</th><th>Description</th></tr></thead><tbody><tr><td><code>.message -&gt; str</code></td><td>Error message</td></tr><tr><td><code>.error_code -&gt; int</code></td><td>Error code (<code>ErrorCode.CLIENT_ERROR</code> for client-side errors, server code otherwise)</td></tr></tbody></table>
+<p>Raised for all Fluss-specific errors (connection failures, table not found, schema mismatches, etc.). Inherits from <code>Exception</code>. See <a class="" href="/user-guide/python/error-handling">Error Handling</a> for details on matching specific error codes.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="constants">Constants<a href="#constants" class="hash-link" aria-label="Direct link to Constants" title="Direct link to Constants" translate="no">​</a></h2>
+<table><thead><tr><th>Constant</th><th>Value</th><th>Description</th></tr></thead><tbody><tr><td><code>fluss.EARLIEST_OFFSET</code></td><td><code>-2</code></td><td>Start reading from earliest available offset</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="offsetspec"><code>OffsetSpec</code><a href="#offsetspec" class="hash-link" aria-label="Direct link to offsetspec" title="Direct link to offsetspec" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>OffsetSpec.earliest()</code></td><td>Earliest available offset</td></tr><tr><td><code>OffsetSpec.latest()</code></td><td>Latest offset</td></tr><tr><td><code>OffsetSpec.timestamp(ts)</code></td><td>Offset at or after the given timestamp (millis)</td></tr></tbody></table>
+<p>To start reading from the latest offset (only new records), resolve the current offset via <code>list_offsets</code> before subscribing:</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">offsets </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><s [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changetype"><code>ChangeType</code><a href="#changetype" class="hash-link" aria-label="Direct link to changetype" title="Direct link to changetype" translate="no">​</a></h2>
+<table><thead><tr><th>Value</th><th>Short String</th><th>Description</th></tr></thead><tbody><tr><td><code>ChangeType.AppendOnly</code> (0)</td><td><code>+A</code></td><td>Append-only</td></tr><tr><td><code>ChangeType.Insert</code> (1)</td><td><code>+I</code></td><td>Insert</td></tr><tr><td><code>ChangeType.UpdateBefore</code> (2)</td><td><code>-U</code></td><td>Previous value of updated row</td></tr><tr><td><code>ChangeType.UpdateAfter</code> (3)</td><td><code>+U</code></td><td>New valu [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/python/data-types/index.html b/user-guide/python/data-types/index.html
new file mode 100644
index 0000000..1fbd83e
--- /dev/null
+++ b/user-guide/python/data-types/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/python/data-types" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Data Types | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" content= [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>The Python client uses PyArrow types for schema definitions:</p>
+<table><thead><tr><th>PyArrow Type</th><th>Fluss Type</th><th>Python Type</th></tr></thead><tbody><tr><td><code>pa.bool_()</code></td><td>Boolean</td><td><code>bool</code></td></tr><tr><td><code>pa.int8()</code> / <code>int16()</code> / <code>int32()</code> / <code>int64()</code></td><td>TinyInt / SmallInt / Int / BigInt</td><td><code>int</code></td></tr><tr><td><code>pa.float32()</code> / <code>float64()</code></td><td>Float / Double</td><td><code>float</code></td></tr><tr><td><code>pa. [...]
+<p>All Python native types (<code>date</code>, <code>time</code>, <code>datetime</code>, <code>Decimal</code>) work when appending rows via dicts.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="writing-data">Writing Data<a href="#writing-data" class="hash-link" aria-label="Direct link to Writing Data" title="Direct link to Writing Data" translate="no">​</a></h2>
+<p>Rows can be dicts, lists, or tuples:</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> datetime </span [...]
+<p>Lists and tuples must have values in column order:</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">row </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span  [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reading-data">Reading Data<a href="#reading-data" class="hash-link" aria-label="Direct link to Reading Data" title="Direct link to Reading Data" translate="no">​</a></h2>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">records </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><s [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/python/error-handling/index.html b/user-guide/python/error-handling/index.html
new file mode 100644
index 0000000..76b9d0b
--- /dev/null
+++ b/user-guide/python/error-handling/index.html
@@ -0,0 +1,43 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/python/error-handling" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Error Handling | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" cont [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>The client raises <code>fluss.FlussError</code> for all Fluss-specific errors. Each error carries a <code>message</code> and an <code>error_code</code>.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="basic-usage">Basic Usage<a href="#basic-usage" class="hash-link" aria-label="Direct link to Basic Usage" title="Direct link to Basic Usage" translate="no">​</a></h2>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> fluss</span>< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="error-codes">Error Codes<a href="#error-codes" class="hash-link" aria-label="Direct link to Error Codes" title="Direct link to Error Codes" translate="no">​</a></h2>
+<p>Server-side errors carry a specific error code (&gt;0 or -1). Client-side errors (connection failures, type mismatches, etc.) use <code>ErrorCode.CLIENT_ERROR</code> (-2). Use <code>fluss.ErrorCode</code> to match on specific codes:</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> fluss</span>< [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-error-codes">Common Error Codes<a href="#common-error-codes" class="hash-link" aria-label="Direct link to Common Error Codes" title="Direct link to Common Error Codes" translate="no">​</a></h3>
+<table><thead><tr><th>Constant</th><th>Code</th><th>Description</th></tr></thead><tbody><tr><td><code>ErrorCode.CLIENT_ERROR</code></td><td>-2</td><td>Client-side error (not from server)</td></tr><tr><td><code>ErrorCode.UNKNOWN_SERVER_ERROR</code></td><td>-1</td><td>Unexpected server error</td></tr><tr><td><code>ErrorCode.NETWORK_EXCEPTION</code></td><td>1</td><td>Server disconnected before response</td></tr><tr><td><code>ErrorCode.DATABASE_NOT_EXIST</code></td><td>4</td><td>Database doe [...]
+<p>See <code>fluss.ErrorCode</code> for the full list of named constants.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-error-scenarios">Common Error Scenarios<a href="#common-error-scenarios" class="hash-link" aria-label="Direct link to Common Error Scenarios" title="Direct link to Common Error Scenarios" translate="no">​</a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="connection-refused">Connection Refused<a href="#connection-refused" class="hash-link" aria-label="Direct link to Connection Refused" title="Direct link to Connection Refused" translate="no">​</a></h3>
+<p>The Fluss cluster is not running or the address is incorrect.</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">try</span><span class="token punctuation" style="colo [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="table-not-found">Table Not Found<a href="#table-not-found" class="hash-link" aria-label="Direct link to Table Not Found" title="Direct link to Table Not Found" translate="no">​</a></h3>
+<p>The table does not exist or has been dropped.</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">try</span><span class="token punctuation" style="colo [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="partition-not-found">Partition Not Found<a href="#partition-not-found" class="hash-link" aria-label="Direct link to Partition Not Found" title="Direct link to Partition Not Found" translate="no">​</a></h3>
+<p>Writing to a partitioned table before creating partitions.</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">try</span><span class="token punctuation" style="colo [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="authentication-failed">Authentication Failed<a href="#authentication-failed" class="hash-link" aria-label="Direct link to Authentication Failed" title="Direct link to Authentication Failed" translate="no">​</a></h3>
+<p>SASL credentials are incorrect or the user does not exist.</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">try</span><span class="token punctuation" style="colo [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="schema-mismatch">Schema Mismatch<a href="#schema-mismatch" class="hash-link" aria-label="Direct link to Schema Mismatch" title="Direct link to Schema Mismatch" translate="no">​</a></h3>
+<p>Row data doesn&#x27;t match the table schema.</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">try</span><span class="token punctuation" style="colo [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/python/example/admin-operations/index.html b/user-guide/python/example/admin-operations/index.html
new file mode 100644
index 0000000..b7fd38f
--- /dev/null
+++ b/user-guide/python/example/admin-operations/index.html
@@ -0,0 +1,32 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/python/example/admin-operations" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Admin Operations | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" co [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">admin </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><spa [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="databases">Databases<a href="#databases" class="hash-link" aria-label="Direct link to Databases" title="Direct link to Databases" translate="no">​</a></h2>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">await</span><span class="token plain"> admin</span><s [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tables">Tables<a href="#tables" class="hash-link" aria-label="Direct link to Tables" title="Direct link to Tables" translate="no">​</a></h2>
+<p>Schemas are defined using PyArrow and wrapped in <code>fluss.Schema</code>:</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> pyarrow </spa [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="tabledescriptor-options">TableDescriptor Options<a href="#tabledescriptor-options" class="hash-link" aria-label="Direct link to TableDescriptor Options" title="Direct link to TableDescriptor Options" translate="no">​</a></h3>
+<p><code>TableDescriptor</code> accepts these optional parameters:</p>
+<table><thead><tr><th>Parameter</th><th>Description</th></tr></thead><tbody><tr><td><code>partition_keys</code></td><td>Column names to partition by (e.g. <code>[&quot;region&quot;]</code>)</td></tr><tr><td><code>bucket_count</code></td><td>Number of buckets (parallelism units) for the table</td></tr><tr><td><code>bucket_keys</code></td><td>Columns used to determine bucket assignment</td></tr><tr><td><code>comment</code></td><td>Table comment / description</td></tr><tr><td><code>log_form [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="offsets">Offsets<a href="#offsets" class="hash-link" aria-label="Direct link to Offsets" title="Direct link to Offsets" translate="no">​</a></h2>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)"># Latest offsets for buckets</span><span class="token [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lake-snapshot">Lake Snapshot<a href="#lake-snapshot" class="hash-link" aria-label="Direct link to Lake Snapshot" title="Direct link to Lake Snapshot" translate="no">​</a></h2>
+<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.6 [...]
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">snapshot </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span>< [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/python/example/configuration/index.html b/user-guide/python/example/configuration/index.html
new file mode 100644
index 0000000..04be683
--- /dev/null
+++ b/user-guide/python/example/configuration/index.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/python/example/configuration" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Configuration | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" conte [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="connection-setup">Connection Setup<a href="#connection-setup" class="hash-link" aria-label="Direct link to Connection Setup" title="Direct link to Connection Setup" translate="no">​</a></h2>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> fluss</span>< [...]
+<p>The connection also supports context managers:</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">with</span><span class="token plain"> </span><span cl [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="connection-configurations">Connection Configurations<a href="#connection-configurations" class="hash-link" aria-label="Direct link to Connection Configurations" title="Direct link to Connection Configurations" translate="no">​</a></h2>
+<table><thead><tr><th>Key</th><th>Description</th><th>Default</th></tr></thead><tbody><tr><td><code>bootstrap.servers</code></td><td>Coordinator server address</td><td><code>127.0.0.1:9123</code></td></tr><tr><td><code>writer.request-max-size</code></td><td>Maximum request size in bytes</td><td><code>10485760</code> (10 MB)</td></tr><tr><td><code>writer.acks</code></td><td>Acknowledgment setting (<code>all</code> waits for all replicas)</td><td><code>all</code></td></tr><tr><td><code>wri [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sasl-authentication">SASL Authentication<a href="#sasl-authentication" class="hash-link" aria-label="Direct link to SASL Authentication" title="Direct link to SASL Authentication" translate="no">​</a></h2>
+<p>To connect to a Fluss cluster with SASL/PLAIN authentication enabled:</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">config </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><sp [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="connection-lifecycle">Connection Lifecycle<a href="#connection-lifecycle" class="hash-link" aria-label="Direct link to Connection Lifecycle" title="Direct link to Connection Lifecycle" translate="no">​</a></h2>
+<p>Remember to close the connection when done:</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">conn</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><sp [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/python/example/index.html b/user-guide/python/example/index.html
new file mode 100644
index 0000000..e062299
--- /dev/null
+++ b/user-guide/python/example/index.html
@@ -0,0 +1,20 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/python/example/index" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Example | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" content="ht [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>Minimal working example: connect to Fluss, create a table, write data, and read it back.</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> asyncio</span [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/python/example/log-tables/index.html b/user-guide/python/example/log-tables/index.html
new file mode 100644
index 0000000..36bfbab
--- /dev/null
+++ b/user-guide/python/example/log-tables/index.html
@@ -0,0 +1,49 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/python/example/log-tables" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Log Tables | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" content= [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>Log tables are append-only tables without primary keys, suitable for event streaming.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-log-table">Creating a Log Table<a href="#creating-a-log-table" class="hash-link" aria-label="Direct link to Creating a Log Table" title="Direct link to Creating a Log Table" translate="no">​</a></h2>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> pyarrow </spa [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="writing">Writing<a href="#writing" class="hash-link" aria-label="Direct link to Writing" title="Direct link to Writing" translate="no">​</a></h2>
+<p>Rows can be appended as dicts, lists, or tuples. For bulk writes, use <code>write_arrow()</code>, <code>write_arrow_batch()</code>, or <code>write_pandas()</code>.</p>
+<p>Write methods like <code>append()</code> and <code>write_arrow_batch()</code> return a <code>WriteResultHandle</code>. You can ignore it for fire-and-forget semantics (flush at the end), or <code>await handle.wait()</code> to block until the server acknowledges that specific write.</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">table </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><spa [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reading">Reading<a href="#reading" class="hash-link" aria-label="Direct link to Reading" title="Direct link to Reading" translate="no">​</a></h2>
+<p>There are two scanner types:</p>
+<ul>
+<li class=""><strong>Batch scanner</strong> (<code>create_record_batch_log_scanner()</code>): returns Arrow Tables or DataFrames, best for analytics</li>
+<li class=""><strong>Record scanner</strong> (<code>create_log_scanner()</code>): returns individual records with metadata (offset, timestamp, change type), best for streaming</li>
+</ul>
+<p>And two reading modes:</p>
+<ul>
+<li class=""><strong><code>to_arrow()</code> / <code>to_pandas()</code></strong>: reads all data from subscribed buckets up to the current latest offset, then returns. Best for one-shot batch reads.</li>
+<li class=""><strong><code>poll_arrow()</code> / <code>poll()</code> / <code>poll_record_batch()</code></strong>: returns whatever data is available within the timeout, then returns. Call in a loop for continuous streaming.</li>
+</ul>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="batch-read-one-shot">Batch Read (One-Shot)<a href="#batch-read-one-shot" class="hash-link" aria-label="Direct link to Batch Read (One-Shot)" title="Direct link to Batch Read (One-Shot)" translate="no">​</a></h3>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">num_buckets </span><span class="token operator" style="color:rgb(212, 212, 212)">=</spa [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="continuous-polling">Continuous Polling<a href="#continuous-polling" class="hash-link" aria-label="Direct link to Continuous Polling" title="Direct link to Continuous Polling" translate="no">​</a></h3>
+<p>Use <code>poll_arrow()</code> or <code>poll()</code> in a loop for streaming consumption:</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)"># Batch scanner: poll as Arrow Tables</span><span cla [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="unsubscribing">Unsubscribing<a href="#unsubscribing" class="hash-link" aria-label="Direct link to Unsubscribing" title="Direct link to Unsubscribing" translate="no">​</a></h3>
+<p>To stop consuming from a bucket, use <code>unsubscribe()</code>:</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">scanner</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span> [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="subscribe-from-latest-offset">Subscribe from Latest Offset<a href="#subscribe-from-latest-offset" class="hash-link" aria-label="Direct link to Subscribe from Latest Offset" title="Direct link to Subscribe from Latest Offset" translate="no">​</a></h3>
+<p>To only consume new records (skip existing data), first resolve the current latest offset via <code>list_offsets</code>, then subscribe at that offset:</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">admin </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><spa [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="column-projection">Column Projection<a href="#column-projection" class="hash-link" aria-label="Direct link to Column Projection" title="Direct link to Column Projection" translate="no">​</a></h2>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">scanner </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><s [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/python/example/partitioned-tables/index.html b/user-guide/python/example/partitioned-tables/index.html
new file mode 100644
index 0000000..195f159
--- /dev/null
+++ b/user-guide/python/example/partitioned-tables/index.html
@@ -0,0 +1,33 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/python/example/partitioned-tables" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Partitioned Tables | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url"  [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>Partitioned tables distribute data across partitions based on column values. Partitions must exist before writing data, otherwise the client will by default retry indefinitely.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-and-managing-partitions">Creating and Managing Partitions<a href="#creating-and-managing-partitions" class="hash-link" aria-label="Direct link to Creating and Managing Partitions" title="Direct link to Creating and Managing Partitions" translate="no">​</a></h2>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> pyarrow </spa [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="writing">Writing<a href="#writing" class="hash-link" aria-label="Direct link to Writing" title="Direct link to Writing" translate="no">​</a></h2>
+<p>Same as non-partitioned tables - include partition column values in each row. <strong>Partitions must exist before writing data, otherwise the client will by default retry indefinitely.</strong></p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">table </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><spa [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reading">Reading<a href="#reading" class="hash-link" aria-label="Direct link to Reading" title="Direct link to Reading" translate="no">​</a></h2>
+<p>Use <code>subscribe_partition()</code> or <code>subscribe_partition_buckets()</code> instead of <code>subscribe()</code>:</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">scanner </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><s [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="unsubscribing">Unsubscribing<a href="#unsubscribing" class="hash-link" aria-label="Direct link to Unsubscribing" title="Direct link to Unsubscribing" translate="no">​</a></h3>
+<p>To stop consuming from a specific partition bucket, use <code>unsubscribe_partition()</code>:</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">scanner</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span> [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partitioned-primary-key-tables">Partitioned Primary Key Tables<a href="#partitioned-primary-key-tables" class="hash-link" aria-label="Direct link to Partitioned Primary Key Tables" title="Direct link to Partitioned Primary Key Tables" translate="no">​</a></h2>
+<p>Partition columns must be part of the primary key. Partitions must exist before upserting data, otherwise the client will by default retry indefinitely.</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">schema </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><sp [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/python/example/primary-key-tables/index.html b/user-guide/python/example/primary-key-tables/index.html
new file mode 100644
index 0000000..30fe51a
--- /dev/null
+++ b/user-guide/python/example/primary-key-tables/index.html
@@ -0,0 +1,27 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/python/example/primary-key-tables" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Primary Key Tables | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url"  [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>Primary key tables support upsert, delete, and point lookup operations.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-primary-key-table">Creating a Primary Key Table<a href="#creating-a-primary-key-table" class="hash-link" aria-label="Direct link to Creating a Primary Key Table" title="Direct link to Creating a Primary Key Table" translate="no">​</a></h2>
+<p>Pass <code>primary_keys</code> to <code>fluss.Schema</code>:</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> pyarrow </spa [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upsert-delete-lookup">Upsert, Delete, Lookup<a href="#upsert-delete-lookup" class="hash-link" aria-label="Direct link to Upsert, Delete, Lookup" title="Direct link to Upsert, Delete, Lookup" translate="no">​</a></h2>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">table </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><spa [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partial-updates">Partial Updates<a href="#partial-updates" class="hash-link" aria-label="Direct link to Partial Updates" title="Direct link to Partial Updates" translate="no">​</a></h2>
+<p>Update specific columns while preserving others:</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">partial_writer </span><span class="token operator" style="color:rgb(212, 212, 212)">=</ [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/python/installation/index.html b/user-guide/python/installation/index.html
new file mode 100644
index 0000000..871de06
--- /dev/null
+++ b/user-guide/python/installation/index.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/python/installation" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Installation | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" conten [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">pip </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><spa [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="building-from-source-optional">Building From Source (Optional)<a href="#building-from-source-optional" class="hash-link" aria-label="Direct link to Building From Source (Optional)" title="Direct link to Building From Source (Optional)" translate="no">​</a></h2>
+<p><strong>Prerequisites:</strong> Python 3.9+, Rust 1.85+</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">git</span><span class="token plain"> clone https://gith [...]
+<p>Install <a href="https://github.com/PyO3/maturin" target="_blank" rel="noopener noreferrer" class="">maturin</a>:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">pip </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><spa [...]
+<p>Build and install:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)"># Development mode (editable)</span><span class="token pl [...]
+<p>Verify:</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> fluss</span>< [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/rust/api-reference/index.html b/user-guide/rust/api-reference/index.html
new file mode 100644
index 0000000..2a8f3b1
--- /dev/null
+++ b/user-guide/rust/api-reference/index.html
@@ -0,0 +1,116 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/rust/api-reference" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">API Reference | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" conte [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>Complete API reference for the Fluss Rust client.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="config"><code>Config</code><a href="#config" class="hash-link" aria-label="Direct link to config" title="Direct link to config" translate="no">​</a></h2>
+<table><thead><tr><th>Field</th><th>Type</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>bootstrap_servers</code></td><td><code>String</code></td><td><code>&quot;127.0.0.1:9123&quot;</code></td><td>Coordinator server address</td></tr><tr><td><code>writer_request_max_size</code></td><td><code>i32</code></td><td><code>10485760</code> (10 MB)</td><td>Maximum request size in bytes</td></tr><tr><td><code>writer_acks</code></td><td><code>String</code></td><td><code>&q [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flussconnection"><code>FlussConnection</code><a href="#flussconnection" class="hash-link" aria-label="Direct link to flussconnection" title="Direct link to flussconnection" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>async fn new(config: Config) -&gt; Result&lt;Self&gt;</code></td><td>Create a new connection to a Fluss cluster</td></tr><tr><td><code>async fn get_admin(&amp;self) -&gt; Result&lt;FlussAdmin&gt;</code></td><td>Get the admin interface for cluster management</td></tr><tr><td><code>async fn get_table(&amp;self, table_path: &amp;TablePath) -&gt; Result&lt;FlussTable&lt;&#x27;_&gt;&gt;</code></td><td>Get a [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flussadmin"><code>FlussAdmin</code><a href="#flussadmin" class="hash-link" aria-label="Direct link to flussadmin" title="Direct link to flussadmin" translate="no">​</a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="database-operations">Database Operations<a href="#database-operations" class="hash-link" aria-label="Direct link to Database Operations" title="Direct link to Database Operations" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>async fn create_database(&amp;self, name: &amp;str, descriptor: Option&lt;&amp;DatabaseDescriptor&gt;, ignore_if_exists: bool) -&gt; Result&lt;()&gt;</code></td><td>Create a database</td></tr><tr><td><code>async fn drop_database(&amp;self, name: &amp;str, ignore_if_not_exists: bool, cascade: bool) -&gt; Result&lt;()&gt;</code></td><td>Drop a database</td></tr><tr><td><code>async fn list_databases(&amp; [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="table-operations">Table Operations<a href="#table-operations" class="hash-link" aria-label="Direct link to Table Operations" title="Direct link to Table Operations" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>async fn create_table(&amp;self, table_path: &amp;TablePath, descriptor: &amp;TableDescriptor, ignore_if_exists: bool) -&gt; Result&lt;()&gt;</code></td><td>Create a table</td></tr><tr><td><code>async fn drop_table(&amp;self, table_path: &amp;TablePath, ignore_if_not_exists: bool) -&gt; Result&lt;()&gt;</code></td><td>Drop a table</td></tr><tr><td><code>async fn get_table_info(&amp;self, table_path: &a [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="partition-operations">Partition Operations<a href="#partition-operations" class="hash-link" aria-label="Direct link to Partition Operations" title="Direct link to Partition Operations" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>async fn list_partition_infos(&amp;self, table_path: &amp;TablePath) -&gt; Result&lt;Vec&lt;PartitionInfo&gt;&gt;</code></td><td>List all partitions</td></tr><tr><td><code>async fn list_partition_infos_with_spec(&amp;self, table_path: &amp;TablePath, spec: Option&lt;&amp;PartitionSpec&gt;) -&gt; Result&lt;Vec&lt;PartitionInfo&gt;&gt;</code></td><td>List partitions matching a spec</td></tr><tr><td><code [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="offset-operations">Offset Operations<a href="#offset-operations" class="hash-link" aria-label="Direct link to Offset Operations" title="Direct link to Offset Operations" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>async fn list_offsets(&amp;self, table_path: &amp;TablePath, bucket_ids: &amp;[i32], offset_spec: OffsetSpec) -&gt; Result&lt;HashMap&lt;i32, i64&gt;&gt;</code></td><td>Get offsets for buckets</td></tr><tr><td><code>async fn list_partition_offsets(&amp;self, table_path: &amp;TablePath, partition_name: &amp;str, bucket_ids: &amp;[i32], offset_spec: OffsetSpec) -&gt; Result&lt;HashMap&lt;i32, i64&gt;&gt; [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="lake-operations">Lake Operations<a href="#lake-operations" class="hash-link" aria-label="Direct link to Lake Operations" title="Direct link to Lake Operations" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>async fn get_latest_lake_snapshot(&amp;self, table_path: &amp;TablePath) -&gt; Result&lt;LakeSnapshot&gt;</code></td><td>Get the latest lake snapshot</td></tr></tbody></table>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cluster-operations">Cluster Operations<a href="#cluster-operations" class="hash-link" aria-label="Direct link to Cluster Operations" title="Direct link to Cluster Operations" translate="no">​</a></h3>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>async fn get_server_nodes(&amp;self) -&gt; Result&lt;Vec&lt;ServerNode&gt;&gt;</code></td><td>Get all alive server nodes (coordinator + tablets)</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="servernode"><code>ServerNode</code><a href="#servernode" class="hash-link" aria-label="Direct link to servernode" title="Direct link to servernode" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>fn id(&amp;self) -&gt; i32</code></td><td>Server node ID</td></tr><tr><td><code>fn host(&amp;self) -&gt; &amp;str</code></td><td>Hostname of the server</td></tr><tr><td><code>fn port(&amp;self) -&gt; u32</code></td><td>Port number</td></tr><tr><td><code>fn server_type(&amp;self) -&gt; &amp;ServerType</code></td><td>Server type (<code>CoordinatorServer</code> or <code>TabletServer</code>)</td></tr><tr>< [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flusstablea"><code>FlussTable&lt;&#x27;a&gt;</code><a href="#flusstablea" class="hash-link" aria-label="Direct link to flusstablea" title="Direct link to flusstablea" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>fn get_table_info(&amp;self) -&gt; &amp;TableInfo</code></td><td>Get table metadata</td></tr><tr><td><code>fn new_append(&amp;self) -&gt; Result&lt;TableAppend&gt;</code></td><td>Create an append builder for log tables</td></tr><tr><td><code>fn new_scan(&amp;self) -&gt; TableScan&lt;&#x27;_&gt;</code></td><td>Create a scan builder</td></tr><tr><td><code>fn new_lookup(&amp;self) -&gt; Result&lt;TableLoo [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tableappend"><code>TableAppend</code><a href="#tableappend" class="hash-link" aria-label="Direct link to tableappend" title="Direct link to tableappend" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>fn create_writer(&amp;self) -&gt; Result&lt;AppendWriter&gt;</code></td><td>Create an append writer</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="appendwriter"><code>AppendWriter</code><a href="#appendwriter" class="hash-link" aria-label="Direct link to appendwriter" title="Direct link to appendwriter" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>fn append(&amp;self, row: &amp;impl InternalRow) -&gt; Result&lt;WriteResultFuture&gt;</code></td><td>Append a row; returns a future for acknowledgment</td></tr><tr><td><code>fn append_arrow_batch(&amp;self, batch: RecordBatch) -&gt; Result&lt;WriteResultFuture&gt;</code></td><td>Append an Arrow RecordBatch</td></tr><tr><td><code>async fn flush(&amp;self) -&gt; Result&lt;()&gt;</code></td><td>Flush all [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tablescana"><code>TableScan&lt;&#x27;a&gt;</code><a href="#tablescana" class="hash-link" aria-label="Direct link to tablescana" title="Direct link to tablescana" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>fn project(self, indices: &amp;[usize]) -&gt; Result&lt;Self&gt;</code></td><td>Project columns by index</td></tr><tr><td><code>fn project_by_name(self, names: &amp;[&amp;str]) -&gt; Result&lt;Self&gt;</code></td><td>Project columns by name</td></tr><tr><td><code>fn create_log_scanner(self) -&gt; Result&lt;LogScanner&gt;</code></td><td>Create a record-based log scanner</td></tr><tr><td><code>fn create_ [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="logscanner"><code>LogScanner</code><a href="#logscanner" class="hash-link" aria-label="Direct link to logscanner" title="Direct link to logscanner" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>async fn subscribe(&amp;self, bucket_id: i32, start_offset: i64) -&gt; Result&lt;()&gt;</code></td><td>Subscribe to a bucket</td></tr><tr><td><code>async fn subscribe_buckets(&amp;self, bucket_offsets: &amp;HashMap&lt;i32, i64&gt;) -&gt; Result&lt;()&gt;</code></td><td>Subscribe to multiple buckets</td></tr><tr><td><code>async fn subscribe_partition(&amp;self, partition_id: i64, bucket_id: i32, start_o [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="recordbatchlogscanner"><code>RecordBatchLogScanner</code><a href="#recordbatchlogscanner" class="hash-link" aria-label="Direct link to recordbatchlogscanner" title="Direct link to recordbatchlogscanner" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>async fn subscribe(&amp;self, bucket_id: i32, start_offset: i64) -&gt; Result&lt;()&gt;</code></td><td>Subscribe to a bucket</td></tr><tr><td><code>async fn subscribe_buckets(&amp;self, bucket_offsets: &amp;HashMap&lt;i32, i64&gt;) -&gt; Result&lt;()&gt;</code></td><td>Subscribe to multiple buckets</td></tr><tr><td><code>async fn subscribe_partition(&amp;self, partition_id: i64, bucket_id: i32, start_o [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="scanrecord"><code>ScanRecord</code><a href="#scanrecord" class="hash-link" aria-label="Direct link to scanrecord" title="Direct link to scanrecord" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>fn row(&amp;self) -&gt; &amp;dyn InternalRow</code></td><td>Get the row data</td></tr><tr><td><code>fn offset(&amp;self) -&gt; i64</code></td><td>Record offset in the log</td></tr><tr><td><code>fn timestamp(&amp;self) -&gt; i64</code></td><td>Record timestamp</td></tr><tr><td><code>fn change_type(&amp;self) -&gt; &amp;ChangeType</code></td><td>Change type (AppendOnly, Insert, etc.)</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="scanrecords"><code>ScanRecords</code><a href="#scanrecords" class="hash-link" aria-label="Direct link to scanrecords" title="Direct link to scanrecords" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>fn count(&amp;self) -&gt; usize</code></td><td>Number of records</td></tr><tr><td><code>fn is_empty(&amp;self) -&gt; bool</code></td><td>Whether the result set is empty</td></tr><tr><td><code>fn records(&amp;self, bucket: &amp;TableBucket) -&gt; &amp;[ScanRecord]</code></td><td>Get records for a specific bucket</td></tr><tr><td><code>fn records_by_buckets(&amp;self) -&gt; &amp;HashMap&lt;TableBucket, V [...]
+<p><code>ScanRecords</code> also implements <code>IntoIterator</code>, so you can iterate over all records directly:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> record </span><span  [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="scanbatch"><code>ScanBatch</code><a href="#scanbatch" class="hash-link" aria-label="Direct link to scanbatch" title="Direct link to scanbatch" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>fn bucket(&amp;self) -&gt; &amp;TableBucket</code></td><td>Bucket this batch belongs to</td></tr><tr><td><code>fn batch(&amp;self) -&gt; &amp;RecordBatch</code></td><td>Arrow RecordBatch data</td></tr><tr><td><code>fn base_offset(&amp;self) -&gt; i64</code></td><td>First record offset</td></tr><tr><td><code>fn last_offset(&amp;self) -&gt; i64</code></td><td>Last record offset</td></tr><tr><td><code>fn  [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tableupsert"><code>TableUpsert</code><a href="#tableupsert" class="hash-link" aria-label="Direct link to tableupsert" title="Direct link to tableupsert" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>fn create_writer(&amp;self) -&gt; Result&lt;UpsertWriter&gt;</code></td><td>Create an upsert writer</td></tr><tr><td><code>fn partial_update(&amp;self, column_indices: Option&lt;Vec&lt;usize&gt;&gt;) -&gt; Result&lt;TableUpsert&gt;</code></td><td>Create a partial update builder by column indices</td></tr><tr><td><code>fn partial_update_with_column_names(&amp;self, names: &amp;[&amp;str]) -&gt; Result&l [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upsertwriter"><code>UpsertWriter</code><a href="#upsertwriter" class="hash-link" aria-label="Direct link to upsertwriter" title="Direct link to upsertwriter" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>fn upsert(&amp;self, row: &amp;impl InternalRow) -&gt; Result&lt;WriteResultFuture&gt;</code></td><td>Upsert a row (insert or update by PK)</td></tr><tr><td><code>fn delete(&amp;self, row: &amp;impl InternalRow) -&gt; Result&lt;WriteResultFuture&gt;</code></td><td>Delete a row by primary key</td></tr><tr><td><code>async fn flush(&amp;self) -&gt; Result&lt;()&gt;</code></td><td>Flush all pending operati [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tablelookup"><code>TableLookup</code><a href="#tablelookup" class="hash-link" aria-label="Direct link to tablelookup" title="Direct link to tablelookup" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>fn create_lookuper(&amp;self) -&gt; Result&lt;Lookuper&gt;</code></td><td>Create a lookuper for point lookups</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lookuper"><code>Lookuper</code><a href="#lookuper" class="hash-link" aria-label="Direct link to lookuper" title="Direct link to lookuper" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>async fn lookup(&amp;mut self, key: &amp;impl InternalRow) -&gt; Result&lt;LookupResult&gt;</code></td><td>Lookup a row by primary key</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lookupresult"><code>LookupResult</code><a href="#lookupresult" class="hash-link" aria-label="Direct link to lookupresult" title="Direct link to lookupresult" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>fn get_single_row(&amp;self) -&gt; Result&lt;Option&lt;impl InternalRow&gt;&gt;</code></td><td>Get a single row from the result</td></tr><tr><td><code>fn get_rows(&amp;self) -&gt; Vec&lt;impl InternalRow&gt;</code></td><td>Get all rows from the result</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="writeresultfuture"><code>WriteResultFuture</code><a href="#writeresultfuture" class="hash-link" aria-label="Direct link to writeresultfuture" title="Direct link to writeresultfuture" translate="no">​</a></h2>
+<table><thead><tr><th>Description</th></tr></thead><tbody><tr><td>Implements <code>Future&lt;Output = Result&lt;(), Error&gt;&gt;</code>. Await to wait for server acknowledgment. Returned by <code>append()</code>, <code>upsert()</code>, and <code>delete()</code>.</td></tr></tbody></table>
+<p>Usage:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// Fire-and-forget (batched)</span><span class="token pla [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="schema"><code>Schema</code><a href="#schema" class="hash-link" aria-label="Direct link to schema" title="Direct link to schema" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>fn builder() -&gt; SchemaBuilder</code></td><td>Create a schema builder</td></tr><tr><td><code>fn columns(&amp;self) -&gt; &amp;[Column]</code></td><td>Get all columns</td></tr><tr><td><code>fn primary_key(&amp;self) -&gt; Option&lt;&amp;PrimaryKey&gt;</code></td><td>Get primary key (None if no primary key)</td></tr><tr><td><code>fn column_names(&amp;self) -&gt; Vec&lt;&amp;str&gt;</code></td><td>Get a [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="schemabuilder"><code>SchemaBuilder</code><a href="#schemabuilder" class="hash-link" aria-label="Direct link to schemabuilder" title="Direct link to schemabuilder" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>fn column(name: &amp;str, data_type: DataType) -&gt; Self</code></td><td>Add a column</td></tr><tr><td><code>fn primary_key(keys: Vec&lt;&amp;str&gt;) -&gt; Self</code></td><td>Set primary key columns</td></tr><tr><td><code>fn build() -&gt; Result&lt;Schema&gt;</code></td><td>Build the schema</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tabledescriptor"><code>TableDescriptor</code><a href="#tabledescriptor" class="hash-link" aria-label="Direct link to tabledescriptor" title="Direct link to tabledescriptor" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>fn builder() -&gt; TableDescriptorBuilder</code></td><td>Create a table descriptor builder</td></tr><tr><td><code>fn schema(&amp;self) -&gt; &amp;Schema</code></td><td>Get the table schema</td></tr><tr><td><code>fn partition_keys(&amp;self) -&gt; &amp;[String]</code></td><td>Get partition key column names</td></tr><tr><td><code>fn has_primary_key(&amp;self) -&gt; bool</code></td><td>Check if the table  [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tabledescriptorbuilder"><code>TableDescriptorBuilder</code><a href="#tabledescriptorbuilder" class="hash-link" aria-label="Direct link to tabledescriptorbuilder" title="Direct link to tabledescriptorbuilder" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>fn schema(schema: Schema) -&gt; Self</code></td><td>Set the schema</td></tr><tr><td><code>fn log_format(format: LogFormat) -&gt; Self</code></td><td>Set log format (e.g., <code>LogFormat::ARROW</code>)</td></tr><tr><td><code>fn kv_format(format: KvFormat) -&gt; Self</code></td><td>Set KV format (e.g., <code>KvFormat::COMPACTED</code>)</td></tr><tr><td><code>fn property(key: &amp;str, value: &amp;str) - [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tablepath"><code>TablePath</code><a href="#tablepath" class="hash-link" aria-label="Direct link to tablepath" title="Direct link to tablepath" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>TablePath::new(database: &amp;str, table: &amp;str) -&gt; Self</code></td><td>Create a table path</td></tr><tr><td><code>fn database(&amp;self) -&gt; &amp;str</code></td><td>Get database name</td></tr><tr><td><code>fn table(&amp;self) -&gt; &amp;str</code></td><td>Get table name</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tableinfo"><code>TableInfo</code><a href="#tableinfo" class="hash-link" aria-label="Direct link to tableinfo" title="Direct link to tableinfo" translate="no">​</a></h2>
+<table><thead><tr><th>Field / Method</th><th>Description</th></tr></thead><tbody><tr><td><code>.table_path</code></td><td><code>TablePath</code> -- Table path</td></tr><tr><td><code>.table_id</code></td><td><code>i64</code> -- Table ID</td></tr><tr><td><code>.schema_id</code></td><td><code>i32</code> -- Schema ID</td></tr><tr><td><code>.schema</code></td><td><code>Schema</code> -- Table schema</td></tr><tr><td><code>.primary_keys</code></td><td><code>Vec&lt;String&gt;</code> -- Primary k [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tablebucket"><code>TableBucket</code><a href="#tablebucket" class="hash-link" aria-label="Direct link to tablebucket" title="Direct link to tablebucket" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>TableBucket::new(table_id: i64, bucket_id: i32) -&gt; Self</code></td><td>Create a non-partitioned bucket</td></tr><tr><td><code>TableBucket::new_with_partition(table_id: i64, partition_id: Option&lt;i64&gt;, bucket_id: i32) -&gt; Self</code></td><td>Create a partitioned bucket</td></tr><tr><td><code>fn table_id(&amp;self) -&gt; i64</code></td><td>Get table ID</td></tr><tr><td><code>fn partition_id(&am [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partitionspec"><code>PartitionSpec</code><a href="#partitionspec" class="hash-link" aria-label="Direct link to partitionspec" title="Direct link to partitionspec" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>PartitionSpec::new(spec_map: HashMap&lt;&amp;str, &amp;str&gt;) -&gt; Self</code></td><td>Create from a map of partition column names to values</td></tr><tr><td><code>fn get_spec_map(&amp;self) -&gt; &amp;HashMap&lt;String, String&gt;</code></td><td>Get the partition spec map</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partitioninfo"><code>PartitionInfo</code><a href="#partitioninfo" class="hash-link" aria-label="Direct link to partitioninfo" title="Direct link to partitioninfo" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>fn get_partition_id(&amp;self) -&gt; i64</code></td><td>Get partition ID</td></tr><tr><td><code>fn get_partition_name(&amp;self) -&gt; String</code></td><td>Get partition name</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="databasedescriptor"><code>DatabaseDescriptor</code><a href="#databasedescriptor" class="hash-link" aria-label="Direct link to databasedescriptor" title="Direct link to databasedescriptor" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>fn builder() -&gt; DatabaseDescriptorBuilder</code></td><td>Create a database descriptor builder</td></tr><tr><td><code>fn comment(&amp;self) -&gt; Option&lt;&amp;str&gt;</code></td><td>Get database comment</td></tr><tr><td><code>fn custom_properties(&amp;self) -&gt; &amp;HashMap&lt;String, String&gt;</code></td><td>Get custom properties</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="databasedescriptorbuilder"><code>DatabaseDescriptorBuilder</code><a href="#databasedescriptorbuilder" class="hash-link" aria-label="Direct link to databasedescriptorbuilder" title="Direct link to databasedescriptorbuilder" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>fn comment(comment: impl Into&lt;String&gt;) -&gt; Self</code></td><td>Set database comment</td></tr><tr><td><code>fn custom_properties(properties: HashMap&lt;impl Into&lt;String&gt;, impl Into&lt;String&gt;&gt;) -&gt; Self</code></td><td>Set custom properties</td></tr><tr><td><code>fn custom_property(key: impl Into&lt;String&gt;, value: impl Into&lt;String&gt;) -&gt; Self</code></td><td>Set a single c [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="databaseinfo"><code>DatabaseInfo</code><a href="#databaseinfo" class="hash-link" aria-label="Direct link to databaseinfo" title="Direct link to databaseinfo" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>fn database_name(&amp;self) -&gt; &amp;str</code></td><td>Get database name</td></tr><tr><td><code>fn created_time(&amp;self) -&gt; i64</code></td><td>Get creation timestamp</td></tr><tr><td><code>fn modified_time(&amp;self) -&gt; i64</code></td><td>Get last modification timestamp</td></tr><tr><td><code>fn database_descriptor(&amp;self) -&gt; &amp;DatabaseDescriptor</code></td><td>Get the database desc [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lakesnapshot"><code>LakeSnapshot</code><a href="#lakesnapshot" class="hash-link" aria-label="Direct link to lakesnapshot" title="Direct link to lakesnapshot" translate="no">​</a></h2>
+<table><thead><tr><th>Field</th><th>Description</th></tr></thead><tbody><tr><td><code>.snapshot_id</code></td><td><code>i64</code> -- Snapshot ID</td></tr><tr><td><code>.table_buckets_offset</code></td><td><code>HashMap&lt;TableBucket, i64&gt;</code> -- All bucket offsets</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="genericrowa"><code>GenericRow&lt;&#x27;a&gt;</code><a href="#genericrowa" class="hash-link" aria-label="Direct link to genericrowa" title="Direct link to genericrowa" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>GenericRow::new(field_count: usize) -&gt; Self</code></td><td>Create a new row with the given number of fields</td></tr><tr><td><code>fn set_field(&amp;mut self, pos: usize, value: impl Into&lt;Datum&lt;&#x27;a&gt;&gt;)</code></td><td>Set a field value by position</td></tr><tr><td><code>GenericRow::from_data(data: Vec&lt;impl Into&lt;Datum&lt;&#x27;a&gt;&gt;&gt;) -&gt; Self</code></td><td>Create a row  [...]
+<p>Implements the <code>InternalRow</code> trait (see below).</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="internalrow-trait"><code>InternalRow</code> trait<a href="#internalrow-trait" class="hash-link" aria-label="Direct link to internalrow-trait" title="Direct link to internalrow-trait" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>fn is_null_at(&amp;self, idx: usize) -&gt; Result&lt;bool&gt;</code></td><td>Check if a field is null</td></tr><tr><td><code>fn get_boolean(&amp;self, idx: usize) -&gt; Result&lt;bool&gt;</code></td><td>Get boolean value</td></tr><tr><td><code>fn get_byte(&amp;self, idx: usize) -&gt; Result&lt;i8&gt;</code></td><td>Get tinyint value</td></tr><tr><td><code>fn get_short(&amp;self, idx: usize) -&gt; Resul [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="changetype"><code>ChangeType</code><a href="#changetype" class="hash-link" aria-label="Direct link to changetype" title="Direct link to changetype" translate="no">​</a></h2>
+<table><thead><tr><th>Value</th><th>Short String</th><th>Description</th></tr></thead><tbody><tr><td><code>ChangeType::AppendOnly</code></td><td><code>+A</code></td><td>Append-only record</td></tr><tr><td><code>ChangeType::Insert</code></td><td><code>+I</code></td><td>Inserted row</td></tr><tr><td><code>ChangeType::UpdateBefore</code></td><td><code>-U</code></td><td>Previous value of an updated row</td></tr><tr><td><code>ChangeType::UpdateAfter</code></td><td><code>+U</code></td><td>New  [...]
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>fn short_string(&amp;self) -&gt; &amp;str</code></td><td>Get the short string representation</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="offsetspec"><code>OffsetSpec</code><a href="#offsetspec" class="hash-link" aria-label="Direct link to offsetspec" title="Direct link to offsetspec" translate="no">​</a></h2>
+<table><thead><tr><th>Variant</th><th>Description</th></tr></thead><tbody><tr><td><code>OffsetSpec::Earliest</code></td><td>Start from the earliest available offset</td></tr><tr><td><code>OffsetSpec::Latest</code></td><td>Start from the latest offset (only new records)</td></tr><tr><td><code>OffsetSpec::Timestamp(i64)</code></td><td>Start from a specific timestamp in milliseconds</td></tr></tbody></table>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="constants">Constants<a href="#constants" class="hash-link" aria-label="Direct link to Constants" title="Direct link to Constants" translate="no">​</a></h2>
+<table><thead><tr><th>Constant</th><th>Value</th><th>Description</th></tr></thead><tbody><tr><td><code>fluss::client::EARLIEST_OFFSET</code></td><td><code>-2</code></td><td>Start reading from the earliest available offset</td></tr></tbody></table>
+<p>To start reading from the latest offset (only new records), resolve the current offset via <code>list_offsets</code> before subscribing:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="datatypes-factory"><code>DataTypes</code> factory<a href="#datatypes-factory" class="hash-link" aria-label="Direct link to datatypes-factory" title="Direct link to datatypes-factory" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Returns</th><th>Description</th></tr></thead><tbody><tr><td><code>DataTypes::boolean()</code></td><td><code>DataType</code></td><td>Boolean type</td></tr><tr><td><code>DataTypes::tinyint()</code></td><td><code>DataType</code></td><td>8-bit signed integer</td></tr><tr><td><code>DataTypes::smallint()</code></td><td><code>DataType</code></td><td>16-bit signed integer</td></tr><tr><td><code>DataTypes::int()</code></td><td><code>DataType</code></td><td>32- [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="datafield"><code>DataField</code><a href="#datafield" class="hash-link" aria-label="Direct link to datafield" title="Direct link to datafield" translate="no">​</a></h2>
+<table><thead><tr><th>Method</th><th>Description</th></tr></thead><tbody><tr><td><code>DataField::new(name: impl Into&lt;String&gt;, data_type: DataType, description: Option&lt;String&gt;) -&gt; DataField</code></td><td>Create a data field</td></tr><tr><td><code>fn name(&amp;self) -&gt; &amp;str</code></td><td>Get the field name</td></tr></tbody></table></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col n [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/rust/data-types/index.html b/user-guide/rust/data-types/index.html
new file mode 100644
index 0000000..b4adf39
--- /dev/null
+++ b/user-guide/rust/data-types/index.html
@@ -0,0 +1,27 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/rust/data-types" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Data Types | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" content= [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<table><thead><tr><th>Fluss Type</th><th>Rust Type</th><th>Getter</th><th>Setter</th></tr></thead><tbody><tr><td><code>BOOLEAN</code></td><td><code>bool</code></td><td><code>get_boolean()</code></td><td><code>set_field(idx, bool)</code></td></tr><tr><td><code>TINYINT</code></td><td><code>i8</code></td><td><code>get_byte()</code></td><td><code>set_field(idx, i8)</code></td></tr><tr><td><code>SMALLINT</code></td><td><code>i16</code></td><td><code>get_short()</code></td><td><code>set_field( [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="constructing-special-types">Constructing Special Types<a href="#constructing-special-types" class="hash-link" aria-label="Direct link to Constructing Special Types" title="Direct link to Constructing Special Types" translate="no">​</a></h2>
+<p>Primitive types (<code>bool</code>, <code>i8</code>, <code>i16</code>, <code>i32</code>, <code>i64</code>, <code>f32</code>, <code>f64</code>, <code>&amp;str</code>, <code>&amp;[u8]</code>) can be passed directly to <code>set_field</code>. The following types require explicit construction:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-rows-from-data">Creating Rows from Data<a href="#creating-rows-from-data" class="hash-link" aria-label="Direct link to Creating Rows from Data" title="Direct link to Creating Rows from Data" translate="no">​</a></h2>
+<p><code>GenericRow::from_data</code> accepts a <code>Vec&lt;Datum&gt;</code>. Because multiple crates implement <code>From&lt;&amp;str&gt;</code>, Rust cannot infer the target type from <code>.into()</code> alone. Annotate the vector type explicitly:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reading-row-data">Reading Row Data<a href="#reading-row-data" class="hash-link" aria-label="Direct link to Reading Row Data" title="Direct link to Reading Row Data" translate="no">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/rust/error-handling/index.html b/user-guide/rust/error-handling/index.html
new file mode 100644
index 0000000..aa91d5b
--- /dev/null
+++ b/user-guide/rust/error-handling/index.html
@@ -0,0 +1,49 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/rust/error-handling" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Error Handling | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" cont [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>The Fluss Rust client uses a unified <code>Error</code> type and a <code>Result&lt;T&gt;</code> alias for all fallible operations.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="basic-usage">Basic Usage<a href="#basic-usage" class="hash-link" aria-label="Direct link to Basic Usage" title="Direct link to Basic Usage" translate="no">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<p>Use the <code>?</code> operator to propagate errors, or <code>match</code> on specific variants for fine-grained handling.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="matching-error-variants">Matching Error Variants<a href="#matching-error-variants" class="hash-link" aria-label="Direct link to Matching Error Variants" title="Direct link to Matching Error Variants" translate="no">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="error-variants">Error Variants<a href="#error-variants" class="hash-link" aria-label="Direct link to Error Variants" title="Direct link to Error Variants" translate="no">​</a></h2>
+<table><thead><tr><th>Variant</th><th>Description</th></tr></thead><tbody><tr><td><code>UnexpectedError</code></td><td>General unexpected errors with a message and optional source</td></tr><tr><td><code>IoUnexpectedError</code></td><td>I/O errors (network, file system)</td></tr><tr><td><code>RemoteStorageUnexpectedError</code></td><td>Remote storage errors (OpenDAL backend failures)</td></tr><tr><td><code>RpcError</code></td><td>RPC communication failures (connection refused, timeout)</t [...]
+<p>Server side errors are represented as <code>FlussAPIError</code> with a specific error code. Use the <code>api_error()</code> helper to match them ergonomically:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-error-scenarios">Common Error Scenarios<a href="#common-error-scenarios" class="hash-link" aria-label="Direct link to Common Error Scenarios" title="Direct link to Common Error Scenarios" translate="no">​</a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="connection-refused">Connection Refused<a href="#connection-refused" class="hash-link" aria-label="Direct link to Connection Refused" title="Direct link to Connection Refused" translate="no">​</a></h3>
+<p>The Fluss cluster is not running or the address is incorrect.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">let</span><span class="token plain"> result </span><span  [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="table-not-found">Table Not Found<a href="#table-not-found" class="hash-link" aria-label="Direct link to Table Not Found" title="Direct link to Table Not Found" translate="no">​</a></h3>
+<p>The table does not exist or has been dropped.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="partition-not-found">Partition Not Found<a href="#partition-not-found" class="hash-link" aria-label="Direct link to Partition Not Found" title="Direct link to Partition Not Found" translate="no">​</a></h3>
+<p>The partition does not exist on a partitioned table.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="authentication-failed">Authentication Failed<a href="#authentication-failed" class="hash-link" aria-label="Direct link to Authentication Failed" title="Direct link to Authentication Failed" translate="no">​</a></h3>
+<p>SASL credentials are incorrect or the user does not exist.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="schema-mismatch">Schema Mismatch<a href="#schema-mismatch" class="hash-link" aria-label="Direct link to Schema Mismatch" title="Direct link to Schema Mismatch" translate="no">​</a></h3>
+<p>Row data does not match the expected table schema.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">let</span><span class="token plain"> result </span><span  [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-resultt-in-application-code">Using <code>Result&lt;T&gt;</code> in Application Code<a href="#using-resultt-in-application-code" class="hash-link" aria-label="Direct link to using-resultt-in-application-code" title="Direct link to using-resultt-in-application-code" translate="no">​</a></h2>
+<p>The <code>fluss::error::Result&lt;T&gt;</code> type alias makes it easy to use Fluss errors with the <code>?</code> operator in your application functions:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<p>For applications that use other error types alongside Fluss errors, you can convert with standard <code>From</code> / <code>Into</code> traits or use crates like <code>anyhow</code>:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/rust/example/admin-operations/index.html b/user-guide/rust/example/admin-operations/index.html
new file mode 100644
index 0000000..a6f82ca
--- /dev/null
+++ b/user-guide/rust/example/admin-operations/index.html
@@ -0,0 +1,31 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/rust/example/admin-operations" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Admin Operations | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" co [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-admin-interface">Get Admin Interface<a href="#get-admin-interface" class="hash-link" aria-label="Direct link to Get Admin Interface" title="Direct link to Get Admin Interface" translate="no">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">let</span><span class="token plain"> admin </span><span c [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="database-operations">Database Operations<a href="#database-operations" class="hash-link" aria-label="Direct link to Database Operations" title="Direct link to Database Operations" translate="no">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// Create database</span><span class="token plain"></span [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="table-operations">Table Operations<a href="#table-operations" class="hash-link" aria-label="Direct link to Table Operations" title="Direct link to Table Operations" translate="no">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partition-operations">Partition Operations<a href="#partition-operations" class="hash-link" aria-label="Direct link to Partition Operations" title="Direct link to Partition Operations" translate="no">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="offset-operations">Offset Operations<a href="#offset-operations" class="hash-link" aria-label="Direct link to Offset Operations" title="Direct link to Offset Operations" translate="no">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lake-snapshot">Lake Snapshot<a href="#lake-snapshot" class="hash-link" aria-label="Direct link to Lake Snapshot" title="Direct link to Lake Snapshot" translate="no">​</a></h2>
+<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.6 [...]
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">let</span><span class="token plain"> snapshot </span><spa [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/rust/example/configuration/index.html b/user-guide/rust/example/configuration/index.html
new file mode 100644
index 0000000..e72b858
--- /dev/null
+++ b/user-guide/rust/example/configuration/index.html
@@ -0,0 +1,25 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/rust/example/configuration" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Configuration | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" conte [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="connection-setup">Connection Setup<a href="#connection-setup" class="hash-link" aria-label="Direct link to Connection Setup" title="Direct link to Connection Setup" translate="no">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="connection-configurations">Connection Configurations<a href="#connection-configurations" class="hash-link" aria-label="Direct link to Connection Configurations" title="Direct link to Connection Configurations" translate="no">​</a></h2>
+<table><thead><tr><th>Option</th><th>Description</th><th>Default</th></tr></thead><tbody><tr><td><code>bootstrap_servers</code></td><td>Coordinator server address</td><td><code>127.0.0.1:9123</code></td></tr><tr><td><code>writer_request_max_size</code></td><td>Maximum request size in bytes</td><td>10 MB</td></tr><tr><td><code>writer_acks</code></td><td>Acknowledgment setting (<code>all</code> waits for all replicas)</td><td><code>all</code></td></tr><tr><td><code>writer_retries</code></t [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sasl-authentication">SASL Authentication<a href="#sasl-authentication" class="hash-link" aria-label="Direct link to SASL Authentication" title="Direct link to SASL Authentication" translate="no">​</a></h2>
+<p>To connect to a Fluss cluster with SASL/PLAIN authentication enabled:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">let</span><span class="token plain"> </span><span class=" [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/rust/example/index.html b/user-guide/rust/example/index.html
new file mode 100644
index 0000000..0a8e100
--- /dev/null
+++ b/user-guide/rust/example/index.html
@@ -0,0 +1,20 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/rust/example/index" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Example | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" content="ht [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>Minimal working examples: connect to Fluss, create a table, write data, and read it back.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/rust/example/log-tables/index.html b/user-guide/rust/example/log-tables/index.html
new file mode 100644
index 0000000..70bcb78
--- /dev/null
+++ b/user-guide/rust/example/log-tables/index.html
@@ -0,0 +1,41 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/rust/example/log-tables" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Log Tables | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" content= [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>Log tables are append-only tables without primary keys, suitable for event streaming.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-log-table">Creating a Log Table<a href="#creating-a-log-table" class="hash-link" aria-label="Direct link to Creating a Log Table" title="Direct link to Creating a Log Table" translate="no">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="writing-to-log-tables">Writing to Log Tables<a href="#writing-to-log-tables" class="hash-link" aria-label="Direct link to Writing to Log Tables" title="Direct link to Writing to Log Tables" translate="no">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<p>Write operations use a <strong>fire-and-forget</strong> pattern for efficient batching. Each call queues the write and returns a <code>WriteResultFuture</code> immediately. Call <code>flush()</code> to ensure all queued writes are sent to the server.</p>
+<p>For per-record acknowledgment:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">append_writer</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</spa [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reading-from-log-tables">Reading from Log Tables<a href="#reading-from-log-tables" class="hash-link" aria-label="Direct link to Reading from Log Tables" title="Direct link to Reading from Log Tables" translate="no">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<p><strong>Subscribe from special offsets:</strong></p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<p><strong>Subscribe from latest offset (only new records):</strong></p>
+<p>To start reading only new records, first resolve the current latest offset via <code>list_offsets</code>, then subscribe at that offset:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<p><strong>Subscribe to all buckets:</strong></p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">let</span><span class="token plain"> num_buckets </span>< [...]
+<p><strong>Subscribe to multiple buckets at once:</strong></p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<p><strong>Unsubscribe from a bucket:</strong></p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// Non-partitioned tables</span><span class="token plain" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="column-projection">Column Projection<a href="#column-projection" class="hash-link" aria-label="Direct link to Column Projection" title="Direct link to Column Projection" translate="no">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// Project by column index</span><span class="token plain [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/rust/example/partitioned-tables/index.html b/user-guide/rust/example/partitioned-tables/index.html
new file mode 100644
index 0000000..60b3fd6
--- /dev/null
+++ b/user-guide/rust/example/partitioned-tables/index.html
@@ -0,0 +1,45 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/rust/example/partitioned-tables" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Partitioned Tables | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url"  [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>Partitioned tables distribute data across partitions based on partition column values, enabling efficient data organization and querying. Both log tables and primary key tables support partitioning.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partitioned-log-tables">Partitioned Log Tables<a href="#partitioned-log-tables" class="hash-link" aria-label="Direct link to Partitioned Log Tables" title="Direct link to Partitioned Log Tables" translate="no">​</a></h2>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-partitioned-log-table">Creating a Partitioned Log Table<a href="#creating-a-partitioned-log-table" class="hash-link" aria-label="Direct link to Creating a Partitioned Log Table" title="Direct link to Creating a Partitioned Log Table" translate="no">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="writing-to-partitioned-log-tables">Writing to Partitioned Log Tables<a href="#writing-to-partitioned-log-tables" class="hash-link" aria-label="Direct link to Writing to Partitioned Log Tables" title="Direct link to Writing to Partitioned Log Tables" translate="no">​</a></h3>
+<p><strong>Partitions must exist before writing data, otherwise the client will by default retry indefinitely.</strong> Include partition column values in each row, the client routes records to the correct partition automatically.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="reading-from-partitioned-log-tables">Reading from Partitioned Log Tables<a href="#reading-from-partitioned-log-tables" class="hash-link" aria-label="Direct link to Reading from Partitioned Log Tables" title="Direct link to Reading from Partitioned Log Tables" translate="no">​</a></h3>
+<p>For partitioned tables, use partition-aware subscribe methods.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<p>Subscribe to multiple partition-buckets at once:</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="managing-partitions">Managing Partitions<a href="#managing-partitions" class="hash-link" aria-label="Direct link to Managing Partitions" title="Direct link to Managing Partitions" translate="no">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partitioned-primary-key-tables">Partitioned Primary Key Tables<a href="#partitioned-primary-key-tables" class="hash-link" aria-label="Direct link to Partitioned Primary Key Tables" title="Direct link to Partitioned Primary Key Tables" translate="no">​</a></h2>
+<p>Partitioned KV tables combine partitioning with primary key operations. Partition columns must be part of the primary key.</p>
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-partitioned-primary-key-table">Creating a Partitioned Primary Key Table<a href="#creating-a-partitioned-primary-key-table" class="hash-link" aria-label="Direct link to Creating a Partitioned Primary Key Table" title="Direct link to Creating a Partitioned Primary Key Table" translate="no">​</a></h3>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="writing-to-partitioned-primary-key-tables">Writing to Partitioned Primary Key Tables<a href="#writing-to-partitioned-primary-key-tables" class="hash-link" aria-label="Direct link to Writing to Partitioned Primary Key Tables" title="Direct link to Writing to Partitioned Primary Key Tables" translate="no">​</a></h3>
+<p><strong>Partitions must exist before upserting data, otherwise the client will by default retry indefinitely.</strong></p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="looking-up-records-in-partitioned-tables">Looking Up Records in Partitioned Tables<a href="#looking-up-records-in-partitioned-tables" class="hash-link" aria-label="Direct link to Looking Up Records in Partitioned Tables" title="Direct link to Looking Up Records in Partitioned Tables" translate="no">​</a></h3>
+<p>Lookup requires all primary key columns including partition columns.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">let</span><span class="token plain"> </span><span class=" [...]
+<blockquote>
+<p><strong>Note:</strong> Scanning partitioned primary key tables is not supported. Use lookup operations instead.</p>
+</blockquote></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col noPrint_WFHX"><a href="https://github.com/apache/fluss-rust/edit/main/website/docs/user-guide/rust/example/partitioned-tables.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3- [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/rust/example/primary-key-tables/index.html b/user-guide/rust/example/primary-key-tables/index.html
new file mode 100644
index 0000000..f8011d0
--- /dev/null
+++ b/user-guide/rust/example/primary-key-tables/index.html
@@ -0,0 +1,33 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/rust/example/primary-key-tables" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Primary Key Tables | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url"  [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>Primary key tables (KV tables) support upsert, delete, and lookup operations.</p>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-primary-key-table">Creating a Primary Key Table<a href="#creating-a-primary-key-table" class="hash-link" aria-label="Direct link to Creating a Primary Key Table" title="Direct link to Creating a Primary Key Table" translate="no">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upserting-records">Upserting Records<a href="#upserting-records" class="hash-link" aria-label="Direct link to Upserting Records" title="Direct link to Upserting Records" translate="no">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">use</span><span class="token plain"> </span><span class=" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="updating-records">Updating Records<a href="#updating-records" class="hash-link" aria-label="Direct link to Updating Records" title="Direct link to Updating Records" translate="no">​</a></h2>
+<p>Upsert with the same primary key to update an existing record.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">let</span><span class="token plain"> </span><span class=" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="deleting-records">Deleting Records<a href="#deleting-records" class="hash-link" aria-label="Direct link to Deleting Records" title="Direct link to Deleting Records" translate="no">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// Only primary key field needs to be set</span><span cla [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partial-updates">Partial Updates<a href="#partial-updates" class="hash-link" aria-label="Direct link to Partial Updates" title="Direct link to Partial Updates" translate="no">​</a></h2>
+<p>Update only specific columns while preserving others.</p>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">// By column indices</span><span class="token plain"></sp [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="looking-up-records">Looking Up Records<a href="#looking-up-records" class="hash-link" aria-label="Direct link to Looking Up Records" title="Direct link to Looking Up Records" translate="no">​</a></h2>
+<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">let</span><span class="token plain"> </span><span class=" [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/user-guide/rust/installation/index.html b/user-guide/rust/installation/index.html
new file mode 100644
index 0000000..7aec03b
--- /dev/null
+++ b/user-guide/rust/installation/index.html
@@ -0,0 +1,43 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-user-guide/rust/installation" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.9.2">
+<title data-rh="true">Installation | Apache Fluss Clients</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" name="twitter:image" content="https://clients.fluss.apache.org/img/logo/png/colored_logo.png"><meta data-rh="true" property="og:url" conten [...]
+<link rel="manifest" href="/manifest.json">
+<meta name="theme-color" content="#0071e3"><link rel="stylesheet" href="/assets/css/styles.ffd6893e.css">
+<script src="/assets/js/runtime~main.613ff8f6.js" defer="defer"></script>
+<script src="/assets/js/main.5b88a321.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__d [...]
+<p>The Fluss Rust client is published to <a href="https://crates.io/crates/fluss-rs" target="_blank" rel="noopener noreferrer" class="">crates.io</a> as <code>fluss-rs</code>. The crate&#x27;s library name is <code>fluss</code>, so you import it with <code>use fluss::...</code>.</p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token table class-name" style=" [...]
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="feature-flags">Feature Flags<a href="#feature-flags" class="hash-link" aria-label="Direct link to Feature Flags" title="Direct link to Feature Flags" translate="no">​</a></h2>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token table class-name" style=" [...]
+<p>Available features:</p>
+<ul>
+<li class=""><code>storage-memory</code> (default: In-memory storage)</li>
+<li class=""><code>storage-fs</code> (default: Local filesystem storage)</li>
+<li class=""><code>storage-s3</code> (Amazon S3 storage)</li>
+<li class=""><code>storage-oss</code> (Alibaba OSS storage)</li>
+<li class=""><code>storage-all</code> (All storage backends)</li>
+</ul>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="git-or-path-dependency">Git or Path Dependency<a href="#git-or-path-dependency" class="hash-link" aria-label="Direct link to Git or Path Dependency" title="Direct link to Git or Path Dependency" translate="no">​</a></h2>
+<p>For development against unreleased changes:</p>
+<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token table class-name" style=" [...]
+<blockquote>
+<p><strong>Note:</strong> When using <code>git</code> or <code>path</code> dependencies, the <code>package = &quot;fluss-rs&quot;</code> field is required so that Cargo resolves the correct package while still allowing <code>use fluss::...</code> imports.</p>
+</blockquote>
+<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="building-from-source">Building from Source<a href="#building-from-source" class="hash-link" aria-label="Direct link to Building from Source" title="Direct link to Building from Source" translate="no">​</a></h2>
+<p><strong>Prerequisites:</strong> Rust 1.85+, Protobuf compiler (<code>protoc</code>)</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">git</span><span class="token plain"> clone https://gith [...]
+<p>Install <code>protoc</code>:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)"># macOS</span><span class="token plain"></span><br></span [...]
+<p>Build:</p>
+<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">cargo</span><span class="token plain"> build </span><sp [...]
+</body>
+</html>
\ No newline at end of file