Modernize Apache Unomi website: Bootstrap 5, design system, AI positi… (#40)

Modernize Apache Unomi website: Bootstrap 5, design system, AI positioning, SEO/AEO

Complete redesign of the Apache Unomi website including:

Infrastructure:
- Upgrade Bootstrap 4 to 5.3.8 and Jekyll 4.2.0 to 4.4.1
- Add Mermaid.js v11 for interactive diagrams
- Centralized CSS design system with 40+ CSS custom properties
- Docker-based build workflow using bretfisher/jekyll images

Content & Pages:
- New "CDP in the AI Era" section and AI-first positioning throughout
- New Integrations page with randomized company order (ASF compliance)
- Rewritten Tutorial page for Unomi 3.0
- Rebuilt Events page with 12 talks, local video thumbnails
- Testing guide TODOs filled in from source code research
- Dependencies guide: added BOM documentation for Unomi 3
- Latest News timeline combining releases, articles, and events (capped at 10)
- Use cases reordered with AI & ML first

Community & Design:
- Team page redesigned as responsive card grid with updated affiliations
- All 11 contribute sub-pages modernized (layout only, text preserved)
- Fixed empty mailing list cards, encoding issues, dead links
- Copyright years updated to 2026

SEO & AI Engine Optimization:
- JSON-LD structured data (Schema.org) on all pages
- Open Graph and Twitter Card meta tags
- robots.txt, sitemap.xml, llms.txt, llms-full.txt added

Staging preview: https://unomi-v3-site.netlify.app/

* CSS design system: centralized variables, utility classes, DRY cleanup

- Add new CSS variables for rgba variants, opacity levels, and color tokens
- Create 10+ utility classes to replace inline styles (badges, icons, overlays)
- Merge duplicate CSS rules (.mermaid, media queries, button hovers)
- Add vendor prefix (-webkit-backdrop-filter) for Safari
- Fix color contrast for WCAG AA compliance (hero text opacity)
- Add mobile overflow protection for Mermaid diagrams and code blocks
- Extract shared Fisher-Yates shuffle script to assets/js/shuffle.js

* Layout: performance, accessibility, SEO and navigation improvements

- Conditional Mermaid.js loading (saves ~25KB on pages without diagrams)
- Defer Bootstrap JS and Mermaid scripts for faster initial render
- Preconnect to cdn.jsdelivr.net, non-blocking Bootstrap Icons CSS
- Add :focus-visible styles for keyboard navigation accessibility
- Replace footer <h6> with role="heading" for semantic hierarchy
- Shorten <title> suffix to keep under 65 characters
- Normalize og:url to match canonical URL
- Update navbar Slack link to point to access instructions
- Update navbar mailing list link to point to community page
- Update JSON-LD featureList (Salesforce deprecated, Groovy actions)
- Fix broken links to generated docs with absolute URLs

* 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

* Community, events, integrations: Slack access, Salesforce removal, ASF compliance

- Community: rewrite Slack card with ASF access paths, update monthly meeting
  with direct Zoom link and 'open to all' messaging, add mailing list anchor
- Team: modernize to card layout, update affiliations, lazy-load gravatars
- Events: restructure past events with local thumbnails, add CollectionPage schema
- Integrations: remove Salesforce connector, add Groovy actions (recommended)
  and Java plugins guidance, remove Unomi UI/Inoyu UI cards for ASF compliance,
  use generic labels in Mermaid diagram
- Connectors: update description for Salesforce deprecation
- Stories: replace inline shuffle script with shared shuffle.js
- All pages: fix rel="noopener", protocol upgrades, inline style cleanup

* Contribute pages, SEO & LLM files: testing TODOs, release guide, sitemap

- Testing: replace TODOs with Surefire/Failsafe/Pax Exam docs, add CI section
- Dependencies: add BOM section with usage examples
- Release guide: update versions to 3.0.x, fix typos and stale URLs
- Manual release guide: update version examples, fix typos
- Encoding fixes: correct mojibake characters on 3 contribute pages
- Sitemap: expand from 14 to 29 URLs, add lastmod dates
- Robots.txt: remove CSS/JS disallow rules for proper Google rendering
- LLM files: update to 3.0.0, Groovy/Java plugin guidance, OpenSearch wording,
  Salesforce deprecation, Slack access, remove excess Inoyu product listings
- All contribute pages: add SEO keywords, fix rel="noopener"
54 files changed
tree: cddf84e3531deda278f04f124643ad8e3a149694
  1. src/
  2. .gitignore
  3. _config.yml
  4. Gemfile
  5. pom.xml
  6. README.md
README.md

Apache Unomi Website source repository

This project contains the Apache Unomi Website. The website is generated using Jekyll 4.4 with Liquid templates.

Configuration

Jekyll Config

Can be found in _config YAML file

source: src/main/webapp
destination: target/site

Data config

Can be found in _data folder This contains some variables used to replace placeholders in the site.

Build

You need either Docker (recommended) or a local Ruby/Jekyll installation to build the website.

Checkout the current project:

git clone https://github.com/apache/unomi-site

Build with Docker (recommended)

Using the bretfisher/jekyll Docker image. No local Ruby or Jekyll installation required.

docker run --rm \
  --volume="$PWD:/site" \
  bretfisher/jekyll \
  build

The generated site will be in the folder target/site.

Local development server with Docker

Serves the site at http://localhost:4000/ with live-reload on source changes:

docker run --rm \
  --volume="$PWD:/site" \
  -p 4000:4000 \
  bretfisher/jekyll-serve

Build with local Jekyll

Requires Ruby 2.7+ and Bundler. Install dependencies once, then build:

bundle install
bundle exec jekyll build

Or serve locally with live-reload:

bundle exec jekyll serve

Publish

To publish the local website to the production location (https://unomi.apache.org/), you have to use: Do not use the clean maven goal to not remove the previous generated site.

mvn install scm-publish:publish-scm -Dusername=YOUR_APACHE_USERNAME -Dpassword=YOUR_APACHE_PASSWORD