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

popduke pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/bifromq-sites.git


The following commit(s) were added to refs/heads/master by this push:
     new e7a13e3a add download page
e7a13e3a is described below

commit e7a13e3abf8b967e260a788988d3e8fb6fde44c9
Author: Yonny Hao <[email protected]>
AuthorDate: Mon Dec 1 15:24:48 2025 +0800

    add download page
---
 docs/get_started/download/_category_.json |   8 ---
 docs/get_started/download/intro.md        |  36 -----------
 docs/installation/linux.md                |   2 +-
 docs/installation/windows.md              |   2 +-
 docusaurus.config.ts                      |   5 +-
 package-lock.json                         |  35 +----------
 releaseInfo.ts                            |   2 +
 src/pages/download.mdx                    | 101 ++++++++++++++++++++++++++++++
 8 files changed, 109 insertions(+), 82 deletions(-)

diff --git a/docs/get_started/download/_category_.json 
b/docs/get_started/download/_category_.json
deleted file mode 100644
index 14db48c2..00000000
--- a/docs/get_started/download/_category_.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "label": "Download",
-  "position": 1,
-  "link": {
-    "type": "doc",
-    "id": "get_started/download/intro"
-  }
-}
diff --git a/docs/get_started/download/intro.md 
b/docs/get_started/download/intro.md
deleted file mode 100644
index 5a1b8c2f..00000000
--- a/docs/get_started/download/intro.md
+++ /dev/null
@@ -1,36 +0,0 @@
----
-sidebar_position: 0
-title: "Download"
----
-
-# Download BifroMQ
-
-BifroMQ releases consist of two parts:
-
-1. **Binary Distributions** published via Apache's release process.
-2. **Plugin Packages** published to Maven Central.
-
-We **strongly recommend** using the versions released after BifroMQ entered 
the Apache Incubator. Pre-incubation distributions remain available via [GitHub 
Release](https://github.com/apache/bifromq/releases).
-
-## Binary Distributions
-
-### Apache Incubator Downloads
-
-Official binary and source archives for incubating releases are available on 
the Apache mirror network:  
-https://www.apache.org/dyn/closer.lua/incubator/bifromq/
-
-Download the ZIP or TAR.GZ packages from your preferred mirror.
-
-## Plugin Packages
-
-Java plugin artifacts are published to Maven Central under the 
`org.apache.bifromq` group. Add your plugin dependencies:
-
-```xml
-<dependency>
-  <groupId>org.apache.bifromq</groupId>
-  <artifactId>bifromq-plugin-[NAME]</artifactId>
-  <version>[BIFROMQ_VERSION]</version>
-</dependency>
-```
-
-Browse all plugin packages on [Maven 
Central](https://search.maven.org/search?q=g:org.apache.bifromq%20AND%20a:bifromq-plugin-*)
diff --git a/docs/installation/linux.md b/docs/installation/linux.md
index 48fe7043..e04647af 100644
--- a/docs/installation/linux.md
+++ b/docs/installation/linux.md
@@ -6,7 +6,7 @@ title: "Linux"
 ## Prerequisites
 
 - JDK 17+
-- Latest version BifroMQ [Releases](../get_started/download/intro.md)
+- Latest version BifroMQ [Releases](/download)
 
 ## Shell Commands
 
diff --git a/docs/installation/windows.md b/docs/installation/windows.md
index 332ec7f9..308709d0 100644
--- a/docs/installation/windows.md
+++ b/docs/installation/windows.md
@@ -6,7 +6,7 @@ title: "Windows"
 ## Prerequisites
 
 - JDK 17+
-- Latest version from BifroMQ [Releases](../get_started/download/intro.md)
+- Latest version from BifroMQ [Releases](/download)
 
 ## Shell Commands
 
diff --git a/docusaurus.config.ts b/docusaurus.config.ts
index 02c84c1e..22eeb9d0 100644
--- a/docusaurus.config.ts
+++ b/docusaurus.config.ts
@@ -5,6 +5,7 @@ const { themes } = require("prism-react-renderer");
 const lightCodeTheme = themes.github;
 const darkCodeTheme = themes.dracula;
 const tailwindPlugin = require("./plugins/tailwind-plugin.cjs");
+const { releaseVersion } = require("./releaseInfo");
 
 const projectName = "BifroMQ";
 const mainRepoName = "bifromq";
@@ -58,7 +59,7 @@ const config = {
           lastVersion: "current",
           versions: {
             current: {
-              label: "Next (Incubating)",
+              label: `${releaseVersion}`,
               badge: true,
             },
           },
@@ -123,7 +124,7 @@ const config = {
           position: "right",
         },
         {
-          to: "/docs/get_started/download/intro/",
+          to: "/download",
           label: "Download",
           position: "right",
         },
diff --git a/package-lock.json b/package-lock.json
index b52b0112..595b3787 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -247,7 +247,6 @@
       "resolved": 
"https://registry.npmjs.org/@algolia/client-search/-/client-search-5.43.0.tgz";,
       "integrity": 
"sha512-wKy6x6fKcnB1CsfeNNdGp4dzLzz04k8II3JLt6Sp81F8s57Ks3/K9qsysmL9SJa8P486s719bBttVLE8JJYurQ==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@algolia/client-common": "5.43.0",
         "@algolia/requester-browser-xhr": "5.43.0",
@@ -406,7 +405,6 @@
       "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz";,
       "integrity": 
"sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@babel/code-frame": "^7.27.1",
         "@babel/generator": "^7.28.5",
@@ -2238,7 +2236,6 @@
         }
       ],
       "license": "MIT",
-      "peer": true,
       "engines": {
         "node": ">=18"
       },
@@ -2261,7 +2258,6 @@
         }
       ],
       "license": "MIT",
-      "peer": true,
       "engines": {
         "node": ">=18"
       }
@@ -2371,7 +2367,6 @@
       "resolved": 
"https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz";,
       "integrity": 
"sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "cssesc": "^3.0.0",
         "util-deprecate": "^1.0.2"
@@ -2793,7 +2788,6 @@
       "resolved": 
"https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz";,
       "integrity": 
"sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "cssesc": "^3.0.0",
         "util-deprecate": "^1.0.2"
@@ -3679,7 +3673,6 @@
       "resolved": 
"https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz";,
       "integrity": 
"sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@docusaurus/core": "3.9.2",
         "@docusaurus/logger": "3.9.2",
@@ -3908,7 +3901,6 @@
       "resolved": 
"https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.9.2.tgz";,
       "integrity": 
"sha512-IGUsArG5hhekXd7RDb11v94ycpJpFdJPkLnt10fFQWOVxAtq5/D7hT6lzc2fhyQKaaCE62qVajOMKL7OiAFAIA==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@docusaurus/core": "3.9.2",
         "@docusaurus/logger": "3.9.2",
@@ -4485,7 +4477,6 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz";,
       "integrity": 
"sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==",
-      "peer": true,
       "dependencies": {
         "@types/mdx": "^2.0.0"
       },
@@ -4817,7 +4808,6 @@
       "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz";,
       "integrity": 
"sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@babel/core": "^7.21.3",
         "@svgr/babel-preset": "8.1.0",
@@ -5413,7 +5403,6 @@
       "version": "19.1.8",
       "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz";,
       "integrity": 
"sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==",
-      "peer": true,
       "dependencies": {
         "csstype": "^3.0.2"
       }
@@ -5747,7 +5736,6 @@
       "version": "8.15.0",
       "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz";,
       "integrity": 
"sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
-      "peer": true,
       "bin": {
         "acorn": "bin/acorn"
       },
@@ -5816,7 +5804,6 @@
       "version": "8.17.1",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz";,
       "integrity": 
"sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
-      "peer": true,
       "dependencies": {
         "fast-deep-equal": "^3.1.3",
         "fast-uri": "^3.0.1",
@@ -5860,7 +5847,6 @@
       "resolved": 
"https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.43.0.tgz";,
       "integrity": 
"sha512-hbkK41JsuGYhk+atBDxlcKxskjDCh3OOEDpdKZPtw+3zucBqhlojRG5e5KtCmByGyYvwZswVeaSWglgLn2fibg==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@algolia/abtesting": "1.9.0",
         "@algolia/client-abtesting": "5.43.0",
@@ -6325,7 +6311,6 @@
         }
       ],
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "baseline-browser-mapping": "^2.8.19",
         "caniuse-lite": "^1.0.30001751",
@@ -6616,7 +6601,6 @@
       "resolved": 
"https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz";,
       "integrity": 
"sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==",
       "license": "Apache-2.0",
-      "peer": true,
       "dependencies": {
         "@chevrotain/cst-dts-gen": "11.0.3",
         "@chevrotain/gast": "11.0.3",
@@ -7287,7 +7271,6 @@
       "resolved": 
"https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz";,
       "integrity": 
"sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "cssesc": "^3.0.0",
         "util-deprecate": "^1.0.2"
@@ -7602,7 +7585,6 @@
       "version": "3.32.0",
       "resolved": 
"https://registry.npmjs.org/cytoscape/-/cytoscape-3.32.0.tgz";,
       "integrity": 
"sha512-5JHBC9n75kz5851jeklCPmZWcg3hUe6sjqJvyk3+hVqFaKcHwHgxsjeN1yLmggoUc6STbtm9/NQyabQehfjvWQ==",
-      "peer": true,
       "engines": {
         "node": ">=0.10"
       }
@@ -8015,7 +7997,6 @@
       "resolved": 
"https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz";,
       "integrity": 
"sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
       "license": "ISC",
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
@@ -9168,7 +9149,6 @@
       "version": "6.12.6",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz";,
       "integrity": 
"sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-      "peer": true,
       "dependencies": {
         "fast-deep-equal": "^3.1.1",
         "fast-json-stable-stringify": "^2.0.0",
@@ -13668,7 +13648,6 @@
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz";,
       "integrity": 
"sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "fast-deep-equal": "^3.1.1",
         "fast-json-stable-stringify": "^2.0.0",
@@ -14268,7 +14247,6 @@
           "url": "https://github.com/sponsors/ai";
         }
       ],
-      "peer": true,
       "dependencies": {
         "nanoid": "^3.3.11",
         "picocolors": "^1.1.1",
@@ -15329,7 +15307,6 @@
       "resolved": 
"https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz";,
       "integrity": 
"sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "cssesc": "^3.0.0",
         "util-deprecate": "^1.0.2"
@@ -16224,7 +16201,6 @@
       "version": "19.1.0",
       "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz";,
       "integrity": 
"sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
-      "peer": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -16233,7 +16209,6 @@
       "version": "19.1.0",
       "resolved": 
"https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz";,
       "integrity": 
"sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
-      "peer": true,
       "dependencies": {
         "scheduler": "^0.26.0"
       },
@@ -16285,7 +16260,6 @@
       "version": "6.0.0",
       "resolved": 
"https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz";,
       "integrity": 
"sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==",
-      "peer": true,
       "dependencies": {
         "@types/react": "*"
       },
@@ -16327,7 +16301,6 @@
       "version": "5.3.4",
       "resolved": 
"https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz";,
       "integrity": 
"sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==",
-      "peer": true,
       "dependencies": {
         "@babel/runtime": "^7.12.13",
         "history": "^4.9.0",
@@ -17916,7 +17889,6 @@
       "version": "3.4.17",
       "resolved": 
"https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz";,
       "integrity": 
"sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==",
-      "peer": true,
       "dependencies": {
         "@alloc/quick-lru": "^5.2.0",
         "arg": "^5.0.2",
@@ -18236,8 +18208,7 @@
     "node_modules/tslib": {
       "version": "2.8.1",
       "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz";,
-      "integrity": 
"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
-      "peer": true
+      "integrity": 
"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
     },
     "node_modules/type-fest": {
       "version": "2.19.0",
@@ -18302,7 +18273,6 @@
       "resolved": 
"https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz";,
       "integrity": 
"sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
       "devOptional": true,
-      "peer": true,
       "bin": {
         "tsc": "bin/tsc",
         "tsserver": "bin/tsserver"
@@ -18652,7 +18622,6 @@
       "version": "6.12.6",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz";,
       "integrity": 
"sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-      "peer": true,
       "dependencies": {
         "fast-deep-equal": "^3.1.1",
         "fast-json-stable-stringify": "^2.0.0",
@@ -18906,7 +18875,6 @@
       "version": "5.99.9",
       "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz";,
       "integrity": 
"sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==",
-      "peer": true,
       "dependencies": {
         "@types/eslint-scope": "^3.7.7",
         "@types/estree": "^1.0.6",
@@ -19521,7 +19489,6 @@
       "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz";,
       "integrity": 
"sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==",
       "license": "MIT",
-      "peer": true,
       "funding": {
         "url": "https://github.com/sponsors/colinhacks";
       }
diff --git a/releaseInfo.ts b/releaseInfo.ts
new file mode 100644
index 00000000..58e7b9f0
--- /dev/null
+++ b/releaseInfo.ts
@@ -0,0 +1,2 @@
+// Central place to maintain the current incubating release version.
+export const releaseVersion = '4.0.0-incubating';
diff --git a/src/pages/download.mdx b/src/pages/download.mdx
new file mode 100644
index 00000000..9df9cb73
--- /dev/null
+++ b/src/pages/download.mdx
@@ -0,0 +1,101 @@
+---
+title: Download
+description: Download Apache BifroMQ (Incubating) releases, verify signatures, 
and find Docker and plugin packages.
+---
+
+import CodeBlock from "@theme/CodeBlock";
+import { releaseVersion } from "../../releaseInfo";
+
+export const releaseName = `apache-bifromq-${releaseVersion}`;
+export const mirrorPath = `incubator/bifromq/${releaseVersion}`;
+export const mirrorBase = 
`https://www.apache.org/dyn/closer.lua/${mirrorPath}`;
+export const archiveBase = `https://downloads.apache.org/${mirrorPath}`;
+export const archiveRoot = 
"https://archive.apache.org/dist/incubator/bifromq/";;
+export const keyUrl = "https://downloads.apache.org/incubator/bifromq/KEYS";;
+export const srcMirror = `${mirrorBase}/${releaseName}-src.tar.gz`;
+export const srcAsc = `${archiveBase}/${releaseName}-src.tar.gz.asc`;
+export const srcSha = `${archiveBase}/${releaseName}-src.tar.gz.sha512`;
+export const binMirror = `${mirrorBase}/${releaseName}-bin.tar.gz`;
+export const binAsc = `${archiveBase}/${releaseName}-bin.tar.gz.asc`;
+export const binSha = `${archiveBase}/${releaseName}-bin.tar.gz.sha512`;
+export const winZipMirror = `${mirrorBase}/${releaseName}-windows.zip`;
+export const winZipAsc = `${archiveBase}/${releaseName}-windows.zip.asc`;
+export const winZipSha = `${archiveBase}/${releaseName}-windows.zip.sha512`;
+export const releaseNoteUrl = 
`https://github.com/apache/bifromq/releases/tag/${releaseVersion}`;
+
+# Download Apache BifroMQ (Incubating)
+
+Current release: **{releaseVersion}**(<a href={releaseNoteUrl}>Release 
Note</a>) 
+
+## Release artifacts
+
+<table>
+  <thead>
+    <tr>
+      <th>Artifact</th>
+      <th>Signature</th>
+      <th>SHA512</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td><a href={srcMirror}>Source (.tar.gz)</a></td>
+      <td><a href={srcAsc}>.asc</a></td>
+      <td><a href={srcSha}>.sha512</a></td>
+    </tr>
+    <tr>
+      <td><a href={binMirror}>Binary (.tar.gz, convenience)</a></td>
+      <td><a href={binAsc}>.asc</a></td>
+      <td><a href={binSha}>.sha512</a></td>
+    </tr>
+    <tr>
+      <td><a href={winZipMirror}>Binary (.zip, Windows convenience)</a></td>
+      <td><a href={winZipAsc}>.asc</a></td>
+      <td><a href={winZipSha}>.sha512</a></td>
+    </tr>
+  </tbody>
+</table>
+
+- If a mirror is out of date, use the downloads.apache.org links or the <a 
href={archiveRoot}>release archive</a>.
+- Import the <a href={keyUrl}>KEYS file</a> before verification
+
+## Verify your download
+
+1. **Import keys**
+<CodeBlock language="bash">{`curl -O ${keyUrl}`}</CodeBlock>
+<CodeBlock language="bash">{`gpg --import KEYS`}</CodeBlock>
+
+2. **Download and verify PGP signature (source)**
+<CodeBlock language="bash">{`curl -O 
${mirrorBase}/${releaseName}-src.tar.gz`}</CodeBlock>
+<CodeBlock language="bash">{`curl -O 
${archiveBase}/${releaseName}-src.tar.gz.asc`}</CodeBlock>
+<CodeBlock language="bash">{`gpg --verify ${releaseName}-src.tar.gz.asc 
${releaseName}-src.tar.gz`}</CodeBlock>
+
+3. **Check SHA512**
+<CodeBlock language="bash">{`curl -O 
${archiveBase}/${releaseName}-src.tar.gz.sha512`}</CodeBlock>
+<CodeBlock language="bash">{`sha512sum -c 
${releaseName}-src.tar.gz.sha512`}</CodeBlock>
+
+If verification fails, discard the artifact and contact 
`[email protected]`.
+
+## Docker image (convenience)
+
+Run quickly with the published image (source release remains authoritative):
+
+<CodeBlock language="bash">{`docker run -d --name bifromq -p 1883:1883 
bifromq/bifromq:latest`}</CodeBlock>
+
+Set memory limits:
+
+<CodeBlock language="bash">{`docker run -d -m 10G -e MEM_LIMIT='10737418240' 
--name bifromq -p 1883:1883 bifromq/bifromq:latest`}</CodeBlock>
+
+Pass custom JVM options with `JVM_HEAP_OPTS` as needed.
+
+## Plugin packages (Maven Central)
+
+Java plugins are published under `org.apache.bifromq`. Match the plugin 
version to your BifroMQ deployment:
+
+<CodeBlock language="xml">{`<dependency>
+  <groupId>org.apache.bifromq</groupId>
+  <artifactId>bifromq-plugin-[NAME]</artifactId>
+  <version>${releaseVersion}</version>
+</dependency>`}</CodeBlock>
+
+[Browse on Maven 
Central](https://search.maven.org/search?q=g:org.apache.bifromq%20AND%20a:bifromq-plugin-*)

Reply via email to