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

(stormcrawler-site) branch asf-site updated: publishing 2026-04-02T09:54:42+00:00

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

github-bot pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/stormcrawler-site.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 9ded3e4  publishing 2026-04-02T09:54:42+00:00
9ded3e4 is described below

commit 9ded3e465beb5cef18666ca2cda6af9348a584d3
Author: GitHub Actions Bot <>
AuthorDate: Thu Apr 2 09:54:42 2026 +0000

    publishing 2026-04-02T09:54:42+00:00
---
 contribute/index.html             |  41 +++++++++++-
 css/main.css                      | 130 ++++++++++++++++++++++++++++----------
 docs/3.5.1/architecture.html      |   2 +-
 docs/3.5.1/configuration.html     |   2 +-
 docs/3.5.1/debugging.html         |   2 +-
 docs/3.5.1/index.html             |   2 +-
 docs/3.5.1/internals.html         |   2 +-
 docs/3.5.1/overview.html          |   2 +-
 docs/3.5.1/powered-by.html        |   2 +-
 docs/3.5.1/presentations.html     |   2 +-
 docs/3.5.1/quick-start.html       |   2 +-
 docs/index.html                   |  39 +++++++++++-
 download/3.0/migration-guide.html |  39 +++++++++++-
 download/index.html               |  41 +++++++++++-
 feed.xml                          |   4 +-
 index.html                        |  41 +++++++++++-
 js/darkmode-docs.js               |  83 ++++++++++++++++++++++++
 scripts/fetch-maven-docs.sh       |   3 +
 security/index.html               |  39 +++++++++++-
 support/index.html                |  41 +++++++++++-
 20 files changed, 465 insertions(+), 54 deletions(-)

diff --git a/contribute/index.html b/contribute/index.html
index 5018270..343e5c2 100644
--- a/contribute/index.html
+++ b/contribute/index.html
@@ -14,6 +14,14 @@
   <link rel="canonical" href="https://stormcrawler.apache.org/contribute/">
   <link rel="alternate" type="application/rss+xml" title="Apache StormCrawler" href="https://stormcrawler.apache.org/feed.xml">
   <link rel="icon" type="/image/png" href="/img/favicon.png" />
+  <script>
+    (function() {
+      var t = localStorage.getItem('theme');
+      if (t === 'dark' || (!t && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
+        document.documentElement.setAttribute('data-theme', 'dark');
+      }
+    })();
+  </script>
 </head>
 
 
@@ -22,7 +30,10 @@
     <header class="site-header">
   <div class="site-header__wrap">
     <div class="site-header__logo">
-      <a href="/"><img src="/img/logo.png" alt="Apache StormCrawler"></a>
+      <a href="/">
+        <img class="logo-light" src="/img/logo.png" alt="Apache StormCrawler">
+        <img class="logo-dark" src="/img/logo-dark.png" alt="Apache StormCrawler">
+      </a>
     </div>
   </div>
 </header>
@@ -53,7 +64,7 @@
         <li><a href="https://github.com/apache/incubator-stormcrawler/issues">GitHub issues</a>: for bug reports and feature requests. Please search the existing issues before creating new ones. If you are unsure whether you have found a bug, consider asking in GitHub discussions or the mailing list first.</li>
     </ul>
 
-    <p>With GitHub, the StormCrawler code is located in this <a href="https://github.com/apache/incubator-stormcrawler" target="_blank">repository</a>. The website code is is in this <a href="https://github.com/apache/incubator-stormcrawler-site" target="_blank">repository</a>.  links for GitHub discussions and issues above are related to the core repository. If you are aware of the right repository, then please use the discussions and issues for that repository.</p>
+    <p>With GitHub, the StormCrawler code is located in this <a href="https://github.com/apache/incubator-stormcrawler" target="_blank">repository</a>. The website code is in this <a href="https://github.com/apache/incubator-stormcrawler-site" target="_blank">repository</a>. Links for GitHub discussions and issues above are related to the core repository. If you are aware of the right repository, then please use the discussions and issues for that repository.</p>
 
     <h2 id="code-of-conduct">Code of Conduct</h2>
     <p>Please see the Apache-wide <a href="https://www.apache.org/foundation/policies/conduct">Code of Conduct</a>.</p>
@@ -81,6 +92,32 @@ Licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache
 </footer>
 
 
+    <button class="theme-toggle" id="theme-toggle" aria-label="Toggle dark mode" title="Toggle dark mode">&#9790;</button>
+
+    <script>
+      (function() {
+        var toggle = document.getElementById('theme-toggle');
+        var root = document.documentElement;
+        var stored = localStorage.getItem('theme');
+        if (stored === 'dark' || (!stored && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
+          root.setAttribute('data-theme', 'dark');
+          toggle.textContent = '\u2600';
+        }
+        toggle.addEventListener('click', function() {
+          var isDark = root.getAttribute('data-theme') === 'dark';
+          if (isDark) {
+            root.removeAttribute('data-theme');
+            localStorage.setItem('theme', 'light');
+            toggle.textContent = '\u263E';
+          } else {
+            root.setAttribute('data-theme', 'dark');
+            localStorage.setItem('theme', 'dark');
+            toggle.textContent = '\u2600';
+          }
+        });
+      })();
+    </script>
+
   </body>
 
   <script src="https://www.apachecon.com/event-images/snippet.js"></script>
diff --git a/css/main.css b/css/main.css
index 5578d5e..67ca0a9 100644
--- a/css/main.css
+++ b/css/main.css
@@ -1,5 +1,39 @@
 @import url(/css/resources/ubuntu-mono-300-600-300italic-600italic.css);
 @import url(/css/resources/ubuntu-mono.css);
+:root {
+  --bg: #fff;
+  --bg-secondary: #f7f7f7;
+  --text: #000;
+  --text-secondary: #555;
+  --border: #ddd;
+  --nav-bg: #000;
+  --nav-text: #fff;
+  --code-bg: #e5e5e5;
+  --header-bg: #fff;
+  --footer-bg: #000;
+  --footer-text: #fff;
+  --used-by-border: rgba(0,0,0,0.1);
+  --used-by-shadow: rgba(0,0,0,0.1);
+  --fork-bg: #000;
+  --fork-text: #fff; }
+
+[data-theme="dark"] {
+  --bg: #1a1a2e;
+  --bg-secondary: #16213e;
+  --text: #e0e0e0;
+  --text-secondary: #aaa;
+  --border: #333;
+  --nav-bg: #0f0f23;
+  --nav-text: #e0e0e0;
+  --code-bg: #16213e;
+  --header-bg: #1a1a2e;
+  --footer-bg: #0f0f23;
+  --footer-text: #e0e0e0;
+  --used-by-border: rgba(255,255,255,0.1);
+  --used-by-shadow: rgba(0,0,0,0.3);
+  --fork-bg: #16213e;
+  --fork-text: #e0e0e0; }
+
 * {
   margin: 0;
   padding: 0;
@@ -26,9 +60,10 @@
   clear: both; }
 
 body {
-  background: #fff;
-  color: #000;
-  font: normal 15px/23px "ubuntu",sans-serif; }
+  background: var(--bg);
+  color: var(--text);
+  font: normal 15px/23px "ubuntu",sans-serif;
+  transition: background 0.3s, color 0.3s; }
 
 a {
   color: #99181C;
@@ -38,8 +73,9 @@ p {
   text-align: justify; }
 
 .site-header {
-  background: #fff;
-  text-align: center; }
+  background: var(--header-bg);
+  text-align: center;
+  transition: background 0.3s; }
 
 .site-header__logo {
   margin: 30px auto;
@@ -49,12 +85,13 @@ p {
     max-width: 100%; }
 
 .site-nav {
-  background: #000;
+  background: var(--nav-bg);
   font-size: 0;
   text-align: center;
-  margin: 0 0 40px 0; }
-  .site-nav a {
-    color: #fff; }
+  margin: 0 0 40px 0;
+  transition: background 0.3s; }
+  .site-nav a, .site-nav a:visited, .site-nav a:hover, .site-nav a:active {
+    color: var(--nav-text); }
   .site-nav li {
     display: inline-block;
     border-right: solid 1px rgba(255, 255, 255, 0.25); }
@@ -84,7 +121,7 @@ main h1 {
 main h2 {
   font-size: 1.25rem;
   margin: 0 0 30px 0;
-  border-bottom: solid 1px #ddd;
+  border-bottom: solid 1px var(--border);
   padding: 0 0 5px 0; }
 main p {
   margin: 0 0 30px 0; }
@@ -100,29 +137,21 @@ main ul, main ol {
 
 pre {
   margin: 0 0 30px 0;
-  background: #e5e5e5;
+  background: var(--code-bg);
   padding: 15px 20px;
   overflow: scroll;
-  font-family: "ubuntu mono",monospaced; }
+  font-family: "ubuntu mono",monospaced;
+  transition: background 0.3s; }
 
 .used-by-panel {
-  box-shadow: inset 0 2px 2px rgba(0, 0, 0, 0.1);
+  box-shadow: inset 0 2px 2px var(--used-by-shadow);
   text-align: center;
-  border: solid 1px rgba(0, 0, 0, 0.1);
+  border: solid 1px var(--used-by-border);
   margin: 20px 0 60px 0;
   padding: 30px 30px 0 30px;
   border-radius: 5px;
-  /* Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#f7f7f7+0,ffffff+100 */
-  background: #f7f7f7;
-  /* Old browsers */
-  background: -moz-linear-gradient(top, #f7f7f7 0%, white 100%);
-  /* FF3.6-15 */
-  background: -webkit-linear-gradient(top, #f7f7f7 0%, white 100%);
-  /* Chrome10-25,Safari5.1-6 */
-  background: linear-gradient(to bottom, #f7f7f7 0%, white 100%);
-  /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
-  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f7f7f7', endColorstr='#ffffff',GradientType=0 );
-  /* IE6-9 */ }
+  background: var(--bg-secondary);
+  transition: background 0.3s; }
   .used-by-panel img {
     max-height: 100%;
     max-width: 100%;
@@ -130,7 +159,10 @@ pre {
     vertical-align: middle; }
   .used-by-panel h2 {
     border: 0;
-    color: #000; }
+    color: var(--text); }
+
+[data-theme="dark"] .used-by-panel img {
+  filter: brightness(0.9) contrast(1.1); }
 
 .github-info {
   text-align: center;
@@ -140,17 +172,18 @@ pre {
     text-align: center; }
 
 .site-footer {
-  background: #000;
-  color: #fff;
+  background: var(--footer-bg);
+  color: var(--footer-text);
   text-align: center;
-  padding: 15px 0; }
+  padding: 15px 0;
+  transition: background 0.3s; }
   .site-footer a {
-    color: #fff;
+    color: var(--footer-text);
     text-decoration: underline; }
 
 #forkongithub a {
-  background: #000;
-  color: #fff;
+  background: var(--fork-bg);
+  color: var(--fork-text);
   text-decoration: none;
   font-family: arial,sans-serif;
   text-align: center;
@@ -203,3 +236,36 @@ pre {
 @media only screen and (max-width: 991px) {
   #forkongithub {
     display: none; } }
+.theme-toggle {
+  position: fixed;
+  bottom: 20px;
+  right: 20px;
+  z-index: 10000;
+  background: var(--nav-bg);
+  color: var(--nav-text);
+  border: 2px solid var(--border);
+  border-radius: 50%;
+  width: 44px;
+  height: 44px;
+  cursor: pointer;
+  font-size: 20px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  transition: background 0.3s, color 0.3s;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); }
+  .theme-toggle:hover {
+    background: #99181C;
+    color: #fff; }
+
+.site-header__logo .logo-light {
+  display: inline; }
+
+.site-header__logo .logo-dark {
+  display: none; }
+
+[data-theme="dark"] .site-header__logo .logo-light {
+  display: none; }
+
+[data-theme="dark"] .site-header__logo .logo-dark {
+  display: inline; }
diff --git a/docs/3.5.1/architecture.html b/docs/3.5.1/architecture.html
index 03a2de3..e3ad24c 100644
--- a/docs/3.5.1/architecture.html
+++ b/docs/3.5.1/architecture.html
@@ -434,7 +434,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
 @media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
 </style>
 <link rel="stylesheet" href="fonts/font-awesome.min.css">
-</head>
+<script src="/js/darkmode-docs.js"></script></head>
 <body class="article">
 <div id="header">
 <div id="toc" class="toc">
diff --git a/docs/3.5.1/configuration.html b/docs/3.5.1/configuration.html
index 773b8ef..b0aa1fa 100644
--- a/docs/3.5.1/configuration.html
+++ b/docs/3.5.1/configuration.html
@@ -523,7 +523,7 @@ table.CodeRay td.code{padding:0 0 0 .75em}
 .CodeRay .change .change{color:#66f}
 .CodeRay .head .head{color:#f4f}
 </style>
-</head>
+<script src="/js/darkmode-docs.js"></script></head>
 <body class="article">
 <div id="header">
 <div id="toc" class="toc">
diff --git a/docs/3.5.1/debugging.html b/docs/3.5.1/debugging.html
index 4bfe749..d501350 100644
--- a/docs/3.5.1/debugging.html
+++ b/docs/3.5.1/debugging.html
@@ -523,7 +523,7 @@ table.CodeRay td.code{padding:0 0 0 .75em}
 .CodeRay .change .change{color:#66f}
 .CodeRay .head .head{color:#f4f}
 </style>
-</head>
+<script src="/js/darkmode-docs.js"></script></head>
 <body class="article">
 <div id="header">
 <div id="toc" class="toc">
diff --git a/docs/3.5.1/index.html b/docs/3.5.1/index.html
index 1730d3c..1c1d21d 100644
--- a/docs/3.5.1/index.html
+++ b/docs/3.5.1/index.html
@@ -524,7 +524,7 @@ table.CodeRay td.code{padding:0 0 0 .75em}
 .CodeRay .change .change{color:#66f}
 .CodeRay .head .head{color:#f4f}
 </style>
-</head>
+<script src="/js/darkmode-docs.js"></script></head>
 <body class="article toc2 toc-left">
 <div id="header">
 <h1>Apache StormCrawler 3.5.1 - Documentation</h1>
diff --git a/docs/3.5.1/internals.html b/docs/3.5.1/internals.html
index 0672fef..f537cd5 100644
--- a/docs/3.5.1/internals.html
+++ b/docs/3.5.1/internals.html
@@ -523,7 +523,7 @@ table.CodeRay td.code{padding:0 0 0 .75em}
 .CodeRay .change .change{color:#66f}
 .CodeRay .head .head{color:#f4f}
 </style>
-</head>
+<script src="/js/darkmode-docs.js"></script></head>
 <body class="article">
 <div id="header">
 <div id="toc" class="toc">
diff --git a/docs/3.5.1/overview.html b/docs/3.5.1/overview.html
index 07f63f0..eac4e24 100644
--- a/docs/3.5.1/overview.html
+++ b/docs/3.5.1/overview.html
@@ -434,7 +434,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
 @media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
 </style>
 <link rel="stylesheet" href="fonts/font-awesome.min.css">
-</head>
+<script src="/js/darkmode-docs.js"></script></head>
 <body class="article">
 <div id="header">
 <div id="toc" class="toc">
diff --git a/docs/3.5.1/powered-by.html b/docs/3.5.1/powered-by.html
index cf46c4d..c7457b5 100644
--- a/docs/3.5.1/powered-by.html
+++ b/docs/3.5.1/powered-by.html
@@ -434,7 +434,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
 @media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
 </style>
 <link rel="stylesheet" href="fonts/font-awesome.min.css">
-</head>
+<script src="/js/darkmode-docs.js"></script></head>
 <body class="article">
 <div id="header">
 <div id="toc" class="toc">
diff --git a/docs/3.5.1/presentations.html b/docs/3.5.1/presentations.html
index 80b41c0..ae3e615 100644
--- a/docs/3.5.1/presentations.html
+++ b/docs/3.5.1/presentations.html
@@ -434,7 +434,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
 @media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
 </style>
 <link rel="stylesheet" href="fonts/font-awesome.min.css">
-</head>
+<script src="/js/darkmode-docs.js"></script></head>
 <body class="article">
 <div id="header">
 <div id="toc" class="toc">
diff --git a/docs/3.5.1/quick-start.html b/docs/3.5.1/quick-start.html
index 587b225..3498401 100644
--- a/docs/3.5.1/quick-start.html
+++ b/docs/3.5.1/quick-start.html
@@ -523,7 +523,7 @@ table.CodeRay td.code{padding:0 0 0 .75em}
 .CodeRay .change .change{color:#66f}
 .CodeRay .head .head{color:#f4f}
 </style>
-</head>
+<script src="/js/darkmode-docs.js"></script></head>
 <body class="article">
 <div id="header">
 <div id="toc" class="toc">
diff --git a/docs/index.html b/docs/index.html
index 771d744..7b170b0 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -14,6 +14,14 @@
   <link rel="canonical" href="https://stormcrawler.apache.org/docs/">
   <link rel="alternate" type="application/rss+xml" title="Apache StormCrawler" href="https://stormcrawler.apache.org/feed.xml">
   <link rel="icon" type="/image/png" href="/img/favicon.png" />
+  <script>
+    (function() {
+      var t = localStorage.getItem('theme');
+      if (t === 'dark' || (!t && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
+        document.documentElement.setAttribute('data-theme', 'dark');
+      }
+    })();
+  </script>
 </head>
 
 
@@ -22,7 +30,10 @@
     <header class="site-header">
   <div class="site-header__wrap">
     <div class="site-header__logo">
-      <a href="/"><img src="/img/logo.png" alt="Apache StormCrawler"></a>
+      <a href="/">
+        <img class="logo-light" src="/img/logo.png" alt="Apache StormCrawler">
+        <img class="logo-dark" src="/img/logo-dark.png" alt="Apache StormCrawler">
+      </a>
     </div>
   </div>
 </header>
@@ -192,6 +203,32 @@ Licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache
 </footer>
 
 
+    <button class="theme-toggle" id="theme-toggle" aria-label="Toggle dark mode" title="Toggle dark mode">&#9790;</button>
+
+    <script>
+      (function() {
+        var toggle = document.getElementById('theme-toggle');
+        var root = document.documentElement;
+        var stored = localStorage.getItem('theme');
+        if (stored === 'dark' || (!stored && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
+          root.setAttribute('data-theme', 'dark');
+          toggle.textContent = '\u2600';
+        }
+        toggle.addEventListener('click', function() {
+          var isDark = root.getAttribute('data-theme') === 'dark';
+          if (isDark) {
+            root.removeAttribute('data-theme');
+            localStorage.setItem('theme', 'light');
+            toggle.textContent = '\u263E';
+          } else {
+            root.setAttribute('data-theme', 'dark');
+            localStorage.setItem('theme', 'dark');
+            toggle.textContent = '\u2600';
+          }
+        });
+      })();
+    </script>
+
   </body>
 
   <script src="https://www.apachecon.com/event-images/snippet.js"></script>
diff --git a/download/3.0/migration-guide.html b/download/3.0/migration-guide.html
index b012183..df4c630 100644
--- a/download/3.0/migration-guide.html
+++ b/download/3.0/migration-guide.html
@@ -14,6 +14,14 @@
   <link rel="canonical" href="https://stormcrawler.apache.org/download/3.0/migration-guide.html">
   <link rel="alternate" type="application/rss+xml" title="Apache StormCrawler" href="https://stormcrawler.apache.org/feed.xml">
   <link rel="icon" type="/image/png" href="/img/favicon.png" />
+  <script>
+    (function() {
+      var t = localStorage.getItem('theme');
+      if (t === 'dark' || (!t && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
+        document.documentElement.setAttribute('data-theme', 'dark');
+      }
+    })();
+  </script>
 </head>
 
 
@@ -22,7 +30,10 @@
     <header class="site-header">
   <div class="site-header__wrap">
     <div class="site-header__logo">
-      <a href="/"><img src="/img/logo.png" alt="Apache StormCrawler"></a>
+      <a href="/">
+        <img class="logo-light" src="/img/logo.png" alt="Apache StormCrawler">
+        <img class="logo-dark" src="/img/logo-dark.png" alt="Apache StormCrawler">
+      </a>
     </div>
   </div>
 </header>
@@ -127,6 +138,32 @@ Licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache
 </footer>
 
 
+    <button class="theme-toggle" id="theme-toggle" aria-label="Toggle dark mode" title="Toggle dark mode">&#9790;</button>
+
+    <script>
+      (function() {
+        var toggle = document.getElementById('theme-toggle');
+        var root = document.documentElement;
+        var stored = localStorage.getItem('theme');
+        if (stored === 'dark' || (!stored && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
+          root.setAttribute('data-theme', 'dark');
+          toggle.textContent = '\u2600';
+        }
+        toggle.addEventListener('click', function() {
+          var isDark = root.getAttribute('data-theme') === 'dark';
+          if (isDark) {
+            root.removeAttribute('data-theme');
+            localStorage.setItem('theme', 'light');
+            toggle.textContent = '\u263E';
+          } else {
+            root.setAttribute('data-theme', 'dark');
+            localStorage.setItem('theme', 'dark');
+            toggle.textContent = '\u2600';
+          }
+        });
+      })();
+    </script>
+
   </body>
 
   <script src="https://www.apachecon.com/event-images/snippet.js"></script>
diff --git a/download/index.html b/download/index.html
index b930df2..af42a8e 100644
--- a/download/index.html
+++ b/download/index.html
@@ -14,6 +14,14 @@
   <link rel="canonical" href="https://stormcrawler.apache.org/download/">
   <link rel="alternate" type="application/rss+xml" title="Apache StormCrawler" href="https://stormcrawler.apache.org/feed.xml">
   <link rel="icon" type="/image/png" href="/img/favicon.png" />
+  <script>
+    (function() {
+      var t = localStorage.getItem('theme');
+      if (t === 'dark' || (!t && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
+        document.documentElement.setAttribute('data-theme', 'dark');
+      }
+    })();
+  </script>
 </head>
 
 
@@ -22,7 +30,10 @@
     <header class="site-header">
   <div class="site-header__wrap">
     <div class="site-header__logo">
-      <a href="/"><img src="/img/logo.png" alt="Apache StormCrawler"></a>
+      <a href="/">
+        <img class="logo-light" src="/img/logo.png" alt="Apache StormCrawler">
+        <img class="logo-dark" src="/img/logo-dark.png" alt="Apache StormCrawler">
+      </a>
     </div>
   </div>
 </header>
@@ -48,7 +59,7 @@
     <p>You <b>must</b> <a href="https://www.apache.org/info/verification.html">verify</a> the integrity of the
         downloaded files. We provide OpenPGP signatures (*.asc files) for every release file. This signature should be
         matched against <a href="https://downloads.apache.org/stormcrawler/KEYS">KEYS</a> file which contains the
-        OpenPGP keys of StormCrawlers’s Release Managers. We also provide SHA-512 checksums for every release file.
+        OpenPGP keys of StormCrawler’s Release Managers. We also provide SHA-512 checksums for every release file.
         After you download the file, you should calculate a checksum for your download, and make sure it is the same as
         ours. </p>
     <p>More information about release signing and verifying signatures can be found <a
@@ -93,6 +104,32 @@ Licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache
 </footer>
 
 
+    <button class="theme-toggle" id="theme-toggle" aria-label="Toggle dark mode" title="Toggle dark mode">&#9790;</button>
+
+    <script>
+      (function() {
+        var toggle = document.getElementById('theme-toggle');
+        var root = document.documentElement;
+        var stored = localStorage.getItem('theme');
+        if (stored === 'dark' || (!stored && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
+          root.setAttribute('data-theme', 'dark');
+          toggle.textContent = '\u2600';
+        }
+        toggle.addEventListener('click', function() {
+          var isDark = root.getAttribute('data-theme') === 'dark';
+          if (isDark) {
+            root.removeAttribute('data-theme');
+            localStorage.setItem('theme', 'light');
+            toggle.textContent = '\u263E';
+          } else {
+            root.setAttribute('data-theme', 'dark');
+            localStorage.setItem('theme', 'dark');
+            toggle.textContent = '\u2600';
+          }
+        });
+      })();
+    </script>
+
   </body>
 
   <script src="https://www.apachecon.com/event-images/snippet.js"></script>
diff --git a/feed.xml b/feed.xml
index f4e1a84..8af5302 100644
--- a/feed.xml
+++ b/feed.xml
@@ -6,8 +6,8 @@
 </description>
     <link>https://stormcrawler.apache.org/</link>
     <atom:link href="https://stormcrawler.apache.org/feed.xml" rel="self" type="application/rss+xml"/>
-    <pubDate>Tue, 03 Feb 2026 17:31:20 +0000</pubDate>
-    <lastBuildDate>Tue, 03 Feb 2026 17:31:20 +0000</lastBuildDate>
+    <pubDate>Thu, 02 Apr 2026 09:54:41 +0000</pubDate>
+    <lastBuildDate>Thu, 02 Apr 2026 09:54:41 +0000</lastBuildDate>
     <generator>Jekyll v3.9.5</generator>
     
   </channel>
diff --git a/index.html b/index.html
index e873329..d7a07ff 100644
--- a/index.html
+++ b/index.html
@@ -14,6 +14,14 @@
   <link rel="canonical" href="https://stormcrawler.apache.org/">
   <link rel="alternate" type="application/rss+xml" title="Apache StormCrawler" href="https://stormcrawler.apache.org/feed.xml">
   <link rel="icon" type="/image/png" href="/img/favicon.png" />
+  <script>
+    (function() {
+      var t = localStorage.getItem('theme');
+      if (t === 'dark' || (!t && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
+        document.documentElement.setAttribute('data-theme', 'dark');
+      }
+    })();
+  </script>
 </head>
 
 
@@ -22,7 +30,10 @@
     <header class="site-header">
   <div class="site-header__wrap">
     <div class="site-header__logo">
-      <a href="/"><img src="/img/logo.png" alt="Apache StormCrawler"></a>
+      <a href="/">
+        <img class="logo-light" src="/img/logo.png" alt="Apache StormCrawler">
+        <img class="logo-dark" src="/img/logo-dark.png" alt="Apache StormCrawler">
+      </a>
     </div>
   </div>
 </header>
@@ -47,7 +58,7 @@
 </div>
 <div class="row row-col">
   <p><strong>Apache StormCrawler</strong> is an open source SDK for building distributed web crawlers based on <a href="http://storm.apache.org">Apache Storm®</a>. The project is under Apache License v2 and consists of a collection of reusable resources and components, written mostly in Java.</p>
-  <p>The aim of Apache StormCrawler is to help build web crawlers that are :</p>
+  <p>The aim of Apache StormCrawler is to help build web crawlers that are:</p>
   <ul>
     <li>scalable</li>
     <li>resilient</li>
@@ -93,6 +104,32 @@ Licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache
 </footer>
 
 
+    <button class="theme-toggle" id="theme-toggle" aria-label="Toggle dark mode" title="Toggle dark mode">&#9790;</button>
+
+    <script>
+      (function() {
+        var toggle = document.getElementById('theme-toggle');
+        var root = document.documentElement;
+        var stored = localStorage.getItem('theme');
+        if (stored === 'dark' || (!stored && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
+          root.setAttribute('data-theme', 'dark');
+          toggle.textContent = '\u2600';
+        }
+        toggle.addEventListener('click', function() {
+          var isDark = root.getAttribute('data-theme') === 'dark';
+          if (isDark) {
+            root.removeAttribute('data-theme');
+            localStorage.setItem('theme', 'light');
+            toggle.textContent = '\u263E';
+          } else {
+            root.setAttribute('data-theme', 'dark');
+            localStorage.setItem('theme', 'dark');
+            toggle.textContent = '\u2600';
+          }
+        });
+      })();
+    </script>
+
   </body>
 
   <script src="https://www.apachecon.com/event-images/snippet.js"></script>
diff --git a/js/darkmode-docs.js b/js/darkmode-docs.js
new file mode 100644
index 0000000..977ef46
--- /dev/null
+++ b/js/darkmode-docs.js
@@ -0,0 +1,83 @@
+(function() {
+  var DARK_CSS =
+    'html[data-theme="dark"] body { background: #1a1a2e; color: #e0e0e0; }' +
+    'html[data-theme="dark"] a { color: #6ea8fe; }' +
+    'html[data-theme="dark"] a:hover, html[data-theme="dark"] a:focus { color: #9ec5fe; }' +
+    'html[data-theme="dark"] h1, html[data-theme="dark"] h2, html[data-theme="dark"] h3,' +
+    'html[data-theme="dark"] #toctitle, html[data-theme="dark"] .sidebarblock > .content > .title,' +
+    'html[data-theme="dark"] h4, html[data-theme="dark"] h5, html[data-theme="dark"] h6 { color: #e07a5f; }' +
+    'html[data-theme="dark"] .subheader, html[data-theme="dark"] .admonitionblock td.content > .title,' +
+    'html[data-theme="dark"] .listingblock > .title, html[data-theme="dark"] .literalblock > .title,' +
+    'html[data-theme="dark"] .paragraph > .title, html[data-theme="dark"] .exampleblock > .title,' +
+    'html[data-theme="dark"] .dlist > .title, html[data-theme="dark"] .olist > .title,' +
+    'html[data-theme="dark"] .ulist > .title { color: #e07a5f; }' +
+    'html[data-theme="dark"] code { color: #e0e0e0; background: #16213e; }' +
+    'html[data-theme="dark"] :not(pre):not([class^=L]) > code { background: #16213e; }' +
+    'html[data-theme="dark"] pre { background: #16213e; color: #e0e0e0; }' +
+    'html[data-theme="dark"] .listingblock pre { background: #16213e; }' +
+    'html[data-theme="dark"] table { background: #1a1a2e; border-color: #333; }' +
+    'html[data-theme="dark"] table thead, html[data-theme="dark"] table tfoot { background: #16213e; }' +
+    'html[data-theme="dark"] table thead tr th, html[data-theme="dark"] table thead tr td,' +
+    'html[data-theme="dark"] table tfoot tr th, html[data-theme="dark"] table tfoot tr td { color: #e0e0e0; }' +
+    'html[data-theme="dark"] table tr th, html[data-theme="dark"] table tr td { color: #e0e0e0; }' +
+    'html[data-theme="dark"] table tr.even, html[data-theme="dark"] table tr.alt { background: #16213e; }' +
+    'html[data-theme="dark"] #header > h1:first-child, html[data-theme="dark"] #content > h1:first-child:not([class]) { color: #e0e0e0; border-bottom-color: #333; }' +
+    'html[data-theme="dark"] #header .details { border-bottom-color: #333; color: #aaa; }' +
+    'html[data-theme="dark"] #header > h1:only-child { border-bottom-color: #333; }' +
+    'html[data-theme="dark"] #header > h1:first-child + #toc { border-top-color: #333; }' +
+    'html[data-theme="dark"] #toc { border-bottom-color: #333; }' +
+    'html[data-theme="dark"] #toc.toc2 { background: #16213e; border-right-color: #333; }' +
+    'html[data-theme="dark"] #toc #toctitle { color: #e0e0e0; }' +
+    'html[data-theme="dark"] #toc a { color: #6ea8fe; }' +
+    'html[data-theme="dark"] #toc a:active { color: #9ec5fe; }' +
+    'html[data-theme="dark"] #content #toc { background: #16213e; border-color: #333; }' +
+    'html[data-theme="dark"] blockquote { border-left-color: #333; }' +
+    'html[data-theme="dark"] blockquote, html[data-theme="dark"] blockquote p { color: #ccc; }' +
+    'html[data-theme="dark"] hr { border-color: #333; }' +
+    'html[data-theme="dark"] .sidebarblock { background: #16213e; border-color: #333; }' +
+    'html[data-theme="dark"] .admonitionblock > table td.icon .title { color: #e0e0e0; }' +
+    'html[data-theme="dark"] .admonitionblock > table td.content { color: #e0e0e0; }' +
+    'html[data-theme="dark"] kbd { background: #16213e; color: #e0e0e0; border-color: #444; }' +
+    'html[data-theme="dark"] #footer { background: #0f0f23; color: #aaa; }' +
+    'html[data-theme="dark"] #footer a { color: #6ea8fe; }' +
+    'html[data-theme="dark"] .menuseq, html[data-theme="dark"] .menuref { color: #e0e0e0; }' +
+    '.theme-toggle { position: fixed; bottom: 20px; right: 20px; z-index: 10000;' +
+    '  background: #000; color: #fff; border: 2px solid #333; border-radius: 50%;' +
+    '  width: 44px; height: 44px; cursor: pointer; font-size: 20px;' +
+    '  display: flex; align-items: center; justify-content: center;' +
+    '  transition: background 0.3s; box-shadow: 0 2px 8px rgba(0,0,0,0.3); }' +
+    '.theme-toggle:hover { background: #99181C; }' +
+    'html[data-theme="dark"] .theme-toggle { background: #16213e; color: #e0e0e0; border-color: #444; }';
+
+  // Inject stylesheet
+  var style = document.createElement('style');
+  style.textContent = DARK_CSS;
+  document.head.appendChild(style);
+
+  // Apply saved theme
+  var stored = localStorage.getItem('theme');
+  if (stored === 'dark' || (!stored && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
+    document.documentElement.setAttribute('data-theme', 'dark');
+  }
+
+  // Create toggle button
+  var btn = document.createElement('button');
+  btn.className = 'theme-toggle';
+  btn.setAttribute('aria-label', 'Toggle dark mode');
+  btn.setAttribute('title', 'Toggle dark mode');
+  btn.textContent = document.documentElement.getAttribute('data-theme') === 'dark' ? '\u2600' : '\u263E';
+  document.body.appendChild(btn);
+
+  btn.addEventListener('click', function() {
+    var isDark = document.documentElement.getAttribute('data-theme') === 'dark';
+    if (isDark) {
+      document.documentElement.removeAttribute('data-theme');
+      localStorage.setItem('theme', 'light');
+      btn.textContent = '\u263E';
+    } else {
+      document.documentElement.setAttribute('data-theme', 'dark');
+      localStorage.setItem('theme', 'dark');
+      btn.textContent = '\u2600';
+    }
+  });
+})();
diff --git a/scripts/fetch-maven-docs.sh b/scripts/fetch-maven-docs.sh
index 1141c38..0a7fef9 100755
--- a/scripts/fetch-maven-docs.sh
+++ b/scripts/fetch-maven-docs.sh
@@ -18,3 +18,6 @@ curl -L "${URL}" -o "/tmp/${FILENAME}"
 
 echo "Extracting to ${DEST_DIR}"
 tar -xzf "/tmp/${FILENAME}" -C "${DEST_DIR}"
+
+echo "Injecting dark mode script into doc pages"
+find "${DEST_DIR}" -name '*.html' -exec sed -i '' 's|</head>|<script src="/js/darkmode-docs.js"></script></head>|' {} +
diff --git a/security/index.html b/security/index.html
index 7ec6d74..046463d 100644
--- a/security/index.html
+++ b/security/index.html
@@ -14,6 +14,14 @@
   <link rel="canonical" href="https://stormcrawler.apache.org/security/">
   <link rel="alternate" type="application/rss+xml" title="Apache StormCrawler" href="https://stormcrawler.apache.org/feed.xml">
   <link rel="icon" type="/image/png" href="/img/favicon.png" />
+  <script>
+    (function() {
+      var t = localStorage.getItem('theme');
+      if (t === 'dark' || (!t && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
+        document.documentElement.setAttribute('data-theme', 'dark');
+      }
+    })();
+  </script>
 </head>
 
 
@@ -22,7 +30,10 @@
     <header class="site-header">
   <div class="site-header__wrap">
     <div class="site-header__logo">
-      <a href="/"><img src="/img/logo.png" alt="Apache StormCrawler"></a>
+      <a href="/">
+        <img class="logo-light" src="/img/logo.png" alt="Apache StormCrawler">
+        <img class="logo-dark" src="/img/logo-dark.png" alt="Apache StormCrawler">
+      </a>
     </div>
   </div>
 </header>
@@ -110,6 +121,32 @@ Licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache
 </footer>
 
 
+    <button class="theme-toggle" id="theme-toggle" aria-label="Toggle dark mode" title="Toggle dark mode">&#9790;</button>
+
+    <script>
+      (function() {
+        var toggle = document.getElementById('theme-toggle');
+        var root = document.documentElement;
+        var stored = localStorage.getItem('theme');
+        if (stored === 'dark' || (!stored && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
+          root.setAttribute('data-theme', 'dark');
+          toggle.textContent = '\u2600';
+        }
+        toggle.addEventListener('click', function() {
+          var isDark = root.getAttribute('data-theme') === 'dark';
+          if (isDark) {
+            root.removeAttribute('data-theme');
+            localStorage.setItem('theme', 'light');
+            toggle.textContent = '\u263E';
+          } else {
+            root.setAttribute('data-theme', 'dark');
+            localStorage.setItem('theme', 'dark');
+            toggle.textContent = '\u2600';
+          }
+        });
+      })();
+    </script>
+
   </body>
 
   <script src="https://www.apachecon.com/event-images/snippet.js"></script>
diff --git a/support/index.html b/support/index.html
index a46aac1..2f47886 100644
--- a/support/index.html
+++ b/support/index.html
@@ -14,6 +14,14 @@
   <link rel="canonical" href="https://stormcrawler.apache.org/support/">
   <link rel="alternate" type="application/rss+xml" title="Apache StormCrawler" href="https://stormcrawler.apache.org/feed.xml">
   <link rel="icon" type="/image/png" href="/img/favicon.png" />
+  <script>
+    (function() {
+      var t = localStorage.getItem('theme');
+      if (t === 'dark' || (!t && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
+        document.documentElement.setAttribute('data-theme', 'dark');
+      }
+    })();
+  </script>
 </head>
 
 
@@ -22,7 +30,10 @@
     <header class="site-header">
   <div class="site-header__wrap">
     <div class="site-header__logo">
-      <a href="/"><img src="/img/logo.png" alt="Apache StormCrawler"></a>
+      <a href="/">
+        <img class="logo-light" src="/img/logo.png" alt="Apache StormCrawler">
+        <img class="logo-dark" src="/img/logo-dark.png" alt="Apache StormCrawler">
+      </a>
     </div>
   </div>
 </header>
@@ -53,7 +64,7 @@
 
   <h2>Want to be added to this page? </h2>
   <p>All submitted information must be factual and informational in nature and not be a marketing statement. Statements that promote your products and services over other offerings on the page will not be tolerated and will be removed. Such marketing statements can be added to your own pages on your own site.</p>
-  <p>When in doubt, email the Apache StormCrawler PMC and ask. We are be happy to help.</p>
+  <p>When in doubt, email the Apache StormCrawler PMC and ask. We are happy to help.</p>
 
   <h2>Companies</h2>
   <ul>
@@ -73,6 +84,32 @@ Licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache
 </footer>
 
 
+    <button class="theme-toggle" id="theme-toggle" aria-label="Toggle dark mode" title="Toggle dark mode">&#9790;</button>
+
+    <script>
+      (function() {
+        var toggle = document.getElementById('theme-toggle');
+        var root = document.documentElement;
+        var stored = localStorage.getItem('theme');
+        if (stored === 'dark' || (!stored && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
+          root.setAttribute('data-theme', 'dark');
+          toggle.textContent = '\u2600';
+        }
+        toggle.addEventListener('click', function() {
+          var isDark = root.getAttribute('data-theme') === 'dark';
+          if (isDark) {
+            root.removeAttribute('data-theme');
+            localStorage.setItem('theme', 'light');
+            toggle.textContent = '\u263E';
+          } else {
+            root.setAttribute('data-theme', 'dark');
+            localStorage.setItem('theme', 'dark');
+            toggle.textContent = '\u2600';
+          }
+        });
+      })();
+    </script>
+
   </body>
 
   <script src="https://www.apachecon.com/event-images/snippet.js"></script>