You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@unomi.apache.org by sh...@apache.org on 2026/02/14 17:18:48 UTC
(unomi-site) 03/05: Content pages: AI positioning, ES 9.1.3, structured data, inline style cleanup
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 <sh...@apache.org>
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 <cu...@cursor.com>
---
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 & 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 & 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 & 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 — 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 – 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">— 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">— 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">— 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…</h3>
<p class="small text-muted mb-0">Countless teams around the world build on Apache Unomi without ever telling us. That’s the beauty of open source — 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">— How Unomi added OpenSearch persistence support.</span>
+ <span class="small text-muted">— 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 & 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 • 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 • 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 & 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 & 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 — 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 — 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 — 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 — set <code>JAVA_HOME</code> accordingly. OpenJDK distributions work fine.</li>
- <li><strong>Elasticsearch 7.17.x</strong> — <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> — <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 & 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 -->