)]}'
{
  "log": [
    {
      "commit": "9da0491df662fbdd511b2dc08cf4913f2758a41d",
      "tree": "975032a06083ea5b144f36f30a160c10557832c8",
      "parents": [
        "8c979ebd0f17151076a6dc2e16de90de9199d483"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Mon Sep 21 23:02:21 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 21 23:02:21 2026 +0200"
      },
      "message": "Blog: Round 2 of the local-model benchmark, a real-world example set and 31 more Camel fixes (#1786)\n\nClaude-Session: https://claude.ai/code/session_01Bp3538HRBPMQkb5ta9xRaj\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "8c979ebd0f17151076a6dc2e16de90de9199d483",
      "tree": "f037ae524243efdd12583c2d14a9ed6e7d1359c3",
      "parents": [
        "5746f2e6175fbbaf36249d42df9c474e61f68170"
      ],
      "author": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Mon Sep 21 13:37:11 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 21 13:37:11 2026 +0200"
      },
      "message": "Added Release 4.22.1 of Camel Kamelets (#1785)\n\nSigned-off-by: Andrea Cosentino \u003cancosen@gmail.com\u003e"
    },
    {
      "commit": "5746f2e6175fbbaf36249d42df9c474e61f68170",
      "tree": "b614f4670bf5c1de7827e3fd05268736a931c4d7",
      "parents": [
        "666b2f9d90ff9fc16d1965ef925c55d8647d3dab"
      ],
      "author": {
        "name": "Ege Karaosmanoglu",
        "email": "egekaraosmanoglu@gmail.com",
        "time": "Mon Sep 21 13:03:26 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 21 12:03:26 2026 +0200"
      },
      "message": "Blog post: introduce CamelBee, route topology and message tracing for deployed Camel applications. (#1784)"
    },
    {
      "commit": "666b2f9d90ff9fc16d1965ef925c55d8647d3dab",
      "tree": "a43a9e3a1bc305e6910d1cb97ff3130c0ba30335",
      "parents": [
        "8160c2a05d881c397b1eae769d6efb7e5ddc9adc"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Sun Sep 20 18:52:55 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 20 18:52:55 2026 +0200"
      },
      "message": "Front page: the YAML tab of the Kafka to database route is written in the canonical route form (#1783)\n\nThe compact top-level from: is deprecated (camel run warns on it, CAMEL-24745), and the what-is-apache-camel page already shows the route form.\n\n\nClaude-Session: https://claude.ai/code/session_01Bp3538HRBPMQkb5ta9xRaj\n\nCo-authored-by: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "8160c2a05d881c397b1eae769d6efb7e5ddc9adc",
      "tree": "05fe1cd038c01ef8009b19c414c4514474952bd7",
      "parents": [
        "937e924ba44f792a68b8cab4c4eb05a240e2b646"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Sun Sep 20 17:00:25 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 20 17:00:25 2026 +0200"
      },
      "message": "chore: fix html checks for the Simple custom functions blog post (#1782)\n\n* chore: fix html checks for the Simple custom functions blog post\n\nThe post linked to camel.apache.org pages with absolute URLs; make them\nroot-relative like the other blog posts.\n\nThe remaining failures were trailing whitespace that is not in the\nMarkdown at all: Chroma\u0027s YAML lexer emits a whitespace token at the end\nof the last line of every literal block scalar (`key: |`). Add a\ncode-block render hook that strips trailing whitespace from highlighted\noutput, which fixes every such code sample site-wide and lets the Smooks\npost that had been excluded for the same reason come off the ignore list.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* chore: link the Simple custom functions post to the 4.22.x language docs\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* chore: link the Simple custom functions post to the next language docs\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "937e924ba44f792a68b8cab4c4eb05a240e2b646",
      "tree": "95ae2ad7aa7f035519acf77555bd23ca11054d0f",
      "parents": [
        "144016e5fc6ddb2eeb7e7c0a24f5d62cba73db15"
      ],
      "author": {
        "name": "Simon Hartl",
        "email": "78904047+SiHartl@users.noreply.github.com",
        "time": "Sun Sep 20 14:38:13 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 20 14:38:13 2026 +0200"
      },
      "message": "Add blog post Extending Apache Camel Simple with Your Own Functions (#1780)\n\n* Add blog post Extending Apache Camel Simple with Your Own Functions\n\n* Updated  blog post Extending Apache Camel Simple with Your Own Functions\n\nChange the way how it must be run as Camel 4.22.1 is already released."
    },
    {
      "commit": "144016e5fc6ddb2eeb7e7c0a24f5d62cba73db15",
      "tree": "7797eb49bda241ae5aa7ba3fe0173bf2bc67b016",
      "parents": [
        "83914a59a6193ea05aa09fabb6967b3207beaf83"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Sun Sep 20 12:49:31 2026 +0200"
      },
      "committer": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Sun Sep 20 12:49:31 2026 +0200"
      },
      "message": "chore: pin blog links to the logging and telemetry traits to camel-k 2.11.x\n\ncamel-k main dropped both traits (apache/camel-k#6805), so the\n/camel-k/next/ pages no longer exist and the link check failed.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "83914a59a6193ea05aa09fabb6967b3207beaf83",
      "tree": "7c48d2b82d882c556b6dd73698baa52360402aea",
      "parents": [
        "5d08759c5e678eee2e7d7f3d2ca7d9324850a041"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Sun Sep 20 11:40:54 2026 +0200"
      },
      "committer": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Sun Sep 20 11:41:22 2026 +0200"
      },
      "message": "ci: test camel-k redirects against the container trait page\n\ncamel-k main dropped the deprecated master trait (apache/camel-k#6805),\nso /camel-k/next/traits/master.html no longer exists and the redirect\ntest failed. Use the container trait page instead, which exists on all\ncamel-k branches the website builds.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "5d08759c5e678eee2e7d7f3d2ca7d9324850a041",
      "tree": "893dac5e4430a8310642d3089a8297e8f51138ef",
      "parents": [
        "be991e94237916c7c08e5b7ff73dbd5919c718e5"
      ],
      "author": {
        "name": "Adriano Machado",
        "email": "60320+ammachado@users.noreply.github.com",
        "time": "Sun Sep 20 04:03:29 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 20 10:03:29 2026 +0200"
      },
      "message": "Blog: keep the overlay scrollbar off the left rail\u0027s text (#1772) (#1781)\n\nThe blog rail is a fixed 240px scroll container whose content sits flush\nagainst its right edge, with the category counts pinned there by\njustify-content: space-between. Nothing reserved space for the scrollbar,\nso a browser drawing an overlay scrollbar painted it straight over the\ntext: counts clipped, pick titles wrapping a word early.\n\nThat is why only Firefox showed it. Windows 11 hides scroll bars by\ndefault and Firefox honors the setting, switching to overlay scrollbars,\nwhich take no layout width. Chromium on Windows always uses classic\nscrollbars, and those are subtracted from the content box, so they can\nnarrow the rail but never cover it.\n\nscrollbar-gutter: stable looks like the fix and is not. Per CSS Overflow 3\na gutter is only defined for classic scrollbars, so it does nothing\nagainst overlay ones. Measured on Firefox 156 with\nui.useOverlayScrollbars\u003d1, the property computes to \"stable\" and still\nreserves 0px, leaving the overlap exactly as it was.\n\nReserve the lane with explicit padding instead, through a new\n--scrollbar-overlay-lane token, paired with a matching negative margin so\nthe lane bleeds into the grid gap and the text measure does not change.\nClear space to the right of the category count, Firefox 156:\n\n  overlay scrollbars    0px -\u003e 12px   (rail text stays 240px)\n  classic scrollbars   15px -\u003e 27px   (rail text stays 225px)\n\nApply the same shape to .community-nav and the docs TOC list. Neither\ncould be made to scroll during testing, so those are latent rather than\nreported, but they are built the same way and would fail the same way.\n\n_Claude Code on behalf of Adriano Machado (@ammachado)_\n\n_This was generated by an AI agent and may contain inaccuracies.\nPlease verify before relying on it._"
    },
    {
      "commit": "be991e94237916c7c08e5b7ff73dbd5919c718e5",
      "tree": "174464fb859650267e3424989c2062d75cea4692",
      "parents": [
        "429b321a91b09188adb259d0e927611ddf86f3e5"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Fri Sep 18 20:32:36 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 18 20:32:36 2026 +0200"
      },
      "message": "chore: point links between website pages and blog posts at their Markdown mirror\n\nHugo pages link to each other by directory (../camel-dna/, /blog/2026/07/\nsome-post/), so a reader of the Markdown mirror following such a link\ngot the HTML page. Like the .html links that are already rewritten to\n.md, a directory link now gets index.md appended when that page has a\nmirror; links to list pages, redirects and external sites are left alone.\n\nCloses #1779"
    },
    {
      "commit": "429b321a91b09188adb259d0e927611ddf86f3e5",
      "tree": "0489eff2007fcb5da3ded93a6f572fa8ab56493d",
      "parents": [
        "63704a866059417eafe5cae7108075ec0fad3464"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Fri Sep 18 19:43:11 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 18 19:43:11 2026 +0200"
      },
      "message": "chore: share the page-to-Markdown converter between the page and index generators\n\nhtml-index.js carried its own copy of the content extraction and link\nrewriting in generate-markdown.js, so every fix to one had to be repeated\nin the other (most recently the eyebrow label). convertPage and\ntrimBlogPost move to gulp/helpers/convert-page.js and both generators\nuse it; the index pages also gain the jsdom repair of malformed HTML and\nthe table of contents removal that only the page converter had.\n\nCloses #1777"
    },
    {
      "commit": "63704a866059417eafe5cae7108075ec0fad3464",
      "tree": "b53d424f9042160999e707fa0efd248616f1592b",
      "parents": [
        "efc62a6dc9fff08ae758ec70618d655b05d74f50"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Fri Sep 18 19:43:06 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 18 19:43:06 2026 +0200"
      },
      "message": "ci: run the unit tests in the pull request workflow\n\nyarn test (node:test over test/*-test.js, covering the Markdown pipeline\nand the other gulp helpers and scripts) was only ever run by hand. It\nnow runs in the checks job before the site build, so a broken helper\nfails the PR in a second instead of going unnoticed.\n\nCloses #1776"
    },
    {
      "commit": "efc62a6dc9fff08ae758ec70618d655b05d74f50",
      "tree": "9f8c243a7201bdcca86e06d591d83474cffb1b6c",
      "parents": [
        "e961a0b5742be5bda18e4fd8b31d36fd68a91ac7"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Fri Sep 18 19:43:02 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 18 19:43:02 2026 +0200"
      },
      "message": "chore: add OSS Helper project rules\n\nProject-local rules for the AI Agents OSS Helper commands: repository and\nissue tracker metadata, how the site is built (Antora for the pulled\ndocumentation, Hugo for the website pages and blog, gulp post-steps) with\npointers into the README, and the branch, commit and merge conventions,\nincluding that there are no backport branches and commits are not signed.\n\nCloses #1775"
    },
    {
      "commit": "e961a0b5742be5bda18e4fd8b31d36fd68a91ac7",
      "tree": "f9c5189cba6999fcf0f2caeea6d65b2002f3e7ee",
      "parents": [
        "b1a1daf5b17ca3beaefe139bd1c6f383626a2bc8"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Fri Sep 18 16:50:12 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 18 16:50:12 2026 +0200"
      },
      "message": "chore: drop the eyebrow label above the title from the Markdown mirrors\n\nThe Antora UI renders the component title (User manual, Camel Components)\nin a div.doc-eyebrow above every page title. Converted to Markdown it\nbecame a stray line before the heading; the converter and the index\ngenerator now remove it like the other page chrome.\n\nCloses #1774"
    },
    {
      "commit": "b1a1daf5b17ca3beaefe139bd1c6f383626a2bc8",
      "tree": "07e3eb2d8432b024efd77040d4ab61b903d035eb",
      "parents": [
        "dc259de6476fb73161015de9f1173f1e63e6bc9c"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Fri Sep 18 16:50:08 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 18 16:50:08 2026 +0200"
      },
      "message": "Fix #1771: include the website pages and blog posts in the offline bundle\n\nThe bundle only zipped components/ and manual/. The \"Start here\" website\npages, the community pages and every blog post now have a Markdown mirror\nas \u003cpage\u003e/index.md, so they join the unversioned directories the bundle\ncollects; blog/index.md lists the posts. The bundle layout in llms.txt\nand the README describe the additions.\n\nCloses #1773"
    },
    {
      "commit": "dc259de6476fb73161015de9f1173f1e63e6bc9c",
      "tree": "ebec2735b68bda4c5cf09c726984cd492d7fe4a8",
      "parents": [
        "51169998a40699878dbdd911f1c4cd2022579679"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Fri Sep 18 15:55:03 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 18 15:55:03 2026 +0200"
      },
      "message": "Fix #1763: publish every blog post as Markdown at \u003cpost\u003e/index.md\n\nBlog posts are now converted from the rendered HTML like the documentation\npages, so Hugo\u0027s draft and date rules, permalinks and shortcodes are\nhonoured. The page chrome (back link, avatars, share links, table of\ncontents, previous/next, featured image, related posts) is dropped and the\ndate, authors and categories become one byline under the title. Embedded\nvideo iframes become links. The generated blog/index.md now links to\nfiles that exist.\n\nCloses #1770"
    },
    {
      "commit": "51169998a40699878dbdd911f1c4cd2022579679",
      "tree": "6b16202fe6df2ca00322e8432655d26572ad85b9",
      "parents": [
        "a1d6c2b949ce4d0cfdfa6b16e072560186c289bf"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Fri Sep 18 15:21:09 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 18 15:21:09 2026 +0200"
      },
      "message": "Fix #1762: publish a Markdown mirror of the website pages as \u003cpage\u003e/index.md\n\ngenerate-markdown skipped every index.html, which is how Hugo renders each\nwebsite page, so \"What is Apache Camel\", \"When to use\", the trust page,\nCamel DNA and the community pages had no Markdown mirror, nor had the\nAntora pages rendered as index.html. An index.html is now converted when\nit is a content page (has an article.doc); list and section pages are\nstill skipped. The mirror sits next to the page as \u003cpage\u003e/index.md so\nrelative links stay valid. The embedded table of contents is dropped, and\nllms.txt documents the rule and links the first-reader pages as Markdown\nin a \"Start here\" section.\n\nCloses #1769"
    },
    {
      "commit": "a1d6c2b949ce4d0cfdfa6b16e072560186c289bf",
      "tree": "aca7a8e76926538d6cd1271a1163dd832330df46",
      "parents": [
        "b6b8ac0be1c0f5c55c601ff17884b82d8406eca9"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Fri Sep 18 15:20:55 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 18 15:20:55 2026 +0200"
      },
      "message": "Fix #1764: generate the offline bundle list in llms.txt from the documented Camel versions\n\nThe bundle section of llms.txt was hand-written and listed only Camel 4.18\nalthough a docs-4.22 bundle has existed since August. The list is now filled\nin from the versioned component directories Antora builds\n(public/components/\u003cmajor.minor\u003e.x), so it follows the branches in the\nAntora playbook. The stale note that the 4.18 bundle lacks the YAML DSL\nschema is gone, llms.txt says next has no bundle, and the README explains\nthat the bundle workflow must be run when a new LTS branch is added.\n\nCloses #1768"
    },
    {
      "commit": "b6b8ac0be1c0f5c55c601ff17884b82d8406eca9",
      "tree": "cd14b657ac74315006f5ba2fef57eedf5f59b967",
      "parents": [
        "923f941c475688c8416510bb15f777709b9d2d3d"
      ],
      "author": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Fri Sep 18 06:58:03 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 18 06:58:03 2026 +0200"
      },
      "message": "Add blog post on authorizing AI agent tool calls with SPIFFE and OPA (#1767)"
    },
    {
      "commit": "923f941c475688c8416510bb15f777709b9d2d3d",
      "tree": "1c51c4d26ede1cb5d794b907184e0c9961fdb71d",
      "parents": [
        "79b3be04e95388a5c3abc8e5ffddeb1fc1f9f306"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Thu Sep 17 16:13:10 2026 +0200"
      },
      "committer": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Thu Sep 17 16:13:10 2026 +0200"
      },
      "message": "Add Ultimate Apache Camel for Enterprise AI Integrations to books page\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "79b3be04e95388a5c3abc8e5ffddeb1fc1f9f306",
      "tree": "4053acfbb5d7b78259f572e9cd84ffaf031e7346",
      "parents": [
        "f64db84f02797db4ab4257f84b09bc2f598ad87a"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Thu Sep 17 14:58:36 2026 +0200"
      },
      "committer": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Thu Sep 17 14:58:36 2026 +0200"
      },
      "message": "Schema in correct folder\n"
    },
    {
      "commit": "f64db84f02797db4ab4257f84b09bc2f598ad87a",
      "tree": "000dd16add1b8a8acfd00f62ba1922d4b2dac2e2",
      "parents": [
        "00a2e183f731868e7ddce9526ac9c4440f90a985"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Thu Sep 17 14:57:27 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 14:57:27 2026 +0200"
      },
      "message": "Blog: the Camel website, rebuilt for humans and for AI (#1765)\n\n* Blog: a new front page for Camel, written for humans and for AI\n\nAnnounces the website redesign with the front page and its mission as\nthe centre: what Camel is, three ways to start, one route in three\nsyntaxes, measured numbers, and the AI-ready card. Takes the rest of\nthe redesign from #1761 in short form, then the documentation work in\nprogress: build-checked code listings, the content restructure, and\nMarkdown mirrors and llms.txt for AI agents, with the website pages\nas the next step.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01Bp3538HRBPMQkb5ta9xRaj\n\n* Blog: front page post, separate the before and after screenshots\n\nThe before shot moves up next to the paragraph about the old page, the\nafter shot stays under the front page heading, each with a caption.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01Bp3538HRBPMQkb5ta9xRaj\n\n* Blog: website post, title covers the whole redesign\n\n\"The Camel website, rebuilt for humans and for AI\"; preview and\nopening lines say design instead of front page; the post directory\nfollows the title.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01Bp3538HRBPMQkb5ta9xRaj\n\n---------\n\nCo-authored-by: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "00a2e183f731868e7ddce9526ac9c4440f90a985",
      "tree": "940de48b6968b61a64737cb131c5cc205257929d",
      "parents": [
        "460829dd30b9ab65aa70c1a9315186979c45a268"
      ],
      "author": {
        "name": "Jiří Ondrušek",
        "email": "ondrusek.jiri@gmail.com",
        "time": "Thu Sep 17 14:57:16 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 14:57:16 2026 +0200"
      },
      "message": "Camel Quarkus 3.33.3 announcement blog post (#1766)"
    },
    {
      "commit": "460829dd30b9ab65aa70c1a9315186979c45a268",
      "tree": "34e18a087942d7cc84a34c63dd2202a8a5ae3c1f",
      "parents": [
        "6abe2ca1858df4c46f5f1887f7daf507a82b797e"
      ],
      "author": {
        "name": "Gregor Zurowski",
        "email": "gregor@zurowski.org",
        "time": "Thu Sep 17 11:03:34 2026 +0200"
      },
      "committer": {
        "name": "Gregor Zurowski",
        "email": "gregor@zurowski.org",
        "time": "Thu Sep 17 11:03:34 2026 +0200"
      },
      "message": "Add release notes and blog entry for Camel 4.22.1\n"
    },
    {
      "commit": "6abe2ca1858df4c46f5f1887f7daf507a82b797e",
      "tree": "6bc4e38a02100b06e6c530f085365952a7faf2e7",
      "parents": [
        "a1f71b009519f800d7c0d3c5b5d4d3cce32e7022"
      ],
      "author": {
        "name": "Gregor Zurowski",
        "email": "gregor@zurowski.org",
        "time": "Thu Sep 17 08:16:17 2026 +0000"
      },
      "committer": {
        "name": "Gregor Zurowski",
        "email": "gregor@zurowski.org",
        "time": "Thu Sep 17 08:16:17 2026 +0000"
      },
      "message": "Add XML schemas for Camel 4.22.1\n"
    },
    {
      "commit": "a1f71b009519f800d7c0d3c5b5d4d3cce32e7022",
      "tree": "48bd2cff2c2f1ac5391e26ca73c86fb2daaa6bdb",
      "parents": [
        "f7eab1dba2b91b4109dacba4cafc77231dbb7c8c"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Wed Sep 16 21:20:56 2026 +0200"
      },
      "committer": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Wed Sep 16 21:20:56 2026 +0200"
      },
      "message": "Fix link check: drop jOOR language links, fix header anchors for prefix headers\n\nThe jOOR language was removed from Camel main (superseded by the java\nlanguage), so the three 3.x blog posts no longer link to its page.\n\nHeader prefix constants such as \"CamelBox.\" and \"CamelSolrParam.\" now carry\n@Metadata, so their names end in a dot. boldLink turned that into a trailing\n\"_\" in the anchor id, and \"_..._\" inside the xref target rendered as emphasis,\nproducing a broken \"#\u003cem\u003eendpoint_header_CamelBox\u003c/em\u003e\" fragment. Strip\ntrailing underscores from the generated id.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "f7eab1dba2b91b4109dacba4cafc77231dbb7c8c",
      "tree": "fa07f23f182746d15f6d63b1555a8287c7724d76",
      "parents": [
        "90e6d93631ef5c143eb1f592a373effe13e75bf9"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Sep 15 20:36:47 2026 +0200"
      },
      "committer": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Sep 15 20:36:47 2026 +0200"
      },
      "message": "Blog: say what was wrong in the benchmark post intro\n\n\"was also wrong for a person\" left it unclear whether the model or\nCamel was wrong until the \"Who benefits\" section. Name Camel as the\nsubject up front.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "90e6d93631ef5c143eb1f592a373effe13e75bf9",
      "tree": "5599c94db07de018e014fbe3912c48a4366a312f",
      "parents": [
        "2431caa98638f5a80351b773a2acc9940751a58c"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Sep 15 15:19:03 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 15:19:03 2026 +0200"
      },
      "message": "Blog: ten posts per page, a compact post card, and a \"Start here\" list in the rail (#1756)\n\nThe blog list and category pages showed three posts per page, spreading\nthe 125 listed posts across 42 pages. Page size is now ten (13 pages) and\nthe post card is tightened so ten posts read as a list: smaller date\nblock, less padding, a 22px title, previews cut at 180 characters, and the\nredundant \"Continue reading\" link dropped.\n\nThe rail now opens with eight hand-picked evergreen posts from\ndata/blog-picks.yaml (each resolved with site.GetPage so a wrong path\nfails the build) above the categories, and scrolls in place when it is\ntaller than the viewport. The rail markup, previously duplicated in the\nblog list and taxonomy layouts, is a shared partial.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "2431caa98638f5a80351b773a2acc9940751a58c",
      "tree": "e1cc30131d090cccb68198d11a50b0cb6830b446",
      "parents": [
        "fb479f686da3e642e0bcb1b66dc67427fb7d6a5c"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Sep 15 13:48:56 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 13:48:56 2026 +0200"
      },
      "message": "Trust page: visible icons, a \"Why Camel\" top bar link, and a matching title (#1760)\n\nThe padlock, community and gear icons on /trust/ were filled white from\ntheir days as navbar icons on the dark menu bar and all but vanished on the\noff-white page; they now use the Camel orange the other trust icons use.\n\nThe page was also nearly unfindable (only \"About \u003e Trust\" in the footer).\n\"Why Camel\" is now the first item in the top bar (menu.main in config.toml,\nread by both Hugo and the Antora UI), the home page features section ends\nwith a \"Why teams trust Camel in production\" button, and the page is\nretitled \"Why Apache Camel\" with the URL kept at /trust/. llms.txt, the\nfooter and the two blog posts that link the page by name are updated.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "fb479f686da3e642e0bcb1b66dc67427fb7d6a5c",
      "tree": "b8fe8fcbe5077f483eda474f535879f9299ef0d1",
      "parents": [
        "32050f68127d70864fb3174cc4b4a5f3e0067213"
      ],
      "author": {
        "name": "Pasquale Congiusti",
        "email": "pasquale.congiusti@gmail.com",
        "time": "Tue Sep 15 13:42:33 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 13:42:33 2026 +0200"
      },
      "message": "chore(doc): security severity category align (#1759)"
    },
    {
      "commit": "32050f68127d70864fb3174cc4b4a5f3e0067213",
      "tree": "acd4834907d478f210fc7be1a44c4fa9318531ed",
      "parents": [
        "5a3f947454e8750bbbb90269c82175531091c77d"
      ],
      "author": {
        "name": "Croway",
        "email": "federico.mariani.1990@gmail.com",
        "time": "Tue Sep 15 10:35:15 2026 +0200"
      },
      "committer": {
        "name": "Federico Mariani",
        "email": "34543311+Croway@users.noreply.github.com",
        "time": "Tue Sep 15 12:55:02 2026 +0200"
      },
      "message": "fix: improve tab panel prose readability\n"
    },
    {
      "commit": "5a3f947454e8750bbbb90269c82175531091c77d",
      "tree": "4dc056d3578b6a7822b080db62b6abe2e8619c9b",
      "parents": [
        "152ec7679001ad42c8ca2133f7fddc587738cd47"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Sep 15 09:28:38 2026 +0200"
      },
      "committer": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Sep 15 09:28:38 2026 +0200"
      },
      "message": "Home page: show a camel run command that matches the selected DSL tab\n\nThe run line under the Kafka-to-database example was a single static\n\"camel run kafka-to-db.yaml\" regardless of which tab was selected. Move it\ninside each tab panel with its own file name (kafka-to-db.yaml, KafkaToDb.java,\nkafka-to-db.xml), so switching tabs switches the command too; the hidden\npanel hides its own line, the same way the copy button already works.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "152ec7679001ad42c8ca2133f7fddc587738cd47",
      "tree": "802ec1abbaa546454f288be68c4fb3d31be60eb2",
      "parents": [
        "d7f84f2501edb2c4ba93742a5bd1e6bb724ed1fd"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Sep 15 09:26:41 2026 +0200"
      },
      "committer": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Sep 15 09:26:41 2026 +0200"
      },
      "message": "Drop the Fastest / Most popular / Cloud native badges from the runtime cards on the home page\n\nFixes #1753\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "d7f84f2501edb2c4ba93742a5bd1e6bb724ed1fd",
      "tree": "3cb590ef6d48c15d45417778d741b0b0a43249a1",
      "parents": [
        "84378fc3e955011c876667a744019010812cb49c"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Sep 15 09:25:08 2026 +0200"
      },
      "committer": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Sep 15 09:25:08 2026 +0200"
      },
      "message": "Trust page and llms.txt: use the local model benchmark as evidence that AI knows Camel\n\nThe \"AI already knows Camel\" box on the trust page now cites the measured\nresults from the local model benchmark blog (frontier model 13 of 13, local\nmodel 0 to 12 of 13, 99 of 117 findings fixed for humans too in 4.23) and no\nlonger calls 4.22 LTS \"upcoming\".\n\nllms.txt gets the same evidence in Key facts, AI-Assisted Development and\nAdditional Resources, plus a \"Common mistakes\" list under the YAML DSL\nguidance built from the concrete before/after findings in the post, and two\nrecommended behaviours for agents: start from a catalog sample and apply the\nerror message literally.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "84378fc3e955011c876667a744019010812cb49c",
      "tree": "915fa40d1aa45bb34d648e022905222d52623613",
      "parents": [
        "5c1c1fda75b4afce58f7fbcd8d3730af3633e11e"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Sep 15 08:01:06 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 08:01:06 2026 +0200"
      },
      "message": "ci: evict the deadlinks archives from the yarn cache before install (#1755)\n\nBuild 2796 on websites3 failed yarn install with YN0018 (The remote\narchive doesn\u0027t match the expected checksum) for the deadlinks-macos\nand deadlinks-windows packages, while the same yarn.lock built fine in\n2795 on websites2. The archives are generated by github-release-binary.js\nand yarn caches them by locator hash only, so a node that once cached a\ndifferently-built archive keeps failing even though the lockfile is\ncorrect. Remove the three entries before yarn install so they are always\nrebuilt from the GitHub release.\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "5c1c1fda75b4afce58f7fbcd8d3730af3633e11e",
      "tree": "fc70e487930238ca45a1016f2615d86bd85e3125",
      "parents": [
        "6ac5f067ae52cf04f161b66fde2ca37db7a4a0c1"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Sep 15 06:24:10 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 06:24:10 2026 +0200"
      },
      "message": "Blog: We had a frontier AI coach a small local model through Camel (#1754)\n\n* Blog: We had a frontier AI coach a small local model through Camel. It found 99 things wrong for humans too\n* Blog: featured image for the local model post (a big camel teaching a little camel, AI-generated)\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "6ac5f067ae52cf04f161b66fde2ca37db7a4a0c1",
      "tree": "27ee4aa7579f48040301f01ced9975110cc313c1",
      "parents": [
        "3fe58f7c1f00fc7fa8c6b69fee91098ec4f90f5a"
      ],
      "author": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Mon Sep 14 11:30:18 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 14 11:30:18 2026 +0200"
      },
      "message": "Blog post: SPIFFE post, add the authorization with Open Policy Agent section (#1751)\n\nThe camel-spiffe example now decides authorization with camel-opa and\nRego policies instead of an allow-list in the properties. Update the\nexample section accordingly and add a section on the component."
    },
    {
      "commit": "3fe58f7c1f00fc7fa8c6b69fee91098ec4f90f5a",
      "tree": "377a87bd27031061f0691d3e39d0a0307cd30799",
      "parents": [
        "89f4a31e3f74f7c6685f59227e58a5966ecec440"
      ],
      "author": {
        "name": "Adriano Machado",
        "email": "60320+ammachado@users.noreply.github.com",
        "time": "Mon Sep 14 02:57:01 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 14 08:57:01 2026 +0200"
      },
      "message": "fix: repair malformed HTML before converting pages to Markdown (#1750)\n\nAsciidoctor emits mis-nested inline tags for some sources: a `*` inside\nbackticks renders as \u003ccode\u003ecore/camel-\u003cstrong\u003e\u003c/code\u003e...\u003c/strong\u003e.\nnode-html-parser drops the unmatched close tag and, at end of input,\nunwraps every unclosed ancestor including article.doc, so\ngenerate-markdown skipped the page silently and its .md mirror 404ed\n(35 pages in production).\n\nPages that node-html-parser\u0027s valid() rejects are now repaired with\njsdom\u0027s HTML5 parser before extraction, the way browsers do. The\nparseNoneClosedTags option is not enough: it keeps the unclosed \u003ccode\u003e\nopen and Turndown flattens the rest of the article into one inline code\nspan. Well-formed pages take the unchanged path.\n\nRepaired pages and pages without main content are now logged instead of\nskipped silently, so the build names the sources to fix upstream.\n\nFixes #1746\n\n_Claude Code on behalf of Adriano Machado (@ammachado)_\n\n_This was generated by an AI agent and may contain inaccuracies.\nPlease verify before relying on it._"
    },
    {
      "commit": "89f4a31e3f74f7c6685f59227e58a5966ecec440",
      "tree": "bc6f07b0a395f33e710a1aa85aea86c8343c2f22",
      "parents": [
        "34b1a678a1327611af07524886f88551f9f8ff90"
      ],
      "author": {
        "name": "Adriano Machado",
        "email": "60320+ammachado@users.noreply.github.com",
        "time": "Sun Sep 13 07:02:23 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 13 13:02:23 2026 +0200"
      },
      "message": "chore: remove redesign planning docs, drop dangling CSS comment refs, regen UI bundle (#1749)\n\n* chore: remove website redesign planning docs\n\nThe specs and implementation plans under docs/superpowers were working\nnotes for the new website design (#1740). That work has landed, so the\ndocuments no longer describe pending work and are removed.\n\n_Claude Code on behalf of Adriano Machado (@ammachado)_\n\n_This was generated by an AI agent and may contain inaccuracies.\nPlease verify before relying on it._\n\n* chore: drop CSS comment pointers to uncommitted design notes\n\nEight comments in antora-ui-camel/src/css cited .superpowers/sdd/4b/\ndesign notes (00-primitives.md and extract/*.md) that were never\ncommitted, so the pointers lead nowhere. Remove the pointers and keep\nthe reasoning each comment already states inline. Comment-only change.\n\n_Claude Code on behalf of Adriano Machado (@ammachado)_\n\n_This was generated by an AI agent and may contain inaccuracies.\nPlease verify before relying on it._\n\n* Regen for commit e83e6fb511e362bc8a81ab608874da8eff2cdfce\n\nRebuild the antora-ui-camel bundle (yarn workspace antora-ui-camel run\nbuild) after regenerating yarn.lock from scratch. The lockfile refresh\nmoves the build toolchain and vendor packages to their latest in-range\nversions, which gives new hashed site/vendor CSS and JS assets, updated\nfonts, and matching rev-manifest and partial references.\n\nThe CSS comment cleanup in e83e6fb5 does not change the bundle on its\nown: building with and without it on the same dependencies produced\nbyte-identical output.\n\n_Claude Code on behalf of Adriano Machado (@ammachado)_\n\n_This was generated by an AI agent and may contain inaccuracies.\nPlease verify before relying on it._\n\n* fix: restore CI-matching deadlinks checksums in the regenerated lockfile\n\nRegenerating yarn.lock from scratch recomputed the checksums of the\nthree @deadlinks/cargo-deadlinks* archives. The github-release-binary\nplugin builds those archives locally, and the ones built on macOS with\nNode 26 do not match what CI builds on Ubuntu with Node 22, so the PR\nchecks failed with YN0018 \"The remote archive doesn\u0027t match the\nexpected checksum\".\n\nRestore the three checksum values from 5a994408 (#1747), which CI\naccepted on a fresh fetch. The rest of the regenerated lockfile is\nunchanged, and the UI bundle does not depend on deadlinks.\n\n_Claude Code on behalf of Adriano Machado (@ammachado)_\n\n_This was generated by an AI agent and may contain inaccuracies.\nPlease verify before relying on it._"
    },
    {
      "commit": "34b1a678a1327611af07524886f88551f9f8ff90",
      "tree": "5fdcb0e1597c0261f54bb79b799800cf35856c34",
      "parents": [
        "58ce9e6594f1bf7557447509bff4f9ad4ff74431"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Sun Sep 13 07:46:34 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 13 07:46:34 2026 +0200"
      },
      "message": "ci: stop the website stage when yarn install fails (#1748)\n\nThe install and build were chained with \";\", so a failed yarn install\nstill ran yarn build-all against whatever node_modules the previous\nbuild left behind. That is how build 2786 reported a misleading gulp\n\"Did you forget to signal async completion?\" error when the real\nfailure was a YN0018 checksum mismatch during install. Chain with \"\u0026\u0026\"\nso the stage fails at the install and the log shows the actual cause.\n\n\nClaude-Session: https://claude.ai/code/session_01Ue7BFcXRDGZvRpovC3EtSR\n\nCo-authored-by: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "58ce9e6594f1bf7557447509bff4f9ad4ff74431",
      "tree": "41aac24a012de0fea1347ebc69583d65e425dcc0",
      "parents": [
        "5a994408b44471abad4743efcf6ff40dda84a658"
      ],
      "author": {
        "name": "JB Onofré",
        "email": "jb.onofre@dremio.com",
        "time": "Sun Sep 13 07:33:18 2026 +0200"
      },
      "committer": {
        "name": "JB Onofré",
        "email": "jb.onofre@dremio.com",
        "time": "Sun Sep 13 07:33:18 2026 +0200"
      },
      "message": "Publish Camel Karaf 4.18.4 release\n"
    },
    {
      "commit": "5a994408b44471abad4743efcf6ff40dda84a658",
      "tree": "fbdce868cdc0c7e1c9b15178549f35441cff9594",
      "parents": [
        "a41a415fb88c2e4214fe8a150bd3efc387fca722"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Sat Sep 12 19:38:03 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 12 19:38:03 2026 +0200"
      },
      "message": "chore: restore the deadlinks archive checksum so CI\u0027s yarn cache matches (#1747)\n\nThe website redesign (#1740) changed the exec.js stub template in the\ngithub-release-binary yarn plugin (rmdirSync -\u003e rmSync). The stub is\nwritten into the faux package archive, so the archive bytes and its\nlockfile checksum changed. Yarn names global-cache entries by locator\nhash only, so CI (and every developer who had installed before) kept the\nold archive under the same file name, and yarn install failed with\nYN0018 \"The remote archive doesn\u0027t match the expected checksum\" instead\nof refetching. On CI the install then aborted before linking, and the\nfollowing antora-ui-camel gulp build ran against stale node_modules and\ndied with \"Did you forget to signal async completion?\".\n\nRevert the stub template so a fresh fetch is byte-identical to the\ncached archive again, and recompute the three deadlinks checksums with\nthe reverted template (linux returns to its pre-#1740 value; macos and\nwindows are new entries and get their matching values).\n\n\nClaude-Session: https://claude.ai/code/session_01Ue7BFcXRDGZvRpovC3EtSR\n\nCo-authored-by: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "a41a415fb88c2e4214fe8a150bd3efc387fca722",
      "tree": "2f04b699961a7dfea81681231a7101830a59b22f",
      "parents": [
        "8184ee363186a0b5ae68f726750026af63b52eb7"
      ],
      "author": {
        "name": "Adriano Machado",
        "email": "60320+ammachado@users.noreply.github.com",
        "time": "Sat Sep 12 12:33:48 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 12 18:33:48 2026 +0200"
      },
      "message": "New website design (#1740)\n\n* docs: spec for redesign foundation (tokens and typography)\n\nPiece 1 of 6 of the camel-website redesign. Covers the font migration\nto self-hosted Archivo and JetBrains Mono, the palette swap at :root in\nvars.css, and the container widths.\n\nRecords three decisions the design handoff left open: splitting\n--heading-font-weight and --code-font-color where a single token was\nasked to carry two values, diverging the marketing container (1200px)\nfrom the docs article area (1366px), and deferring the dark syntax\nhighlighting theme to its own piece.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* docs: stack piece 6 on piece 1 in the foundation spec\n\nPiece numbers become identities rather than sequence; landing order is\n1, 6, 2, 3, 4, 5 so the branch is never reviewable with broken code\nblocks. SCOPE.md section 2a now specifies the dark hljs theme and the\nchroma mapping, so piece 6 is a spec rather than an open decision.\n\nRecords that piece 1 cannot merge on its own as a result.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* docs: implementation plan for redesign foundation (piece 1)\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* docs: apply pre-flight rulings to the foundation plan\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* build(ui): add Archivo and JetBrains Mono webfonts\n\n* style(ui): switch monospace to JetBrains Mono, add Archivo display family\n\n* style(ui): declare the redesign color palette\n\n* style(ui): set marketing containers to 1200px, keep docs at 1366px\n\n* style(ui): repaint the site onto the redesign palette\n\n* style(ui): fix ink-on-ink code blocks in Hugo pre\u003ecode content\n\nHugo\u0027s chroma highlighter puts the .highlight class on the wrapping\ndiv, not the pre, so .doc pre:not(.highlight) matches the pre itself\nwhile base.css\u0027s code,kbd,pre rule still paints the nested \u003ccode\u003e\nwith --code-font-color (now ink) directly on the element, beating the\ninherited --pre-font-color. Add a minimal .doc pre code { color:\ninherit; } rule, specific enough to beat base.css\u0027s group rule but not\nthe higher-specificity .doc pre.highlight code branch.\n\n* style(ui): repair surfaces broken by the palette repaint\n\n* style(ui): drop ASF blue from the download badge and restore table striping\n\n* style(ui): repaint link underlines and fix quote attribution contrast\n\n* docs: record open items after piece 1 implementation\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* chore: regen antora-ui bundle for the redesign foundation\n\nRebuilt from committed source only. The projects.css import was\ntemporarily removed for this build so the tracked bundle matches\ntracked source; that work is still in progress and untracked.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* docs: update open items after a clean Hugo build\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* style(ui): darken link colors to clear WCAG AA\n\n`--color-orange-deep` (#c95f12) measured 3.83:1 on --color-paper and\n3.55:1 on --color-paper-2, below the 4.5:1 threshold for normal text.\nLinks land on both surfaces, so both were held to it. Hover was worse:\n--color-camel-orange at 2.74:1, and lighter than rest, so hovering\nweakened the link rather than strengthening it.\n\nRest becomes #a84e0d (5.22 / 4.84) and hover a new --color-orange-deeper\nat #853c09 (7.42 / 6.87). Both keep hue 25deg and ~92% saturation, so\nthey are lightness steps down the existing brand ramp, not a new color.\n--color-camel-orange is untouched and stays the primary brand orange.\n\nBoth values deviate from SCOPE.md section 2 and were approved by the\ndesign owner. The reasoning is commented at each declaration site.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* style(ui): theme syntax highlighting for the dark code ground\n\nPiece 1 set --pre-background to --color-ink but left highlight.css on the\nGitHub light theme, so highlighted code rendered dark-on-dark. This closes\nthat window, per SCOPE.md section 2a.\n\nColors live in vars.css as --syntax-*, one token per row of section 2a,\nbound by both highlighters so they cannot drift apart. Every value clears\n4.5:1 on #211c17.\n\nhighlight.css keeps its selector groups and swaps hardcoded hex for tokens.\nchroma.css is new: Hugo emits chroma classes for blog code fences and the\nrepo had no chroma stylesheet at all, so those blocks were never highlighted.\n\nTwo bindings section 2a implies that were not in place:\n\n- --pre-font-color moves off --color-on-dark (#faf7f1) to --syntax-text\n  (#f0e9df). Section 2a reserves #faf7f1 for .hljs-title, so sharing one\n  value made titles indistinguishable from body text.\n- --syntax-font-weight-strong is 600. --monospace-font-weight-bold is 500\n  and has other consumers, so it could not be reused.\n\nThree class collisions needed language scoping, since one class carries two\nmeanings in the same highlighter:\n\n- .hljs-meta is the shell prompt in shell/console/shellsession and Java\n  annotations elsewhere.\n- chroma .nt is a YAML or JSON key but an XML tag.\n- chroma .l is an unquoted YAML scalar, which highlight.js calls a string.\n\nSection 2a has no row for bare .hljs-attr, which is YAML and JSON keys\nacross roughly 5600 blocks. It takes the attr color so those keys read\nconsistently with XML attributes.\n\nVerified by rendering real code blocks from the built tree in headless\nChrome, with the real bundle, across java, xml, yaml, json, shell, console,\nproperties and sql on both highlighters.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* chore: regen antora-ui bundle for links and syntax highlighting\n\nCovers the two source commits since the last regen, 37e661f2 (link colors)\nand a692460a (syntax highlighting). site-a08aeff1d4.css becomes\nsite-4cf1bc34cd.css.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* docs: design for shared chrome (piece 2)\n\nHeader, footer and buttons across both template systems.\n\nThe finding that shapes the piece: layouts/partials/footer.html and\nantora-ui-camel/src/partials/footer-content.hbs are supposed to be the\nsame markup and have already drifted in five ways. Rather than rewrite\nboth by hand, the footer content moves into data/chrome.yaml, read\nnatively by Hugo and by a new withChromeData.js helper that mirrors the\nexisting withMenuData.js. Neither js-yaml nor toml is a new dependency.\n\nRecords five rulings from the design owner where SCOPE.md section 3 is\nsilent or self-contradictory: search stays in the header, Trust moves to\nthe footer, the header keeps GitHub only, the CTA reads Get Started on\nthe home page and /projects/, and the footer takes five columns because\n\"4 columns\" and \"same link set as today\" cannot both hold.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* docs: implementation plan for shared chrome (piece 2)\n\nSeven tasks: chrome data file and Antora helper, footer markup, footer\nCSS, header menu and markup, header CSS, buttons, then bundle regen and\nfinal verification.\n\nThree findings from reading the code shape the plan and are recorded as\nglobal constraints:\n\n- algoliasearch.bundle.js assigns container.className wholesale at four\n  points, so #search\u0027s parent must carry exactly \"navbar-search\n  results-hidden\" and no other class, or it is erased on first use.\n- yarn build:antora cannot run here, so every Antora assertion renders\n  the handlebars partials directly with the handlebars already in\n  node_modules. Proven against the current footer-content.hbs.\n- yarn is not on PATH; the plan uses the vendored .yarn/releases binary.\n\nThe load-bearing check is Task 2: extract the footer link set from a\nbuilt Hugo page and from a directly rendered Antora partial, sort, and\ndiff. It fails today on all five divergences.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* feat(chrome): single source the footer content\n\n* feat(chrome): render both footers from the shared data\n\n* fix(chrome): preserve the handlebars data frame in withChromeData\n\noptions.fn(this, { data: {...} }) was replacing the block\u0027s data frame\nwholesale, dropping inherited private variables such as @root. Merge\nonto options.data instead so {{@root.uiRootPath}} keeps working inside\nthe block (needed by the footer logo and social icon asset paths).\n\n* style(chrome): paint the five column footer on ink\n\nReconciles the pre-existing footer.css cascade with the new\nfooter-brand/footer-column markup instead of appending beside it:\nretargets the dt/dd rules onto .footer-column so they actually win,\nscopes footer .footer p to p.remark so .footer-blurb is not\noverridden, and gives p.remark/.resources/.footer-icons an explicit\ngrid-column so they still span the row now that flex-basis is inert\nunder the new grid. Drops the dead figure.logo and dl:first-child\nrules the markup no longer produces. Also collapses the grid to a\nsingle column in the existing mobile media query, since the grid\nStep 2 introduces has no responsive variant of its own and the old\nflex-basis: 100% no longer stacks the accordion columns.\n\n--footer-height is bumped from 23rem to 40rem to match the measured\nheight of the five-column layout.\n\n* fix(chrome): stop --footer-height forcing an empty mobile ink band\n\nDeletes min-height: var(--footer-height) from the footer rule in\nfooter.css. At desktop the five-column content already renders taller\nthan any reasonable token, so the floor never bound there; at narrow\nwidths, where the accordion collapses columns to their dt labels, it\nwas forcing extra empty ink regardless of actual content height.\n\n--footer-height now serves only body.css\u0027s sitewide min-height calc,\nand is set to 39rem: measuring the footer\u0027s real rendered height in\npixels at 1400px (716px, root font-size 18px), 1000px (933px), and\n390px (964px, root font-size 17px below the 1025px breakpoint) shows\nthe desktop figure is the binding constraint once the differing root\nfont-size is factored in, not the mobile one, despite the mobile\nfooter being visually the shorter layout post-collapse. Rounded down\nfrom the desktop bound so the token stays a safe underestimate at\nevery width.\n\n* feat(chrome): rebuild the header markup in both template systems\n\nReduce menu.main from seven items to five, reorder them, and drop the\nper-item pre icons. Rebuild layouts/partials/header.html and\nantora-ui-camel/src/partials/header-content.hbs onto a shared\ndiv.navbar-inner container with a single GitHub icon and a\nDownload/Get Started CTA. Drop the now-unused pre field from\nwithMenuData.js so both template systems stay in sync with config.toml.\n\n* docs: reconcile the shared chrome spec with the design artboards\n\nThe artboards arrived after the spec was written, in\nApache Camel website reference.zip. The spec asserted they were unavailable\nand derived everything from SCOPE.md prose, so that claim is corrected and\nthe measured deltas are recorded for the header and the footer.\n\nThe artboards confirm the five-column footer resolution: the design really\ndoes show four columns with no Documentation column, so the conflict with\ntoday\u0027s link set was real.\n\n* style(chrome): reconcile the footer with the design artboard\n\n* docs: record Task 4R, the footer artboard reconciliation\n\n* fix(chrome): stop the footer legal rule double-counting the grid row-gap\n\n* style(chrome): repaint the header as a 66px paper bar\n\nRepaints the header for the new markup from the previous task: a\n66px blurred paper bar, brand, link, actions cluster, search, and\nmobile menu drop-down. Also removes header rules the new markup made\nunreachable (nav-logo, navbar-end, navbar-fill, break-row, navbar-tools,\nthe old orange mobile tiles) and two that actively conflicted with the\nnew unconditional .navbar-menu/.navbar-item and \u003e\u003d1025px stretch rules.\n\nApplies artboard overrides beyond the prose brief: 28px navbar-inner\ngap, 11px brand gap, wordmark letter-spacing, and the CTA\u0027s 9px/18px\npadding with 7px radius via a.button.navbar-cta (R16), which beats\nfrontpage.css\u0027s a.button base rule on specificity.\n\n* fix(chrome): make the header actions cluster fit on phone widths\n\nFix round 1 for Task 5, addressing three findings from review.\n\nFinding 1 (R17): below 1024px the search field now shrinks with the\nbar (min-width:0, input width:100%) instead of holding a fixed 200px.\nMeasurement showed that even fully shrunk, search+GitHub+CTA+burger\nstill overflow below ~451px, so a second breakpoint at 500px (chosen\nby measurement, not the 640px estimate) drops search and GitHub\nentirely there. Measurement also showed the burger itself was\ncollapsing to 0 width under flex-shrink at very narrow widths and,\nseparately, that brand+CTA+burger alone still overflow a 390px phone\neven with search/GitHub gone; fixed with flex-shrink:0 on the burger\nand hiding the wordmark (logo mark only) in the same \u003c\u003d500px query.\nVerified onscreen and hit-testable at 390, 414, 500, 501, 768, 1024px.\n\nFinding 2: deleted the legacy .navbar .button rule, which no longer\nmatches any element other than the CTA and was clamping its height to\n1.75rem (a visible squash under R16\u0027s 9px vertical padding) and adding\na stray 1px border the artboard doesn\u0027t show. Confirmed via computed\nstyle: height is no longer clamped, border is gone, R16\u0027s padding and\nradius still apply. Left --navbar-button-background/-border-color/\n-font-color declared in vars.css though nothing consumes them now;\ndeciding their fate is out of scope here.\n\n* fix(chrome): fix search panel positioning, burger centering, and a11y regression\n\nFix round 2 for Task 5, addressing three Important findings and three\nMinor cleanups from review.\n\nFinding 1: removed position:relative from .navbar-search. It had made\nthe field the containing block for the absolutely positioned\n#search_results, so the panel\u0027s top/left/width offsets (authored\nagainst .navbar, which is position:fixed) resolved against the wrong\nbox: the panel opened ~16px below the header instead of flush, and at\n501-1024px it started at the field\u0027s left edge and ran off-screen\ninstead of spanning the viewport. Verified with the panel forced\nvisible: flush at y\u003d66 at 1400px, and anchored to the viewport\n(left:0, width clamped to 600/540px by its own max-width rule) at\n768px, 1024px and 600px.\n\nFinding 2: replaced the burger\u0027s top:0.75rem with a measured top:-2.1px.\nThe span geometry (top:60% plus fixed, unscaled -10/-3/+4px margins)\nputs the glyph\u0027s optical center below the button\u0027s own vertical\ncenter by a fixed amount, not a percentage of the button\u0027s height, so\na percentage-of-burger-height offset (the reviewer\u0027s suggested\ncalc(var(--navbar-burger-height) * -0.1)) overshoots. Measured before\nand after: glyph center was 3px off in the original direction and the\nsuggested formula moved it 3px off the other way; -2.1px lands the\nglyph within 0.01px of the bar\u0027s centerline and clears the bar\u0027s\nbottom edge by ~8px (previously overhanging by design intent, now\ncorrected) at both 390px and 1024px.\n\nFinding 3, Ruling R19: swapped the wordmark\u0027s display:none for a\nvisually-hidden clip (position:absolute, 1x1px, clip-path:inset(50%)),\nkeeping it in the accessibility tree since both templates give the\nlogo image alt\u003d\"\" and rely on the wordmark to name the brand link;\nthe Antora template has no title/aria-label fallback. Moved the rule\ninto its own @media (width \u003c\u003d 430px), off the 500px breakpoint it had\nbeen riding on, per the measured table showing 430px already has the\nfull 30px padding margin to spare.\n\nAlso deleted three now-unreachable rules while already in this file\nfor the above: the duplicate .navbar-burger{display:block} in the\nolder mobile block, .navbar-brand{flex-wrap:wrap} (brand is flex:none\nwith two nowrap children), and .navbar-brand .separator (matches no\nelement in either template).\n\nConfirmed unchanged: CTA font-weight computes to 700 (inherited from\nfrontpage.css\u0027s a.button, matching the artboard) - no action needed.\n\n* style(chrome): square off the button radius and drop dead selectors\n\nRestyle .button.dark and .button.light per the artboard (8px radius,\n13px/24px padding, 15px base / 15.5px hero, inline-flex with an 8px\ngap for trailing arrows), split the dark hover state out of the base\nrule so it is reachable, and add .button.on-dark for later dark-band\nwork. Delete the dead .button-light/.button-dark hyphenated selectors,\nwhich matched nothing in the repo. Guard the new font-size against\na.button.navbar-cta so the header CTA keeps its own inherited size.\n\n* fix(chrome): move the navbar-cta font-size pin to header.css\n\nPin a.button.navbar-cta\u0027s font-size in header.css alongside the padding\nand border-radius it already owns, instead of excluding it with\n:not(.navbar-cta) in frontpage.css\u0027s shared button rule. That inverted\nthe dependency (a generic rule naming a specific consumer) and would\nnot have scaled to a second variant. Ordinary specificity (0-0-2-1\nbeating 0-0-1-1) now handles font-size the same way it already handles\npadding and radius.\n\n* chore: regen antora-ui bundle for the shared chrome\n\n* docs: record open items after piece 2 implementation\n\n* fix(chrome): single-source header menu ordering and fix inert declarations\n\nwithMenuData.js preserved config.toml\u0027s file order instead of sorting by\nweight, unlike Hugo\u0027s own menu ordering. Sort ascending by weight (missing\nweight treated as 0) at both the top level and children, so the header\ncannot silently diverge from Hugo on a weight-only reorder. Also merge\nonto the inherited Handlebars data frame instead of replacing it, matching\nwithChromeData.js, so @root survives inside the block.\n\nMinor cleanup from the final review: drop two --navbar-mobile-height\noverrides in header.css that now duplicate the base rule (deleting the\nnow-empty media block), a raw 15px font-size in footer.css that the\ntoken rewrite missed, and two inert declarations in header.css\n(text-transform: none on .navbar-item, order: 8 on .navbar-burger).\nAdd aria-label\u003d\"Header\" to the Antora header partial to match Hugo\u0027s.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* docs: correct record errors found in the final review\n\n- Remove the plan\u0027s stale open item claiming p.remark keeps\n  padding: 0 1rem; that rule was rewritten during the artboard\n  reconciliation and no longer exists.\n- Reword the orphaned-token count: six navbar tokens were newly\n  orphaned by this piece\u0027s header rewrite, --navbar-hover-background\n  was already orphaned before it, and --footer-link-font-color\n  (vars.css:192) was missing from the count entirely.\n- Fix the spec\u0027s decision 6, which still specified calc(25 / ...)\n  horizontal button padding; the code and the spec\u0027s own artboard\n  reconciliation section both say 24.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* chore: regen antora-ui bundle for the final fix wave\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* docs: spec the Antora docs UI redesign\n\nPiece 3 of 6. Covers the nav panel, toolbar, article, TOC, tabs and\npagination, plus a committed local Antora build harness that closes the\nverification gap piece 2 shipped with.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* docs: plan the Antora docs UI redesign\n\nTen tasks. Task 1 lands a local Antora build harness so every later task\nis measured on a real rendered page.\n\nFour spec corrections found by rendering the fixture are applied to the\nspec in the same change: the table header and pagination eyebrow move off\n--color-ink-muted, which fails contrast at those sizes; header.css is\ntouched after all; pagination needs :page-pagination:; and\nextensions/table.js makes .doc .admonitionblock \u003e table a dead selector.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* test: add a local Antora build harness for UI work\n\n* docs: fix six defects found in the piece 3 plan pre-flight scan\n\nA hint-hiding selector rooted at .navbar-search could never reach\n.nav-search-hint, which is its sibling. Two tasks would have added\nduplicate CSS selectors, failing stylelint\u0027s no-duplicate-selectors.\nTwo grep expectations were miscounted. Task 7\u0027s margin-collapse\nfallback is widened from a last resort to a live option.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* style(docs): retarget tokens for the docs UI redesign\n\n* feat(docs): move site search into the documentation nav panel\n\n* docs: correct the stylelint constraint in the piece 3 plan\n\nThe plan named two disabled rules; .stylelintrc disables five and\ncustomizes a sixth. It also failed to warn that\ndeclaration-block-no-redundant-longhand-properties is live, which\nalready forced one disclosed deviation in Task 3.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* style(docs): repaint the documentation nav panel\n\nSwitch the nav tree to flex sizing so the search row, tree, and pinned\ncontext bar share the panel height instead of guessed pixel math, and\nretire the two now-dead --nav-panel-height tokens. Restyle the tree\nrows, current-page highlight, indent, caret, and context bar to match\nthe redesign.\n\nFix a specificity bug the new rules exposed: .nav-menu a.nav-link\n(0,2,1) was beating .is-current-page \u003e .nav-link (0,2,0), silently\ndropping the current-page color and font-weight. Add the \"a\" type\nselector to the current-page rule so it ties on specificity and wins\non source order, without changing any of the brief\u0027s color or weight\nvalues.\n\nRaise the caret opacity from 0.7 to 1: even fully opaque, caret.svg\u0027s\nown fill (#c1c1c1) reads lighter than the design\u0027s ink-muted target\n(#8a8074), so 1 is the closest this token-only change can get; full\nfidelity needs the SVG recolored, which is out of this task\u0027s scope.\n\n* fix(docs): keep the current-page pill on hover, recolor the caret\n\nThe current-page rule tied .nav-menu a.nav-link on specificity but the\nplain hover rule (0,3,1) still outranked it (0,2,1) outright, so\nhovering the active nav item dropped the orange pill for the grey\nhover box. Add a rule scoped under .nav-menu and .is-current-page\ntogether, reaching (0,4,1)/(0,4,0), so it outranks the hover rule\nnumerically rather than by source order. It keeps the orange tint\nbackground and deepens the text to --color-orange-deeper.\n\nRecolor caret.svg\u0027s fill/stroke from #c1c1c1 to #8a8074 so the caret\nrenders at the design\u0027s ink-muted target directly, per the caret\ninvestigation in the task 4 report. With the asset now the target\ncolor, opacity: 1 on .nav-item-toggle is a no-op default; removed\nrather than left looking deliberate.\n\n* docs: carve out non-layout pixel values in the piece 3 plan\n\nThe constraint said \"never raw px\" with no exception for hairline\nborders, which raw 1px solid already is in 17 places across six\nstylesheets, including files pieces 1 and 2 shipped. Scaling a hairline\ncomputes to 1.06px at the 17px mobile root and renders blurry. Filter\nradii and border-tracking offsets are exempt for the same reason.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* style(docs): repaint the documentation toolbar\n\n* style(docs): grid the article column and repaint the TOC\n\n* style(docs): mutually exclude TOC hover and active states\n\n* docs: fix an impossible width expectation in the piece 3 plan\n\nTask 6\u0027s measurement table paired a 1400px viewport with a 1180px\ncontent width. The nav panel is a fixed 280px, so the cap is only\nreachable at 1460px. At 1400px the correct measurement is 1120px.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* docs: drop the flex eyebrow approach from Task 7\n\nMaking .doc a flex container turns .sect1 into a flex item, which\nestablishes a block formatting context and stops its first child\u0027s\nmargin collapsing through it. .sect1\u0027s 36px margin-top and the h2\u0027s\n44px would then sum to 80px at every section boundary instead of\ncollapsing to 44px, on every docs page and the eight-plus Hugo pages\nsharing .doc.\n\nThe eyebrow now precedes the h1 in the DOM and the two :first-child\nqualifiers on the .doc half are dropped. article.hbs renders h1.page\nonce, so they only ever described position.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* style(docs): repaint article typography, code blocks and lists\n\nTask 7 of the Antora docs UI redesign: headings, eyebrow, lead\nparagraph, body text, inline code, code blocks and lists in doc.css,\nplus a doc-eyebrow element in article.hbs that precedes h1 in normal\nblock flow (no flex, no DOM reorder) so section-boundary margins keep\ncollapsing to 44px instead of summing to 80px.\n\n* style(docs): card tables and admonitions\n\n* fix(docs): top-align the admonition chip pill\n\nvertical-align: top on td.icon only positions the cell box within the\nrow; the inline-block chip inside it still defaulted to baseline,\nleaving a ~5px gap above the pill relative to the content cell. Add\nvertical-align: top to the pill itself to close the gap.\n\n* docs: add the orphaned-token cleanup to Task 9\n\nTasks 5, 7 and 8 each removed the last consumer of one or more tokens,\nand Task 9 step 1 removes the last two consumers of\n--toolbar-muted-color. Eleven tokens in total. The cleanup lands last\nso each is provably dead when deleted, and the step re-verifies rather\nthan trusting the list.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* style(docs): repaint pagination and put code tabs on dark\n\n* chore(docs): drop tokens orphaned by the docs UI repaint\n\n* docs: widen the pixel exemption to 2px rule and indicator widths\n\nThe exemption named only 1px hairline borders, so Task 9\u0027s 2px tab\nunderline read as a violation. Every 2px rule in the tree is plain px\nwithout exception, including toc.css\u0027s border-left approved three tasks\nearlier and footer.css\u0027s underline shipped in piece 2. A 2px indicator\nmarks a boundary or a state; it does not participate in the type ramp.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* chore: regen antora-ui bundle for the docs UI redesign\n\n* docs: record corrections and open items for the docs UI redesign\n\n* fix(nav): restore search-cancel, results z-index, and scroll behavior\n\nTask 3 scoped header.css\u0027s search layout rules under .header when it moved\nsite search into the docs nav panel, which dropped properties the nav copy\nalso needed:\n\n- #search-cancel had no display:none / sizing, so cancel.svg (a 64px opaque\n  orange circle) rendered at full size over the search field on every load.\n- #search_results had no z-index, so the nav tree (a later, position:relative\n  sibling) painted and hit-tested on top of the left ~264px of every result\n  row.\n- #search_results had no max-height/overflow-y, so results past 80vh were\n  unreachable.\n\nRestores the three properties directly on .nav-search\u0027s own selectors,\nincluding a consumer for the previously orphaned --z-index-nav-search token.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(nav): drop dead margin-top rule causing a 62px mobile drawer gap\n\nThis media rule predates the redesign, from when .nav-panel-menu was the\nfirst child of .panels. .nav-search now precedes it and .panels is a flex\ncolumn, so the margin cannot collapse: it left a 62px blank band between the\nsearch field and the tree at \u003c\u003d1024px, which also cost the tree 62px of\nscroll height.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(doc): stop callout lists getting a stray card, restore nested admonition padding\n\nextensions/table.js wraps every \u003ctable\u003e in .table-wrapper, and Asciidoctor\nemits a table for callout lists (colist), so the new .doc .table-wrapper card\nwas reaching annotated source blocks too. Cancel it the same way the\nadmonition case is already cancelled.\n\nSeparately, .doc table.tableblock .admonitionblock / .ulist .admonitionblock\n/ .olist .admonitionblock zeroed padding to stop a nested admonition\ninheriting outer spacing, but it now beats the admonition card\u0027s own padding,\nso a NOTE/TIP/etc. inside a list item or table cell rendered flush against\nits card border. Restated the card\u0027s own padding for those three contexts\nrather than narrowing the selector, since the selector still has a legitimate\nreason to single out .admonitionblock in these nesting contexts and only the\nvalue was wrong.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(main,sitemap): make the docs grid single-column by default\n\nmain.article was not a reliable Antora discriminator: layouts/sitemap/\nsitemap.html also rendered \u003cmain class\u003d\"article\"\u003e, so the Hugo sitemap page\nwrongly took the docs grid (1180px cap instead of the 1200px static width,\nplus a 220px empty second column). Drop the class there -- it\u0027s the only\nHugo layout that used it, and it has no aside.toc.sidebar, so this makes the\nCSS discriminator actually true.\n\nSeparately, 02-on-this-page.js removes aside.toc.sidebar on pages with no\nqualifying headings, but the grid still declared two tracks plus a gap,\nleaving 316px of dead space on component landing pages and stubs. The grid\nis now single-column by default and only adds the second track via\n:has(\u003e aside.toc.sidebar), so it re-evaluates when the script removes the\naside.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* chore(vars): drop four more tokens orphaned by the docs UI repaint\n\nTask 9\u0027s verification loop checked a hardcoded list and missed these:\n--pre-border-color, --toc-border-color, --toc-heading-font-color, and\n--color-jet-80. Re-verified each has zero remaining consumers under\nantora-ui-camel/src, layouts, assets, and static before deleting.\n\n--z-index-nav-search was also on this list but is kept: the nav search fix\nin this same pass gives it a consumer again (#search_results\u0027s z-index).\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(tests): harden the antora-ui fixture build script\n\n- Add cd \"$REPO\" after REPO is computed: running the script from anywhere\n  else died with \"Cannot find module \u0027js-yaml\u0027\".\n- Add --no-verify to both fixture git commits so a slow or failing global\n  pre-commit hook can\u0027t break the harness under set -e.\n- The sed that creates the second fixture version hardcoded \u00274.18\u0027. If the\n  fixture\u0027s version ever changes, the sed would silently no-op, the v4.17\n  branch would become a duplicate of HEAD, and page-versions coverage would\n  disappear with no error. Now verifies the substitution actually changed\n  the file and exits non-zero with a clear message if it did not.\n- Note that ui.bundle.url points at the committed antora-ui-camel/public/_,\n  not src/, so a stale bundle means measuring stale CSS.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* chore: regen antora-ui bundle for the final review fix wave\n\nRegenerates antora-ui-camel/public/_ from src/ after the C1-C3, I1-I2, I5-I6\nfixes and the I3/I4 grid change, since the previously committed bundle no\nlonger matches source. Built twice in succession and diffed public/ between\nruns to confirm the bundle is reproducible (no differences).\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* docs: spec the home page redesign (piece 4a)\n\nRescopes piece 4 to the Home page plus the /projects/ page it links to,\nper the design owner\u0027s decision to ship Home first and reassess.\n\nRecords four decisions that deviate from the design reference, each with\nits measurement:\n\n- The four headline stats are verified against apache/camel rather than\n  copied. Two of the design\u0027s figures overstated the project (100k+ vs\n  83,428 commits; 1,600+ vs 1,583 contributors) and one understated it\n  (311 vs 398 components).\n- Neutral muted labels move from the design\u0027s #7a7164 to --color-ink-soft;\n  #7a7164 reaches only 4.16:1 on paper-2 and 4.49:1 on paper.\n- The handoff\u0027s layouts/projects/list.html does not build: it calls\n  .Site.Data as a function. The line is unused and gets deleted.\n- The hero copy button needs its own JS; 06-copy-to-clipboard.js is\n  hard-scoped to Antora listing blocks and cannot match it.\n\nAcceptance for every task is a measurement AND a screenshot. Piece 3\nshipped three Criticals that property measurement could not see.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* docs: plan the home page redesign (piece 4a)\n\nTwelve tasks: a build and screenshot harness, the /projects/ page, a single\natomic switchover to data-driven content, then one section per task so every\nintermediate state is a valid shorter home page.\n\nSix defects in the plan were found and fixed before dispatch, recorded in a\nPre-flight Corrections section so a reviewer can tell a correction from an\noversight. The two that would have cost the most:\n\n- The hero template called .Site.Data inside a `with` block, where the dot is\n  rebound to the hero map. The rev-manifest lookup would have failed the build.\n- Task 11 told the implementer to edit `.header #search`, which does not exist.\n  The field is styled by `.header .navbar-search input`. Following the original\n  text would have added a competing id-specificity rule instead of editing the\n  real one, which is the same class of defect that produced piece 3\u0027s three\n  Criticals.\n\nEvery task ends with a measurement AND a screenshot that gets opened.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* test(hugo): add a build and screenshot harness\n\nBuilds the site with an authenticated token resolved from gh, fails loudly\non any Hugo error, and serves the output for screenshots and computed-style\nmeasurement. Without a token the build exits non-zero with about 32 getJSON\nrate-limit errors, so the harness owns the token rather than each caller.\n\n_measure.html reads computed styles from a same-origin iframe so measurement\nneeds no browser-automation dependency.\n\n* fix(hugo-harness): detect a squatted port instead of measuring stale content\n\nstart_server\u0027s readiness loop only checked that something answered on the\nport, so an already-occupied port let curl succeed against someone else\u0027s\nserver while our own python3 failed to bind, and the harness exited 0\nhaving screenshotted or measured unrelated content instead of the built\nsite. It now confirms the spawned SERVER_PID is both alive and the actual\nlistener on the port (via lsof) before declaring the server ready, and\nfails loudly, naming the port, when it is not.\n\nAlso verified the fail-loud path fires for real: with GITHUB_TOKEN unset\nand gh made unresolvable via PATH, the unauthenticated build hits the\ngetJSON rate limit and the harness exits non-zero.\n\n* feat(projects): add the All Camel Projects page\n\nLands the handoff\u0027s pre-written /projects/ slice with three corrections:\n\n- layouts/projects/list.html called .Site.Data as a function, which aborts\n  the Hugo build. The variable was never read; the line is deleted.\n- The article carried both \u0027static\u0027 and \u0027projects\u0027. static.css has\n  \u0027.static p\u0027 at (0,1,1), which beats every card paragraph rule at (0,1,0),\n  so every card paragraph took the wrong margin. \u0027static\u0027 is dropped.\n- The page-scoped --projects-* vars are replaced by the shared tokens. The\n  muted text color maps to --color-ink-soft rather than --color-ink-muted;\n  all five consumers are small informational text and #8a8074 reaches only\n  3.35:1 on paper-2.\n\n* fix(tests): sync the antora-ui bundle into documentation/_ before Hugo builds\n\nconfig.toml serves the site\u0027s \"_\" assets from documentation/_ (staticDir\nincludes it, and the \"data\" module mount reads rev-manifest.json from\nthere), but \"yarn workspace antora-ui-camel run build\" only writes to\nantora-ui-camel/public/_. Nothing connected the two, so the harness could\nbuild successfully and report confident computed-style values against a\nstale bundle: Task 2 hit exactly this, where a CSS retarget produced\ncorrect diffs but wrong --measure output until the bundle was manually\ncopied over.\n\nBefore Hugo runs, copy css/js/img/font/data from antora-ui-camel/public/_\ninto documentation/_, refusing to run if the bundle\u0027s rev-manifest.json is\nmissing, and failing loudly if anything under antora-ui-camel/src is newer\nthan that manifest, so a future task cannot edit CSS, forget to rebuild the\nbundle, and get a green result from stale output.\n\n* feat(home): move the front page onto data and rebuild the hero\n\nReplaces 250 lines of nested section/div/icon shortcodes in content/_index.md\nwith data/home.yaml plus a real template. content/_index.md keeps only its\nfront matter.\n\nfrontpage.css is rewritten. The a.button rules stay, since the header and five\ncontent pages consume them; everything else goes, including the\n\u0027text-transform: uppercase\u0027 on section.frontpage headings that was shouting\nevery h1 and h2 on the page.\n\nAdds four tokens for design values used more than once and with no existing\ntoken: --color-dark-3, --color-prompt, --color-on-dark-dim, and\n--color-button-on-dark-border. The last replaces --color-dark-line on\n.button.on-dark, which was nearly invisible against ink.\n\n* feat(home): add the stat strip\n\nShips the four figures verified against apache/camel on 2026-09-04 rather\nthan the design reference\u0027s illustrative numbers, which overstated commits\n(100k+ against 83,428) and contributors (1,600+ against 1,583) and\nunderstated components (311 against 398).\n\nStat labels take --color-ink-soft. The design\u0027s #7a7164 reaches only 4.16:1\non paper-2 at 12px.\n\n* fix(home): clear .footer-tools on .home, not the stat strip\n\nfooter.css pulls .footer-tools up 2rem (36px at --rem-base: 18) into\nwhatever ends \u003cmain\u003e. The stat strip\u0027s own bottom padding is only 30px,\nso the utility line (\"Edit this Page / Back to top\") painted onto the\nstrip\u0027s --color-paper-2 band instead of the plain page background.\n\nPadding the stat strip itself would only move the problem: .home-stats\nis the last child of \u003cmain\u003e only until later tasks append more sections,\nat which point the same overlap would land on whatever section is last,\nincluding the dark .home-closing band where it would be worse. Instead,\ngive .home 48px of bottom padding, clearing the 36px pull with margin to\nspare regardless of which section ends the page.\n\n* feat(home): add the three get-started cards\n\n* fix(home): raise get-started badge contrast to 5.58:1\n\n.home-badge used --color-white on --color-camel-orange at 10.5px,\nmeasuring 2.93:1 against the plan\u0027s 4.5:1 minimum for text below\n18.66px. Swap the background to --color-orange-deep, the codebase\u0027s\nalready-established accessible orange (used by --link-font-color,\n.home-stat-num, .home-eyebrow), which measures 5.58:1 with the same\nwhite text. Radius, padding, font, letter-spacing, and uppercase are\nunchanged.\n\na.button.dark has the same white-on-camel-orange issue but predates\nthis piece and is the site\u0027s primary CTA everywhere; left untouched,\nraised separately.\n\n* feat(home): add the six feature cards\n\nThe tag chip takes min-width plus padding rather than the design\u0027s fixed\n38px square. The first tag is now \u0027390+\u0027, four characters, which clips at\nArchivo 800 16px in a fixed 38px box.\n\n* feat(home): add the DSL code example\n\nMarkup and styling only. The tabs are inert until the next task adds the\nJS; the YAML panel is visible and the other two carry the hidden attribute,\nwhich is also the no-JS end state.\n\n* feat(home): drive the DSL tabs and the hero copy button\n\nA new module rather than an extension of 06-copy-to-clipboard.js, which is\nhard-scoped to Antora listing blocks and rewrites their DOM. Both halves\nno-op when their elements are absent, since the bundle loads on every page.\n\nThe copy button removes itself when navigator.clipboard is unavailable\nrather than presenting a control that does nothing.\n\nAlso adds tabindex\u003d\"0\" to each .home-tabpanel div in layouts/index.html so\nthe scrollable code panels are reachable by keyboard, per the WAI-ARIA tabs\npattern.\n\n* test(hugo): add a click step to the measurement harness\n\nTask 8\u0027s original verification could only read state at initial load,\nso it never actually proved that clicking a DSL tab switches the panel;\nreading listeners out of the compiled bundle proves the code shipped,\nnot that it works. The measure harness now accepts an optional third\nhash segment naming an element to click inside the iframe before the\nqueries are evaluated. A missing click target prints a clear\n\"NOT FOUND (click target)\" line instead of silently falling back to\nmeasuring the unclicked state, which would manufacture a false pass.\n\nExisting two-argument --measure calls are unaffected: the third segment\ndefaults to empty, which the click-selector check treats as absent.\n\n* feat(home): add the four core project tiles\n\n* fix(home): give each project tile link a distinct accessible name\n\nThe four tile links all rendered \"Read more\" with no way for\nscreen-reader users navigating by link list to tell them apart. Add\naria-label\u003d\"Read more about {name}\" to each anchor so the accessible\nname is unique per tile while the visible text stays \"Read more →\"\nunchanged. The accessible name still starts with the visible label,\nsatisfying WCAG Label in Name.\n\n* feat(home): add the closing community band\n\n* style(header): restyle the search field and shorten the Docs label\n\nSearch stays in the header on Hugo pages, which have no nav panel to host\nit; docs pages keep the nav-panel field piece 3 added. Property set is\nunchanged, values only.\n\n* style(home): collapse the grids at 1024px and 626px\n\nReuses the repo\u0027s existing two breakpoints. The hero art moves above the\ncopy when the hero stacks, matching the outgoing page\u0027s column-reverse.\n\n* fix(home,projects): drop the hero art reorder, link the primary cards, correct the connector count\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(home): keep the stacked hero image under the banner ratio\n\nThe logo is square, so .home-hero-art img\u0027s base 62% width made the image\ntaller than the 1/0.45 ratio and sized the panel itself, leaving the ratio\ninert. Constrain the image at the collapsed widths so the ratio governs.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* feat(css): add the shared primitives for the remaining redesign pages\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* feat(download): redesign download page with flat release rows\n\nReplace the linear markdown + shortcode table on /download/ with a\nbespoke layout: intro copy plus a dark CLI Launcher card (real\ninstall one-liner from camel-cli-launcher.md, copy-to-clipboard via\nthe existing [data-copy-value] handler), a flat \"Supported releases\"\nrow list per version (project, version + LTS chip, note, and every\nreal download artifact for that release), and SBOM/Verify cards.\n\nThe per-release rows preserve PGP signature and SHA512/SHA1 checksum\nlinks for every artifact (ASF release-distribution policy, not a\nstyle choice) and handle the real, uneven release-categories data\nthat the flat design assumed away: zip vs tar.gz source labels,\ncamel-k\u0027s 7 artifacts, camel-kafka-connector\u0027s bare external\n\"Binaries\" link, and the two-file (XML/JSON) SBOM. Each category\u0027s\nrow group keeps its id so the existing /download/#camel-k inbound\nlink still resolves.\n\nNew layouts/download/list.html and layouts/partials/download/rows.html\nfork the version-selection logic already in\nlayouts/partials/releases/downloads.html rather than modifying it,\nsince that shared partial (and its shortcode) is still used unchanged\nby the release-note detail pages, a different, undesigned screen.\n\nUses the shared .page-hero-title, .section-label, .lts-chip, .card\nand .card--flat primitives from components.css; only page-owned\nlayout lives in download.css.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* feat(docs,community): redesign the documentation index and community pages\n\nReplace the shortcode-driven /docs/ and /community/ content with the\ndata-file + layout pattern already used by /projects/: new\nlayouts/docs/list.html + data/docs-projects.yaml (hero, dark User Manual\nand light Component Reference feature cards, then a 3-col grid of 9\nproject cards with gated Documentation/Source/Examples links), and new\nlayouts/community/list.html + data/community.yaml (7 channel cards plus\na dark \"Talk to us\" CTA card spanning two grid columns).\n\nBoth screens are built entirely on the shared primitives already shipped\nin primitives.css (.page-hero-title/.page-hero-lead, .card, .card-grid,\n.card-grid--feature/--3, .section-label) and the existing a.button.*\nvariants and color tokens (--color-prompt, --color-button-on-dark-border)\n- no new tokens or primitives introduced. docs.css now carries both\nscreens\u0027 page-specific layout, replacing the old shared, now-dead\n`.docs, .community` flex/80%-width rule left over from the generic\n_default/section.html wrapper.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* feat(tooling): redesign the Tooling screen with data-driven groups\n\nRebuild /tooling/ per the piece-4b design: CLI command list on a dark\nblock, TUI text+screenshot split, an MCP card with two AI-tool tiles,\nand the remaining five groups as name/description rows behind a\nsticky \"On this page\" rail that reuses the existing aside.toc.sidebar\n+ 02-on-this-page.js scroll-spy unchanged.\n\nTables render from a new data/tooling.yaml (not the {{\u003c table \u003e}}\nshortcode) via a new layouts/tooling/list.html, matching the\n/projects/ and /docs/ data-file pattern - the design restructures the\ngroups (AI-Assisted Development folds into the MCP card, Libraries\nfolds into Monitoring) in ways a markdown table can\u0027t express. The\nMCP feature card reuses the shared .card/.card--lg primitive; the\nnested AI-tool tiles don\u0027t fit either card size tier and stay a small,\npage-owned shape (documented in tooling.css). content/tooling/_index.md\nis trimmed to front matter only.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* feat(blog): redesign blog list, category and post screens\n\nRebuild /blog/, /categories/\u003cname\u003e/ and /blog/\u003cpost\u003e/ against the piece-4b\ndesign: a 240px sticky category rail shared by the list and category\nscreens, day/month post cards with tag chips and a mono numbered pager,\nand a single-post layout with a 260px rail (author, share pills, an\n\"In this post\" TOC rendered from real headings, prev/next), a 760px\narticle column, a 16:8 featured image and an orange-rule blockquote.\n\nReuses the .page-hero-title/.page-hero-lead/.detail-lead/.card/.card-grid\nprimitives from primitives.css instead of re-declaring them. taxonomy.html\ngains the pagination and Releases-only filter list.html already had, which\nit was missing entirely before this change.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* feat(releases): redesign releases archive and security advisory screens\n\nRewrite the Releases archive as a paper-2-header white table per project\nwith a sticky \"Projects\" rail, and the Security advisory single page as\nan eyebrow/H1/lead detail view with uppercase section labels and a sticky\nfacts card. Reuses the shared .page-hero-title/.page-hero-lead,\n.detail-lead, .lts-chip and .severity-chip primitives from primitives.css.\nAlso sweeps the undesigned release-note detail template onto the shared\n.static/.doc typography (no CSS changes needed there beyond removing two\ndead, visually-inconsistent .release selectors) and fixes a malformed\nclosing \u003c/main\u003e tag found along the way.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(download,security): apply blocking review findings for tables group\n\nAdd computed aria-labels to the repeated Signature/Checksum/Release\nnotes/SBOM links in the download rows so a link-list/rotor screen\nreader view can distinguish them, and compose .security-grid from the\nshared .card-grid/.card-grid--2 primitives (matching how download.css\nalready does this for .download-cards) instead of hand-rolling the\nsame grid declarations.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(a11y): add aria-label to Community card \"Read more\" links\n\nThe 7 repeated \"Read more\" links on the Community page were indistinguishable\nto screen-reader users out of context. Mirror the pattern already used in\nlayouts/projects/list.html and the docs project cards.\n\n* fix(tooling): scope safeHTML to fields that actually carry markup\n\nApplying `| safeHTML` unconditionally to every group item\u0027s .desc and\ngroup .intro disabled Go\u0027s default HTML-escaping on plain-text fields,\nso a bare `\u0026` in the hawt.io description rendered as invalid HTML and\nwould fail the repo\u0027s check:html gate (html-validate\u0027s\nno-raw-characters rule).\n\nAdd explicit htmlDesc/htmlIntro flags in data/tooling.yaml for the\nhandful of fields that legitimately embed \u003ca\u003e markup (the two IDE\ngroup items, and the archetypes group\u0027s intro), and only apply\nsafeHTML when those flags are set. Every other description now falls\nthrough Go\u0027s default auto-escaping, so the \u0026 in hawt.io\u0027s description\nrenders as \u0026amp; as it did before this screen existed (previously\ninside a {{\u003c table \u003e}} cell escaped by Goldmark).\n\n* fix(blog): restore paragraph spacing and fix orange contrast on hover\n\nBlog post body paragraphs had no vertical spacing between them because\n.doc p { margin: 0 } from doc.css governed unopposed once blog.css\ndropped its own margin declaration. Add .blog .post-content p + p with\nthe spec\u0027s 12px top margin.\n\nAlso swap --color-camel-orange (2.74:1, fails WCAG AA) for the\nWCAG-safe --link_hover-font-color on five hover states\n(.blog-category, .blog-rss, .blog-back-link, .blog-post-title a,\n.blog-post-continue) and for --color-orange-deep on the static\n.blog-post-day color, matching the pattern already used on the post\nscreen for the same kind of text.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(releases): address blocking review findings on advisory screen\n\n- Scope a{color} in .advisory-section-body so bare-URL autolinks inside\n  Mitigation/Notes markdown render in the site\u0027s link color instead of\n  the browser default blue.\n- Add code-block styling scoped to .advisory-section-body so \u003cpre\u003e\u003ccode\u003e\n  blocks in the Notes section get the same dark background/padding/\n  overflow-x treatment as .doc pre, instead of unstyled plain text.\n- Change .advisory-back\u0027s color from --color-ink-muted (3.6-3.9:1, fails\n  WCAG AA) to --color-ink-soft (~7:1), matching the already-shipped\n  .projects-back this feature\u0027s own spec cites as precedent.\n\n* chore(antora-ui): regenerate the bundle for the remaining redesign pages\n\n* fix(blog): use phrasing content for post date/month inside \u003ctime\u003e\n\n\u003ctime\u003e only permits phrasing content, so the \u003cdiv\u003e day/month blocks in\nthe post summary card were 642 html-validate element-permitted-content\nerrors across 111 pages once the CI gate minifies the build. Swap to\n\u003cspan\u003e and keep the existing box layout with an explicit display:block\non both classes so there is no visual change.\n\n* fix(download): restore relURL on the release-notes link\n\nlayouts/partials/download/rows.html is a documented fork of\nlayouts/partials/releases/downloads.html, which filters its release-note\nhref through relURL. The fork dropped the filter, so all nine\nrelease-notes links emitted absolute camel.apache.org URLs and tripped\nthe repo\u0027s own camel/relative-links html-validate rule.\n\n* fix(releases): name the projects rail nav for a11y\n\n\u003cnav class\u003d\"releases-rail-links\"\u003e had no accessible name, so it\ncollided with the header/footer navs under the unique-landmark rule.\nGive it aria-label\u003d\"Projects\", matching the blog rail\u0027s\naside[aria-label\u003d\"Categories\"] and tooling\u0027s\naside[aria-label\u003d\"On this page\"].\n\n* fix(download,security): style markdownify links instead of UA blue\n\ndownload.css had no `a` rule and security.css had none for its card\nprose, so author links inside markdownify/.Content output (including\nthe ASF procedures/KEYS verification links) rendered in the browser\ndefault rgb(0,0,238) instead of the brand link color. Add the same\n`a`/`a:hover` pattern already shipped for .advisory-section-body,\nusing --link-font-color and --link_hover-font-color.\n\n* fix(download): stop the note column starving to 57px\n\n.download-row\u0027s `1fr` note track resolves to minmax(auto, 1fr), so its\nfloor is min-content while the wrapping `auto` links track sizes to\nmax-content and wins the free space, flooring the note at its longest\nword (57px/113px/7 lines) across the whole desktop and tablet range.\nGive the note a real minimum and cap the links track so it can no\nlonger take unbounded space from its neighbour.\n\n* fix(security): wrap the single-paragraph SBOM body in \u003cp\u003e\n\nHugo\u0027s markdownify drops the \u003cp\u003e wrapper for single-paragraph source,\nso the SBOM card\u0027s body matched no `.security-card p` rule and fell\nback to the card\u0027s ambient 18px/20.7px ink-2 with no gap under the\nheading, next to its two-paragraph twin rendering correctly at\n14.5px/23.2px. Wrap it explicitly, matching the pattern already used\nby layouts/download/list.html for the same defect class.\n\nThe Security Policy Enforcement card is left alone: its body is\ngenuinely two paragraphs and markdownify already emits its own \u003cp\u003e\ntags, so wrapping it would nest \u003cp\u003e elements.\n\n* fix(community): stop skipping a heading level (h1 -\u003e h3)\n\n/community/ was the only route on the branch with a skipped heading\nlevel: h1 followed directly by h3 with no h2. Retag\n.community-card-title and .community-cta-title to h2; both classes\ncarry all sizing so this is a zero-visual-effect change.\n\n* fix(css): unify the mobile h1 step-down on .page-hero-title\n\n.page-hero-title had no responsive step-down of its own; blog.css\nspecial-cased .blog-list .page-hero-title to 36px at \u003c\u003d626px, which is\nwhy /blog/ and /categories/ stepped down and the other six pages\nsharing the primitive did not (34px vs 43.4px). Move the step-down\nonto the primitive itself in primitives.css and delete the blog.css\nspecial case, so all nine pages using .page-hero-title agree.\n\n* fix(css): consume --page-padding-x instead of hardcoding its value\n\nSCOPE.md introduces --page-padding-x as the side padding for every\ncontainer, but download.css, security.css, tooling.css and release.css\neach hardcoded the identical calc(32 / var(--rem-base) * 1rem) instead\nof the token. Same computed value today; this just makes the token the\nsingle source of truth so a future change moves every page at once.\nOnly the base values are touched; the differing \u003c\u003d1024px overrides are\nleft alone.\n\n* chore(antora-ui): regenerate the bundle after the final review fixes\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* style(static-pages): add container padding and prose-measure to .static.doc\n\nThe six markdown-driven static sections (what-is-apache-camel,\nwhen-to-use, trust, camel-dna, camel-core, misc) rendered through\n_default/section.html with no top/side padding and no reading-width\ncap, so their h1 sat flush under the sticky header and body text ran\nedge to edge. Extend the existing .static primitive with the same\npadding block every other redesigned page-shell already uses, and cap\ndirect-child prose elements to the shared 760px measure, excluding\n.tooling (which owns its own fully-designed container).\n\nNo new tokens, no template changes: reuses --page-padding-x,\n--rem-base and the existing 760px measure value already repeated\nacross docs.css/security.css/blog.css/release.css/tooling.css.\n\n* content(static-pages): use table shortcode and normalize connector count\n\nWrap the two raw markdown tables (what-is-apache-camel \"The numbers\",\ncamel-dna \"What changed, what didn\u0027t\") in the {{\u003c table \u003e}} shortcode\nalready used on mailing-list.md/team.md/user-stories.md, so they pick\nup the shared table.tableblock styling instead of rendering as a bare\nunstyled \u003ctable\u003e.\n\nAlso normalize the site\u0027s connector/component count from 350+/300+ to\n390+ across these five evergreen pages (17 occurrences), matching the\nfigure already sourced and used on the redesigned pages. Historical\nanchors (19 components in 2007) are left untouched; content/blog/ is\nuntouched per standing ruling since those are dated, published posts.\n\n* fix(misc,docs): scope the misc flex rule and finish the connector count\n\n.misc p { display: flex } was written for an image-and-caption paragraph, but\napplied to every \u003cp\u003e it made the text node and each inline link separate flex\nitems, rendering /misc/\u0027s prose links as narrow vertical letter-stacks. Scope it\nto paragraphs that actually contain an image, matching the :has() usage already\nin main.css.\n\ndata/docs-projects.yaml was the last place still advertising 300+ components\nwhile the rest of the site says 390+.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* chore(antora-ui): regenerate the bundle for the static-page pass\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* content: standardize the connector count on 350+\n\nReverts the 390+ normalization. 350+ is the figure the site and its published\nblog posts already used, so this makes every page agree without rewriting\ndated articles.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(css): consolidate duplicated eyebrow/shell/hover/rail declarations (M5)\n\nThe final-review found the mono uppercase eyebrow declared ten times across\nseven files (same five declarations, three different colours), plus three\nother byte-identical cross-file blocks: the .download/.security/.advisory\npage shell, the .card:hover lift forked in frontpage.css/projects.css, and\nthe .blog-rail/.releases-rail sticky offset. Extract each shared shape into\nprimitives.css and have the existing selectors join it via grouped\nselectors, so no HTML/template changes are needed. Colours are left exactly\nas they render today (frontpage.css\u0027s .home-eyebrow, at 12.5px instead of\n12px, is deliberately excluded from the eyebrow group for the same reason).\nVerified byte-identical before/after screenshots at 1440/626 for all nine\nroutes; see .superpowers/sdd/4d/hygiene-report.md.\n\n* fix(css): drop the orphan --color-on-dark-dim token (L3)\n\n--color-on-dark-dim (#cabfb0) had exactly one consumer,\n.home-example-command in frontpage.css, and differed from the existing\n--color-on-dark-soft (#c4bbac) by an imperceptible amount. Point the\nconsumer at --color-on-dark-soft and delete the token. Contrast against\n--color-dark-3 (its background) moves from 9.74:1 to 9.29:1, both far\nabove the 4.5:1 normal-text floor. Verified: only 747-810 pixels differ\nin the home page screenshots at 1440/626, all within the small CLI\ncommand text this rule paints; see .superpowers/sdd/4d/hygiene-report.md.\n\n* fix(releases): move the mobile jump-nav rail above the content (M1)\n\nlayouts/releases/list.html put \u003caside class\u003d\"releases-rail\"\u003e after\n.releases-content, and release.css set it to position: static at\n\u003c\u003d1024px. The eight-project jump-nav rendered at the bottom of a\n~22,000px mobile page, unreachable without scrolling past everything\nit exists to let you skip.\n\nMove the aside before .releases-content in the template (matching the\nblog rail\u0027s DOM-order pattern) and pin both children to their grid\ncolumns explicitly so desktop rendering is unchanged: .releases-rail\nstays in the second (220px) column, .releases-content in the first.\nAt \u003c\u003d1024px both reset to grid-column: 1 so they stack in DOM order;\nthe stale rail margin-top (needed only when the rail trailed the\ncontent) is dropped since the grid\u0027s own row-gap now provides the\nspacing, same as blog.\n\nConfirmed via cmp that the seven other required routes are unaffected\nexcept for the expected CSS-bundle hash rename, and that the release.css\ndiff is scoped to .releases-content/.releases-rail grid-column rules.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(security): render severity chip casing consistently with the advisory page (L2)\n\nlayouts/security/list.html printed .Params.severity raw, and every\nadvisory\u0027s front matter stores it upper case (MEDIUM, HIGH, LOW,\nCRITICAL), so the list page\u0027s chips read \"MEDIUM\" etc. The single\nadvisory page (layouts/security-advisory/single.html) already applies\n| lower | title, rendering \"Medium\", matching the design reference\u0027s\ncapitalized chips.\n\nApply the same | lower | title filter on the list page so both screens\nrender the same CVE\u0027s severity identically.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* test(hugo): add an optional width to the measure harness\n\n_measure.html\u0027s iframe was hardcoded to 1440px, so --measure could\nonly ever report desktop computed styles. Add an optional fourth hash\nsegment (and matching 4th CLI arg in build.sh) to set the iframe\nwidth, defaulting to 1440 so every existing call is unaffected. Needed\nto confirm the releases-rail position/order fix at 626px.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(download): wrap the CLI install command and finish deferred table minors\n\nThe 380px CLI card is a spec\u0027d width, so let the command wrap onto multiple\nlines instead of truncating the host with an ellipsis (L1). Also closes three\ndeferred review minors: collapse the SBOM/Verify cards to one column at\n\u003c\u003d1024px like every sibling card grid, bring the sig/checksum sub-link scale\nback to the spec\u0027s 13.5px/700 instead of an invented 11px/600, and fix the\nrow-links gap to the spec\u0027s flat 14px.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(tooling): finish three deferred CLI/TUI review minors\n\n.tooling-cli-cmd never got the spec\u0027s 13.5px (it inherited .tooling code\u0027s\n14px); scope it as .tooling .tooling-cli-cmd to beat that rule\u0027s specificity\nand set the size explicitly. .doc p code (0,1,2) outranked .tooling code\n(0,1,1) for the inline \u003ccode\u003e in the section-intro paragraphs, rendering\n14.5px instead of 14px; add a higher-specificity override scoped to\n.tooling-section-intro. .tooling-split was missing the spec\u0027s\nalign-items: start.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(blog): reset h2 padding-top, restore list spacing, label repeat links\n\ndoc.css\u0027s .doc h2:not(.discrete) leaves an undocumented 8px top padding under\n.blog .post-content h2, adding to its own 40px margin; reset it to 0px so the\ngap matches the spec exactly. The pre-redesign .blog ul/ol padding-bottom\nrule was dropped with no replacement when the article was rewritten; restore\nit scoped to .post-content so a list still gets a gap before the next block.\n\"Continue reading\" repeats identically on every post card with nothing to\ntell screen-reader users apart; add a per-post aria-label, matching the\nRead-more pattern already used on the home tiles and project cards.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* docs(release): disclose the first-category 40px margin-top\n\nFlagged as undisclosed spec drift (releases.md gives a flat 48px for every\ncategory). Kept the 40px value rather than aligning it to 48px, since the\nroute\u0027s rendered output must stay unchanged unless a finding calls for a\nvisible fix; documented the reasoning inline instead: this group sits\ndirectly under the H1/lead intro, not a full release table, so the tighter\ngap reads better against that shorter block.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* chore(antora-ui): regenerate the bundle for the 4d assorted fix wave\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(home): restore the #apache-camel-projects compatibility anchor\n\nFound by the first run of check:links on this branch. The pre-redesign home\npage carried a \"# Apache Camel Projects\" heading, which blackfriday heading\nIDs (config.toml autoHeadingIDType) rendered as id\u003d\"apache-camel-projects\".\nReplacing that shortcode-driven content per SCOPE section 4 dropped the id,\nand deadlinks flagged the resulting dead fragment in the 2022 content-based\nrouting post, which links to /#apache-camel-projects.\n\nPut the id back on the project-tiles section rather than editing the post\u0027s\nlink. The anchor is a public URL that external inbound links may still use,\nso rewriting the one in-repo reference would have turned the gate green while\nsilently breaking every bookmark to it. Commented inline as a compatibility\nanchor rather than a styling hook, since an id with no CSS or JS behind it\nreads as dead weight to the next person.\n\nVerified on a full production build: the anchor is present in the minified\npublic/index.html, and a re-run of deadlinks drops exactly this failure and\nnothing else. The gate still exits 1 on three upstream apache/camel link\nfailures that this branch does not cause.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(blog): pin the csimple docs link to 4.22.x\n\ncsimple is deprecated and was removed in 4.23, so\n/components/next/languages/csimple-language.html no longer exists and the\n2020 \"What\u0027s new in Camel 3.7\" post linked at a 404. deadlinks flagged it on\nthe first run of check:links against this branch.\n\nPin to 4.22.x, the newest built version that still carries the page (it also\nexists in 4.18.x). Version-pinning a link out of an old post already has\nprecedent in content/blog/2026/07/hawtio-ai, which points at\n/components/4.18.x/ai-summary.html. The post\u0027s four other /components/next/\nlinks still resolve and are left alone.\n\nVerified on a production rebuild: the link now renders as\n../../../../components/4.22.x/languages/csimple-language.html and deadlinks\nno longer reports it.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(blog): render posts as a fragment and repair the TOC, date, summary and category pages\n\npost.html is rendered through blog/single.html, which already wraps it in\nheader.html and footer.html, so the partials it emitted itself nested a\nsecond complete HTML document inside \u003cmain\u003e on every post.\n\nAlso on the post page: the publish date is rendered once as a \u003ctime\u003e\nelement instead of once per author; the \"In this post\" TOC descends into\nthe placeholder node Hugo inserts for h3-first posts and prints heading\ntitles as HTML; blog rules that lost to doc.css\u0027s .doc a / .doc h1 /\n.doc p are scoped under .post; blockquote paragraphs inherit the pull\nquote size.\n\nOn the listings: the summary falls back to .Summary when a post has no\npreview; the category term page no longer applies the \"Releases-only\"\nfilter that hid 94 of the 110 posts in the Releases category; the\ncurrent-category highlight compares permalinks so multi-word categories\nsuch as Camel-K get is-current.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n\n* fix(redirects): drop the /projects/ 301 that shadowed the new projects page\n\nstatic/.htaccess still carried `Redirect 301 /projects/ /docs/`, which\nprefix-matches the new All Camel Projects page linked from the home\ntiles, the footer and the header CTA. The rule is gone, the three legacy\n/projects/camel-* redirects now land on /projects/, and the removed\ncsimple \"next\" page redirects to its 4.22.x copy. tests/redirect.sh\ncovers all three.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n\n* fix(antora-ui): contrast, focus rings, header clear icon and download row overflow\n\n- --color-ink-muted moves from #8a8074 (3.62:1 on paper) to #6f675c so\n  the 12px to 15px eyebrows and meta text it carries clear WCAG AA; the\n  LTS chip moves to --color-orange-deep for the same reason.\n- Download row links hover to the shared darker link color instead of\n  the lighter camel-orange, and the row stacks at 1024px because its\n  fixed tracks overflowed the page between 627px and about 890px.\n- The Hugo header clear icon is positioned absolutely inside the field;\n  its relative box with a percentage bottom dropped it under the input\n  once .navbar-search stopped being a stretched flex item. The results\n  container goes fixed so it keeps hanging off the navbar.\n- Both search fields get a visible :focus-visible ring; the docs-nav \"/\"\n  hint hides while the field holds a query.\n- The hero CLI command wraps instead of truncating below about 510px.\n- print.css targets the actual footer element and forces inherited color.\n- Eight declared-but-unread navbar and footer tokens and the dead\n  .nav-category rule are removed; British spellings in comments fixed.\n- browserslist adds safari and ios_saf 16.4 so autoprefixer emits\n  -webkit-backdrop-filter for the translucent bars.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n\n* fix(antora-ui): fragment jumper, \"/\" hotkey and clipboard fallbacks\n\nThe shared fragment jumper dereferenced .toolbar and article.doc, which\nthe Hugo pages with in-page anchors (tooling rail, post TOC, releases\nrail) do not render, so every rail click threw and left the heading\nunder the fixed navbar; it now falls back to the navbar and body.\n\nThe \"/\" hotkey only swallows the key when the search field actually took\nfocus, the home copy button reports a rejected clipboard write instead\nof staying silent, and withChromeData throws an error naming the file\nand cwd instead of a bare ENOENT.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n\n* fix(pages): restore dropped links, point Edit this Page at data files, name the tables\n\nThe docs index lost Camel Core\u0027s documentation, source and examples\nlinks and the tooling page lost the CLI and TUI manual links in the\nrewrite; both come back from their data files. The five data-driven\npages name their yaml in an editPath param so \"Edit this Page\" no longer\nopens a front-matter-only file. Release and advisory tables get\naria-labels, the advisory mitigation body is a div because markdownify\nemits block elements, rows.html reuses the category releases it already\ncomputed, and the orphaned section and downloads shortcodes are deleted.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n\n* chore(tests): clean up the Hugo harness output and fix its staleness check\n\nThe harness left its mktemp site (a 500 MB copy of documentation/) behind\non every run, flagged every fresh checkout as stale because git does not\nrestore mtimes, and failed before hugo ran when HUGO_OUT did not exist.\nA temporary site is now removed on exit, only uncommitted source newer\nthan the manifest counts as stale, the output dir is created, and\nHUGO_OPTIONS and HUGO_CACHE_DIR are forwarded like build:hugo.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n\n* docs(specs): record the review corrections and fix stale statements\n\nThe home spec gains a Corrections section (350+ connectors, wrapping CLI\nbar, the /projects/ redirect, dropped deep links, deleted shortcodes,\nsite-wide contrast changes), the shared chrome spec describes when\nwithChromeData actually runs, and em dashes and British spellings in the\nnew documents are replaced.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n\n* chore(antora-ui): regenerate the bundle for the review fix wave\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n\n* fix(content): make the Hugo pages pass html-validate\n\nAll pre-existing on main. The release-note partial never closed the\nSpring Boot BOM paragraph before the Note 2 aside, which failed every\nreleases/release-* page. Five blog posts had youtube shortcodes glued to\nthe surrounding markdown (a stray U+00AC after each call, no blank line\nbefore a following \u003cbr/\u003e, or a call inside a list item without\nindentation), so the shortcode\u0027s div was wrapped in a paragraph or broke\nthe list, and one post opened a \u003cstrong\u003e in one paragraph and closed it\nin the next.\n\nAfter hugo, gulp minify and html-validate on the 975 Hugo-owned pages\n(everything except the Antora trees): 0 errors. The Google verification\nfile is already excluded by .htmlvalidateignore.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n\n* fix(content): correct the tooling commands and refresh the project activity figures\n\nFact-check corrections on /tooling/: the message sender is `camel cmd\nsend`, not `camel send`; `camel test` is a plugin installed with\n`camel plugin add test`; the Spring archetype is\ncamel-archetype-spring-boot and creates a Spring Boot project; the\nIntelliJ plugin lives under the camel-tooling org.\n\nOn /projects/ the six activity lines undershot today\u0027s counts by 20 to\n30 percent and gave the same repository different figures than the home\npage with the window only in a footnote. They are remeasured\n(commits and unique non-bot contributors since 2025-01-01, GitHub stars,\n2026-09-05) and now say \"since 2025\" on the line itself; the footnote\nand the yaml comment record the method.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n\n* fix(pages): drop the unsourced deployments claim and rehome the lost deep links\n\n\"Proven across millions of production deployments\" had no source, unlike\nthe four stat figures; the EIP feature now cites the pattern catalog and\n\"in production since 2007\". The EIP catalog and data formats links the\nold home page carried get a link row on the components card of /docs/,\nand /community/sources/ gets its own card on /community/, which also\nfills the 3-by-3 grid. The home spec\u0027s Corrections record both.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n\n* fix(antora-ui): paint the primary CTA label in ink on the brand orange\n\nWhite on --color-camel-orange is 2.93:1, below both AA thresholds, and\nthe memo keeps the orange itself. Ink on it reads at 5.78:1. Hover lifts\nto --color-camel-orange-light, where ink reads at 7.30:1; the old darker\nhover would drop ink below 4.5:1.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n\n* chore(antora-ui): delete unreferenced images and orphaned tokens\n\nSixteen images lost their last reference in the redesign (the old home\nand community icons, the ASF wide logo, the medium camel logo and the\nstatic/img feature icons); the footer keeps the ASF, license and privacy\nlinks the ASF site policy asks for. Fifteen tokens in vars.css had no\nvar() consumer: the three ASF blues, the smoke-10/30 and jet-30/70\ngreys, black, glow, wheat, the navbar menu and search-result tokens,\nand the mobile top offsets. --color-camel-orange-light stays as the CTA\nhover ground.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n\n* chore(antora-ui): regenerate the bundle for the CTA and cleanup changes\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n\n* refactor(releases): drop the unreachable download-page branches from the downloads partial\n\nWith the downloads shortcode gone, every caller is a release-page\npartial that passes Version and none passes Section, so the\n`eq $.Section \"download\"` blocks (Version and Note columns) and the\nno-Version arm could never run. All 482 rendered release pages are\nunchanged apart from whitespace.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n\n* feat(chrome): adopt the DocSearch v5 launcher from main in both headers\n\nRebased onto main, whose PR #1729 replaced the hand-built Algolia field\nwith DocSearch v5. The redesign had restyled that field in the Hugo\nheader and moved it into the Antora nav panel; both now mount the\nlauncher in the header (div.navbar-search \u003e #docsearch) and header.css\ndresses it as the 200px field the artboard shows, with a visible\nkeyboard focus ring. docsearch.css themes the modal with the redesign\npalette instead of the old greys. The nav-panel field, its clear icon,\nthe results styling and the \"/\" hotkey are gone; below 768px the vendor\nsheet collapses the launcher to its icon, so search now stays in the\nbar at phone widths (measured at 390px) and only the GitHub link is\ndropped.\n\nAlso from the rebase: yarn.lock regenerated with yarn 4.18 for both\nsides\u0027 dependencies, main\u0027s ignore rules restored, and the Antora\nfixture harness sets NODE_PATH because Antora 3.1.15 resolves helper\nrequires from the playbook directory. The specs record the change.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n\n* fix: address the Copilot review on #1740\n\n- static/.htaccess: `Redirect` is a prefix match, so /projects/camel-k\n  also caught /projects/camel-kafka-connector and appended the\n  remainder; one anchored RedirectMatch covers the three aliases with\n  and without a trailing slash, and tests/redirect.sh checks all six.\n- downloads.html: the no-path fallback spans two columns now that the\n  Version and Note columns are gone.\n- security list: the column holds LOW/MEDIUM/HIGH, so it is \"Severity\".\n- chrome.yaml: the footer Community link opens the redesigned landing\n  page instead of the Support subpage.\n- tooling.yaml: Forage is back in its own Libraries group.\n- llms-txt-template.md: `camel cmd send`, matching the tooling page.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n\n* chore: allowlist the public DocSearch key for secret scanners\n\nThe DocSearch widget ships Algolia\u0027s search-only key in the browser, so\n08-docsearch.js and the minified bundle both carry it, and leaktk\nblocks every bundle regeneration as a \"Generic Secret\". A gitleaks-format\nallowlist scoped to those two paths and that one value lets the bundle\ncommit while keeping the scanner on for everything else.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n\n* chore(antora-ui): regenerate the bundle with the gulp 5 pipeline\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n\n* fix(ci): list changed PR files via the API in detect-drafts\n\n`gh pr diff --name-only` fetches the full unified diff, which GitHub\nrefuses with HTTP 406 once it exceeds 20,000 lines. Regenerating the\nAntora UI bundle pushed this PR past that cap, so the step exited\nnon-zero under `bash -e` and took the dependent `checks` job with it.\n\nUse the paginated pull request files endpoint instead. It returns file\nmetadata rather than diff text, so it has no line cap, and it still\nyields a newline-separated list of paths for the existing loop.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* fix(blog): drop the conflict artifact from the Camel 3.7 post\n\nA diff3 merge-base marker was committed into the \"What\u0027s new in Camel\n3.7\" post, leaving a stray unlinked sentence, the `|||||||` line itself\nrendering verbatim, and the csimple link reverted to /components/next/.\n\nThe botched resolution also undid 13eed0ab. csimple was removed in 4.23,\nso /components/next/languages/csimple-language.html is a 404 and\ncheck:links flags it. Restore the 4.22.x pin, which is the newest built\nversion that still carries the page.\n\nThe file is now byte-identical to its state after 13eed0ab.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* fix(docs): add the link-checker stub for /components/latest/dataformats/\n\nThe new documentation index links to /components/latest/dataformats/ via\ndata/docs-projects.yaml. That URL resolves correctly in production, since\n`Redirect 302 /components/latest /components/4.22.x` is prefix-based and\npublic/components/4.22.x/dataformats/index.html exists.\n\ndeadlinks is a static file checker with no knowledge of .htaccess, so it\nreported \"Linked file at path components/latest/dataformats does not\nexist!\" and failed check:links. The repo already handles this with stub\npages under static/components/latest/; this adds the missing one, copied\nbyte-for-byte from the existing nested eips stub.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* build: make check:links work on macOS and Windows\n\ncheck:links hardcoded the Linux build of cargo-deadlinks in three places:\nthe dependency named the deadlinks-linux release asset, the plugin\nderives the bin name from that asset, and the script invoked\n`deadlinks-linux` directly. On any other platform the ELF binary fails\nto exec with ENOEXEC, so `yarn checks` could only ever run on Linux.\n\nUpstream release 0.8.1 also ships macOS and Windows builds, so declare\nthose as separate dependencies and dispatch on process.platform from a\nsmall launcher. Templating the asset name into a single dependency\nreference is not viable: github-release-binary.js warns that a platform\ndependent reference changes the package hash and breaks the lockfile.\n\nAlso fix the wrapper the plugin generates, which called\nfs.rmdirSync(dir, { recursive: true }) in its exit handler. That option\nwas removed in Node 24, so on a newer Node than .nvmrc pins the cleanup\nthrew and masked the real exit code, failing check:links even when no\ndead links were found. fs.rmSync is the supported replacement and works\non Node 22 as well. Regenerating the wrapper changes the checksum of all\nthree faux packages, hence the lockfile update.\n\nVerified on macOS arm64: check:links runs the x86-64 macOS build under\nRosetta, reports findings, and returns their exit code rather than\ncrashing; check:redirects passes its 76 tests; check:dependencies passes.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* build: log Antora phase timings and tidy the local build scripts\n\n`yarn build-all` goes silent for a long stretch before Hugo\u0027s first line,\nwhich reads as a hung build. Measured on a green CI run, the Build step\ntakes 18m39s and 12m44s of that is a single gap with no output at all:\nAntora aggregating and converting content. Hugo itself is ~35s; minify is\n3m28s and markdown 1m33s.\n\nThe silence is by design. createProgress in @antora/content-aggregator\nreturns nothing unless term.isTTY, and it receives process.stdout\ndirectly, so no environment variable can re-enable it. Both `yarn\nworkspaces foreach` and `run-s -l` pipe stdout to add their label\nprefixes, so a piped build gets no progress at all. --log-level\u003dinfo does\nnot help either: the aggregator emits exactly one info message in total.\n\nAdd an extension that logs each lifecycle event with its own duration and\na running total. contentAggregated is the boundary worth watching, since\nit separates fetching content repositories from converting them, which is\nthe split needed to decide whether caching the Antora content directory\non CI is worthwhile.\n\nIts register function takes no parameters, so generator-context.js calls\nit via the zero-arity branch and cannot reach the Asciidoctor\nregister-signature heuristic. That matters because this playbook sets\nruntime.log.failure_level to warn, where a single warning fails the build.\n\nAlso tidy the local build scripts, which were confusingly duplicated:\nbuild:antora-local-full and -partial pointed at local-antora-playbook-*\nfiles that nothing generates, while the -full2 and -partial2 variants\npointed at the antora-playbook-local-* files antora-local-build.sh\nactually assembles. Drop the dead pair, rename the working pair onto the\nfree names, update the three call sites, and remove the matching stale\n.gitignore pattern.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* ci: cache Antora content repositories between runs\n\nThe build-progress extension measured where the Antora phase actually\ngoes on a green run:\n\n  contentAggregated   +426.1s\n  documentsConverted  +164.6s\n  pagesComposed        +13.7s\n  sitePublished        +606.3s total\n\nFetching content is 70% of it. CI starts from an empty cache every run, so\nit clones all eight Apache repositories from scratch; apache/camel appears\ntwice and several sources track three branches each. Restoring the clones\nturns those into incremental fetches.\n\nPoint ANTORA_CACHE_DIR at the workspace so actions/cache can see it. The\nenv var is read by the playbook builder (schema.js sets env\nANTORA_CACHE_DIR for runtime.cache_dir), which keeps this CI-only: no\nplaybook change, and contributors\u0027 existing caches stay where they are.\n\nThe key intentionally omits a run id. On an exact hit actions/cache skips\nthe upload, so the cache is written once per playbook revision instead of\non every run; a ~1.5 GB entry saved per run would evict the yarn cache\nfrom the repository\u0027s shared 10 GB budget. The restored clones age, but\n--fetch tops them up, and a playbook change rotates the key.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* build: say when minify is skipped outside production\n\nThe minify task is a no-op unless CAMEL_ENV is production, which is\ndeliberate: it is slow and hurts dev turnaround. But it is also the pass\nthat lowercases the doctype, drops the slash from void elements and\ncollapses trailing whitespace, and .htmlvalidate.json treats all three as\nerrors.\n\nSo a default local build makes `yarn check:html` report doctype-style,\nvoid-style or no-trailing-whitespace on essentially every page, which\nreads as broken markup rather than a missing build flag. On CI the\nworkflow sets CAMEL_ENV: production, so it never shows up there.\n\nPrint why it was skipped instead of skipping silently.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* ci: move the Antora cache step to actions/cache@v6\n\nactions/cache@v4 runs on Node 20, which GitHub is deprecating on its\nrunners, so the step logged a deprecation warning on its first run.\n\nv5 switched the action to the Node 24 runtime, which is what silences the\nwarning, and v6 additionally migrates its internals to ESM. Neither\nchanges the action\u0027s inputs, so this is a drop-in bump from v4.\n\nNote that v5 and later require an Actions runner of at least 2.327.1.\nThis workflow runs on ubuntu-latest, where that is already the case.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* ci: move Upload artifacts to actions/upload-artifact@v7\n\nv5 shipped only preliminary Node 24 support and still defaulted to the\nNode 20 runtime, which is what produced the deprecation warning on the\nUpload artifacts step. v6 switched the default to Node 24 and v7 adds an\nopt-in `archive` input plus an ESM rewrite.\n\nNeither release changes the defaults this workflow relies on: `archive`\ndefaults to true, so the artifact is still uploaded as a zip and\npreview.yaml keeps downloading it with archive_format: \u0027zip\u0027.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* fix(ui): stop using bright orange as a text colour\n\nThe palette already reserves --color-camel-orange for fills and uses\n--color-orange-deep for text, which is why ten stylesheets reference the\nlatter. Two places leaked.\n\nMeasured against WCAG AA, which wants 4.5:1 for body text and 3:1 for\nlarge text, bright orange is not usable as text on any of the light\ngrounds in this design:\n\n  camel-orange #e97826 on paper   #faf7f1   2.74:1\n  camel-orange #e97826 on paper-2 #f4eee3   2.53:1\n  camel-orange #e97826 on white   #ffffff   2.93:1\n  orange-deep  #a84e0d on paper   #faf7f1   5.22:1\n  orange-deep  #a84e0d on white   #ffffff   5.58:1\n\n`mark` is search-term highlighting, so it failed on exactly the text a\nreader is hunting for. The download sublink also set text-decoration:none\non hover, opting out of the site-wide a:hover underline from base.css and\nleaving colour as the only hover cue, at 2.74:1. Dropping that override\nrestores the underline.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* feat(home): make the projects section an ecosystem overview\n\n\"Three clear paths\" and the tiles below it were largely the same content:\nthe tiles listed Camel Core, Camel Spring Boot, Camel Quarkus and Camel\nCLI, so three of the four repeated the paths section with the same URLs\nand overlapping copy, down to \"350+ components\" appearing twice.\n\nKeep get_started as the single choice point for picking a runtime, and\ngive the later section a different job: the framework underneath, plus\nthe projects built around it. Camel Core stays because it anchors the\nsection and was never part of the paths; the three runtimes are gone and\nKamelets, Camel K, Karavan, Kafka Connector and Karaf take their place.\n\nIcons and descriptions are taken from data/projects.yaml so the home page\nand the projects page describe each project identically. Karavan links to\nits repository because it has no docs URL there.\n\nSix tiles move the grid from home-grid--four to home-grid--three, giving\n3x2 on desktop rather than a ragged 4+2. Both modifiers already collapse\nto two columns and then one at the existing breakpoints.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* style(home): lighten the hero art and band alternate sections\n\nTwo related complaints from design review: the hero illustration competes\nwith the headline beside it, and the page reads as one continuous cream\nground with white cards and no rhythm.\n\nHero: drop the 1px border so the illustration is not boxed in, take the\ndrop shadow from 0 30px 50px at 30% down to 0 18px 34px at 18% so it\nreads as depth rather than a glow of its own, and take the logo from 62%\nto 54% width. The radial wash stays, which is enough to seat it.\n\nSections: add a home-band wrapper around features and the projects tiles,\ntinting them with the sand paper-2 while the rest stay cream. Cards remain\nwhite so they still lift off both grounds. The wrapper is needed because\nhome-section carries its own max-width and centring, so a full-bleed tint\nhas to come from outside it, which is the same split home-stats already\nuses. That gives hero, sand, cream, sand, cream, sand, dark down the page.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* fix(ui): declare the Open Sans regular face\n\nDesign review read the body copy as noticeably thinner than the headings\nand suggested darkening it. Measured, the colour is not the problem:\nink-muted #6f675c on the cream ground is 5.21:1, above the 4.5:1 AA\nthreshold, and ink-soft is 6.87:1.\n\nThe weight is. This stylesheet declared only 300, 700 and 800, so body\ntext at the default weight of 400 had no matching face. CSS font matching\nfor a desired 400 checks 500, then descends below 400, so every paragraph\non the site was rendering in Open Sans Light.\n\n@openfonts/open-sans_latin-ext already ships the 400 files; they were\nsimply never declared. Adding the normal and italic faces makes body copy\nrender at the weight the design assumed, without touching the palette.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* feat(home): highlight the route example\n\nThe example panel rendered its code through a bare \u003cpre\u003e, so the one place\non the page showing what a Camel route looks like was flat monospace.\n\nEverything needed was already wired: config.toml sets\nmarkup.highlight.noClasses \u003d false, chroma.css themes the emitted classes\nagainst the --syntax-* tokens, and each tab\u0027s id is already its chroma\nlexer (yaml, java, xml). Pass the code through the highlight function and\nthe panel picks all of that up.\n\nOnly keys, strings, comments and literals get colour; punctuation and\nwhitespace inherit --syntax-text, which keeps it restrained. Measured on\nthe #211c17 panel: comments 4.71:1, keys 5.78:1, strings 8.01:1, body\ntext 14.02:1, all above the 4.5:1 AA threshold.\n\nThe leading newline is trimmed so the first line is not blank, and\n.home-tabpanel pre still matches through the wrapper chroma adds.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* feat(home): bring back a latest-posts section\n\nThe redesign dropped the \"What\u0027s New?\" list the old home page carried,\nleaving the stats strip as the only signal that the project is active.\nCumulative commit and release counts are weaker evidence than actual\nrecent work, and a visitor cannot tell from a total whether the last\nrelease was last week or last year.\n\nRestore it in the new idiom: the three most recent blog posts as cards,\nwith date, title and the existing preview front-matter field, plus a link\nthrough to the blog. Same query the old layout used, ordered newest\nfirst.\n\nIt sits after the projects band and before the closing band, so it lands\nlow on the page as suggested and keeps the cream/sand alternation\nrunning: tiles on sand, posts on cream, closing dark.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* chore(antora-ui): regenerate the bundle\n\nPicks up the design review changes to src/css: the home-band tint, the\nlighter hero art, the latest-posts styles, and the Open Sans 400 faces,\nwhich also adds the four regular woff/woff2 files to the bundle.\n\nsite.css rehashes from e9fd817c2e to 0097fb643e, with rev-manifest and\nhead-styles.hbs following.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* perf(ci): shard check:html and stop it truncating its own report\n\ncheck:html was effectively the whole of the ~14 minute \"Run checks\" step.\ncheck:redirects finishes in 8s and check:links in under 20s; both are\nhidden under html-validate by run-p. html-validate is single threaded and\nspends its time in the lexer, so the run is bound by one core: 6229\nfiles, 584 MB of HTML after minify.\n\nTrimming rules is the obvious move and it does nothing. Measured on the\nsame 791 files: full ruleset 25.56s, recommended-only 25.30s, parse-only\nwith every rule off 24.96s. The rules are ~2% of the cost.\n\nSharding the file list is the lever that pays. Locally, 6229 files go\nfrom 4m57s to 34s across 18 workers. CI runners have 4 cores, so expect\nroughly 14 minutes down to 4.\n\nThe launcher also fixes a defect that predates it. html-validate exits\nwithout flushing a piped stdout, so its report is silently truncated\nwhenever it is not writing straight to a file: the same 78 file run that\nwrites 12577 lines to a file emits 570 through `| cat`. run-p pipes every\nscript so it can prefix output, which means CI has been discarding most\nfindings all along. The exit code survives, so failures still failed, but\nthe log showed a fraction of them and cut off mid-word. Each shard now\nwrites to its own file descriptor and is read back in order.\n\nVerified against a serial run over the same input: 12413 findings on both\nsides, identical set, and 78 of 78 files reported through a pipe rather\nthan 5. Files excluded by .htmlvalidateignore stay excluded; html-validate\napplies it to explicit paths too, which the shards rely on.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* fix(preview): cache static assets on Netlify previews\n\nClicking header links on a PR preview flashes the fonts. It is not a\nregression in the redesign; it is the preview host.\n\nPreviews deploy with `netlify deploy --no-build --dir public`, so Netlify\ntreats the artifact as an unmanaged upload and serves everything with\n`max-age\u003d0, must-revalidate`. Every navigation therefore revalidates each\nfont, measured at ~190ms against the live preview, and each @font-face is\ndeclared font-display: swap, so the fallback is painted for exactly that\nwindow.\n\nProduction does not do this. camel.apache.org is served by Apache and\nsends max-age\u003d31536000 for fingerprinted css and max-age\u003d2592000 for\nfonts, so after the first visit there is no round trip to flash through.\nMirror those values so a preview is representative of the real site.\n\ncss and js can take the year because gulp fingerprints their filenames.\nFont filenames carry weight and style instead of a content hash, so they\nget 30 days: replacing a face in place would otherwise stay stale on a\npreview.\n\nApache ignores _headers, so nothing outside Netlify changes.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* fix(home): restore code punctuation and pad the blog cards\n\nTwo defects from the second design review round, both mine.\n\nThe highlighter wraps the source in \u003ccode class\u003d\"language-yaml\"\u003e, and that\nelement matches the code/kbd/pre rule in base.css, which takes\n--code-font-color: it resolves to --color-ink, #211c17, the exact colour\nof the panel background. A rule matching \u003ccode\u003e directly beats the light\ncolour it would otherwise inherit from .home-tabpanel pre, so every token\nchroma deliberately leaves unstyled went invisible: punctuation, plain\nidentifiers, whitespace. The `{}` after `json:` was the visible symptom.\nBefore the highlighting commit there was no \u003ccode\u003e element at all, so this\narrived with it. Colouring .home-tabpanel pre code puts the base text back\nat --syntax-text, 14.02:1 on that ground.\n\nhome-card carries no padding of its own, each variant supplies it, which\nis why home-tile sets 24px. home-news never did, so dates, headings and\ndescriptions sat against the border. Match home-tile.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* feat(home): show the example earlier and tighten the news section\n\nMove the worked example above the feature grid. A visitor who has just\nchosen a runtime should see what a route looks like before being asked to\nread a second grid of cards. The band moves with it so the cream and sand\nalternation still runs: hero, sand, paths, sand example, features, sand\ntiles, posts, dark close.\n\nShorten the news heading to \"Latest from Camel\", which scans in a glance\nwhere the previous sentence did not.\n\nDrop a post\u0027s preview when it merely repeats the title. Release\nannouncements often set both to the same string, so the Camel Quarkus\n3.39.0 card printed its own heading twice. The comparison uses a variable\nrather than `with`, since inside range $ is the home page, not the post.\n\nLink the \"used by thousands of companies worldwide\" label to the user\nstories page. The counts beside it evidence activity rather than adoption,\nso the claim now points at something that substantiates it.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* chore(antora-ui): regenerate the bundle\n\nPicks up the code punctuation colour and the blog card padding.\nsite.css rehashes from 0097fb643e to 140396920c.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* ci: report progress while check:html runs\n\nA clean run printed the shard header and then nothing until the summary,\nwhich on CI is six minutes of dead air in the middle of the step and looks\nthe same as a hung job. Same problem the Antora phase logging solved.\n\nTick every 30s with shards and files completed, rather than a line per\nshard, which would be 32 lines of noise on a green run. The timer is\nunref\u0027d so it can never hold the process open by itself.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* feat(home): copy button on the route example, real release summary\n\nTwo refinements from the third review round.\n\nCopy button: the hero CLI bar has one and the example did not. 09-home.js\nalready wires up any [data-copy-value], so this needs no script change.\nOne button per tab panel rather than one for the section, because the\nhidden panels hide their own button, so whichever is visible always\ncarries the source on screen and nothing has to track the active tab. The\nlabel reads 12.44:1 on its ground.\n\nRelease summary: dropping the duplicated preview left that card visibly\nshorter than its neighbours. The template now falls back to the post\u0027s\nsummary when preview is absent or repeats the title, but that did not help\nhere because this post set preview and summary to near-copies of its own\ntitle. Fixed at the source, using the sentence the post itself leads with.\nThe card goes from empty to 78 characters against 149 for its neighbours.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* chore(antora-ui): regenerate the bundle\n\nPicks up the route example\u0027s copy button. site.css rehashes from\n140396920c to 38ce67035c.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* fix(home): colour the adoption link, stop the 320px overflow\n\nbase.css styles only an anchor\u0027s decoration, never its colour, so the\nlink I added to the adoption label fell through to the browser default\nblue and broke the warm palette. Use the site\u0027s own link tokens, the same\nburnt orange as everywhere else: 4.84:1 on the sand band, 6.87:1 on hover.\n\nThe closing panel pushed the document to 325px inside a 320px viewport.\nIts copy column carries min-width: 280/18rem, and a flex item will not\nshrink below its own min-width no matter how little room is left, so the\npanel could not fit once its padding was taken out of the viewport.\nRelease the floor at the mobile breakpoint and trim the panel\u0027s padding\nfrom 36/32 to 28/20 to buy back the difference.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* fix(a11y): make the footer sections and mobile menu keyboard operable\n\nFooter: the section toggles are checkboxes carrying display: none, which\nremoves them from the tab order and from the accessibility tree, so on\nnarrow screens those sections could only be opened by pointer. Hide the\ncheckbox visually inside the breakpoint that actually collapses them,\nwhich keeps it focusable and announced, and surface its focus ring on the\nheading the reader sees. Above 1024px it stays display: none, since the\nsections are always open there and would otherwise add dead tab stops.\n\nThis is narrower than the disclosure-button-with-aria-expanded the review\nsuggested: it fixes the operability defect without rewriting markup that\nis duplicated across the Hugo partial and the Handlebars one. A checkbox\nannounces as a checkbox rather than as expanded state, which is the\ntrade-off.\n\nMenu: the burger carried no aria-expanded, Escape did nothing, and because\nthe menu markup precedes the button in the DOM, tabbing on from the button\nwalked past the links it had just revealed and into the hero behind them.\nTrack expanded state on the button, move focus to the first link on open\nso the links are the next stops, and close on Escape from the button or\nanywhere inside the menu, returning focus to the button.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* chore(antora-ui): regenerate the bundle\n\nPicks up the adoption link colour, the 320px closing-panel fix, the\nfocusable footer toggles and the navbar keyboard handling. site.css\nrehashes to 859884a05f and site.js to bb1f2f1769.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* fix(home): stop the copy button covering the first line of code\n\nChecked in a browser at 390px: the button overlapped the opening comment\nof every example by 11px, so \"# Route messages from Kafka into a database\"\nwas cut off behind it.\n\nPad the code down to clear the button instead of merely stacking above it.\nA right inset would not do: the code does not wrap, so a long first line\nslides back under the button as soon as the panel scrolls horizontally.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* chore(antora-ui): regenerate the bundle\n\nPicks up the code panel\u0027s top padding.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* fix(a11y): keep the footer toggle glyph out of its accessible name\n\nBoth labels in the section heading point at the same checkbox, so both\ncontributed to its accessible name and the accessibility tree exposed\ncheckbox \"OVERVIEW ＋\". A screen reader read the decorative fullwidth plus\nas part of the section name.\n\nMark the glyph label aria-hidden. It stays visible and still toggles on\nclick, since the label association is unaffected, but the name is now just\nthe section title. Confirmed against the tree: checkbox \"OVERVIEW\".\n\nApplied to both copies of this markup, the Hugo partial and the Handlebars\none.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* fix(a11y): make the footer columns a real disclosure\n\nThe collapse was driven by a hidden checkbox, so a screen reader\nannounced the columns as \"checkbox, not checked\" rather than as\ncollapsed, and Enter did nothing on a control that reads as a toggle.\n\nDrop the checkbox and have 10-footer.js move the heading\u0027s contents\ninto a button with aria-expanded, but only below 1024px, where the\ncolumns actually collapse. Above that width there is nothing to\ndisclose, so the heading stays plain text and no dead control lands in\nthe tab order. Without the script the links stay visible, so they are\nnever trapped behind a toggle that never appears.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* chore(antora-ui): regenerate the bundle\n\nPicks up the footer disclosure button.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* fix(a11y): put the footer tools inside the contentinfo landmark\n\nThe \"Edit this Page\" and \"Back to top\" line sat between \u003c/main\u003e and\n\u003cfooter\u003e, so it belonged to no landmark and axe flagged it: a screen\nreader user navigating by landmark had no way to reach it.\n\nMove it inside the footer and position it out of flow, which keeps it\noff the dark band and out of the flex row alongside .footer. The\ngeometry is unchanged: 2rem above the footer\u0027s top edge, links ending\nexactly on it, full width and right-aligned.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* chore(chrome): drop the unused footer column ids\n\nEach column carried an id that existed only to pair the old footer\ncheckbox with its labels. The disclosure button needs no id, and\nnothing else reads the field.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* chore(antora-ui): regenerate the bundle\n\nPicks up the relocated footer tools and the chrome helper change.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* fix(home): name the unit on the DSL count badge\n\nEvery other feature badge says what it counts (350+, AI, EIP, CI, OSS);\na bare \"3\" only makes sense after reading the body underneath it.\n\nReported by davsclaus in review of #1740.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* fix(home): lead with Camel CLI in the get-started order\n\nReorder the three-path section to CLI, Spring Boot, Quarkus.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n* fix(home): surface the CLI install command on the get-started card\n\nThe Camel CLI card jumped straight to `camel init`, assuming Camel was\nalready installed. Prepend the one-line installer so the fastest path\nactually shows how to get there.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n* fix(antora-ui): widen the doc content grid to reduce TOC crowding\n\nThe content+TOC grid was capped at 1180px, leaving only ~904px for\nthe main content after the 220px TOC and 56px gap.  Increase to\n1340px so the content column gains ~160px on wide screens.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n* refactor(antora-ui): organize CSS imports into cascade layers\n\nGroup all 39 CSS files into seven @layer tiers (fonts, base, chrome,\ncontent, primitives, pages, print) so specificity conflicts between\nfiles are resolved by explicit layer order rather than import sequence.\nPrimitives sits before pages so page-specific rules can override shared\ncard/chip/grid defaults without needing higher-specificity selectors.\n\nRequires postcss-import \u003e\u003d 15 (lockfile pins 16.2.0).\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n* style(antora-ui): add teal accent to break the monochromatic warmth\n\nIntroduce a split-complementary teal (#1f6858, 167deg) as a cool\ncounterpoint to the all-orange palette. Applied to three locations:\n\n- Homepage stat numbers (evidence, not action)\n- Blog card dates (temporal metadata)\n- Community card icon tags (community, not feature)\n\nThree tokens added: --color-teal-deep, --color-teal-light,\n--color-teal-tint. All clear WCAG AA on both paper surfaces\n(6.18:1 on paper, 5.72:1 on paper-2).\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n* feat(home): add Cloud Native badge to Quarkus and widen card layout\n\nGive Quarkus the same badge treatment as Camel CLI (fastest) and\nSpring Boot (Most popular). Wrap the curl install command with a\nbackslash continuation so it fits within the card at narrow viewports.\nWiden the frontpage max-width from 1200px to 1400px so the three\nget-started cards have more breathing room.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n* revert(home): undo the widened layout and wrapped curl command\n\nPartially reverts 536bca34. Restores the 1200px frontpage max-width and\nthe single-line curl install command. Keeps the Quarkus \"Cloud native\"\nbadge. The get-started cards are about to become a one-slide carousel,\nso they no longer need the extra width or the line wrap.\n\n_Claude Code on behalf of Adriano Machado (@ammachado)_\n\n_This was generated by an AI agent and may contain inaccuracies.\nPlease verify before relying on it._\n\n* feat(home): show the three get-started paths as a carousel\n\nReplace the three-column grid with a one-slide carousel. The slide is\ncapped at 720px, with prev/next arrows on either side and dots below. On\nmobile the arrows move down beside the dots so the slide keeps the full\nwidth.\n\nThe track is a native scroll-snap scroller, so swipe and trackpad\nscrolling work without JS. 09-home.js unhides the arrows and dots and\nuses an IntersectionObserver to keep them in step with the visible\nslide, whether it got there by a click, a swipe, or keyboard focus. The\narrows use aria-disabled at either end so focus is not lost, and\nreduced-motion users get instant slide changes.\n\nSlides use card--flat because the scroll container would clip the\nshared hover lift and shadow.\n\n_Claude Code on behalf of Adriano Machado (@ammachado)_\n\n_This was generated by an AI agent and may contain inaccuracies.\nPlease verify before relying on it._\n\n* feat(home): show a runnable Spring Boot snippet and unwrap Quarkus\n\nThe Spring Boot slide showed \"# pom.xml\" and a bare artifact id, which\ntold a visitor little about what to do. Replace it with a Spring\nInitializr command that generates a Maven project with Camel and runs\nit. type\u003dmaven-project is needed because Initializr now defaults to\nGradle, which has no ./mvnw, and baseDir keeps the files out of the\ncurrent directory. Tested against start.spring.io: it produces a\nproject on camel-spring-boot-starter 4.22.0 that starts Camel.\n\nThe description now says the project is generated rather than added to\nan existing one, to match.\n\nPut the Quarkus command on one line; the carousel slide is wide enough.\n\n_Claude Code on behalf of Adriano Machado (@ammachado)_\n\n_This was generated by an AI agent and may contain inaccuracies.\nPlease verify before relying on it._\n\n* fix(antora-ui): address PR review feedback on tables, layout, nav, and redirects\n\n- Remove fixed 25% width on table NAME column; use break-word instead\n  of anywhere so property names stop breaking mid-syllable (#4, #5, #6)\n- Replace fixed max-width caps with clamp(1340px, 85vw, 1800px) so the\n  doc grid, static pages, and community layout scale with viewport (#6)\n- Add community sidebar nav to Hugo subpages (Books, Team, etc.) using\n  a 3-column grid that matches the Antora nav style (#1)\n- Add Netlify _redirects for /components/latest/ so the preview does\n  not land on the raw .htaccess placeholder (#3)\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n* fix(antora-ui): add smart line breaks and min-width to table NAME column\n\nThe NAME column inherited hyphens: auto from .doc, causing mid-syllable\nbreaks even after removing width: 25%. Two changes fix it together:\nCSS sets min-width: 220px, hyphens: none, and normalizes backtick code\nin td:first-child; JS (11-table-breaks.js) inserts \u003cwbr\u003e after dots and\nbefore camelCase humps so overflow-wrap: break-word has sane break points.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n* feat(home): set the hero on a dark band with the get-started tiles over it\n\nThe logo box made the hero tall enough to push the three get-started\npaths below the fold, and the one-slide carousel hid two of them. The\nhero now sits on a full-bleed dark band that starts behind the navbar,\nwith the logo enlarged as a cropped backdrop on the right. The three\npaths follow as tiles that overlap the band\u0027s bottom edge, so all of\nthem are visible at once. At 1440x900 the tiles, commands, and link all\nland above the fold.\n\nThe tiles are ARIA tabs over one full-width terminal per path, each with\nits own Copy button, so no command scrolls inside a third of the page.\n09-home.js now drives every tablist on the home page instead of only the\nroute example, which gives the tiles click and arrow/Home/End handling\nwith no new code, and the carousel script is gone. The hero CLI bar is\ndropped because the Camel CLI tile carries that command; hero.command\nand get_started.heading go with it.\n\nOn the home page only (body.homepage), the navbar goes dark to match the\nband. The search launcher\u0027s colors live in docsearch.css rather than\nheader.css: the vendor stylesheet is unlayered and paints the button\nfrom --docsearch-* properties, and docsearch.css\u0027s layer outranks\nheader.css\u0027s. The stats strip turns cream, since it now sits directly on\nthe example\u0027s sand band and the two would merge.\n\nBelow 1025px the logo shrinks and fades behind the copy. Below 627px the\ntiles stack and the notch hides.\n\n_Claude Code on behalf of Adriano Machado (@ammachado)_\n\n_This was generated by an AI agent and may contain inaccuracies.\nPlease verify before relying on it._\n\n* fix(antora-ui): break long tokens in every option-table column\n\nOn the ActiveMQ 6 page at a 1440px window the Component Options table\noverflowed the 696px doc column and squeezed Description to 116px. A\ncolumn can never be narrower than its longest unbreakable token, and the\nDefault and Type columns hold tokens with no break points: enum constants\nsuch as AUTO_ACKNOWLEDGE and class names such as\nMessageListenerContainerFactory. With the 220px floor on Name, those\nthree columns no longer fit, and overflow-wrap: break-word cannot help\nbecause it does not lower a column\u0027s min-content width. Kafka and Main\nshowed the same thing.\n\n11-table-breaks.js now breaks before camel-case humps in every column,\nnot just the first, treats _ as a separator, and applies to tokens of 12\ncharacters or more. It also fixes the hump split: splitting on the\ncapturing HUMP regex returned the captured letter as its own piece and\nput a break one letter early (additiona|l|Sensitiv|e).\n\nMeasured against the preview with this bundle swapped in, every option\ntable on the ActiveMQ 6, Kafka and Main pages now fits the column, and\nDescription gets 197-270px where it had 116-126px.\n\nThe new test runs the shipped script in jsdom, which resolves from the\nroot workspace\u0027s devDependencies.\n\n_Claude Code on behalf of Adriano Machado (@ammachado)_\n\n_This was generated by an AI agent and may contain inaccuracies.\nPlease verify before relying on it._\n\n* fix(antora-ui): leave identifiers inside table prose unbroken\n\nb5fd5112 added soft breaks in every option-table column, Description\nincluded. A \u003cwbr\u003e is as good a break as a space to the browser, so an\nidentifier in prose split across two lines and read as two words\n(\"Use the exclude\" / \"Pattern property\" on the OpenTelemetry page).\nText nodes with more than one word now keep their natural word wrap;\nsingle-token values (names, defaults, types, inline code) still break.\n\nAlso write the split marker as a unicode escape rather than a raw NUL\nbyte, which made git treat the script as a binary file.\n\n_Claude Code on behalf of Adriano Machado (@ammachado)_\n\n_This was generated by an AI agent and may contain inaccuracies.\nPlease verify before relying on it._\n\n* fix(antora-ui): still break long tokens inside table prose\n\n92dd2b8b left prose text nodes alone entirely, so long tokens inside a\nDescription (classpath:camel/,classpath:camel-template/,..., FQCNs,\ndocs URLs) set the column\u0027s minimum width again and four option tables\non the Main page overflowed the doc column (884px of table in 696px).\n\nProse now gets breaks only in tokens of 24 characters or more, about\nthe width of the narrowest Description column: those cannot wrap whole\nanyway, while a short identifier such as excludePattern still does.\nMeasured at 1440px on 11 option-heavy pages (ActiveMQ 6, Kafka, Main,\nJMS, AWS S3, File, HTTP, Salesforce, SQL, OpenTelemetry): 116 tables,\nnone overflowing.\n\n_Claude Code on behalf of Adriano Machado (@ammachado)_\n\n_This was generated by an AI agent and may contain inaccuracies.\nPlease verify before relying on it._\n\n* fix(antora-ui): underline doc links with text-decoration\n\nThe dashed underline was a background gradient pinned 1.1em below the\ntop of the line box, tuned for the old font. In Open Sans the baseline\nsits at about 1.07em, so the dashes ran just under the baseline and\nthrough every descender (\"Enterprise Integration Patterns\" in the user\nmanual). A real underline follows the font and skips descenders: 1px,\nthe link color at 40%, 0.2em below the text, full color on hover.\n\nThe rules that dropped the gradient for buttons, list and table links,\npagination, blog chips and TOC, catalog items and static-page icons\nnow drop the underline instead; three that already set\ntext-decoration: none lose a dead background-image reset. Checked on\n13 pages: the 39 links that had the dashes are exactly the ones that\nnow carry the underline, and none of the other 2,397 changed.\n\n_Claude Code on behalf of Adriano Machado (@ammachado)_\n\n_This was generated by an AI agent and may contain inaccuracies.\nPlease verify before relying on it._\n\n* feat(ui): dark header on every page\n\nThe home page\u0027s dark bar becomes the navbar everywhere, on the Hugo\npages and the Antora docs alike, which share the navbar classes. The\ncolors move from the .homepage overrides into the base rules and the\n--navbar-background/--navbar-font-color tokens, and the search\nlauncher\u0027s dark custom properties drop their .homepage scope. Below\n1025px the open menu is a dark panel that continues the bar, instead\nof a cream one.\n\nThe bar is 96% opaque rather than the home page\u0027s 88%: over the cream\npages 88% came out a muddy taupe instead of the near-black the bar\nshows over the home page\u0027s dark band.\n\n_Claude Code on behalf of Adriano Machado (@ammachado)_\n\n_This was generated by an AI agent and may contain inaccuracies.\nPlease verify before relying on it._\n\n* fix(ui): give the search launcher a visible focus ring\n\nThe DocSearch vendor sheet is unlayered and opens its button rule with\nall: unset, so it outranks every layered declaration on the button\nwhatever the specificity. The :focus-visible ring in header.css never\napplied, and all: unset also removes the browser\u0027s own ring: keyboard\nfocus on the search launcher showed nothing (outline-style: none while\n:focus-visible matched). The ring now uses !important, the one way a\nlayered declaration beats an unlayered one, in --color-orange-glow:\n7.6:1 on the dark bar over the cream pages, 8.4:1 over the home page.\n\nThe other header.css rules on the button (width, height, padding,\nborder, radius, background, color, font, the hover/focus/active state,\nthe placeholder and the phone-width min-width) lost to the same reset\nand are removed; docsearch.css themes the button through --docsearch-*\nproperties. Deleting them in the browser changed no computed value; the\nicon size and the wrapper rules, which do apply, stay.\n\n_Claude Code on behalf of Adriano Machado (@ammachado)_\n\n_This was generated by an AI agent and may contain inaccuracies.\nPlease verify before relying on it._\n\n* fix(ui): keep the burger on screen at every phone width\n\nThe header row was wider than the viewport from 320 to 374px and from\n431 to about 539px, pushing the burger partly or wholly off-screen (at\n320px and 460px the menu could not be opened). A fixed header never\nwidens the page, so scrollWidth checks did not catch it. Three causes:\n\n- a.button.navbar-cta (margin 0, 17px side padding, 14.5px font) sat in\n  header.css, in the chrome layer, and lost to the shared a.button rule\n  in frontpage.css\u0027s higher pages layer: the header button rendered\n  about 28px wider, with 0.5rem margins. It moves next to a.button.\n- The wordmark came back above 430px, but the full row needs about\n  506px with the home page\u0027s \"Get Started\" CTA. It now hides up to\n  540px, leaving about 35px to spare when it returns.\n- At 374px and below the gaps tighten (14px and 8px), leaving 14px to\n  spare at 320px.\n\nThe bars were also centered with left: 50% and margin-left: -7px, which\nput the 25px glyph 5.5px right of center and 1px past the 34px button;\nthey now sit flush with the button\u0027s right edge, the content edge.\n\nMeasured on the home page, Community and a docs page at 19 widths from\n320 to 1024px: no overflow, bars flush with the button.\n\n_Claude Code on behalf of Adriano Machado (@ammachado)_\n\n_This was generated by an AI agent and may contain inaccuracies.\nPlease verify before relying on it._\n\n* fix(antora-ui): stop hyphenating identifiers and short words in docs\n\nhyphens: auto, inherited from Antora\u0027s default UI, hyphenated about 600\nwords on an option-heavy page at 1440px (ActiveMQ 6, Kafka, Main), many\nas val-ue, top-ic or of-ten, and split identifiers at a syllable\n(local-host:61616, PooledCon-nectionFactory, ex-cludePattern), which\nreads as part of the name.\n\n- .doc gets hyphenate-limit-chars: 10 4 4, so only words of 10+\n  characters hyphenate, with 4+ on each side (Chrome, Edge, Firefox;\n  Safari ignores it).\n- 11-table-breaks.js wraps each identifier in a table cell (a camel-case\n  hump, or . , / : _ between two characters) in span.identifier, which\n  doc.css sets to hyphens: none. Identifiers of 12+ characters get their\n  hump and separator break points again in prose as well: under\n  hyphens: auto the prose exemption from 92dd2b8b and 25145693 did not\n  make them wrap whole, it left them to be hyphenated.\n\nMeasured at 1440px on ActiveMQ 6, Kafka, Main, Salesforce, OpenTelemetry\nand the 4.22 upgrade guide: identifiers hyphenated 0 (1 forced break on\nSalesforce), plain words hyphenated 108 to 159 on the option pages, down\nfrom 605 to 641. At 390px, 3 of the remaining identifier breaks can\nstill hyphenate, all in prose outside tables. 116 option tables on 11\npages still fit at 1440px.\n\n_Claude Code on behalf of Adriano Machado (@ammachado)_\n\n_This was generated by an AI agent and may contain inaccuracies.\nPlease verify before relying on it._\n\n* fix(ui): hide every release post from the blog list\n\nThe blog list hid a post only when Releases was its sole category, so\nrelease announcements that also carried Roadmap or Tooling still came\nthrough. Camel K 2.11.0 (Releases, Roadmap) led page 1 of the preview.\nAny post tagged Releases is now left out; the Releases category page\nstill lists all of them.\n\nIn a local Hugo build the list drops from 47 pages to 42, none of its\n124 posts is tagged Releases, and /categories/releases/ still shows\nCamel K 2.11.0.\n\n_Claude Code on behalf of Adriano Machado (@ammachado)_\n\n_This was generated by an AI agent and may contain inaccuracies.\nPlease verify before relying on it._\n\n---------\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "8184ee363186a0b5ae68f726750026af63b52eb7",
      "tree": "e83def888313bf7138f381047574b84fe8c0ffb1",
      "parents": [
        "6bec68c1df80def5b564a98ea0a073dcd8a3b0f8"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Sat Sep 12 09:29:11 2026 +0200"
      },
      "committer": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Sat Sep 12 09:29:11 2026 +0200"
      },
      "message": "Release blog\n"
    },
    {
      "commit": "6bec68c1df80def5b564a98ea0a073dcd8a3b0f8",
      "tree": "c7d9ef7fa60d3b73e4c8d32b9906fb7662af7c7a",
      "parents": [
        "2a878eb7cc3e6416fa85c09621502efd0cdf0940"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Sat Sep 12 08:19:04 2026 +0200"
      },
      "committer": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Sat Sep 12 08:19:04 2026 +0200"
      },
      "message": "chore: add Apple to who uses Camel\n\nApple\u0027s IS\u0026T organization runs an internal integration and workflow\nplatform built on Apache Camel and Flowable, per their Flow Solutions\nArchitect job posting. Links the live posting and a Wayback snapshot.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01HeoKmHqHuDWaTJQUaaSW9F\n"
    },
    {
      "commit": "2a878eb7cc3e6416fa85c09621502efd0cdf0940",
      "tree": "3b265deddff364361060a78a4ea4ed7400647430",
      "parents": [
        "64380a26131dc398b0bd7408782e20f0518ef593"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Sep 11 15:36:24 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 11 15:36:24 2026 +0200"
      },
      "message": "chore(deps): bump baseline-browser-mapping from 2.10.37 to 2.11.21 (#1744)\n\nBumps [baseline-browser-mapping](https://github.com/web-platform-dx/baseline-browser-mapping) from 2.10.37 to 2.11.21.\n- [Release notes](https://github.com/web-platform-dx/baseline-browser-mapping/releases)\n- [Commits](https://github.com/web-platform-dx/baseline-browser-mapping/compare/v2.10.37...v2.11.21)\n\n---\nupdated-dependencies:\n- dependency-name: baseline-browser-mapping\n  dependency-version: 2.11.21\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "64380a26131dc398b0bd7408782e20f0518ef593",
      "tree": "21cd3810aac5e50dc45f330dd2a550efff4ea1e4",
      "parents": [
        "0ce5636dbc6577d02d804de4248db318c84d2101"
      ],
      "author": {
        "name": "Pasquale Congiusti",
        "email": "pasquale.congiusti@gmail.com",
        "time": "Tue Sep 08 14:21:11 2026 +0200"
      },
      "committer": {
        "name": "Pasquale Congiusti",
        "email": "pasquale.congiusti@gmail.com",
        "time": "Wed Sep 09 08:34:34 2026 +0200"
      },
      "message": "chore: CK security advisors\n"
    },
    {
      "commit": "0ce5636dbc6577d02d804de4248db318c84d2101",
      "tree": "ba495bbdf82b19d7eaf1a24918c5be17cb3384c3",
      "parents": [
        "9beb049a679fba871786243f7c801724610d1b6c"
      ],
      "author": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Tue Sep 08 11:46:53 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 11:46:53 2026 +0200"
      },
      "message": "Blog post: workload identity for Camel with SPIFFE, SPIRE and camel-spiffe (#1742)\n\nIntroduces the camel-spiffe component and the Workload-API-backed\nSSLContextParameters coming in Camel 4.23, and links the camel-examples\nspiffe example."
    },
    {
      "commit": "9beb049a679fba871786243f7c801724610d1b6c",
      "tree": "4a4cd77f8ec1330484804a03ccc77c9241c6757d",
      "parents": [
        "6ef9c2d8588b1d0e04f279bbe312db53a5b156b3"
      ],
      "author": {
        "name": "Pasquale Congiusti",
        "email": "pasquale.congiusti@gmail.com",
        "time": "Mon Sep 07 15:21:55 2026 +0200"
      },
      "committer": {
        "name": "Pasquale Congiusti",
        "email": "pasquale.congiusti@gmail.com",
        "time": "Tue Sep 08 08:28:58 2026 +0200"
      },
      "message": "chore: release 2.11.0 branches\n"
    },
    {
      "commit": "6ef9c2d8588b1d0e04f279bbe312db53a5b156b3",
      "tree": "8c0d1d71288f450952253eb54c90c9fdf9a36b27",
      "parents": [
        "5b80df2eaee97d6be190b6aeb57d9158486335a2"
      ],
      "author": {
        "name": "Pasquale Congiusti",
        "email": "pasquale.congiusti@gmail.com",
        "time": "Mon Sep 07 14:40:32 2026 +0200"
      },
      "committer": {
        "name": "Pasquale Congiusti",
        "email": "pasquale.congiusti@gmail.com",
        "time": "Tue Sep 08 08:28:58 2026 +0200"
      },
      "message": "feat: camel k 2.11.0\n"
    },
    {
      "commit": "5b80df2eaee97d6be190b6aeb57d9158486335a2",
      "tree": "ace06318388432a330f55d39484f781cc8fa9401",
      "parents": [
        "0bcdcc0b560df4bef669b2841a550710f571b5dd"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Sep 06 09:21:11 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 09:21:11 2026 +0200"
      },
      "message": "chore(deps): bump immutable from 3.8.3 to 3.8.4 (#1739)\n\n* chore(deps): bump immutable from 3.8.3 to 3.8.4\n\nBumps [immutable](https://github.com/immutable-js/immutable-js) from 3.8.3 to 3.8.4.\n- [Release notes](https://github.com/immutable-js/immutable-js/releases)\n- [Changelog](https://github.com/immutable-js/immutable-js/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/immutable-js/immutable-js/compare/v3.8.3...v3.8.4)\n\n---\nupdated-dependencies:\n- dependency-name: immutable\n  dependency-version: 3.8.4\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\n\n* chore(deps): update yarn.lock for immutable 3.8.4\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e\nCo-authored-by: Claus Ibsen \u003cclaus.ibsen@gmail.com\u003e\nCo-authored-by: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "0bcdcc0b560df4bef669b2841a550710f571b5dd",
      "tree": "4a45d85694c61f466d5c12332603b551051a4f95",
      "parents": [
        "299503585c564c88a54bb6cb4b9ab27658e03127"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sat Sep 05 23:06:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 05 23:06:07 2026 +0200"
      },
      "message": "chore(deps-dev): bump toml from 3.0.0 to 4.2.0 (#1738)\n\nBumps [toml](https://github.com/BinaryMuse/toml-node) from 3.0.0 to 4.2.0.\n- [Changelog](https://github.com/BinaryMuse/toml-node/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/BinaryMuse/toml-node/compare/v3.0.0...v4.2.0)\n\n---\nupdated-dependencies:\n- dependency-name: toml\n  dependency-version: 4.2.0\n  dependency-type: direct:development\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "299503585c564c88a54bb6cb4b9ab27658e03127",
      "tree": "0d78e1c77a11a8947e2b11441afe4eb020e574c8",
      "parents": [
        "2e4eff24db86517ed9321a1120b2b4a465fc33de"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sat Sep 05 22:08:54 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 05 22:08:54 2026 +0200"
      },
      "message": "chore(deps): bump fast-uri from 3.1.5 to 3.1.6 (#1736)\n\nBumps [fast-uri](https://github.com/fastify/fast-uri) from 3.1.5 to 3.1.6.\n- [Release notes](https://github.com/fastify/fast-uri/releases)\n- [Commits](https://github.com/fastify/fast-uri/compare/v3.1.5...v3.1.6)\n\n---\nupdated-dependencies:\n- dependency-name: fast-uri\n  dependency-version: 3.1.6\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "2e4eff24db86517ed9321a1120b2b4a465fc33de",
      "tree": "ca1c81cc365b38725c3cd4e6ecf2f6233599286d",
      "parents": [
        "7b7e858c32ea1144d652b6568b4648a257c4b022"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Thu Sep 03 07:50:19 2026 +0200"
      },
      "committer": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Thu Sep 03 07:52:55 2026 +0200"
      },
      "message": "User stories: add eProxim Interlock commercial product\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "7b7e858c32ea1144d652b6568b4648a257c4b022",
      "tree": "f9b1431146ab28856d7a6a6317411fd83634a7e5",
      "parents": [
        "0c0e1b302bdcc596f7aa9573a8305f4268fafa1f"
      ],
      "author": {
        "name": "Adriano Machado",
        "email": "60320+ammachado@users.noreply.github.com",
        "time": "Wed Sep 02 01:41:31 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 07:41:31 2026 +0200"
      },
      "message": "Build: gulp 5 / Antora 3.1.15 / Yarn 4.18, DocSearch v5, and UI preview tooling (#1729)\n\n* Build: upgrade to gulp 5 and Antora 3.1.15\n\nFixes a silent build bug and modernises both gulp pipelines.\n\nThe UI bundle was being produced empty (22 bytes, 0 files). The build task\nin antora-ui-camel is an async function that returned a stream, and gulp\nsettles an async task on its promise; a stream is not a thenable, so\nbundle:pack ran against a dest that had not been written yet. The pipeline\nis now awaited explicitly. This only affected consumers of ui-bundle.zip,\nsince the production playbook reads the staged directory instead.\n\nTheme moved to gulp 5, vinyl-fs 4, undertaker 2, through2 5 and fs-extra 11:\n\n- vinyl-fs 4 is built on streamx, and merge-stream is a node-core\n  PassThrough that silently drops files from streamx sources (93 files in,\n  3 out). Replaced with ordered-read-streams, the streamx-native merge.\n- gulp 5 decodes contents as UTF-8 by default, so binary sources now pass\n  encoding: false. All 58 fonts and images verified byte-identical to the\n  gulp 4 output.\n- Removed the font glob in build.js. src/font has never existed; the fonts\n  are copied into dest/font by the postcssUrl handler. vinyl-fs 3 ignored\n  the missing directory, vinyl-fs 4 raises ENOENT.\n\nPostCSS plugins updated to the PostCSS 8 API. cssnano 8 returns a plugin\nobject rather than a callable, and the bare (css, result) plugins were\nPostCSS 7 style and were no longer being invoked. postcss-custom-properties\n15 keeps the :root block after substitution, so resolved custom properties\nare now dropped explicitly; the generated CSS is 94 bytes smaller than\nbefore with prefixes and media queries unchanged.\n\nRoot gulpfile moved to gulp 5. Replaced del with fs.rm, as del 7+ is ESM\nonly, and fixed generate-markdown signalling completion twice by both\ncalling done() and returning a promise.\n\nAntora 3.1.9 added a warning that fires when an extension\u0027s register\nfunction names its first parameter \u0027registry\u0027. Two of the @djencks\nextensions do, and runtime.log.failure_level is set to warn, so the\nadvisory warning failed the build. Those packages were last published in\n2022 and cannot be fixed upstream, so they are required via thin local\nwrappers in extensions/. Antora now completes with no output at all.\n\nAlso removes max-width: var(--static-max-width) from .blog. The variable\nwas never declared, so the declaration was invalid at computed-value time\nand max-width already resolved to none. This matches .static, which\nconstrains width only in the desktop media query.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* Build: dedupe yarn.lock to fix failing check:dedupe\n\nThe `checks` CI job runs `yarn check:dependencies`, which failed because\n21 transitive packages could be deduped using the highest strategy. The\ndrift is unrelated to the gulp/Antora upgrade; the lockfile simply went\nstale as newer versions of caniuse-lite, nanoid, end-of-stream, fastq,\nfs-extra, postcss, streamx, resolve, readable-stream and svgo published.\n\nRan `yarn update:dedupe`. Both `check:cache` and `check:dedupe` now exit 0.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* Fix PR review comments for gulp 5 upgrade\n\nCo-authored-by: Copilot \u003c223556219+Copilot@users.noreply.github.com\u003e\n\n* Fix CI: disable setup-node auto package-manager-cache in detect-drafts job\n\nThe detect-drafts job never installs dependencies, so setup-node@v5\u0027s\nnew package-manager-cache default (true) fails the post-step with\n\"Path Validation Error\" since there\u0027s no cache folder to save,\nfailing the job despite the draft-detection logic succeeding.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n* Fix CI: bump Node to 22 for cssnano 8\u0027s engines requirement\n\ncssnano 8.x (bumped from ~4.1 as part of the gulp 5 / PostCSS 8\nmigration) declares engines.node \u003e\u003d22.11, since postcss-merge-longhand\nuses Set.prototype.isSubsetOf, which Node only ships unflagged from\nv22. Under Node 20 this threw inside the CSS build stream; the error\nwas swallowed by an unhandled \u0027error\u0027 event on a source stream fed\ninto ordered-read-streams, so the task just hung until gulp-cli\u0027s\n\"did not complete\" exit message, with no visible stack trace in CI.\n\nVerified locally: gulp bundle, yarn build-all, and yarn checks\n(link checker aside, which hardcodes a Linux binary and can\u0027t run on\nmacOS) all pass under Node 22.20.0.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n* Build: upgrade Yarn 4.1.0 to 4.18.0, harden supply-chain settings\n\nFixes the stale compat/typescript patch-hunk warning during install\n(patch hash no longer matched typescript 5.9.3 under the old Yarn).\nAlso tightens approvedGitRepositories to [] (no git-protocol deps in\nthis repo) and sets npmMinimalAgeGate to 4320 minutes (3 days) to\ndelay trusting newly-published npm package versions.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n* Build: migrate Algolia to v5\n\n* Build: replace custom search with DocSearch v5\n\n* Build: restore DocSearch result curation and fix CSS custom property handling\n\nThe DocSearch v5 migration dropped the result curation the previous Algolia\nbundle performed, and routed @docsearch/css through postcss-custom-properties\nwith preserve: false, which flattened away its runtime cascade.\n\nSearch curation (src/js/08-docsearch.js):\n\n* restore the sub-project exclusion via transformItems\n* restore core-docs-over-components ranking; DocSearch groups by hierarchy.lvl0\n  into an insertion-ordered object, so the emitted order decides group order\n* cap each parent page at 2 hits. The original dedupe needed the query to spot a\n  direct parent match and transformItems never receives it, so cap by page\n  instead. Without this a query like \"timer\" fills the first group with anchors\n  from a single document\n* fetch 50 hits rather than the DocSearch default of 20. The index has no\n  attributeForDistinct and no attributesForFaceting, so both filters run after\n  Algolia has picked its window and the default starves the result list\n\nStylesheet delivery (gulp.d/tasks/build.js):\n\n* give @docsearch/css its own build stream that skips the custom property pass,\n  mirroring how the DocSearch UMD bundle already ships as vendor JS. This keeps\n  the mobile --docsearch-spacing overrides and the data-theme\u003ddark block live.\n  Preferred over preserve: true, which costs 3.8 KB gzip site-wide and would\n  reverse a convention predating this branch\n* fail loudly when the @docsearch/js UMD path cannot be resolved\n\nCustom property plugin (gulp.d/lib/drop-resolved-custom-properties.js):\n\n* only drop definitions postcss-custom-properties actually substituted. Matching\n  :root by selector string and recursing into at-rules emptied the @media block\n  @docsearch/css ships, and missed resolved :root, :host list forms\n\nTests: 16 cases covering both the plugin and the search transform. The transform\nsuite evaluates the shipped IIFE against stubbed globals and replays captured\nAlgolia responses, so it exercises the real file rather than a copy.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* Fix: DocSearch modal footer height and header search alignment\n\nBoth found by driving the deployed preview at pr-1729--camel.netlify.app.\n\nDocSearch renders its modal footer as a bare \u003cfooter\u003e element, so the global\n`footer` rule in footer.css applied to it. DocSearch sets `height` but never\n`min-height`, so our `min-height: var(--footer-height)` won outright and\nstretched the modal footer to 23rem (391px) against an expected 52px on desktop\nand 48px on mobile. On mobile the modal is full screen, so the footer took 391px\nof 732px, over half the viewport. Scoped the rule to `body \u003e footer`, which also\nstops the `color` and `font-size` from leaking; verified the site footer is a\nclassless direct child of body on the Antora and Hugo page types.\n\nThe DocSearch button is a fixed 38px, and `.navbar-search` was a block container\nrelying on padding alone to position it. In the 73px desktop bar that left the\nbutton centred at 28px against 36.5px for the nav links. Made the container flex\nwith `align-items: center`, which brings it to 36.5px exactly. `text-align:\nright` no longer applies to a flex container, so it is replaced with\n`justify-content: flex-end`. Mobile is unchanged: the 55px container is exactly\n38px plus padding, so padding alone already centred it there.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* Fix: restore DocSearch result titles and widen the fetch window\n\nSearch results rendered with an empty title, collapsed into a single grey\nbreadcrumb line. DocSearch derives the title attribute as\n`hierarchy.${item.type}`, and this index is not built by DocSearch\u0027s standard\nrecord extractor, so its records carry no `type`. The expression became the\nliteral \u0027hierarchy.undefined\u0027 and resolved to nothing.\n\ntransformItems now assigns the deepest populated hierarchy level as `type`, so\na hit on #_component_option_checkCrcs titles as \"checkCrcs\" with\n\"Camel Components \u003e Components \u003e Kafka\" as subtext. Verified on the deployed\npreview by re-initialising DocSearch with the patched config. This is a\nworkaround; the records should carry `type` and `anchor` - see CAMEL-24396.\n\nRaised hitsPerPage from 50 to 75. Measured against the live index at the\ncurrent cap, this lifts \"timer\" from 5 to 8 distinct pages and \"aggregate\" from\n9 to 13. 100 adds almost nothing beyond 75 (only \"rest dsl\", 8 to 9 pages) but\ndoubles the response from ~18 KB to ~36 KB gzipped.\n\nLeft MAX_HITS_PER_PAGE at 2. Raising it is counterproductive: DocSearch caps\neach lvl0 group at 5 results, so a larger per-page cap spends those slots on\nrepeats from one document and yields fewer distinct pages, not more (\"timer\"\ndrops from 5 pages to 4 at a cap of 3).\n\nNote that thin result sets for \"Kafka\" and \"file\" are not addressable here: 98\nof the top 100 hits for \"Kafka\" are anchors on kafka-component.html, so no\nclient-side window size recovers pages that Algolia never returns. That needs\nserver-side distinct.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* Build: give the DocSearch widget a Camel theme\n\nRestyle the DocSearch v5 widget to match the site palette. Camel orange\ntakes the accents the vendor stylesheet renders in Algolia blue, group\nheadings pick up the ASF dark blue used for page headings, and the\nlaunch button matches the navbar buttons.\n\nThe overrides are declared on .DocSearch rather than :root, and with\nliteral values rather than var(--color-*), because the build resolves\nand then strips every :root custom property from site.css. Both are\nsilent failure modes, so they are covered by tests.\n\nAlso fixes the query text clipping in the search box. The vendor fixes\nthe box at 56px while sizing its padding and font in rem, and this\nsite\u0027s root font-size is 18px rather than the 16px DocSearch assumes,\nwhich left a 19px content box around a 25.2px line. Sizing the box in\nrem keeps it in step with the text.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* Fix: drop table-layout: fixed from admonition tables\n\nThe declaration is inherited from the default Antora UI, which positions\ntd.icon absolutely and so loses nothing when the icon column collapses.\nThis UI keeps the icon in flow as a vertical label bar, which needs the\ncolumn to have width; under fixed layout it gets none, because td.content\nis width: 100%.\n\nIt has never taken effect in production: extensions/table.js wraps every\ntable in a div.table-wrapper, so the table is a grandchild of\n.admonitionblock and the child combinator never matches. Removing it is\na no-op for the built site (verified: the only change to the compiled\nstylesheet is this one declaration) and it fixes gulp preview, which\nrenders with plain Asciidoctor and no Antora extensions.\n\nIt also removes a landmine: any change to extensions/table.js would\notherwise collapse every admonition on the site.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* Build: add UI preview example pages and match the site\u0027s Asciidoctor extensions\n\nThe preview rendered with plain Asciidoctor while the site build registers\npostprocessors through antora-playbook-production.yml, so the two disagreed.\ntable.js is the one that matters: it wraps every table in a div.table-wrapper,\nand without it the preview collapsed the icon column of every admonition.\nRegister table.js and inline-styles.js so preview markup matches the built site.\n\n@asciidoctor/tabs is registered by the playbook but deliberately left out: the\n1.0.0-beta.3 build targets the Opal runtime of asciidoctor.js 2 and throws on\nrequire under the @asciidoctor/core 3 this UI depends on. The site build is\nunaffected, since Antora supplies its own Asciidoctor.\n\nAdd three example pages covering the parts of the UI that needed a closer look:\nadmonitions, source highlighting, and tables. Content is original and\nCamel-flavoured rather than lorem ipsum, so it exercises realistic material.\n\nThe admonitions page documents one finding: the label bar is sized by the\ntable\u0027s auto layout, so it widens from 33px to 63px or 137px once the block\nsits inside a list item or a table cell. No page on the site nests an\nadmonition that way today.\n\nNo change to the shipped UI bundle; preview-src is not packaged.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* Build: run UI tests from gulp, register asciinema and a local media check\n\nMove the unit tests into a gulp task. gulp.d/tasks/test.js drives node:test\nthrough its run() API rather than spawning `node --test`, so gulp settles on the\nreturned promise and a failure fails the task it is sequenced into. The task is\nnow part of the bundle series (clean, lint, test, build, pack), and the package\nscripts delegate to it, so `yarn build` no longer runs the tests separately.\n\nRegister @springio/antora-extensions/asciinema-extension. It supplies the\n[asciinema] block, injects asciinema-player\u0027s JS and CSS into the UI catalog,\nand adds the asciinema-styles, asciinema-load-scripts and\nasciinema-create-scripts partials. asciinema-player arrives as a transitive\ndependency, so it needs no entry of its own.\n\nReplace @bonitasoft/antora-detect-unused-media-extension with a local\nequivalent. That extension logs one warning per unused file and this playbook\nsets runtime.log.failure_level to warn, so a single stray image would have\nfailed the site build. extensions/detect-unused-media.js logs at info instead\nand writes build/unused-media.txt, keeping the report without the failure. It\nstill ignores .cast by default so asciinema recordings are not reported.\n\nAdd preview pages for tabs and asciinema. Neither renders in gulp preview:\n@asciidoctor/tabs 1.0.0-beta.3 targets the Opal runtime of asciidoctor.js 2 and\ncannot load under the @asciidoctor/core 3 the UI depends on, and the asciinema\nblock comes from an Antora extension the standalone preview does not run. Both\npages say so.\n\nAlso drops a committed vim swap file.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* Fix: pagination links, and wire the asciinema partials into the layout\n\nThe prev/next links drew a dashed rule across the full half-width of the\nfooter. .doc a paints its underline with a repeating background-image gradient,\nand nav.pagination span is a column flex container, so the anchor stretched to\nthe container width and the gradient painted all of it. align-items keeps the\nanchor at its text width; the links now sit in bordered boxes.\n\nReference the asciinema partials from head-styles.hbs and footer-scripts.hbs,\nguarded on the page-asciinemacasts attribute the extension sets. The guard\nkeeps the player assets off pages with no recording, and keeps gulp preview\nfrom failing on partials that only exist during an Antora build.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* Build: drop @bonitasoft/antora-detect-unused-media-extension\n\nSuperseded by extensions/detect-unused-media.js, which reports the same thing\nat info level so it cannot trip runtime.log.failure_level: warn.\n\nUpdates the two places that still named the package.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* Build: render asciinema casts in the UI preview\n\nThe [asciinema] block comes from @springio/antora-extensions, an Antora\nextension, so it never ran under gulp preview: the blocks stayed literal\nand the page could not be checked without a full site build.\n\nReproduce the parts of it the preview needs, reusing the extension\u0027s own\npartials, helpers and player assets from node_modules rather than copying\nthem: an image$ include processor so preview pages use the same include\nsyntax a real component does, the asciinema block with the same md5-derived\nid and _asciinema/\u003cid\u003e.cast layout, and registration of the partials the UI\ntemplates already guard on.\n\nThe cast ids are collected into a plain object instead of being set on the\ndocument, mirroring what the extension does with file.asciidoc.attributes.\nAsciidoctor rolls back attributes assigned from the body once parsing ends,\nso a page- attribute set from the block processor is gone by the time\ngetAttributes() runs.\n\nAdd a recorded camel-jbang TUI session as the example cast.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* Fix: re-record the TUI cast without split UTF-8 sequences\n\nThe recorder decoded each read() chunk on its own, so a multi-byte sequence\nsplit across a chunk boundary became U+FFFD. Sixty of them survived into the\ncommitted cast, and each one costs a column: a 2-wide emoji rendered as a\n1-wide replacement box, so every row containing one drifted left and the next\nredraw left stale characters behind. The visible symptom was a ghost row under\nthe tab bar.\n\nRe-recorded with an incremental decoder, which brings it to zero replacement\ncharacters and a clean header.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* Build: drop through2 and raise the Node floor to 22.12\n\nthrough2 5 is ESM only, so require(\u0027through2\u0027) fails below Node 22.12\nwhile antora-ui-camel declared engines.node \u003e\u003d 18.0.0. Rather than pin\nthe dependency back, drop it: all five call sites only ever wanted an\nobject-mode Transform, which node:stream provides directly. gulp.d/lib/map.js\nis that Transform, including the zero-argument passthrough and the\n(transform, flush) form the preview task relies on.\n\ngulp.d/lib/gulp-prettier-eslint.js was still importing through2\u0027s obj()\nafter the gulp 5 upgrade moved the other four call sites to objectTransform,\nso `gulp format` had been calling an undefined map(). It uses the helper now.\n\nNode 18 and 20 are both past end of life, and .nvmrc already pinned 22,\nso engines and the README now say 22.12 rather than claiming support for\ntwo unmaintained runtimes.\n\ndetect-unused-media resolved image targets by string comparison, which\nreported referenced files as unused whenever the target came from an\nattribute. It resolves through contentCatalog.resolveResource now, reads\nattributes from antora.yml and the playbook as well as the page, and when\na target still cannot be resolved it suppresses every image that target\ncould name instead of dropping the reference. The report drives deletion,\nso it has to under-report rather than name a referenced file.\n\nAdds tests for both, and a root `yarn test` script to run them.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* Fix: remove orphaned cancel.svg asset\n\nheader-content.hbs dropped the search-cancel \u003cimg\u003e when DocSearch\nreplaced the hand-rolled search box, but cancel.svg and its\nrev-manifest/asset.js entries were left behind.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n* Fix: pin the DocSearch hitsPerPage test to its actual value\n\nThe test only asserted \u003e\u003d 50, so a regression back down to 50 (or\nany value below the actual HITS_PER_PAGE of 75) would not fail it.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n* Docs: attribute preview-src content adapted from bonita-documentation-theme\n\n404.adoc, ui-model.yml, and multirepo-ssg.svg were adapted from\nbonitasoft/bonita-documentation-theme (MPL-2.0), the same license\nantora-ui-camel already ships under.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nCo-authored-by: Copilot \u003c223556219+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "0c0e1b302bdcc596f7aa9573a8305f4268fafa1f",
      "tree": "a187651ee38fa5c55a68e82e4c1b491ed2d587a3",
      "parents": [
        "35688fd84c48c1078f89e820e5e804f6396fdc11"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Sep 01 21:57:11 2026 +0200"
      },
      "committer": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Sep 01 21:57:11 2026 +0200"
      },
      "message": "Move XSD into correct folder\n"
    },
    {
      "commit": "35688fd84c48c1078f89e820e5e804f6396fdc11",
      "tree": "6f6ea0b70b392f5a6a3d5eb298ae58d78cae6eea",
      "parents": [
        "7dd4294176f012fb43030baa3462e857b689931a"
      ],
      "author": {
        "name": "Omar Atie",
        "email": "atiaomar1978@gmail.com",
        "time": "Mon Aug 31 13:06:14 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 22:06:14 2026 +0200"
      },
      "message": "Blog: GenAI observability two-part series (JBang + Spring Boot) (#1734)\n\n* Blog: GenAI observability two-part series (JBang + Spring Boot)\n\nPublish camel.apache.org blog posts for Camel 4.23 GenAI observability:\nJBang/TUI quick start and Spring Boot with Prometheus/VictoriaTraces.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* Address review feedback and fix broken observability-services links\n\n- Use Camel CLI terminology instead of JBang in prose\n- Point examples to camel-jbang-examples and camel-spring-boot-examples PRs\n- Fix Observability Services link (/components/next/others/...)\n- Use camel.aiObservability.enabled (correct property name)\n- Mark posts as draft until publication date is set\n- Remove inline Claus thanks; add camel infra, export, and Java route content\n- Document CLI dependency auto-discovery as future improvement\n\nCo-authored-by: Cursor Agent \u003cnoreply@cursor.com\u003e\n\n* Publish GenAI observability blog posts with TUI Spans screenshot\n\n- Set draft: false and publication date 2026-08-30\n- Add TUI Spans screenshot showing gen_ai OpenTelemetry attributes\n- Fix route example to resolve property placeholders in Java builder\n- Note pending JIRA for CLI dependency auto-discovery\n\nCo-authored-by: Cursor Agent \u003cnoreply@cursor.com\u003e\n\n* Set GenAI observability blog publication date to 2026-09-01\n\nMove both posts from 2026/08/ to 2026/09/ and update cross-links.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* Move TUI spans screenshot to 2026/09 blog folder and fix broken CLI link\n\n- Move camel-genai-observability-spans.png alongside the September blog post\n- Fix broken /manual/camel-jbang-jdk-installation.html link (404) to /manual/camel-jbang.html\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* Update GenAI observability blogs for reworked Spring Boot example\n\nAlign Part 2 with camel-spring-boot-examples#192: camel infra run\nobservability, management port 9876, Micrometer Tracing OTLP export,\ntwo-model YAML routes, Perses GenAI dashboard screenshots, and\ncamel.aiobservability.enabled property name.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n---------\n\nCo-authored-by: Omar Atie \u003comaratie@Omars-Mac-mini.local\u003e\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\nCo-authored-by: Cursor Agent \u003cnoreply@cursor.com\u003e"
    },
    {
      "commit": "7dd4294176f012fb43030baa3462e857b689931a",
      "tree": "4e5ad19447fbd9b14594bb263cde9ba3100cd785",
      "parents": [
        "249e2256ff28687756e5b2186b7a0070a9b370b0"
      ],
      "author": {
        "name": "Jiří Ondrušek",
        "email": "ondrusek.jiri@gmail.com",
        "time": "Mon Aug 31 21:40:39 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 21:40:39 2026 +0200"
      },
      "message": "Camel Upgrade Recipes 4.22.0 Release notes (#1735)"
    },
    {
      "commit": "249e2256ff28687756e5b2186b7a0070a9b370b0",
      "tree": "c3c90c541cd5cf70a27c33b39b7a61d268209cd7",
      "parents": [
        "7c5051c7cdc5e38ff987be8dc3eac2eb89bd47b9"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Mon Aug 31 08:28:26 2026 +0200"
      },
      "committer": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Mon Aug 31 08:28:35 2026 +0200"
      },
      "message": "csimple is removed\n"
    },
    {
      "commit": "7c5051c7cdc5e38ff987be8dc3eac2eb89bd47b9",
      "tree": "d24a468ad82d95bba3fd3923a74671334d30ebf6",
      "parents": [
        "32745a1c9735df4d5ba093790b84f280d0ba77f2"
      ],
      "author": {
        "name": "Jiří Ondrušek",
        "email": "ondrusek.jiri@gmail.com",
        "time": "Mon Aug 31 07:49:10 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 07:49:10 2026 +0200"
      },
      "message": "Camel Quarkus 3.39.0 announcement blog post (#1731)"
    },
    {
      "commit": "32745a1c9735df4d5ba093790b84f280d0ba77f2",
      "tree": "f9489a81fa5f4155e540672b93474f9ea80f9a0c",
      "parents": [
        "c12a8a282c31277c8a1eb270a1ac2a948e81c5d5"
      ],
      "author": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Fri Aug 28 08:16:38 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 28 08:16:38 2026 +0200"
      },
      "message": "Added Release 4.22.0 Kamelets and docs for LTS (#1733)\n\nSigned-off-by: Andrea Cosentino \u003cancosen@gmail.com\u003e"
    },
    {
      "commit": "c12a8a282c31277c8a1eb270a1ac2a948e81c5d5",
      "tree": "f0719c6cad3828313af6ae0577d103e6dc78e0b4",
      "parents": [
        "b99ae12fc9441cb9deae28fccf360f8a39317f77"
      ],
      "author": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Mon Aug 24 11:59:08 2026 +0200"
      },
      "committer": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Mon Aug 24 14:09:41 2026 +0200"
      },
      "message": "Added CVE-2026-78329\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nSigned-off-by: Andrea Cosentino \u003cancosen@gmail.com\u003e\n"
    },
    {
      "commit": "b99ae12fc9441cb9deae28fccf360f8a39317f77",
      "tree": "55aef06aaffad156d12fc0728c94721068f96a90",
      "parents": [
        "9db698c0f3130428b7caa80a16ae43afb4c935c1"
      ],
      "author": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Mon Aug 24 11:45:03 2026 +0200"
      },
      "committer": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Mon Aug 24 14:09:41 2026 +0200"
      },
      "message": "Added CVE-2026-71300\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nSigned-off-by: Andrea Cosentino \u003cancosen@gmail.com\u003e\n"
    },
    {
      "commit": "9db698c0f3130428b7caa80a16ae43afb4c935c1",
      "tree": "f61766f741ef0628a6ff16fd181e1998099f88f0",
      "parents": [
        "a23ee8cfc837ab024b3b50e012e4b05d569f2fe5"
      ],
      "author": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Mon Aug 24 11:37:39 2026 +0200"
      },
      "committer": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Mon Aug 24 14:09:41 2026 +0200"
      },
      "message": "Added CVE-2026-59230\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nSigned-off-by: Andrea Cosentino \u003cancosen@gmail.com\u003e\n"
    },
    {
      "commit": "a23ee8cfc837ab024b3b50e012e4b05d569f2fe5",
      "tree": "5f5284a8020bbf7b730490bac701c9a32c1f57f7",
      "parents": [
        "93834b4896b5ce7f69c1d0640935b95246eab258"
      ],
      "author": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Mon Aug 24 11:13:54 2026 +0200"
      },
      "committer": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Mon Aug 24 14:09:41 2026 +0200"
      },
      "message": "Added CVE-2026-66908\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nSigned-off-by: Andrea Cosentino \u003cancosen@gmail.com\u003e\n"
    },
    {
      "commit": "93834b4896b5ce7f69c1d0640935b95246eab258",
      "tree": "adae14e7d33f1b93c84ec190bc802e9ce0577109",
      "parents": [
        "809d8032830a8ec361c86606646886124e22128b"
      ],
      "author": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Mon Aug 24 10:21:05 2026 +0200"
      },
      "committer": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Mon Aug 24 14:09:41 2026 +0200"
      },
      "message": "Added CVE-2026-63621\n\nSigned-off-by: Andrea Cosentino \u003cancosen@gmail.com\u003e\n"
    },
    {
      "commit": "809d8032830a8ec361c86606646886124e22128b",
      "tree": "bc1bd2d2a8278ae786f0f97e72688f2d95023173",
      "parents": [
        "e0b4874d53e4aae74305def65e6903e43c3c268c"
      ],
      "author": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Mon Aug 24 09:55:04 2026 +0200"
      },
      "committer": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Mon Aug 24 14:09:41 2026 +0200"
      },
      "message": "Added CVE-2026-66907\n\nSigned-off-by: Andrea Cosentino \u003cancosen@gmail.com\u003e\n"
    },
    {
      "commit": "e0b4874d53e4aae74305def65e6903e43c3c268c",
      "tree": "fbe5b2d41b7dc4d0a7b1df5f6b7ede4c6504cc40",
      "parents": [
        "4316f46b23be6f52b2dab9e7b84cae1c4c0fbc4a"
      ],
      "author": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Mon Aug 24 09:29:44 2026 +0200"
      },
      "committer": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Mon Aug 24 14:09:41 2026 +0200"
      },
      "message": "Added CVE CVE-2026-66906\n\nSigned-off-by: Andrea Cosentino \u003cancosen@gmail.com\u003e\n"
    },
    {
      "commit": "4316f46b23be6f52b2dab9e7b84cae1c4c0fbc4a",
      "tree": "004e51f2304aa283b4bd6ce232d71a9a594b846d",
      "parents": [
        "83c7da0dc432e09ea48615a527beabf4ec951068"
      ],
      "author": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Mon Aug 24 08:25:32 2026 +0200"
      },
      "committer": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Mon Aug 24 14:09:41 2026 +0200"
      },
      "message": "Added CVE-2026-60093\n\nSigned-off-by: Andrea Cosentino \u003cancosen@gmail.com\u003e\n"
    },
    {
      "commit": "83c7da0dc432e09ea48615a527beabf4ec951068",
      "tree": "d95cff68fb3c6c983434b974a7be103efe7d6567",
      "parents": [
        "f3ecd30a58ee0fbe0570b67ac445a32500cd8a79"
      ],
      "author": {
        "name": "James Netherton",
        "email": "jamesnetherton@gmail.com",
        "time": "Mon Aug 17 14:12:39 2026 +0100"
      },
      "committer": {
        "name": "Gaëlle Fournier",
        "email": "gaelle.fournier.work@gmail.com",
        "time": "Tue Aug 18 13:44:09 2026 +0200"
      },
      "message": "Restore Camel Quarkus 3.33.x docs\n"
    },
    {
      "commit": "f3ecd30a58ee0fbe0570b67ac445a32500cd8a79",
      "tree": "a89775d39db18a07b21f8ada187b055dd906c34c",
      "parents": [
        "25fa5f451587aa9270598a20c16039f2e2ae7550"
      ],
      "author": {
        "name": "Gregor Zurowski",
        "email": "gregor@zurowski.org",
        "time": "Mon Aug 17 10:37:35 2026 +0200"
      },
      "committer": {
        "name": "Gregor Zurowski",
        "email": "gregor@zurowski.org",
        "time": "Mon Aug 17 10:37:35 2026 +0200"
      },
      "message": "Add release notes and blog entry for Camel 4.18.4\n"
    },
    {
      "commit": "25fa5f451587aa9270598a20c16039f2e2ae7550",
      "tree": "29816a2b237ed99646951d38ae1ed04a090f1c52",
      "parents": [
        "616f92f1f8b55be9493ec61edc8dafa87dca8c77"
      ],
      "author": {
        "name": "Gregor Zurowski",
        "email": "gregor@zurowski.org",
        "time": "Mon Aug 17 05:56:12 2026 +0000"
      },
      "committer": {
        "name": "Gregor Zurowski",
        "email": "gregor@zurowski.org",
        "time": "Mon Aug 17 05:56:12 2026 +0000"
      },
      "message": "Add XML schemas for Camel 4.18.4\n"
    },
    {
      "commit": "616f92f1f8b55be9493ec61edc8dafa87dca8c77",
      "tree": "76ac9c258d02d39eb99cac2ff8527884436e45a4",
      "parents": [
        "28afc9094c575c15bf83e208b7b50c977a5f0e81"
      ],
      "author": {
        "name": "Gregor Zurowski",
        "email": "gregor@zurowski.org",
        "time": "Sun Aug 16 11:02:31 2026 +0200"
      },
      "committer": {
        "name": "Gregor Zurowski",
        "email": "gregor@zurowski.org",
        "time": "Sun Aug 16 11:02:31 2026 +0200"
      },
      "message": "Add release notes and blog entry for Camel 4.14.9\n"
    },
    {
      "commit": "28afc9094c575c15bf83e208b7b50c977a5f0e81",
      "tree": "6d1a8949225f81e1034d0c717df964176edf081e",
      "parents": [
        "5da8db1f65cdb746e42cf422d6cde2e77deb7244"
      ],
      "author": {
        "name": "Gregor Zurowski",
        "email": "gregor@zurowski.org",
        "time": "Sun Aug 16 08:55:58 2026 +0000"
      },
      "committer": {
        "name": "Gregor Zurowski",
        "email": "gregor@zurowski.org",
        "time": "Sun Aug 16 08:55:58 2026 +0000"
      },
      "message": "Add XML schemas for Camel 4.14.9\n"
    },
    {
      "commit": "5da8db1f65cdb746e42cf422d6cde2e77deb7244",
      "tree": "962d52d22a34fc5488898e262308630e0e34a023",
      "parents": [
        "5f11ae09f3dccdba2092e9758abdcf7773d95589"
      ],
      "author": {
        "name": "Omar Atie",
        "email": "atiaomar1978@gmail.com",
        "time": "Tue Aug 11 22:49:57 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 12 07:49:57 2026 +0200"
      },
      "message": "Blog: Real-Time Analytics with Apache Camel and ClickHouse (#1728)\n\n* Add blog post: Real-Time Analytics with Apache Camel and ClickHouse\n\nIntroduce camel-clickhouse with practical ingestion patterns for Kafka,\nHTTP async inserts, and health monitoring.\n\nCo-authored-by: Cursor Agent \u003cnoreply@cursor.com\u003e\n\n* Update blog post date to 12 August 2026\n\n---------\n\nCo-authored-by: Cursor Agent \u003ccursoragent@cursor.com\u003e\nCo-authored-by: Cursor Agent \u003cnoreply@cursor.com\u003e"
    },
    {
      "commit": "5f11ae09f3dccdba2092e9758abdcf7773d95589",
      "tree": "f49893fd9a58374e4e61f22b6a67a0a65d11d51e",
      "parents": [
        "f4fe0590b6f953026d5c4b0e2dc07ebcbe44fbd3"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Aug 11 20:00:32 2026 +0200"
      },
      "committer": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Aug 11 20:00:51 2026 +0200"
      },
      "message": "Bumps docs to 4.22 and drop 4.14\n"
    },
    {
      "commit": "f4fe0590b6f953026d5c4b0e2dc07ebcbe44fbd3",
      "tree": "8611e411ebbaf36943342de11363d856b8ad7f3c",
      "parents": [
        "27ee37386712aaee7ef7337695b705cfc3cde99a"
      ],
      "author": {
        "name": "Adriano Machado",
        "email": "60320+ammachado@users.noreply.github.com",
        "time": "Tue Aug 11 10:35:58 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 11 16:35:58 2026 +0200"
      },
      "message": "Camel 4.22.0 release manifests for the web installer (#1727)"
    },
    {
      "commit": "27ee37386712aaee7ef7337695b705cfc3cde99a",
      "tree": "9acf7221995dbbb566e0b62c2bf229bb6ca9506a",
      "parents": [
        "8aac8a077f110c31034ced92b7131ae0b95563e6"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Aug 11 16:31:36 2026 +0200"
      },
      "committer": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Aug 11 16:31:36 2026 +0200"
      },
      "message": "Bumps docs to 4.22 and drop 4.14\n"
    },
    {
      "commit": "8aac8a077f110c31034ced92b7131ae0b95563e6",
      "tree": "3f5cd2713488d945288f7d84c4cd0078a938a616",
      "parents": [
        "6cf3086a96c01468c70b0b17d091f273e538d123"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Aug 11 14:13:22 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 11 14:13:22 2026 +0200"
      },
      "message": "blog: Apache Camel 4.22 LTS What\u0027s New (#1720)\n\n* blog: Add Apache Camel 4.22 LTS what\u0027s new blog post\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\nSigned-off-by: Claus Ibsen \u003cclaus.ibsen@gmail.com\u003e\n\n* blog: Add Camel Spring Boot section and refine AI section\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\nSigned-off-by: Claus Ibsen \u003cclaus.ibsen@gmail.com\u003e\n\n* blog: Add TUI screenshot to 4.22 what\u0027s new blog post\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\nSigned-off-by: Claus Ibsen \u003cclaus.ibsen@gmail.com\u003e\n\n* blog: Update date to Aug 12 and add TUI editor blog link\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* Update index.md\n\n---------\n\nSigned-off-by: Claus Ibsen \u003cclaus.ibsen@gmail.com\u003e\nCo-authored-by: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "6cf3086a96c01468c70b0b17d091f273e538d123",
      "tree": "703f5d8fcbdb70c375c7fdd0304b2422df3d9729",
      "parents": [
        "2692c3ee0e2c00fb966eb2b9793900cbb67e991e"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Aug 11 13:31:55 2026 +0200"
      },
      "committer": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Aug 11 13:31:55 2026 +0200"
      },
      "message": "Move xsd to correct folder\n"
    },
    {
      "commit": "2692c3ee0e2c00fb966eb2b9793900cbb67e991e",
      "tree": "fa6a73a7498473c36bd502c230098d4dd5deb8dc",
      "parents": [
        "cba74cde5f705dcd1cc3cc8132c85d500fe6afea"
      ],
      "author": {
        "name": "Gregor Zurowski",
        "email": "gregor@zurowski.org",
        "time": "Tue Aug 11 12:34:52 2026 +0200"
      },
      "committer": {
        "name": "Gregor Zurowski",
        "email": "gregor@zurowski.org",
        "time": "Tue Aug 11 12:34:52 2026 +0200"
      },
      "message": "Add release notes and blog entry for Camel 4.22.0\n"
    },
    {
      "commit": "cba74cde5f705dcd1cc3cc8132c85d500fe6afea",
      "tree": "ac32da1f5972fe79d4106a3f883e54c51ced70d8",
      "parents": [
        "a4d6c908fa0a419841bcd7dda4e4e7cd684ee24f"
      ],
      "author": {
        "name": "Gregor Zurowski",
        "email": "gregor@zurowski.org",
        "time": "Tue Aug 11 10:13:37 2026 +0000"
      },
      "committer": {
        "name": "Gregor Zurowski",
        "email": "gregor@zurowski.org",
        "time": "Tue Aug 11 10:13:58 2026 +0000"
      },
      "message": "Add XML schemas for Camel 4.22.0\n"
    },
    {
      "commit": "a4d6c908fa0a419841bcd7dda4e4e7cd684ee24f",
      "tree": "83ea61c483c81a1d67b975d89d6750159ed70fc8",
      "parents": [
        "644bd711d4928f02d0ea931b58931f4ee82e2a23"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Aug 11 12:07:58 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 11 12:07:58 2026 +0200"
      },
      "message": "blog: Camel TUI editor follow-up blog post (#1725)\n\n* blog: Draft Camel TUI editor follow-up blog post\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\nSigned-off-by: Claus Ibsen \u003cclaus.ibsen@gmail.com\u003e\n\n* blog: Add TUI editor screenshots to follow-up blog post\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* blog: Add note about AI-captured screenshots and TamboUI alignment bug\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* blog: Add Go to route feature to TUI editor blog post\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* blog: Replace and resize TUI editor screenshots to 1600px\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* blog: Position editor as prototyping tool, update date, remove TamboUI note\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* blog: Remove incorrect cost estimates claim from AI panel section\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* blog: Clarify open/run flow, plain mode details, and add roadmap section\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n---------\n\nSigned-off-by: Claus Ibsen \u003cclaus.ibsen@gmail.com\u003e\nCo-authored-by: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "644bd711d4928f02d0ea931b58931f4ee82e2a23",
      "tree": "963e6cc384f770c9f79062b217ed677ba69380bb",
      "parents": [
        "d3d97948cd2a91c74d37536a8ec840028a249486"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Aug 11 07:47:10 2026 +0200"
      },
      "committer": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Tue Aug 11 07:47:10 2026 +0200"
      },
      "message": "docs(tooling): promote Camel TUI to its own section with screenshot and editor details\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "d3d97948cd2a91c74d37536a8ec840028a249486",
      "tree": "3be0239489a30a9b987be3bf41ea21cd89cfbb17",
      "parents": [
        "727deee9df304b753129504b6c9c0665c4ab8d39"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Sat Aug 08 15:48:13 2026 +0200"
      },
      "committer": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Sat Aug 08 15:48:13 2026 +0200"
      },
      "message": "Updated\n"
    },
    {
      "commit": "727deee9df304b753129504b6c9c0665c4ab8d39",
      "tree": "55038094e402edecd5433348fc8c2853bd05c68a",
      "parents": [
        "7c534e114c02aa119655d0ffd24789e6e5853895"
      ],
      "author": {
        "name": "Gaelle Fournier",
        "email": "gaelle.fournier.work@gmail.com",
        "time": "Fri Aug 07 19:36:22 2026 +0200"
      },
      "committer": {
        "name": "Gaëlle Fournier",
        "email": "gaelle.fournier.work@gmail.com",
        "time": "Fri Aug 07 19:39:51 2026 +0200"
      },
      "message": "fix: add --no-build to netlify deploy to skip unwanted build\n\nThe netlify.toml build command (yarn build-all) was being triggered\nby netlify deploy, failing after workspaces were stripped. The public\ndirectory is already pre-built by the PR checks workflow.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "7c534e114c02aa119655d0ffd24789e6e5853895",
      "tree": "505fbea2d20622c4f8402e82235b67b7a91903c0",
      "parents": [
        "52a9c89800376eca63c7ac39743862811f04b8a2"
      ],
      "author": {
        "name": "Gaelle Fournier",
        "email": "gaelle.fournier.work@gmail.com",
        "time": "Fri Aug 07 16:21:14 2026 +0200"
      },
      "committer": {
        "name": "Gaëlle Fournier",
        "email": "gaelle.fournier.work@gmail.com",
        "time": "Fri Aug 07 18:07:06 2026 +0200"
      },
      "message": "fix: strip workspaces before netlify deploy to bypass monorepo detection\n\nNetlify CLI v26 detects yarn workspaces and refuses to deploy in CI\nwith \"Projects detected\" error. Both --cwd (broken since v22.1.7,\nnetlify/cli#7528) and --filter + --dir (--dir silently ignored since\nv22.1.3, netlify/cli#7342) fail to work around it.\n\nStrip the workspaces field from package.json after yarn install and\ncall netlify directly to avoid monorepo detection entirely.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "52a9c89800376eca63c7ac39743862811f04b8a2",
      "tree": "f21e18bec16931a1b31fd790daa21d978b495d1a",
      "parents": [
        "d7d87e8a362369fac3ead1f1a64bdd1e86b70190"
      ],
      "author": {
        "name": "Gaelle Fournier",
        "email": "gaelle.fournier.work@gmail.com",
        "time": "Fri Aug 07 12:50:33 2026 +0200"
      },
      "committer": {
        "name": "Gaëlle Fournier",
        "email": "gaelle.fournier.work@gmail.com",
        "time": "Fri Aug 07 15:16:40 2026 +0200"
      },
      "message": "chore(deps): dedupe for js-yaml-4.3.1\n"
    },
    {
      "commit": "d7d87e8a362369fac3ead1f1a64bdd1e86b70190",
      "tree": "5986aba9ccec9f6c2273468f085d91477f6837ce",
      "parents": [
        "0259dfbbc4c3c9c15e2b7c85a32af815cc2a2cf8"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Aug 07 09:55:45 2026 +0000"
      },
      "committer": {
        "name": "Gaëlle Fournier",
        "email": "gaelle.fournier.work@gmail.com",
        "time": "Fri Aug 07 15:16:40 2026 +0200"
      },
      "message": "chore(deps-dev): bump js-yaml from 4.3.0 to 4.3.1\n\nBumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.3.0 to 4.3.1.\n- [Changelog](https://github.com/nodeca/js-yaml/blob/4.3.1/CHANGELOG.md)\n- [Commits](https://github.com/nodeca/js-yaml/compare/4.3.0...4.3.1)\n\n---\nupdated-dependencies:\n- dependency-name: js-yaml\n  dependency-version: 4.3.1\n  dependency-type: direct:development\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "0259dfbbc4c3c9c15e2b7c85a32af815cc2a2cf8",
      "tree": "8e46bd6d771dd4cfbced3c8568a67302b0f755ea",
      "parents": [
        "7466bed993fc077a5124a3fb4a02cdb5927e758e"
      ],
      "author": {
        "name": "Pratyush Adhikari",
        "email": "pratyushadk990@gmail.com",
        "time": "Fri Aug 07 15:42:40 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 07 12:12:40 2026 +0200"
      },
      "message": "docs(website): add \"Secure out of the box\" section to Trust page (#1680) (#1706)\n\n* docs(website): add \u0027Secure out of the box\u0027 section to Trust page (#1680)\n\n* Apply suggestions from code review\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n---------\n\nCo-authored-by: Claus Ibsen \u003cclaus.ibsen@gmail.com\u003e\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "7466bed993fc077a5124a3fb4a02cdb5927e758e",
      "tree": "f9c81b8f1363ccc44f1f5c6959f67b6d88a63846",
      "parents": [
        "7a7e24e068b8519139e837f57bff6196dac00fe3"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Aug 07 11:18:52 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 07 11:18:52 2026 +0200"
      },
      "message": "chore(deps): bump fast-uri from 3.1.4 to 3.1.5 (#1717)\n\nBumps [fast-uri](https://github.com/fastify/fast-uri) from 3.1.4 to 3.1.5.\n- [Release notes](https://github.com/fastify/fast-uri/releases)\n- [Commits](https://github.com/fastify/fast-uri/compare/v3.1.4...v3.1.5)\n\n---\nupdated-dependencies:\n- dependency-name: fast-uri\n  dependency-version: 3.1.5\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "7a7e24e068b8519139e837f57bff6196dac00fe3",
      "tree": "336c46933fa523a64f864b146c374466e341e57e",
      "parents": [
        "527abb1932e8ed7407cb854524abaffd1c9ffa6c"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Aug 07 11:18:02 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 07 11:18:02 2026 +0200"
      },
      "message": "chore(deps): bump socket.io-parser from 4.2.4 to 4.2.7 (#1715)\n\nBumps [socket.io-parser](https://github.com/socketio/socket.io) from 4.2.4 to 4.2.7.\n- [Release notes](https://github.com/socketio/socket.io/releases)\n- [Changelog](https://github.com/socketio/socket.io/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/socketio/socket.io/compare/socket.io-parser@4.2.4...socket.io-parser@4.2.7)\n\n---\nupdated-dependencies:\n- dependency-name: socket.io-parser\n  dependency-version: 4.2.7\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "527abb1932e8ed7407cb854524abaffd1c9ffa6c",
      "tree": "fa39636cd8fe089e73417352cfc49923a5934661",
      "parents": [
        "161193d8dc87e92238d93b42d5219846f86eaecd"
      ],
      "author": {
        "name": "Gaelle Fournier",
        "email": "gaelle.fournier.work@gmail.com",
        "time": "Fri Aug 07 10:11:15 2026 +0200"
      },
      "committer": {
        "name": "Gaëlle Fournier",
        "email": "gaelle.fournier.work@gmail.com",
        "time": "Fri Aug 07 11:17:13 2026 +0200"
      },
      "message": "fix: netlify config preview update\n"
    },
    {
      "commit": "161193d8dc87e92238d93b42d5219846f86eaecd",
      "tree": "3d8c7b8cccda78b37e4b031e109642ead5625ba8",
      "parents": [
        "f16f64b8d8b5f218804e09af188bc077e16729c4"
      ],
      "author": {
        "name": "Zineb Bendhiba",
        "email": "bendhiba.zineb@gmail.com",
        "time": "Tue Aug 04 12:29:38 2026 +0200"
      },
      "committer": {
        "name": "Zineb BENDHIBA",
        "email": "bendhiba.zineb@gmail.com",
        "time": "Fri Aug 07 10:18:00 2026 +0200"
      },
      "message": "Add blog post about unified AI tooling and MCP server in 4.22\n\nCo-Authored-By: Federico Mariani \u003ccroway@users.noreply.github.com\u003e\nCo-Authored-By: JiriOndrusek \u003condrusek.jiri@gmail.com\u003e\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "f16f64b8d8b5f218804e09af188bc077e16729c4",
      "tree": "9a42e382a7e1cc5f59d9491c1718147629e720e7",
      "parents": [
        "3bb6b52fca8517a6c4b5aefd4f353506c98a835a"
      ],
      "author": {
        "name": "JiriOndrusek",
        "email": "ondrusek.jiri@gmail.com",
        "time": "Tue Aug 04 10:50:22 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 04 10:50:22 2026 +0200"
      },
      "message": "Camel Quarkus 3.27.5 announcement blog post (#1693)"
    },
    {
      "commit": "3bb6b52fca8517a6c4b5aefd4f353506c98a835a",
      "tree": "fd0ad676c9b598faaf5178d6678fb0f1b20ec490",
      "parents": [
        "aa178e4a9321a6d1052b4ab5d2b3d5f25433cc80"
      ],
      "author": {
        "name": "JiriOndrusek",
        "email": "ondrusek.jiri@gmail.com",
        "time": "Tue Aug 04 10:50:12 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 04 10:50:12 2026 +0200"
      },
      "message": "Camel Quarkus 3.33.2 announcement blog post (#1694)"
    },
    {
      "commit": "aa178e4a9321a6d1052b4ab5d2b3d5f25433cc80",
      "tree": "7285974f44629cbdec879ee97d140c58f6c17b19",
      "parents": [
        "8afdc77573b35ec247a58413476d84f5287d8d17"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Mon Aug 03 09:48:31 2026 +0200"
      },
      "committer": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Mon Aug 03 09:48:31 2026 +0200"
      },
      "message": "docs(llms): add security response and Echonect case study links\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "8afdc77573b35ec247a58413476d84f5287d8d17",
      "tree": "8e920b399d18d7161dba899ec80297c4c6e59b20",
      "parents": [
        "321b6fc4eb5b98ad1f80f8544e68f1e0722f52fb"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Mon Aug 03 09:46:24 2026 +0200"
      },
      "committer": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Mon Aug 03 09:46:24 2026 +0200"
      },
      "message": "docs(trust): link recent July blogs from trust page\n\nAdd links to three recent blog posts that reinforce the trust narrative:\nsecurity response process, maintainer continuity, and a 15-year case study.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "321b6fc4eb5b98ad1f80f8544e68f1e0722f52fb",
      "tree": "30d3fbf839b72a6c90d645afc35f1e8758752f9c",
      "parents": [
        "a6d5ad875bfa0f0e0e585cb13af4ff3c1f610bf3"
      ],
      "author": {
        "name": "Pratyush Adhikari",
        "email": "pratyushadk990@gmail.com",
        "time": "Mon Aug 03 10:57:09 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 03 07:27:09 2026 +0200"
      },
      "message": "fix(website): use property attribute for og:description meta tag (#1713)"
    },
    {
      "commit": "a6d5ad875bfa0f0e0e585cb13af4ff3c1f610bf3",
      "tree": "6da71383751b987c7719a6648e46e814ac1cca2c",
      "parents": [
        "2a6e344a3273f2bb1ec687617788959873f41aeb"
      ],
      "author": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Mon Aug 03 07:24:09 2026 +0200"
      },
      "committer": {
        "name": "Claus Ibsen",
        "email": "claus.ibsen@gmail.com",
        "time": "Mon Aug 03 07:25:09 2026 +0200"
      },
      "message": "Add user story\n"
    }
  ],
  "next": "2a6e344a3273f2bb1ec687617788959873f41aeb"
}
