docs: add automated what's new highlights (#25729)

## Summary

Replace the static Featured topics section with a data-driven Whatʼs new
timeline. Show the five most important launches by default and let
readers expand the full curated 30-day archive.

Run a daily Claude Sonnet 5 curator over a rolling 30-day window, with
manual dispatch support, deterministic validation, and bot-managed pull
requests. Package the editorial workflow as the reusable
`curate-whats-new` repository skill so Docker Agent and other Agent
Skills-compatible clients can invoke the same process.

Preserve the human-reviewed July 13 through August 11, 2026 result and
flexible selection criteria as a regression example outside the skillʼs
runtime context.

@netlify /

[Homepage
preview](https://deploy-preview-25729--docsdocker.netlify.app/)

Generated by Codex
This commit is contained in:
David Karlsson authored and GitHub committed 2026-08-12 17:23:31 +02:00
1 parent 58f1389442
commit 678542f456
12 files changed
+685 -45

No files matched your search

+79
View File
@@ -0,0 +1,79 @@
{{- $data := index hugo.Data "whats-new" -}}
{{- with $data.items -}}
{{- $items := sort . "published" "desc" -}}
{{- $more := where $items "featured" false -}}
<section class="py-10 md:py-12" x-data="{ expanded: false }">
<div class="container mx-auto max-w-4xl px-4">
<header class="mb-6 border-b border-gray-200 pb-4 dark:border-gray-800">
<h2 class="text-2xl font-semibold text-gray-900 dark:text-white">
What's new
</h2>
</header>
<ol>
{{ range $items }}
<li
{{ if not .featured }}
x-cloak x-show="expanded" x-collapse.duration.300ms
{{ end }}
class="grid grid-cols-[1fr] md:grid-cols-[5rem_1fr] md:gap-x-6"
>
<time
class="hidden pt-5 text-right text-sm text-gray-500 md:block dark:text-gray-400"
datetime="{{ .published }}"
>{{ .published | time.Format "Jan 2" }}</time
>
<a
href="{{ .url }}"
class="group relative block border-l border-gray-200 py-5 pl-7 dark:border-gray-700"
>
<span
aria-hidden="true"
class="absolute top-6 -left-[5px] size-[9px] rounded-full bg-gray-300 ring-4 ring-gray-50 transition group-hover:bg-blue-500 dark:bg-gray-600 dark:ring-gray-950 dark:group-hover:bg-blue-400"
></span>
<span
class="mb-1 flex flex-wrap items-center gap-x-2 text-sm font-medium text-blue-600 dark:text-blue-400"
>
{{ .product }}
<time
class="font-normal text-gray-500 md:hidden dark:text-gray-400"
datetime="{{ .published }}"
>{{ .published | time.Format "Jan 2" }}</time
>
</span>
<span class="flex items-center gap-2">
<span
class="font-medium text-gray-900 transition group-hover:text-blue-500 dark:text-white dark:group-hover:text-blue-400"
>{{ .title }}</span
>
<span
class="icon-svg shrink-0 text-gray-400 transition group-hover:translate-x-1 group-hover:text-blue-500 dark:text-gray-500 dark:group-hover:text-blue-400"
>
{{ partialCached "icon" "arrow-right" "arrow-right" }}
</span>
</span>
<span class="mt-1 block text-sm text-gray-600 dark:text-gray-300"
>{{ .description }}</span
>
</a>
</li>
{{ end }}
</ol>
{{ with $more }}
<button
type="button"
@click="expanded = !expanded"
:aria-expanded="expanded"
class="mt-4 ml-7 inline-flex items-center gap-1 text-sm font-medium text-blue-600 hover:text-blue-500 md:ml-[6.5rem] dark:text-blue-400 dark:hover:text-blue-300"
>
<span x-text="expanded ? 'Show less' : 'Show more'">Show more</span>
<span class="icon-svg icon-sm" x-show="!expanded">
{{ partialCached "icon" "chevron-down" "chevron-down" }}
</span>
<span class="icon-svg icon-sm" x-cloak x-show="expanded">
{{ partialCached "icon" "chevron-up" "chevron-up" }}
</span>
</button>
{{ end }}
</div>
</section>
{{- end -}}
@@ -0,0 +1,9 @@
{{- $data := index hugo.Data "whats-new" -}}
{{- with $data.items }}
## What's new
{{ range . }}
{{ printf "- [%s: %s](%s): %s (%s)\n" .product .title .url .description (.published | time.Format "Jan 2, 2006") -}}
{{ end }}
{{- end }}
+1 -37
View File
@@ -116,43 +116,7 @@
</div>
</section>
<!-- Popular Topics Section -->
<section class="py-8">
<div class="container mx-auto max-w-3xl px-4">
<h2
class="mb-8 text-center text-2xl font-semibold text-gray-900 dark:text-white"
>
Featured topics
</h2>
<div
class="divide-y divide-gray-200 rounded-xl border border-gray-200 bg-white dark:divide-gray-700 dark:border-gray-700 dark:bg-gray-900"
>
{{ range slice
(dict "url" "/dhi/" "title" "Docker Hardened Images")
(dict "url" "/ai/sandboxes/get-started/" "title" "Get started with Docker Sandboxes")
(dict "url" "/desktop/" "title" "Docker Desktop overview")
(dict "url" "/engine/install/" "title" "Install Docker Engine")
(dict "url" "/reference/dockerfile/" "title" "Dockerfile reference")
(dict "url" "/build/" "title" "Docker Build overview")
}}
<a
href="{{ .url }}"
class="group flex items-center justify-between px-4 py-3 transition hover:bg-blue-50 dark:hover:bg-gray-700"
>
<span
class="text-gray-900 transition group-hover:text-blue-500 dark:text-white dark:group-hover:text-blue-400"
>{{ .title }}</span
>
<span
class="icon-svg text-gray-400 transition group-hover:translate-x-1 dark:text-gray-500"
>
{{ partialCached "icon" "arrow-right" "arrow-right" }}
</span>
</a>
{{ end }}
</div>
</div>
</section>
{{ partial "whats-new.html" . }}
</main>
<footer>{{ partialCached "footer.html" . }}</footer>
</body>