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

shuber pushed a commit to branch UNOMI-932-website-modernization
in repository https://gitbox.apache.org/repos/asf/unomi-site.git

commit dc7d22b7f9759e1949c72468c724cd8134645689
Author: Serge Huber <[email protected]>
AuthorDate: Sat Feb 14 17:29:38 2026 +0100

    Content pages: AI positioning, ES 9.1.3, structured data, inline style 
cleanup
    
    - Homepage: fix traveling data dots animation, AI era section, OpenSearch 
wording
    - Use cases: reorder AI use case first, center graphs, add FAQPage schema
    - Tutorial & get-started: update to Elasticsearch 9.1.3 with xpack.security
    - Documentation: add CollectionPage schema, fix heading hierarchy, absolute 
links
    - Resources: add CollectionPage schema, new video entries, local thumbnails
    - Download: fix broken link to quick start guide
    - All pages: replace inline styles with CSS classes, add SEO keywords
    - Correct "ElasticSearch" trademark spelling across all pages
    
    Co-authored-by: Cursor <[email protected]>
---
 src/main/webapp/documentation.html | 66 ++++++++++++++++++++++------------
 src/main/webapp/download.html      |  6 ++--
 src/main/webapp/get-started.html   | 11 +++---
 src/main/webapp/index.html         | 61 +++++++++++++++----------------
 src/main/webapp/resources.html     | 74 +++++++++++++++++++++++++-------------
 src/main/webapp/tutorial.html      | 21 +++++++----
 src/main/webapp/use-cases.html     | 45 ++++++++++++++++++++++-
 7 files changed, 193 insertions(+), 91 deletions(-)

diff --git a/src/main/webapp/documentation.html 
b/src/main/webapp/documentation.html
index 83c09a7..444144e 100644
--- a/src/main/webapp/documentation.html
+++ b/src/main/webapp/documentation.html
@@ -1,7 +1,28 @@
 ---
 title: Documentation
 description: "Apache Unomi documentation hub. Find the latest manual, REST API 
reference, Javadoc, tutorials, use cases, migration guides, and security 
advisories."
+keywords: "Apache Unomi documentation, user manual, REST API, Javadoc, 
developer guide, configuration"
 layout: default
+structured_data: >
+    <script type="application/ld+json">
+    {
+        "@context": "https://schema.org";,
+        "@type": "CollectionPage",
+        "name": "Apache Unomi Documentation",
+        "description": "Comprehensive documentation for Apache Unomi: user 
manual, REST API reference, Javadoc, tutorials, migration guides, and security 
advisories.",
+        "url": "https://unomi.apache.org/documentation.html";,
+        "mainEntity": {
+            "@type": "ItemList",
+            "name": "Apache Unomi Documentation Resources",
+            "itemListElement": [
+                { "@type": "ListItem", "position": 1, "name": "Latest Manual", 
"url": "https://unomi.apache.org/manual/latest/index.html"; },
+                { "@type": "ListItem", "position": 2, "name": "REST API 
Reference", "url": "https://unomi.apache.org/rest-api-doc/index.html"; },
+                { "@type": "ListItem", "position": 3, "name": "Java API 
(Javadoc)", "url": "https://unomi.apache.org/unomi-api/apidocs/index.html"; },
+                { "@type": "ListItem", "position": 4, "name": "Tutorials", 
"url": "https://unomi.apache.org/tutorial.html"; }
+            ]
+        }
+    }
+    </script>
 ---
 
 <!-- Page Header -->
@@ -16,6 +37,7 @@ layout: default
 <!-- Quick Links -->
 <section class="section">
     <div class="container">
+        <h2 class="visually-hidden">Quick Links</h2>
         <div class="row g-4">
             <div class="col-md-6 col-lg-3">
                 <a href="/get-started.html" class="feature-card d-block 
text-decoration-none h-100">
@@ -25,21 +47,21 @@ layout: default
                 </a>
             </div>
             <div class="col-md-6 col-lg-3">
-                <a href="/manual/3_0_x/index.html" class="feature-card d-block 
text-decoration-none h-100">
+                <a href="https://unomi.apache.org/manual/3_0_x/index.html"; 
class="feature-card d-block text-decoration-none h-100">
                     <div class="feature-icon"><i class="bi bi-book"></i></div>
                     <h3 class="h6 fw-semibold text-dark">Stable Manual <span 
class="text-muted fw-normal">3.0.x</span></h3>
                     <p class="small text-muted mb-0">The comprehensive guide 
for the current stable release.</p>
                 </a>
             </div>
             <div class="col-md-6 col-lg-3">
-                <a href="/rest-api-doc/index.html" class="feature-card d-block 
text-decoration-none h-100">
+                <a href="https://unomi.apache.org/rest-api-doc/index.html"; 
class="feature-card d-block text-decoration-none h-100">
                     <div class="feature-icon"><i class="bi 
bi-braces"></i></div>
                     <h3 class="h6 fw-semibold text-dark">REST API</h3>
                     <p class="small text-muted mb-0">Complete REST API 
reference for profiles, events, segments, and more.</p>
                 </a>
             </div>
             <div class="col-md-6 col-lg-3">
-                <a href="/unomi-api/apidocs/index.html" class="feature-card 
d-block text-decoration-none h-100" target="_blank" rel="noopener">
+                <a 
href="https://unomi.apache.org/unomi-api/apidocs/index.html"; 
class="feature-card d-block text-decoration-none h-100" target="_blank" 
rel="noopener">
                     <div class="feature-icon"><i class="bi 
bi-code-square"></i></div>
                     <h3 class="h6 fw-semibold text-dark">Javadoc</h3>
                     <p class="small text-muted mb-0">Java API documentation 
for plugin and extension developers.</p>
@@ -65,8 +87,8 @@ layout: default
                 <div class="feature-card h-100">
                     <div class="feature-icon icon-success"><i class="bi 
bi-box-seam"></i></div>
                     <h3 class="h6 fw-semibold">Installation &amp; 
Configuration</h3>
-                    <p class="small text-muted mb-2">Docker setup, manual 
installation, ElasticSearch configuration, and production deployment.</p>
-                    <a href="/manual/latest/index.html#_quick_start" 
class="small fw-semibold">Read more <i class="bi bi-arrow-right"></i></a>
+                    <p class="small text-muted mb-2">Docker setup, manual 
installation, Elasticsearch configuration, and production deployment.</p>
+                    <a 
href="https://unomi.apache.org/manual/latest/index.html#_quick_start"; 
class="small fw-semibold">Installation guide <i class="bi 
bi-arrow-right"></i></a>
                 </div>
             </div>
             <div class="col-md-6 col-lg-4">
@@ -74,7 +96,7 @@ layout: default
                     <div class="feature-icon icon-info"><i class="bi 
bi-braces"></i></div>
                     <h3 class="h6 fw-semibold">REST API &amp; Integration</h3>
                     <p class="small text-muted mb-2">Send events, query 
profiles, manage segments, and integrate with external systems.</p>
-                    <a href="/rest-api-doc/index.html" class="small 
fw-semibold">REST API docs <i class="bi bi-arrow-right"></i></a>
+                    <a href="https://unomi.apache.org/rest-api-doc/index.html"; 
class="small fw-semibold">REST API docs <i class="bi bi-arrow-right"></i></a>
                 </div>
             </div>
             <div class="col-md-6 col-lg-4">
@@ -82,7 +104,7 @@ layout: default
                     <div class="feature-icon icon-amber"><i class="bi 
bi-shield-lock"></i></div>
                     <h3 class="h6 fw-semibold">Privacy &amp; GDPR</h3>
                     <p class="small text-muted mb-2">Consent management, data 
portability, anonymization, and profile deletion.</p>
-                    <a href="/manual/latest/index.html" class="small 
fw-semibold">Read more <i class="bi bi-arrow-right"></i></a>
+                    <a 
href="https://unomi.apache.org/manual/latest/index.html"; class="small 
fw-semibold">Privacy manual <i class="bi bi-arrow-right"></i></a>
                 </div>
             </div>
             <div class="col-md-6 col-lg-4">
@@ -90,7 +112,7 @@ layout: default
                     <div class="feature-icon icon-rose"><i class="bi 
bi-puzzle"></i></div>
                     <h3 class="h6 fw-semibold">Extending Unomi</h3>
                     <p class="small text-muted mb-2">Build plugins, custom 
actions, rules, conditions, and Groovy connectors.</p>
-                    <a href="/manual/latest/index.html" class="small 
fw-semibold">Plugin guide <i class="bi bi-arrow-right"></i></a>
+                    <a 
href="https://unomi.apache.org/manual/latest/index.html"; class="small 
fw-semibold">Plugin guide <i class="bi bi-arrow-right"></i></a>
                 </div>
             </div>
             <div class="col-md-6 col-lg-4">
@@ -130,12 +152,12 @@ layout: default
             <div class="col-md-5">
                 <div class="version-card featured">
                     <div class="d-flex align-items-center mb-2">
-                        <span class="badge badge-success me-2"><i class="bi 
bi-circle-fill me-1" style="font-size:.45em"></i> Stable</span>
+                        <span class="badge badge-success me-2"><i class="bi 
bi-circle-fill me-1 badge-dot-sm"></i> Stable</span>
                         <span class="fw-semibold">Recommended</span>
                     </div>
                     <h3 class="h5 fw-bold mb-1">Unomi 3.0.x</h3>
                     <div class="d-flex flex-wrap gap-2 mt-3">
-                        <a href="/manual/3_0_x/index.html" class="btn 
btn-primary btn-sm">Read Online</a>
+                        <a 
href="https://unomi.apache.org/manual/3_0_x/index.html"; class="btn btn-primary 
btn-sm">Read Online</a>
                         <a 
href="https://dist.apache.org/repos/dist/release/unomi/3.0.0/unomi-manual-3_0_x.zip";
 target="_blank" rel="noopener" class="btn btn-outline-primary btn-sm">HTML 
(zip)</a>
                         <a 
href="https://dist.apache.org/repos/dist/release/unomi/3.0.0/unomi-manual-3_0_x.pdf";
 target="_blank" rel="noopener" class="btn btn-outline-primary btn-sm">PDF</a>
                     </div>
@@ -144,11 +166,11 @@ layout: default
             <div class="col-md-5">
                 <div class="version-card">
                     <div class="d-flex align-items-center mb-2">
-                        <span class="badge badge-warning me-2"><i class="bi 
bi-circle-fill me-1" style="font-size:.45em"></i> Development</span>
+                        <span class="badge badge-warning me-2"><i class="bi 
bi-circle-fill me-1 badge-dot-sm"></i> Development</span>
                     </div>
                     <h3 class="h5 fw-bold mb-1">Unomi {{ 
site.data.unomi.latest.development.version }}</h3>
                     <p class="small text-muted mb-2">In development &mdash; 
may contain unreleased features.</p>
-                    <a href="/manual/latest/index.html" class="btn 
btn-outline-primary btn-sm">Read Online</a>
+                    <a 
href="https://unomi.apache.org/manual/latest/index.html"; class="btn 
btn-outline-primary btn-sm">Read Online</a>
                 </div>
             </div>
         </div>
@@ -157,7 +179,7 @@ layout: default
         <div class="row justify-content-center">
             <div class="col-lg-10">
                 <details class="mt-3">
-                    <summary class="fw-semibold text-primary" 
style="cursor:pointer">
+                    <summary class="fw-semibold text-primary cursor-pointer">
                         <i class="bi bi-archive me-1"></i> Archived Versions 
(2.7.x &ndash; 1.1.x)
                     </summary>
                     <div class="table-responsive mt-3">
@@ -173,7 +195,7 @@ layout: default
                             <tbody>
                                 <tr>
                                     <td class="fw-semibold">2.7.x</td>
-                                    <td><a 
href="/manual/2_7_x/index.html">Online</a></td>
+                                    <td><a 
href="https://unomi.apache.org/manual/2_7_x/index.html";>Online</a></td>
                                     <td><a 
href="https://dist.apache.org/repos/dist/release/unomi/2.7.0/unomi-manual-2_7_x.zip";
 target="_blank" rel="noopener">Download</a></td>
                                     <td><a 
href="https://dist.apache.org/repos/dist/release/unomi/2.7.0/unomi-manual-2_7_x.pdf";
 target="_blank" rel="noopener">Download</a></td>
                                 </tr>
@@ -310,7 +332,7 @@ layout: default
                     </table>
                 </div>
                 <p class="small text-muted text-center mt-2">
-                    <a href="/rest-api-doc/index.html">View full REST API 
documentation <i class="bi bi-arrow-right"></i></a>
+                    <a 
href="https://unomi.apache.org/rest-api-doc/index.html";>View full REST API 
documentation <i class="bi bi-arrow-right"></i></a>
                 </p>
             </div>
         </div>
@@ -319,31 +341,31 @@ layout: default
 
 <hr class="section-divider">
 
-<!-- ElasticSearch Migration & Security -->
+<!-- Elasticsearch Migration & Security -->
 <section class="section section-alt">
     <div class="container">
         <div class="row g-5">
             <div class="col-lg-6">
-                <h2 class="h4 mb-3"><i class="bi bi-database-gear me-2 
text-primary"></i>ElasticSearch Migration</h2>
-                <p class="small text-muted">When migrating between 
ElasticSearch versions used by Unomi:</p>
+                <h2 class="h4 mb-3"><i class="bi bi-database-gear me-2 
text-primary"></i>Elasticsearch Migration</h2>
+                <p class="small text-muted">When migrating between 
Elasticsearch versions used by Unomi:</p>
                 <ul class="small text-muted">
                     <li class="mb-2"><strong>Standalone:</strong> Copy the 
data directory and custom <code>elasticsearch.yml</code> settings to the new 
version.</li>
-                    <li class="mb-2"><strong>Cluster:</strong> Use 
ElasticSearch <a 
href="https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-upgrade.html";
 target="_blank" rel="noopener">Snapshot and Restore</a> functionality.</li>
+                    <li class="mb-2"><strong>Cluster:</strong> Use 
Elasticsearch <a 
href="https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-upgrade.html";
 target="_blank" rel="noopener">Snapshot and Restore</a> functionality.</li>
                 </ul>
             </div>
             <div class="col-lg-6">
                 <h2 class="h4 mb-3"><i class="bi bi-shield-check me-2 
text-primary"></i>Security Advisories</h2>
                 <ul class="list-unstyled small">
                     <li class="d-flex align-items-center mb-2">
-                        <span class="badge bg-danger me-2" 
style="font-size:.65rem">CVE</span>
+                        <span class="badge bg-danger badge-cve me-2">CVE</span>
                         <a 
href="/security/cve-2021-31164.txt">CVE-2021-31164</a><span class="text-muted 
ms-2">&mdash; CRLF Log injection</span>
                     </li>
                     <li class="d-flex align-items-center mb-2">
-                        <span class="badge bg-danger me-2" 
style="font-size:.65rem">CVE</span>
+                        <span class="badge bg-danger badge-cve me-2">CVE</span>
                         <a 
href="/security/cve-2020-13942.txt">CVE-2020-13942</a><span class="text-muted 
ms-2">&mdash; Remote Code Execution</span>
                     </li>
                     <li class="d-flex align-items-center mb-2">
-                        <span class="badge bg-danger me-2" 
style="font-size:.65rem">CVE</span>
+                        <span class="badge bg-danger badge-cve me-2">CVE</span>
                         <a 
href="/security/cve-2020-11975.txt">CVE-2020-11975</a><span class="text-muted 
ms-2">&mdash; Remote Code Execution</span>
                     </li>
                 </ul>
diff --git a/src/main/webapp/download.html b/src/main/webapp/download.html
index d5c381d..309dd0d 100644
--- a/src/main/webapp/download.html
+++ b/src/main/webapp/download.html
@@ -34,7 +34,7 @@ structured_data: >
             <div class="col-lg-8">
                 <div class="version-card featured p-4">
                     <div class="d-flex align-items-center mb-3">
-                        <span class="badge badge-success me-2"><i class="bi 
bi-circle-fill me-1" style="font-size:.45em"></i> Latest Stable</span>
+                        <span class="badge badge-success me-2"><i class="bi 
bi-circle-fill me-1 badge-dot-sm"></i> Latest Stable</span>
                         <span class="fw-semibold">Recommended</span>
                     </div>
                     <h2 class="h3 fw-bold mb-1">Apache Unomi {{ 
site.data.unomi.latest.stable.version }}</h2>
@@ -83,7 +83,7 @@ structured_data: >
             <div class="col-lg-5">
                 <div class="feature-icon mb-3"><i class="bi 
bi-rocket-takeoff"></i></div>
                 <h2 class="h5 fw-semibold">Installation</h2>
-                <p class="small text-muted">Get up and running quickly with 
our <a href="/get-started.html#quickstart">Docker Quick Start</a> or follow the 
<a href="/manual/latest/index.html#_quick_start" target="_blank" 
rel="noopener">manual installation guide</a>.</p>
+                <p class="small text-muted">Get up and running quickly with 
our <a href="/get-started.html#quickstart">Docker Quick Start</a> or follow the 
<a href="https://unomi.apache.org/manual/latest/index.html#_quick_start"; 
target="_blank" rel="noopener">manual installation guide</a>.</p>
             </div>
             <div class="col-lg-5">
                 <div class="feature-icon mb-3"><i class="bi 
bi-shield-check"></i></div>
@@ -128,7 +128,7 @@ gpg --verify unomi-{{ site.data.unomi.latest.stable.version 
}}-bin.tar.gz.asc \
                     </table>
                 </div>
                 <details class="mt-3">
-                    <summary class="fw-semibold text-primary small" 
style="cursor:pointer">
+                    <summary class="fw-semibold text-primary small 
cursor-pointer">
                         <i class="bi bi-archive me-1"></i> Older releases (1.x)
                     </summary>
                     <div class="table-responsive mt-3">
diff --git a/src/main/webapp/get-started.html b/src/main/webapp/get-started.html
index b788a78..9716559 100644
--- a/src/main/webapp/get-started.html
+++ b/src/main/webapp/get-started.html
@@ -1,14 +1,16 @@
 ---
 title: Getting Started
 description: "Get started with Apache Unomi in minutes. Learn what Unomi does, 
run it with Docker, and start building with the REST API."
+keywords: "Apache Unomi quickstart, getting started, Docker setup, 
installation guide, CDP setup, first steps"
 layout: default
+mermaid: true
 structured_data: >
     <script type="application/ld+json">
     {
         "@context": "https://schema.org";,
         "@type": "HowTo",
         "name": "How to Get Started with Apache Unomi using Docker",
-        "description": "Run Apache Unomi Customer Data Platform in minutes 
using Docker Compose with ElasticSearch.",
+        "description": "Run Apache Unomi Customer Data Platform in minutes 
using Docker Compose with Elasticsearch.",
         "totalTime": "PT5M",
         "tool": [
             { "@type": "HowToTool", "name": "Docker" },
@@ -19,7 +21,7 @@ structured_data: >
                 "@type": "HowToStep",
                 "position": 1,
                 "name": "Create a docker-compose.yml file",
-                "text": "Create a docker-compose.yml file with ElasticSearch 
7.10.2 and Apache Unomi services configured."
+                "text": "Create a docker-compose.yml file with Elasticsearch 
9.1.3 and Apache Unomi services configured."
             },
             {
                 "@type": "HowToStep",
@@ -133,9 +135,10 @@ graph TD
                         <pre><code>version: '3.8'
 services:
   elasticsearch:
-    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2
+    image: docker.elastic.co/elasticsearch/elasticsearch:9.1.3
     environment:
       - discovery.type=single-node
+      - xpack.security.enabled=false
     ports:
       - 9200:9200
   unomi:
@@ -178,7 +181,7 @@ services:
 
         <div class="row justify-content-center mt-2">
             <div class="col-lg-9">
-                <div class="p-3 rounded-3" 
style="background:var(--unomi-primary-light)">
+                <div class="p-3 rounded-3 bg-primary-light">
                     <p class="small mb-1"><strong><i class="bi bi-info-circle 
me-1"></i>Production note:</strong> This configuration is for development only. 
See the <a 
href="https://unomi.apache.org/manual/latest/index.html#_securing_a_production_environment";>production
 security guide</a> before deploying.</p>
                     <p class="small mb-0"><strong>Prefer manual 
install?</strong> Follow the <a 
href="https://unomi.apache.org/manual/latest/index.html#_quick_start";>manual 
quick start guide</a> for Java-based installation.</p>
                 </div>
diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html
index 01cd784..482cc64 100644
--- a/src/main/webapp/index.html
+++ b/src/main/webapp/index.html
@@ -1,8 +1,9 @@
 ---
 title: Open Source Customer Data Platform
-description: "Apache Unomi is an open source Customer Data Platform (CDP) that 
unifies data from web, mobile, CRM, support systems, IoT, and more. The 
privacy-first data foundation for AI agents, personalization engines, and 
real-time customer intelligence."
+description: "Apache Unomi is an open source CDP that unifies customer data 
from web, mobile, CRM, and IoT. Privacy-first for AI, personalization, and 
real-time."
 keywords: "Apache Unomi, Customer Data Platform, CDP, open source CDP, 
personalization engine, GDPR compliant CDP, customer profiles, segmentation, 
Java CDP, privacy platform, first-party data, OASIS CXS, AI customer data, CDP 
for AI, AI agents customer context"
 layout: default
+mermaid: true
 structured_data: >
     <script type="application/ld+json">
     {
@@ -38,7 +39,7 @@ structured_data: >
                 "name": "What technologies does Apache Unomi use?",
                 "acceptedAnswer": {
                     "@type": "Answer",
-                    "text": "Apache Unomi is built in Java, runs on Apache 
Karaf (OSGi runtime), uses ElasticSearch for data storage, and communicates via 
a REST/JSON API. It has a plugin architecture supporting OSGi bundles and 
Groovy actions."
+                    "text": "Apache Unomi is built in Java, runs on Apache 
Karaf (OSGi runtime), uses Elasticsearch for data storage, and communicates via 
a REST/JSON API. It has a plugin architecture supporting OSGi bundles and 
Groovy actions."
                 }
             },
             {
@@ -78,7 +79,7 @@ structured_data: >
             </div>
             <div class="col-lg-6 text-center">
                 <!-- Inline SVG Illustration: Data flowing into a unified 
profile -->
-                <svg viewBox="0 0 520 440" fill="none" 
xmlns="http://www.w3.org/2000/svg"; class="illustration w-100" 
style="max-width:560px" aria-label="Customer data platform illustration showing 
data flowing into unified profiles">
+                <svg viewBox="0 0 520 440" fill="none" 
xmlns="http://www.w3.org/2000/svg"; class="illustration w-100 hero-illustration" 
role="img" aria-label="Customer data platform illustration showing data flowing 
into unified profiles">
                     <defs>
                         <style>
                             /* Pulse animation for background circles */
@@ -101,7 +102,7 @@ structured_data: >
                             .src-br { animation: svg-float-1 3.4s ease-in-out 
infinite 1.2s; }
 
                             /* Glow pulse on central profile */
-                            @keyframes svg-glow { 
0%,100%{opacity:.9;filter:drop-shadow(0 0 6px rgba(109,92,231,.3))} 
50%{opacity:1;filter:drop-shadow(0 0 14px rgba(109,92,231,.6))} }
+                            @keyframes svg-glow { 
0%,100%{opacity:.9;filter:drop-shadow(0 0 6px var(--unomi-primary-glow))} 
50%{opacity:1;filter:drop-shadow(0 0 14px var(--unomi-primary-glow-strong))} }
                             .profile-node { animation: svg-glow 3s ease-in-out 
infinite; }
 
                             /* Traveling data dot along path */
@@ -128,8 +129,8 @@ structured_data: >
                     </defs>
 
                     <!-- Background circles (pulsing) -->
-                    <circle cx="260" cy="210" r="170" 
fill="rgba(167,139,250,.08)" class="bg-outer"/>
-                    <circle cx="260" cy="210" r="120" 
fill="rgba(167,139,250,.06)" class="bg-inner"/>
+                    <circle cx="260" cy="210" r="170" 
fill="var(--unomi-hero-accent-ghost)" class="bg-outer"/>
+                    <circle cx="260" cy="210" r="120" 
fill="var(--unomi-hero-accent-whisper)" class="bg-inner"/>
 
                     <!-- Connector lines (flowing dashes) -->
                     <line x1="140" y1="72" x2="200" y2="180" 
stroke="var(--unomi-hero-accent)" stroke-width="2.5" stroke-dasharray="6 4" 
opacity=".5" class="flow-line"/>
@@ -139,58 +140,58 @@ structured_data: >
                     <line x1="235" y1="270" x2="195" y2="390" 
stroke="var(--unomi-accent)" stroke-width="2" stroke-dasharray="5 3" 
opacity=".45" class="flow-line-out"/>
                     <line x1="285" y1="270" x2="325" y2="390" 
stroke="var(--unomi-accent)" stroke-width="2" stroke-dasharray="5 3" 
opacity=".45" class="flow-line-out"/>
 
-                    <!-- Traveling data dots -->
-                    <circle r="5" fill="var(--unomi-hero-accent)" 
class="dot-tl"/>
-                    <circle r="5" fill="var(--unomi-hero-accent)" 
class="dot-tr"/>
-                    <circle r="5" fill="var(--unomi-hero-accent)" 
class="dot-bl"/>
-                    <circle r="5" fill="var(--unomi-hero-accent)" 
class="dot-br"/>
+                    <!-- Traveling data dots (initial cx/cy match 0% keyframe; 
opacity 0 until animation starts) -->
+                    <circle cx="140" cy="72" r="5" 
fill="var(--unomi-hero-accent)" opacity="0" class="dot-tl"/>
+                    <circle cx="380" cy="72" r="5" 
fill="var(--unomi-hero-accent)" opacity="0" class="dot-tr"/>
+                    <circle cx="140" cy="342" r="5" 
fill="var(--unomi-hero-accent)" opacity="0" class="dot-bl"/>
+                    <circle cx="380" cy="342" r="5" 
fill="var(--unomi-hero-accent)" opacity="0" class="dot-br"/>
 
                     <!-- Central profile node (glowing) -->
                     <g class="profile-node">
                         <rect x="200" y="150" width="120" height="120" rx="24" 
fill="var(--unomi-primary)" opacity=".9"/>
-                        <circle cx="260" cy="185" r="20" fill="white" 
opacity=".9"/>
-                        <path d="M232 220 a28 20 0 0 1 56 0" fill="white" 
opacity=".7"/>
-                        <text x="260" y="258" text-anchor="middle" 
fill="white" font-size="14" font-weight="700" 
font-family="Inter,sans-serif">PROFILE</text>
+                        <circle cx="260" cy="185" r="20" 
fill="var(--unomi-white)" opacity=".9"/>
+                        <path d="M232 220 a28 20 0 0 1 56 0" 
fill="var(--unomi-white)" opacity=".7"/>
+                        <text x="260" y="258" text-anchor="middle" 
fill="var(--unomi-white)" font-size="14" font-weight="700" 
font-family="Inter,sans-serif">PROFILE</text>
                     </g>
 
                     <!-- Web data source (floating) -->
                     <g class="src-tl">
                         <rect x="30" y="40" width="110" height="64" rx="14" 
fill="var(--unomi-gradient-start)" opacity=".85"/>
-                        <text x="85" y="68" text-anchor="middle" fill="white" 
font-size="15" font-weight="600" font-family="Inter,sans-serif">Web</text>
-                        <text x="85" y="88" text-anchor="middle" 
fill="rgba(255,255,255,.65)" font-size="12" 
font-family="Inter,sans-serif">Events</text>
+                        <text x="85" y="68" text-anchor="middle" 
fill="var(--unomi-white)" font-size="15" font-weight="600" 
font-family="Inter,sans-serif">Web</text>
+                        <text x="85" y="88" text-anchor="middle" 
fill="var(--unomi-on-dark-dim)" font-size="12" 
font-family="Inter,sans-serif">Events</text>
                     </g>
 
                     <!-- Mobile data source (floating) -->
                     <g class="src-tr">
                         <rect x="380" y="40" width="110" height="64" rx="14" 
fill="var(--unomi-gradient-start)" opacity=".85"/>
-                        <text x="435" y="68" text-anchor="middle" fill="white" 
font-size="15" font-weight="600" font-family="Inter,sans-serif">Mobile</text>
-                        <text x="435" y="88" text-anchor="middle" 
fill="rgba(255,255,255,.65)" font-size="12" font-family="Inter,sans-serif">App 
Data</text>
+                        <text x="435" y="68" text-anchor="middle" 
fill="var(--unomi-white)" font-size="15" font-weight="600" 
font-family="Inter,sans-serif">Mobile</text>
+                        <text x="435" y="88" text-anchor="middle" 
fill="var(--unomi-on-dark-dim)" font-size="12" 
font-family="Inter,sans-serif">App Data</text>
                     </g>
 
                     <!-- CRM / Support source (floating) -->
                     <g class="src-bl">
                         <rect x="30" y="310" width="110" height="64" rx="14" 
fill="var(--unomi-gradient-start)" opacity=".85"/>
-                        <text x="85" y="338" text-anchor="middle" fill="white" 
font-size="15" font-weight="600" font-family="Inter,sans-serif">CRM</text>
-                        <text x="85" y="358" text-anchor="middle" 
fill="rgba(255,255,255,.65)" font-size="12" 
font-family="Inter,sans-serif">Support</text>
+                        <text x="85" y="338" text-anchor="middle" 
fill="var(--unomi-white)" font-size="15" font-weight="600" 
font-family="Inter,sans-serif">CRM</text>
+                        <text x="85" y="358" text-anchor="middle" 
fill="var(--unomi-on-dark-dim)" font-size="12" 
font-family="Inter,sans-serif">Support</text>
                     </g>
 
                     <!-- IoT / Systems source (floating) -->
                     <g class="src-br">
                         <rect x="380" y="310" width="110" height="64" rx="14" 
fill="var(--unomi-gradient-start)" opacity=".85"/>
-                        <text x="435" y="338" text-anchor="middle" 
fill="white" font-size="15" font-weight="600" 
font-family="Inter,sans-serif">IoT</text>
-                        <text x="435" y="358" text-anchor="middle" 
fill="rgba(255,255,255,.65)" font-size="12" 
font-family="Inter,sans-serif">Devices</text>
+                        <text x="435" y="338" text-anchor="middle" 
fill="var(--unomi-white)" font-size="15" font-weight="600" 
font-family="Inter,sans-serif">IoT</text>
+                        <text x="435" y="358" text-anchor="middle" 
fill="var(--unomi-on-dark-dim)" font-size="12" 
font-family="Inter,sans-serif">Devices</text>
                     </g>
 
                     <!-- Output: Segment (bouncing) -->
                     <g class="out-seg">
                         <rect x="155" y="392" width="82" height="36" rx="10" 
fill="var(--unomi-accent)" opacity=".75"/>
-                        <text x="196" y="415" text-anchor="middle" 
fill="white" font-size="13" font-weight="700" 
font-family="Inter,sans-serif">Segment</text>
+                        <text x="196" y="415" text-anchor="middle" 
fill="var(--unomi-white)" font-size="13" font-weight="700" 
font-family="Inter,sans-serif">Segment</text>
                     </g>
 
                     <!-- Output: AI Agent (bouncing) -->
                     <g class="out-score">
                         <rect x="283" y="392" width="82" height="36" rx="10" 
fill="var(--unomi-accent)" opacity=".75"/>
-                        <text x="324" y="415" text-anchor="middle" 
fill="white" font-size="13" font-weight="700" font-family="Inter,sans-serif">AI 
Agent</text>
+                        <text x="324" y="415" text-anchor="middle" 
fill="var(--unomi-white)" font-size="13" font-weight="700" 
font-family="Inter,sans-serif">AI Agent</text>
                     </g>
                 </svg>
             </div>
@@ -368,7 +369,7 @@ graph LR
                 <ul class="list-unstyled mt-3">
                     <li class="d-flex align-items-start mb-3">
                         <i class="bi bi-check-circle-fill text-primary me-2 
mt-1"></i>
-                        <span>ElasticSearch backend with dynamic, schema-free 
data structures</span>
+                        <span>Elasticsearch backend with dynamic, schema-free 
data structures</span>
                     </li>
                     <li class="d-flex align-items-start mb-3">
                         <i class="bi bi-check-circle-fill text-primary me-2 
mt-1"></i>
@@ -441,7 +442,7 @@ graph LR
                 <div class="text-center">
                     <div class="step-number mx-auto mb-3">2</div>
                     <h3 class="h6 fw-semibold mb-2">Configure</h3>
-                    <p class="small text-muted">Point to your ElasticSearch 
instance and customize settings as needed.</p>
+                    <p class="small text-muted">Point to your Elasticsearch 
instance and customize settings as needed.</p>
                 </div>
             </div>
             <div class="col-md-4">
@@ -509,7 +510,7 @@ graph LR
             <!-- "Hidden gems" teaser card -->
             <div class="ecosystem-card ecosystem-card-oss" data-company>
                 <div class="text-center">
-                    <i class="bi bi-globe2 d-block mb-2" 
style="font-size:2rem;color:var(--unomi-primary)"></i>
+                    <i class="bi bi-globe2 d-block mb-2 icon-lg-primary"></i>
                     <h3 class="h6 fw-semibold mb-2">And many more&hellip;</h3>
                     <p class="small text-muted mb-0">Countless teams around 
the world build on Apache Unomi without ever telling us. That&rsquo;s the 
beauty of open source &mdash; anyone can adopt it freely and make it their 
own.</p>
                 </div>
@@ -619,7 +620,7 @@ graph LR
                     <i class="bi bi-camera-video news-icon"></i>
                     <div>
                         <strong class="small">OpenSearch contribution 
presentation</strong>
-                        <span class="small text-muted">&mdash; How Unomi added 
OpenSearch persistence support.</span>
+                        <span class="small text-muted">&mdash; Presentation on 
the upcoming OpenSearch persistence support.</span>
                         <a href="/community/events/index.html#opensearch-2025" 
class="news-link">Watch</a>
                     </div>
                 </div>
@@ -679,10 +680,10 @@ graph LR
         <div class="row g-5 align-items-center justify-content-center">
             <div class="col-md-5 col-lg-4 text-center">
                 <a href="https://apache.org"; target="_blank" rel="noopener">
-                    <img src="/assets/images/asf_logo_wide.svg" alt="Apache 
Software Foundation" class="img-fluid mb-3" style="max-width:220px">
+                    <img src="/assets/images/asf_logo_wide.svg" alt="Apache 
Software Foundation" class="img-fluid mb-3 mw-220">
                 </a>
                 <a href="https://events.apache.org/x/current-event.html"; 
target="_blank" rel="noopener" class="d-block">
-                    <img 
src="https://www.apache.org/events/current-event-234x60.png"; alt="Apache 
Events" class="img-fluid" style="max-width:234px">
+                    <img 
src="https://www.apache.org/events/current-event-234x60.png"; alt="Apache 
Events" class="img-fluid mw-234">
                 </a>
             </div>
             <div class="col-md-7 col-lg-5">
diff --git a/src/main/webapp/resources.html b/src/main/webapp/resources.html
index 2551dc1..9e437da 100644
--- a/src/main/webapp/resources.html
+++ b/src/main/webapp/resources.html
@@ -1,7 +1,33 @@
 ---
 title: Videos &amp; Resources
 description: "Apache Unomi learning resources: conference talks, video 
tutorials, articles, slides, and community presentations."
+keywords: "Apache Unomi resources, videos, articles, presentations, CDP 
tutorials, Unomi talks, learning resources"
 layout: default
+structured_data: >
+    <script type="application/ld+json">
+    {
+        "@context": "https://schema.org";,
+        "@type": "CollectionPage",
+        "name": "Apache Unomi Videos & Resources",
+        "description": "Conference talks, tutorials, articles, and slides 
about the Apache Unomi Customer Data Platform.",
+        "url": "https://unomi.apache.org/resources.html";,
+        "mainEntity": {
+            "@type": "ItemList",
+            "name": "Apache Unomi Video Resources",
+            "numberOfItems": 8,
+            "itemListElement": [
+                { "@type": "ListItem", "position": 1, "name": "A CDP in an 
AI-first World — Apache Unomi", "url": 
"https://www.youtube.com/watch?v=UrhNhXHugKc"; },
+                { "@type": "ListItem", "position": 2, "name": "Apache Unomi 3 
— The Open Source CDP at Scale", "url": 
"https://www.youtube.com/watch?v=ON0EskhpuME"; },
+                { "@type": "ListItem", "position": 3, "name": "ApacheCon 2024 
— Apache Unomi: The Open Source CDP", "url": 
"https://www.youtube.com/watch?v=YqPkUhBlcrs"; },
+                { "@type": "ListItem", "position": 4, "name": "Apache Unomi — 
What's New in the Latest Releases", "url": 
"https://www.youtube.com/watch?v=_6vfuWocQBs"; },
+                { "@type": "ListItem", "position": 5, "name": "Apache Unomi 
Past, Present, and Future", "url": 
"https://www.youtube.com/watch?v=uNbKW29FCnE"; },
+                { "@type": "ListItem", "position": 6, "name": "ApacheCon 2021 
— Introduction to Apache Unomi", "url": 
"https://www.youtube.com/watch?v=ynluCYocfG4"; },
+                { "@type": "ListItem", "position": 7, "name": "ApacheCon 2020 
— Building a Customer Data Platform with Apache Unomi", "url": 
"https://www.youtube.com/watch?v=_EXJQJ69niA"; },
+                { "@type": "ListItem", "position": 8, "name": "First Apache 
Unomi Meetup", "url": "https://www.youtube.com/watch?v=f4q4fDkqBDQ"; }
+            ]
+        }
+    }
+    </script>
 ---
 
 <!-- Page Header -->
@@ -27,10 +53,10 @@ layout: default
             <!-- 1. Community Over Code NA 2025 — Sep 29, 2025 -->
             <div class="col-md-6 col-lg-4">
                 <div class="feature-card h-100">
-                    <a href="https://www.youtube.com/watch?v=_6vfuWocQBs"; 
target="_blank" rel="noopener" class="d-block position-relative mb-3 rounded 
overflow-hidden" style="aspect-ratio:16/9">
-                        <img 
src="/assets/images/videos/coc-2025-_6vfuWocQBs.jpg" alt="From Complaining 
Customers to Brand Promoters - Community Over Code 2025" class="w-100 h-100" 
style="object-fit:cover" loading="lazy">
+                    <a href="https://www.youtube.com/watch?v=_6vfuWocQBs"; 
target="_blank" rel="noopener" class="d-block position-relative mb-3 rounded 
overflow-hidden video-thumbnail">
+                        <img 
src="/assets/images/videos/coc-2025-_6vfuWocQBs.jpg" alt="From Complaining 
Customers to Brand Promoters - Community Over Code 2025" class="w-100 h-100 
img-cover" loading="lazy">
                         <span class="position-absolute top-50 start-50 
translate-middle d-flex align-items-center justify-content-center 
rounded-circle play-overlay-lg">
-                            <i class="bi bi-play-fill text-white" 
style="font-size:1.5rem;margin-left:2px"></i>
+                            <i class="bi bi-play-fill text-white 
play-icon"></i>
                         </span>
                     </a>
                     <span class="badge badge-primary mb-2">Community Over Code 
2025</span>
@@ -43,10 +69,10 @@ layout: default
             <!-- 2. Community Over Code NA 2025 — Sep 29, 2025 -->
             <div class="col-md-6 col-lg-4">
                 <div class="feature-card h-100">
-                    <a href="https://www.youtube.com/watch?v=ON0EskhpuME"; 
target="_blank" rel="noopener" class="d-block position-relative mb-3 rounded 
overflow-hidden" style="aspect-ratio:16/9">
-                        <img 
src="/assets/images/videos/coc-2025-ON0EskhpuME.jpg" alt="How AI + Customer 
Data Platforms Create Unlimited Personalized Memory - Community Over Code 2025" 
class="w-100 h-100" style="object-fit:cover" loading="lazy">
+                    <a href="https://www.youtube.com/watch?v=ON0EskhpuME"; 
target="_blank" rel="noopener" class="d-block position-relative mb-3 rounded 
overflow-hidden video-thumbnail">
+                        <img 
src="/assets/images/videos/coc-2025-ON0EskhpuME.jpg" alt="How AI + Customer 
Data Platforms Create Unlimited Personalized Memory - Community Over Code 2025" 
class="w-100 h-100 img-cover" loading="lazy">
                         <span class="position-absolute top-50 start-50 
translate-middle d-flex align-items-center justify-content-center 
rounded-circle play-overlay-lg">
-                            <i class="bi bi-play-fill text-white" 
style="font-size:1.5rem;margin-left:2px"></i>
+                            <i class="bi bi-play-fill text-white 
play-icon"></i>
                         </span>
                     </a>
                     <span class="badge badge-primary mb-2">Community Over Code 
2025</span>
@@ -59,10 +85,10 @@ layout: default
             <!-- 3. OpenSearch Contribution — Jan 14, 2025 -->
             <div class="col-md-6 col-lg-4">
                 <div class="feature-card h-100">
-                    <a href="https://www.youtube.com/watch?v=uNbKW29FCnE"; 
target="_blank" rel="noopener" class="d-block position-relative mb-3 rounded 
overflow-hidden" style="aspect-ratio:16/9">
-                        <img 
src="/assets/images/videos/opensearch-uNbKW29FCnE.jpg" alt="Apache Unomi 
OpenSearch Contribution Presentation" class="w-100 h-100" 
style="object-fit:cover" loading="lazy">
+                    <a href="https://www.youtube.com/watch?v=uNbKW29FCnE"; 
target="_blank" rel="noopener" class="d-block position-relative mb-3 rounded 
overflow-hidden video-thumbnail">
+                        <img 
src="/assets/images/videos/opensearch-uNbKW29FCnE.jpg" alt="Apache Unomi 
OpenSearch Contribution Presentation" class="w-100 h-100 img-cover" 
loading="lazy">
                         <span class="position-absolute top-50 start-50 
translate-middle d-flex align-items-center justify-content-center 
rounded-circle play-overlay-lg">
-                            <i class="bi bi-play-fill text-white" 
style="font-size:1.5rem;margin-left:2px"></i>
+                            <i class="bi bi-play-fill text-white 
play-icon"></i>
                         </span>
                     </a>
                     <span class="badge badge-primary mb-2">Technical Deep Dive 
&bull; Jan 2025</span>
@@ -75,10 +101,10 @@ layout: default
             <!-- 3. Claude AI + MCP Demo — Dec 2, 2024 -->
             <div class="col-md-6 col-lg-4">
                 <div class="feature-card h-100">
-                    <a href="https://www.youtube.com/watch?v=YqPkUhBlcrs"; 
target="_blank" rel="noopener" class="d-block position-relative mb-3 rounded 
overflow-hidden" style="aspect-ratio:16/9">
-                        <img 
src="/assets/images/videos/mcp-demo-YqPkUhBlcrs.jpg" alt="Claude AI integration 
with Apache Unomi using MCP" class="w-100 h-100" style="object-fit:cover" 
loading="lazy">
+                    <a href="https://www.youtube.com/watch?v=YqPkUhBlcrs"; 
target="_blank" rel="noopener" class="d-block position-relative mb-3 rounded 
overflow-hidden video-thumbnail">
+                        <img 
src="/assets/images/videos/mcp-demo-YqPkUhBlcrs.jpg" alt="Claude AI integration 
with Apache Unomi using MCP" class="w-100 h-100 img-cover" loading="lazy">
                         <span class="position-absolute top-50 start-50 
translate-middle d-flex align-items-center justify-content-center 
rounded-circle play-overlay-lg">
-                            <i class="bi bi-play-fill text-white" 
style="font-size:1.5rem;margin-left:2px"></i>
+                            <i class="bi bi-play-fill text-white 
play-icon"></i>
                         </span>
                     </a>
                     <span class="badge badge-primary mb-2">AI Integration Demo 
&bull; Dec 2024</span>
@@ -91,10 +117,10 @@ layout: default
             <!-- 4. Community Meetup — Nov 18, 2021 -->
             <div class="col-md-6 col-lg-4">
                 <div class="feature-card h-100">
-                    <a href="https://www.youtube.com/watch?v=UrhNhXHugKc"; 
target="_blank" rel="noopener" class="d-block position-relative mb-3 rounded 
overflow-hidden" style="aspect-ratio:16/9">
-                        <img 
src="/assets/images/videos/meetup-2021-UrhNhXHugKc.jpg" alt="Apache Unomi 
November 2021 Meetup" class="w-100 h-100" style="object-fit:cover" 
loading="lazy">
+                    <a href="https://www.youtube.com/watch?v=UrhNhXHugKc"; 
target="_blank" rel="noopener" class="d-block position-relative mb-3 rounded 
overflow-hidden video-thumbnail">
+                        <img 
src="/assets/images/videos/meetup-2021-UrhNhXHugKc.jpg" alt="Apache Unomi 
November 2021 Meetup" class="w-100 h-100 img-cover" loading="lazy">
                         <span class="position-absolute top-50 start-50 
translate-middle d-flex align-items-center justify-content-center 
rounded-circle play-overlay-lg">
-                            <i class="bi bi-play-fill text-white" 
style="font-size:1.5rem;margin-left:2px"></i>
+                            <i class="bi bi-play-fill text-white 
play-icon"></i>
                         </span>
                     </a>
                     <span class="badge badge-primary mb-2">Community Meetup 
2021</span>
@@ -107,10 +133,10 @@ layout: default
             <!-- 5. ApacheCon 2019 -->
             <div class="col-md-6 col-lg-4">
                 <div class="feature-card h-100">
-                    <a href="https://www.youtube.com/watch?v=ut2ReqhMl2Y"; 
target="_blank" rel="noopener" class="d-block position-relative mb-3 rounded 
overflow-hidden" style="aspect-ratio:16/9">
-                        <img 
src="/assets/images/videos/apachecon-2019-ut2ReqhMl2Y.jpg" alt="Customer 
Segmentation &amp; Marketing Automation - ApacheCon 2019" class="w-100 h-100" 
style="object-fit:cover" loading="lazy">
+                    <a href="https://www.youtube.com/watch?v=ut2ReqhMl2Y"; 
target="_blank" rel="noopener" class="d-block position-relative mb-3 rounded 
overflow-hidden video-thumbnail">
+                        <img 
src="/assets/images/videos/apachecon-2019-ut2ReqhMl2Y.jpg" alt="Customer 
Segmentation &amp; Marketing Automation - ApacheCon 2019" class="w-100 h-100 
img-cover" loading="lazy">
                         <span class="position-absolute top-50 start-50 
translate-middle d-flex align-items-center justify-content-center 
rounded-circle play-overlay-lg">
-                            <i class="bi bi-play-fill text-white" 
style="font-size:1.5rem;margin-left:2px"></i>
+                            <i class="bi bi-play-fill text-white 
play-icon"></i>
                         </span>
                     </a>
                     <span class="badge badge-primary mb-2">ApacheCon 
2019</span>
@@ -126,10 +152,10 @@ layout: default
             <!-- 6. ApacheCon 2018 -->
             <div class="col-md-6 col-lg-4">
                 <div class="feature-card h-100">
-                    <a href="https://www.youtube.com/watch?v=XO1cLSgeRsw"; 
target="_blank" rel="noopener" class="d-block position-relative mb-3 rounded 
overflow-hidden" style="aspect-ratio:16/9">
-                        <img 
src="/assets/images/videos/apachecon-2018-XO1cLSgeRsw.jpg" alt="Apache Unomi 
&mdash; An Open Source CDP - ApacheCon 2018" class="w-100 h-100" 
style="object-fit:cover" loading="lazy">
+                    <a href="https://www.youtube.com/watch?v=XO1cLSgeRsw"; 
target="_blank" rel="noopener" class="d-block position-relative mb-3 rounded 
overflow-hidden video-thumbnail">
+                        <img 
src="/assets/images/videos/apachecon-2018-XO1cLSgeRsw.jpg" alt="Apache Unomi 
&mdash; An Open Source CDP - ApacheCon 2018" class="w-100 h-100 img-cover" 
loading="lazy">
                         <span class="position-absolute top-50 start-50 
translate-middle d-flex align-items-center justify-content-center 
rounded-circle play-overlay-lg">
-                            <i class="bi bi-play-fill text-white" 
style="font-size:1.5rem;margin-left:2px"></i>
+                            <i class="bi bi-play-fill text-white 
play-icon"></i>
                         </span>
                     </a>
                     <span class="badge badge-primary mb-2">ApacheCon 
2018</span>
@@ -145,10 +171,10 @@ layout: default
             <!-- 7. ApacheCon 2015 -->
             <div class="col-md-6 col-lg-4">
                 <div class="feature-card h-100">
-                    <a href="https://www.youtube.com/watch?v=y4uNwnVMVyg"; 
target="_blank" rel="noopener" class="d-block position-relative mb-3 rounded 
overflow-hidden" style="aspect-ratio:16/9">
-                        <img 
src="/assets/images/videos/apachecon-2015-y4uNwnVMVyg.jpg" alt="Apache Unomi 
Project In-Depth - ApacheCon 2015" class="w-100 h-100" style="object-fit:cover" 
loading="lazy">
+                    <a href="https://www.youtube.com/watch?v=y4uNwnVMVyg"; 
target="_blank" rel="noopener" class="d-block position-relative mb-3 rounded 
overflow-hidden video-thumbnail">
+                        <img 
src="/assets/images/videos/apachecon-2015-y4uNwnVMVyg.jpg" alt="Apache Unomi 
Project In-Depth - ApacheCon 2015" class="w-100 h-100 img-cover" loading="lazy">
                         <span class="position-absolute top-50 start-50 
translate-middle d-flex align-items-center justify-content-center 
rounded-circle play-overlay-lg">
-                            <i class="bi bi-play-fill text-white" 
style="font-size:1.5rem;margin-left:2px"></i>
+                            <i class="bi bi-play-fill text-white 
play-icon"></i>
                         </span>
                     </a>
                     <span class="badge badge-primary mb-2">ApacheCon 
2015</span>
diff --git a/src/main/webapp/tutorial.html b/src/main/webapp/tutorial.html
index e5a5a35..5db0517 100644
--- a/src/main/webapp/tutorial.html
+++ b/src/main/webapp/tutorial.html
@@ -1,6 +1,7 @@
 ---
 title: Tutorials &mdash; Getting Started with Apache Unomi 3
 description: "Step-by-step tutorials for Apache Unomi 3.0: Docker quick start, 
manual installation, REST API basics, web tracking integration, and profile 
personalization."
+keywords: "Apache Unomi tutorial, step by step, beginner guide, CDP tutorial, 
profiles, events, segments, rules"
 layout: default
 structured_data: >
     <script type="application/ld+json">
@@ -9,24 +10,29 @@ structured_data: >
         "@type": "HowTo",
         "name": "Getting Started with Apache Unomi 3",
         "description": "Learn how to set up and use Apache Unomi 3.0 as a 
Customer Data Platform with Docker, REST APIs, and web tracking.",
+        "totalTime": "PT30M",
         "step": [
             {
                 "@type": "HowToStep",
+                "position": 1,
                 "name": "Start Unomi with Docker",
                 "text": "Create a docker-compose.yml and run docker-compose up 
to start Unomi with Elasticsearch."
             },
             {
                 "@type": "HowToStep",
+                "position": 2,
                 "name": "Verify the cluster",
                 "text": "Access https://localhost:9443/cxs/cluster with 
credentials karaf/karaf to verify the installation."
             },
             {
                 "@type": "HowToStep",
+                "position": 3,
                 "name": "Create a scope and send events",
                 "text": "Use the REST API to create scopes, send events, and 
query profiles."
             },
             {
                 "@type": "HowToStep",
+                "position": 4,
                 "name": "Integrate the web tracker",
                 "text": "Add the Unomi web tracker to your web pages for 
automatic event collection and personalization."
             }
@@ -45,7 +51,7 @@ structured_data: >
 </section>
 
 <!-- Table of Contents -->
-<section class="section" style="padding-bottom:0">
+<section class="section section-flush-bottom">
     <div class="container">
         <div class="row justify-content-center">
             <div class="col-lg-10">
@@ -89,9 +95,10 @@ structured_data: >
 <pre><code>version: '3.8'
 services:
   elasticsearch:
-    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2
+    image: docker.elastic.co/elasticsearch/elasticsearch:9.1.3
     environment:
       - discovery.type=single-node
+      - xpack.security.enabled=false
     ports:
       - 9200:9200
 
@@ -125,7 +132,7 @@ services:
 <pre><code>curl http://localhost:9200/_cat/health?format=json</code></pre>
 
                 <div class="alert alert-info small" role="alert">
-                    <i class="bi bi-info-circle me-1"></i> This Docker setup 
is for <strong>development and learning only</strong>. For production 
deployments, see the <a 
href="/manual/latest/index.html#_securing_a_production_environment">production 
security guide</a>.
+                    <i class="bi bi-info-circle me-1"></i> This Docker setup 
is for <strong>development and learning only</strong>. For production 
deployments, see the <a 
href="https://unomi.apache.org/manual/latest/index.html#_securing_a_production_environment";>production
 security guide</a>.
                 </div>
             </div>
         </div>
@@ -148,7 +155,7 @@ services:
                 <h3 class="h6 fw-semibold mt-4 mb-3">Prerequisites</h3>
                 <ul class="small">
                     <li><strong>Java 17</strong> or later &mdash; set 
<code>JAVA_HOME</code> accordingly. OpenJDK distributions work fine.</li>
-                    <li><strong>Elasticsearch 7.17.x</strong> &mdash; <a 
href="https://www.elastic.co/downloads/past-releases/elasticsearch-7-17-5"; 
target="_blank" rel="noopener">Download 7.17.5</a></li>
+                    <li><strong>Elasticsearch 9.x</strong> &mdash; <a 
href="https://www.elastic.co/downloads/elasticsearch"; target="_blank" 
rel="noopener">Download Elasticsearch</a></li>
                 </ul>
 
                 <h3 class="h6 fw-semibold mt-4 mb-3">1. Configure &amp; start 
Elasticsearch</h3>
@@ -229,7 +236,7 @@ Initializing cluster service endpoint...</code></pre>
 
                 <!-- Send a custom event -->
                 <h3 class="h6 fw-semibold mt-4 mb-3">Send a custom event</h3>
-                <p>Before sending a custom event, register a <strong>JSON 
Schema</strong> to validate it (required since Unomi 2.x):</p>
+                <p>Before sending a custom event, register a <strong>JSON 
Schema</strong> to validate it (required since Unomi 2.0):</p>
 <pre><code>curl -X POST http://localhost:8181/cxs/jsonSchema \
   -u karaf:karaf \
   -H "Content-Type: application/json" \
@@ -557,7 +564,7 @@ unomiWebTracker.registerPersonalizationObject({
                             <div class="feature-icon"><i class="bi 
bi-book"></i></div>
                             <h3 class="h6 fw-semibold mb-2">Full 
Documentation</h3>
                             <p class="small text-muted mb-2">Dive deeper into 
segmentation, scoring, conditions, and actions in the comprehensive manual.</p>
-                            <a href="/manual/latest/index.html" class="small 
fw-semibold">Read the manual <i class="bi bi-arrow-right"></i></a>
+                            <a 
href="https://unomi.apache.org/manual/latest/index.html"; class="small 
fw-semibold">Read the manual <i class="bi bi-arrow-right"></i></a>
                         </div>
                     </div>
                     <div class="col-md-6">
@@ -565,7 +572,7 @@ unomiWebTracker.registerPersonalizationObject({
                             <div class="feature-icon"><i class="bi 
bi-braces"></i></div>
                             <h3 class="h6 fw-semibold mb-2">REST API 
Reference</h3>
                             <p class="small text-muted mb-2">Explore every 
endpoint for profiles, events, segments, rules, and more.</p>
-                            <a href="/rest-api-doc/index.html" class="small 
fw-semibold">Browse the API <i class="bi bi-arrow-right"></i></a>
+                            <a 
href="https://unomi.apache.org/rest-api-doc/index.html"; class="small 
fw-semibold">Browse the API <i class="bi bi-arrow-right"></i></a>
                         </div>
                     </div>
                     <div class="col-md-6">
diff --git a/src/main/webapp/use-cases.html b/src/main/webapp/use-cases.html
index 0a38aa5..6333da6 100644
--- a/src/main/webapp/use-cases.html
+++ b/src/main/webapp/use-cases.html
@@ -1,7 +1,50 @@
 ---
 title: Use Cases
-description: "Discover how Apache Unomi can be used as a web personalization 
engine, mobile analytics backend, centralized profile management system, or 
real-time data backbone for AI agents and machine learning."
+description: "Apache Unomi use cases: web personalization, mobile analytics, 
profile management, and data backbone for AI agents and machine learning."
+keywords: "Apache Unomi use cases, web personalization, mobile analytics, 
customer profiles, AI CDP, machine learning, segmentation"
 layout: default
+mermaid: true
+structured_data: >
+    <script type="application/ld+json">
+    {
+        "@context": "https://schema.org";,
+        "@type": "FAQPage",
+        "mainEntity": [
+            {
+                "@type": "Question",
+                "name": "How can Apache Unomi be used for AI and machine 
learning?",
+                "acceptedAnswer": {
+                    "@type": "Answer",
+                    "text": "Apache Unomi serves as the real-time customer 
data backbone for AI agents, chatbots, recommendation engines, and predictive 
models. It provides unified profiles, segments, and event data via REST API 
with built-in consent management to ensure AI only processes data customers 
have explicitly consented to share."
+                }
+            },
+            {
+                "@type": "Question",
+                "name": "How does Apache Unomi work for web personalization?",
+                "acceptedAnswer": {
+                    "@type": "Answer",
+                    "text": "Apache Unomi integrates with CMS platforms to 
track visitors, build profiles, define real-time segments, and deliver 
personalized content. A lightweight JavaScript tracker sends events, while the 
context servlet returns matching personalization rules for the current visitor."
+                }
+            },
+            {
+                "@type": "Question",
+                "name": "Can Apache Unomi be used as a mobile analytics 
backend?",
+                "acceptedAnswer": {
+                    "@type": "Answer",
+                    "text": "Yes. Native mobile apps send events to the Unomi 
REST API to track user journeys, build profiles, and compute segments. This 
enables personalized mobile experiences based on real-time behavioral data."
+                }
+            },
+            {
+                "@type": "Question",
+                "name": "How does Apache Unomi handle centralized profile 
management?",
+                "acceptedAnswer": {
+                    "@type": "Answer",
+                    "text": "Unomi aggregates customer data from CRM, support, 
commerce, and other systems into unified profiles. It resolves multiple 
identities across touchpoints and provides a single customer view via REST API."
+                }
+            }
+        ]
+    }
+    </script>
 ---
 
 <!-- Page Header -->

Reply via email to