diff --git a/docusaurus.config.ts b/docusaurus.config.ts
index f644abe4c87..5282f6df0f7 100644
--- a/docusaurus.config.ts
+++ b/docusaurus.config.ts
@@ -221,6 +221,10 @@ const config: Config = {
label: "Support",
to: "/support",
},
+ {
+ label: "Powered By",
+ to: "/powered-by",
+ },
],
},
{
@@ -333,6 +337,10 @@ const config: Config = {
label: "Brand Guidelines",
href: "/community/brand",
},
+ {
+ label: "Powered By",
+ href: "/powered-by",
+ },
],
},
{
diff --git a/src/consts/poweredBy.tsx b/src/consts/poweredBy.tsx
new file mode 100644
index 00000000000..79a2de36f7a
--- /dev/null
+++ b/src/consts/poweredBy.tsx
@@ -0,0 +1,94 @@
+import LinkWithBaseUrl from "../components/common/LinkWithBaseUrl";
+
+export interface IPoweredByUser {
+ /** Organization or project name. */
+ name: string;
+ /** Logo path under /static (e.g. "/img/powered-by/acme.svg"). Leave empty to render a text-only card. */
+ logo?: string;
+ /** Optional external link. */
+ website?: string;
+ /** Short description of how the organization uses Apache Cloudberry. */
+ description?: string;
+ /** Optional country/region label. */
+ region?: string;
+}
+
+const SUBMIT_URL =
+ "https://github.com/apache/cloudberry/discussions/1771";
+
+const configData = {
+ titleText: "Powered by Apache Cloudberry",
+ subText:
+ "Organizations and projects around the world are running their analytics workloads on Apache Cloudberry. This page highlights some of them and invites you to share your own story with the community.",
+ introText: (
+ <>
+ The list below is community-maintained and is not an endorsement by The
+ Apache Software Foundation. Entries are submitted by users themselves.
+ Logos and trademarks belong to their respective owners. If you would like
+ to add, update, or remove your organization, please open a comment in our{" "}
+
+ GitHub Discussion
+
+ .
+ >
+ ),
+ submitTitle: "Are you using Apache Cloudberry?",
+ submitText: (
+ <>
+ We would love to hear from you. Tell us about your use case, scale, and
+ what you are building. Adding your organization to this page is a simple
+ way to support the project and help others discover Cloudberry in
+ production.
+ >
+ ),
+ submitButtonText: "Share your story on GitHub",
+ submitButtonUrl: SUBMIT_URL,
+ guidelines: [
+ "Provide your organization or project name.",
+ "Attach a logo (SVG preferred, transparent background, at least 240px wide).",
+ "Add a one or two sentence description of how you use Apache Cloudberry.",
+ "Optionally include a website URL.",
+ ],
+ /**
+ * Append your entries below. Drop the logo file under
+ * `static/img/powered-by/` and reference it via an absolute path,
+ * e.g. `/img/powered-by/your-org.svg`.
+ */
+ users: [
+ // Example entries — replace with real users.
+ // {
+ // name: "Acme Analytics",
+ // logo: "/img/powered-by/acme.svg",
+ // website: "https://acme.example.com",
+ // description:
+ // "Powers a multi-petabyte analytics platform serving thousands of internal users.",
+ // },
+ {
+ name: "HashData",
+ logo: "/img/powered-by/hashdata.png",
+ website: "https://www.hashdata.cn/",
+ description:
+ "HashData Lightning and HashData Enterprise use Apache Cloudberry as their core engine.",
+ },
+ {
+ name: "Synx Data Labs",
+ logo: "/img/powered-by/synx.png",
+ website: "https://www.synxdata.com/",
+ description:
+ "Synx Data Labs builds its data warehouse product SynxDB on Apache Cloudberry.",
+ },
+ {
+ name: "Yandex Cloud",
+ logo: "/img/powered-by/yandex-cloud.svg",
+ website: "https://yandex.cloud/en/docs/managed-greenplum/",
+ description:
+ "Yandex MPP Analytics for PostgreSQL supports Apache Cloudberry.",
+ },
+ ] as IPoweredByUser[],
+};
+
+export default configData;
diff --git a/src/css/pages/powered-by.module.scss b/src/css/pages/powered-by.module.scss
new file mode 100644
index 00000000000..0798bfd577f
--- /dev/null
+++ b/src/css/pages/powered-by.module.scss
@@ -0,0 +1,187 @@
+.mainContent {
+ max-width: var(--global-main-width);
+ margin: 0 auto;
+ padding: 60px var(--mobile-padding-width) 120px;
+ box-sizing: border-box;
+}
+
+.intro {
+ max-width: 900px;
+ margin: 0 auto 56px;
+ font-size: 15px;
+ line-height: 26px;
+ color: var(--sub-text-color-2);
+ text-align: center;
+}
+
+.sectionTitle {
+ font-size: 22px;
+ font-weight: 700;
+ line-height: 32px;
+ margin-bottom: 28px;
+ color: var(--title-text-color);
+}
+
+.logoGrid {
+ display: grid;
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ gap: 24px;
+ margin-bottom: 80px;
+}
+
+.logoCard {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: flex-start;
+ text-align: center;
+ padding: 28px 20px;
+ border: 1px solid var(--blog-border-color);
+ border-radius: 8px;
+ background-color: var(--normal-bg-1);
+ transition: border-color 0.2s ease, transform 0.2s ease,
+ box-shadow 0.2s ease;
+ min-height: 200px;
+ text-decoration: none;
+ color: inherit;
+
+ &:hover {
+ border-color: var(--active-color);
+ transform: translateY(-2px);
+ box-shadow: 0 6px 18px rgba(0, 0, 0, 0.08);
+ text-decoration: none;
+ color: inherit;
+ }
+}
+
+.logoBox {
+ width: 100%;
+ height: 72px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-bottom: 16px;
+
+ img {
+ max-width: 100%;
+ max-height: 100%;
+ object-fit: contain;
+ }
+}
+
+.logoFallback {
+ font-size: 18px;
+ font-weight: 700;
+ color: var(--title-text-color);
+ letter-spacing: 0.02em;
+}
+
+.userName {
+ font-size: 15px;
+ font-weight: 600;
+ color: var(--title-text-color);
+ margin-bottom: 6px;
+}
+
+.userMeta {
+ font-size: 12px;
+ color: var(--sub-text-color-1);
+ margin-bottom: 8px;
+}
+
+.userDesc {
+ font-size: 13px;
+ line-height: 20px;
+ color: var(--sub-text-color-2);
+}
+
+.emptyState {
+ border: 1px dashed var(--blog-border-color);
+ border-radius: 8px;
+ padding: 48px 24px;
+ text-align: center;
+ color: var(--sub-text-color-2);
+ font-size: 14px;
+ line-height: 22px;
+ margin-bottom: 80px;
+}
+
+.submitSection {
+ border-radius: 12px;
+ padding: 48px 40px;
+ background: linear-gradient(
+ 135deg,
+ rgba(255, 168, 0, 0.12),
+ rgba(139, 123, 207, 0.08)
+ );
+ border: 1px solid var(--blog-border-color);
+ text-align: center;
+}
+
+.submitTitle {
+ font-size: 24px;
+ font-weight: 700;
+ margin-bottom: 16px;
+ color: var(--title-text-color);
+}
+
+.submitText {
+ max-width: 720px;
+ margin: 0 auto 24px;
+ color: var(--sub-text-color-2);
+ font-size: 15px;
+ line-height: 24px;
+}
+
+.guidelines {
+ max-width: 640px;
+ margin: 0 auto 28px;
+ text-align: left;
+ padding-left: 22px;
+
+ li {
+ font-size: 14px;
+ line-height: 24px;
+ color: var(--sub-text-color-2);
+ margin-bottom: 4px;
+ }
+}
+
+.submitButton {
+ display: inline-block;
+ padding: 12px 28px;
+ background-color: var(--active-color);
+ color: var(--home-btn-color, #000);
+ font-weight: 700;
+ font-size: 15px;
+ border-radius: 6px;
+ transition: background-color 0.2s ease;
+
+ &:hover {
+ background-color: var(--hover-fill-color);
+ color: var(--home-btn-color, #000);
+ text-decoration: none;
+ }
+}
+
+@media screen and (max-width: 1200px) {
+ .logoGrid {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ }
+}
+
+@media screen and (max-width: 900px) {
+ .logoGrid {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+}
+
+@media screen and (max-width: 560px) {
+ .logoGrid {
+ grid-template-columns: 1fr;
+ }
+
+ .submitSection {
+ padding: 32px 20px;
+ }
+}
diff --git a/src/pages/powered-by.tsx b/src/pages/powered-by.tsx
new file mode 100644
index 00000000000..9fb90b03d2c
--- /dev/null
+++ b/src/pages/powered-by.tsx
@@ -0,0 +1,97 @@
+import clsx from "clsx";
+import ColorCard from "../components/common/ColorCard";
+import CommonLayout from "../components/common/Layout";
+import LinkWithBaseUrl from "../components/common/LinkWithBaseUrl";
+import configData, { IPoweredByUser } from "../consts/poweredBy";
+import styles from "../css/pages/powered-by.module.scss";
+
+const {
+ titleText,
+ subText,
+ introText,
+ submitTitle,
+ submitText,
+ submitButtonText,
+ submitButtonUrl,
+ guidelines,
+ users,
+} = configData;
+
+function UserCard({ user }: { user: IPoweredByUser }) {
+ const inner = (
+ <>
+
+ {user.logo ? (
+
+ ) : (
+
{user.name}
+ )}
+
+ {user.name}
+ {user.region && {user.region}
}
+ {user.description && (
+ {user.description}
+ )}
+ >
+ );
+
+ if (user.website) {
+ return (
+
+ {inner}
+
+ );
+ }
+
+ return {inner}
;
+}
+
+export default function PoweredBy() {
+ return (
+
+
+
+
{introText}
+
+ {users.length > 0 ? (
+ <>
+
Adopters
+
+ {users.map((user) => (
+
+ ))}
+
+ >
+ ) : (
+
+ We are gathering the first wave of public adopters. If your team
+ runs Apache Cloudberry, you can be the first to be featured here.
+
+ )}
+
+
+ {submitTitle}
+ {submitText}
+
+ {guidelines.map((line) => (
+ {line}
+ ))}
+
+
+ {submitButtonText}
+
+
+
+
+ );
+}
diff --git a/static/img/powered-by/README.md b/static/img/powered-by/README.md
new file mode 100644
index 00000000000..2ee1dd88e6c
--- /dev/null
+++ b/static/img/powered-by/README.md
@@ -0,0 +1,16 @@
+# Powered By Logos
+
+Drop adopter logos in this directory. Reference them from
+`src/consts/poweredBy.tsx` using an absolute URL such as
+`/img/powered-by/your-org.svg`.
+
+## Guidelines
+
+- SVG is preferred. Otherwise use a transparent PNG at 2x density.
+- Crop tightly around the logo with a small amount of padding.
+- Aim for at least 240px on the long side so the logo stays sharp on
+ high-DPI displays.
+- File name: lowercase, hyphenated, matching the organization slug
+ (e.g. `acme-analytics.svg`).
+- Make sure you have permission to use the logo. Trademarks remain
+ with their respective owners.
diff --git a/static/img/powered-by/hashdata.png b/static/img/powered-by/hashdata.png
new file mode 100644
index 00000000000..bb76a2134a4
Binary files /dev/null and b/static/img/powered-by/hashdata.png differ
diff --git a/static/img/powered-by/synx.png b/static/img/powered-by/synx.png
new file mode 100644
index 00000000000..44fbc12c22e
Binary files /dev/null and b/static/img/powered-by/synx.png differ
diff --git a/static/img/powered-by/yandex-cloud.svg b/static/img/powered-by/yandex-cloud.svg
new file mode 100644
index 00000000000..fcf2d710305
--- /dev/null
+++ b/static/img/powered-by/yandex-cloud.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+