diff --git a/hbase-website/.gitignore b/hbase-website/.gitignore
index 00909066a6fa..76974dfd2872 100644
--- a/hbase-website/.gitignore
+++ b/hbase-website/.gitignore
@@ -39,6 +39,7 @@ lerna-debug.log*
/app/pages/_docs/docs/_mdx/(multi-page)/configuration/hbase-default.md
/app/lib/export-pdf/hbase-version.json
/public/books/**
+/public/sitemap.xml
# Playwright
node_modules/
diff --git a/hbase-website/README.md b/hbase-website/README.md
index a67a85699757..020bccef96fa 100644
--- a/hbase-website/README.md
+++ b/hbase-website/README.md
@@ -476,16 +476,18 @@ When you run `mvn site`, the website module automatically:
- `npm run extract-hbase-config` - Extract data from `hbase-default.xml` to `app/pages/_docs/docs/_mdx/(multi-page)/configuration/hbase-default.md`
- `npm run extract-hbase-version` - Extract version from root `pom.xml` to `app/lib/export-pdf/hbase-version.json`
- `npm run test:unit:run` - Vitest unit tests
- - `npm run test:e2e` - Playwright e2e tests
- `npm run build` - Production build
+ - `npm run generate-sitemap` - Generates `public/sitemap.xml` and `build/client/sitemap.xml`
+ - `npm run test:e2e` - Playwright e2e tests
`npm run ci-skip-tests` executes:
- `npm run extract-developers` - Extract developers from parent pom.xml
- `npm run extract-hbase-config` - Extract data from `hbase-default.xml` to `app/pages/_docs/docs/_mdx/(multi-page)/configuration/hbase-default.md`
- `npm run extract-hbase-version` - Extract version from root `pom.xml` to `app/lib/export-pdf/hbase-version.json`
+ - `npm run build` - Production build
+ - `npm run generate-sitemap` - Generates `public/sitemap.xml` and `build/client/sitemap.xml`
- `npx playwright install` - Installs Playwright browsers
- `npm run export-pdf` - Generates docs PDF assets through Playwright
- - `npm run build` - Production build
6. **Build Output**: Generated files are in `build/` directory
diff --git a/hbase-website/app/routes.ts b/hbase-website/app/routes.ts
index e66051c7f16d..18311ce3aea9 100644
--- a/hbase-website/app/routes.ts
+++ b/hbase-website/app/routes.ts
@@ -32,7 +32,8 @@ export default [
route("source-repository", "routes/_landing/source-repository.tsx"),
route("acid-semantics", "routes/_landing/acid-semantics.tsx"),
route("news", "routes/_landing/news.tsx"),
- route("export-control", "routes/_landing/export-control.tsx")
+ route("export-control", "routes/_landing/export-control.tsx"),
+ route("404", "routes/404.tsx")
]),
// Docs
layout("./pages/_docs/docs-layout.tsx", [route("docs/*", "routes/_docs/docs.tsx")]),
diff --git a/hbase-website/app/routes/404.tsx b/hbase-website/app/routes/404.tsx
new file mode 100644
index 000000000000..159b7f8518fb
--- /dev/null
+++ b/hbase-website/app/routes/404.tsx
@@ -0,0 +1,57 @@
+//
+// 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.
+//
+
+import type { Route } from "./+types/404";
+import { Link } from "@/components/link";
+import { Button } from "@/ui/button";
+
+export function meta({}: Route.MetaArgs) {
+ return [
+ { title: "Page Not Found - Apache HBase" },
+ {
+ name: "description",
+ content:
+ "The page you are looking for does not exist. The route you were trying to visit might have changed."
+ },
+ { name: "robots", content: "noindex, nofollow" }
+ ];
+}
+
+export default function NotFound() {
+ return (
+
+
+
+ 404
+
+
+ Page not found
+
+
+ The page you are looking for doesn't exist. The route you were trying to visit might
+ have changed.
+