diff --git a/.claude/agents/design-review.md b/.claude/agents/design-review.md
index 37d8509..33b2e7b 100644
--- a/.claude/agents/design-review.md
+++ b/.claude/agents/design-review.md
@@ -68,13 +68,13 @@ Use the Report Format at the bottom of this file.
These are the categories. The CSS supplies the specifics.
-1. **Color palette discipline.** Every `color:`, `background:`, `border-color:`, `border-top:` etc. must resolve to a token defined in the main theme CSS (or plain `#fff` / black-or-white `rgba()` for shadows/overlays). Prefer `var(--r-...)` references over raw hex. Flag any off-palette hex or rgb.
-2. **Component class usage.** Title slides use `` with nested `.title-slide`. Section dividers use ``. Cards use `.card` (no inline accent borders — base styling is sufficient). Lists prefer `ul.styled-list`. Icons wrap in `.icon-accent`. Badges/pills use `.badge`. Source attributions use ``. Horizontal rules use `
`. Social links use the `.social-links` wrapper.
+1. **Color palette discipline.** Every `color:`, `background:`, `border-color:`, `border-top:` etc. must resolve to a token defined in the main theme CSS (or plain `#fff` / black-or-white `rgba()` for shadows/overlays). Prefer `var(--r-...)` references over raw hex. Flag any off-palette hex or rgb. Also flag raw hex that exactly matches a token's value (e.g. `fill="#1a202c"` instead of `style="fill: var(--r-heading-color)"`) as **INFO** — the value is correct but the hardcoded form will silently diverge if the theme changes. This applies to SVG `fill`/`stroke` attributes too; modern inline SVG supports `var()` in `style` attributes.
+2. **Component class usage.** Title slides use `` with nested `.title-slide`. Section dividers use ``. Cards use `.card` (no inline accent borders — base styling is sufficient). Lists prefer `ul.styled-list` — **but verify overflow before flagging**. `.styled-list` adds significant padding and line-height; in dense cards (icon + heading + paragraph + multi-item list + closing element) this can push the slide past the 960×700 bound. If the card is already content-heavy, flag as **INFO** and note that the render check must confirm zero overflow after applying the fix. Only flag as WARNING when the card has room to spare. Icons wrap in `.icon-accent`. Badges/pills use `.badge`. Source attributions use ``. Horizontal rules use `
`. Social links use the `.social-links` wrapper.
3. **Heading hierarchy.** Exactly one `` per presentation (on the title slide). `` for section-divider titles, title-slide subtitle, and content-slide titles. `` for sub-headings inside content slides. `` only for decorative labels inside `.card` — do not flag `` inside cards. Do not skip levels. Do not use `` on section dividers.
4. **Layout via utilities, not inline styles.** Prefer the utility classes defined in `utilities.css` (flex, grid, gap, spacing, sizing, rounding, shadows) over equivalent inline styles. Do not recommend a utility class where higher-specificity CSS would override it (e.g., don't push `.mt-*` onto `.source`, which has its own `margin-top` rule). Acceptable inline styles: `max-width`, `font-size` tweaks, absolute positioning for overlays, and margin-top on elements whose CSS already sets it.
5. **Images.** Must have `alt` (use `alt=""` + `aria-hidden="true"` for purely decorative). Content images use `.rounded`; profile photos use `.rounded-full`. Large images have a `max-width` constraint. External images carry a `.source` attribution. In later sections, missing `loading="lazy"` is worth an INFO flag.
6. **Fragments.** Cards in a grid that use `fragment` should do so consistently — all-or-nothing within a given grid.
-7. **Progression gradients.** Multi-step visual progressions (bars, stacks, timelines) use a two-endpoint gradient interpolated between `--r-accent-color` and `--r-link-color` via `color-mix(in srgb, var(--r-accent-color) %, var(--r-link-color))`. For N steps, step i uses `pct = 100 - (i * 100 / (N - 1))`. Always include a solid-color fallback before the `color-mix()` declaration. Text on fills is `#fff`. Fills go on block/bar elements, not `.card`. The same concept on multiple slides uses the same percentage.
+7. **Progression gradients.** Multi-step visual progressions (bars, stacks, timelines) use a two-endpoint gradient interpolated between `--r-accent-color` and `--r-link-color-dark` via `color-mix(in srgb, var(--r-accent-color) %, var(--r-link-color-dark))`. For N steps, step i uses `pct = 100 - (i * 100 / (N - 1))`. Always include a solid-color fallback before the `color-mix()` declaration. Text on fills is `#fff`. Fills go on block/bar elements, not `.card`. The same concept on multiple slides uses the same percentage.
8. **Timeline era cards.** Past/completed → `.card` with reduced opacity. Current/active → `.card` with `background: var(--r-accent-light)` at full opacity. Opacity alone is not sufficient to convey active state.
9. **Portrait-mode resilience.** `.grid-cols-2/3/5` collapse to one column; `.col-span-2` resets; images cap at `max-height: 260px`. Layouts that lose meaning when stacked vertically get an INFO flag, especially dense `.grid-cols-5`.
10. **Print considerations.** The `@media print` block alters backgrounds. Slides that rely solely on a gradient background to convey structure deserve an INFO flag.
diff --git a/docker-training/sections/cloud-native.html b/docker-training/sections/cloud-native.html
index a151985..cbe11d5 100644
--- a/docker-training/sections/cloud-native.html
+++ b/docker-training/sections/cloud-native.html
@@ -56,30 +56,30 @@
- Core Technologies
+ Core Technologies
-
+
Containers
-
+
Microservices
-
+
Service Meshes
-
+
Serverless
-
+
Declarative APIs
-
+
Immutable Infrastructure
diff --git a/docker-training/sections/container-history.html b/docker-training/sections/container-history.html
index 860c2f8..3758e07 100644
--- a/docker-training/sections/container-history.html
+++ b/docker-training/sections/container-history.html
@@ -4,10 +4,10 @@ What are containers?
A lightweight, isolated environment to run an application —
using features already built into the Linux kernel
-
-
"chroot on steroids"
+
+ "chroot on steroids"
— Jérôme Petazzoni
-
+
diff --git a/docker-training/sections/docker-desktop.html b/docker-training/sections/docker-desktop.html
index 8ac29f9..21bccd2 100644
--- a/docker-training/sections/docker-desktop.html
+++ b/docker-training/sections/docker-desktop.html
@@ -23,6 +23,7 @@
Docker Desktop Architecture
src="imgs/docker-desktop-architecture.png"
style="max-width: 80%; max-height: 540px;"
alt="Docker Desktop Architecture"
+ loading="lazy"
/>
diff --git a/docker-training/sections/docker-images.html b/docker-training/sections/docker-images.html
index d3a8aba..c2328fb 100644
--- a/docker-training/sections/docker-images.html
+++ b/docker-training/sections/docker-images.html
@@ -10,11 +10,11 @@ Images & Layers
-
+
-
+
@@ -22,92 +22,92 @@ Images & Layers
+ fill="none" style="stroke: var(--r-accent-color)" stroke-width="2" stroke-dasharray="8,4"/>
+ fill="none" style="stroke: var(--r-accent-color)" stroke-width="1.5" stroke-dasharray="5,3"/>
Thin R/W layer
+ font-size="13" style="fill: var(--r-heading-color)">Thin R/W layer
+ style="stroke: var(--r-muted-color)" stroke-width="1.5" marker-end="url(#arr-sm)"/>
Container layer
+ font-size="11" style="fill: var(--r-muted-color)">Container layer
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+ fill="white" style="stroke: var(--r-card-border)" stroke-width="1.5" stroke-dasharray="4,3"/>
-
+
91e54dfb1179
0 B
-
+
d74508fb6632
1.895 KB
-
+
c22013c84729
194.5 KB
-
+
d3a1f33e8a5a
188.1 MB
ubuntu:15.04
+ font-size="13" style="fill: var(--r-heading-color)">ubuntu:15.04
-
+ fill="none" style="stroke: var(--r-muted-color)" stroke-width="2"/>
+
-
+
+ fill="none" style="stroke: var(--r-link-color)" stroke-width="2.5"/>
Image layers (R/O)
+ font-size="12" font-weight="600" style="fill: var(--r-heading-color)">Image layers (R/O)
Container
+ font-size="13" style="fill: var(--r-muted-color)">Container
(based on ubuntu:15.04 image)
+ font-size="11" style="fill: var(--r-muted-color)">(based on ubuntu:15.04 image)
Dockerfile:
+ font-size="17" font-weight="700" style="fill: var(--r-heading-color)">Dockerfile:
+ style="fill: var(--r-accent-color)"/>
-
+
+ style="stroke: var(--r-heading-color)" stroke-width="1.2" opacity="0.6"/>
FROM ubuntu:15.04
+ font-family="monospace" font-size="15" font-weight="600" fill="white">FROM ubuntu:15.04
Images & Layers
-->
+ style="stroke: var(--r-accent-color)" stroke-width="3.5" marker-end="url(#arr-layers)"/>
+ style="stroke: var(--r-accent-color)" stroke-width="3.5" marker-end="url(#arr-layers)"/>
+ style="stroke: var(--r-accent-color)" stroke-width="3.5" marker-end="url(#arr-layers)"/>
+ style="stroke: var(--r-accent-color)" stroke-width="3.5" marker-end="url(#arr-layers)"/>
@@ -170,6 +170,7 @@ Container Layer
src="imgs/container-layers.png"
style="max-width: 70%"
alt="Container Layers"
+ loading="lazy"
/>
@@ -181,6 +182,7 @@ Image Layer Details
src="imgs/image-layer-detail1.jpeg"
style="max-width: 80%"
alt="Image Layer Details"
+ loading="lazy"
/>
@@ -192,6 +194,7 @@ Image Layer Details
src="imgs/image-layer-detail2.jpeg"
style="max-width: 80%"
alt="Image Layer Details"
+ loading="lazy"
/>
diff --git a/docker-training/sections/docker-kubernetes.html b/docker-training/sections/docker-kubernetes.html
index 3b2f2b9..a79a45a 100644
--- a/docker-training/sections/docker-kubernetes.html
+++ b/docker-training/sections/docker-kubernetes.html
@@ -7,6 +7,7 @@ Docker Architecture
src="imgs/docker-k8s-arch.png"
style="max-width: 70%"
alt="Docker Architecture"
+ loading="lazy"
/>
@@ -18,9 +19,10 @@ Kubernetes Architecture
src="imgs/k8s-architecture.png"
style="max-width: 80%"
alt="Kubernetes Architecture"
+ loading="lazy"
/>
- Credit: @ajeetraina
+
Docker & Kubernetes Architecture
@@ -31,6 +33,7 @@ Docker
class="rounded"
src="imgs/docker-containerd.png"
alt="Docker containerd Architecture"
+ loading="lazy"
/>
@@ -39,6 +42,7 @@
Kubernetes
class="rounded"
src="imgs/k8s-containerd.png"
alt="Kubernetes containerd Architecture"
+ loading="lazy"
/>
diff --git a/docker-training/sections/docker-networking.html b/docker-training/sections/docker-networking.html
index 3959f23..48166d4 100644
--- a/docker-training/sections/docker-networking.html
+++ b/docker-training/sections/docker-networking.html
@@ -7,6 +7,7 @@ Overlay Network
src="imgs/overlay-network.png"
style="max-width: 50%; max-height: 540px;"
alt="Overlay Network"
+ loading="lazy"
/>
@@ -18,6 +19,7 @@ Bridged Network
src="imgs/bridged-network.png"
style="max-width: 50%; max-height: 540px;"
alt="Bridged Network"
+ loading="lazy"
/>
@@ -29,6 +31,7 @@ MACVLAN Network
src="imgs/macvlan-network.png"
style="max-width: 50%; max-height: 540px;"
alt="MACVLAN Network"
+ loading="lazy"
/>
diff --git a/docker-training/sections/docker-swarm.html b/docker-training/sections/docker-swarm.html
index 7ec7344..194e437 100644
--- a/docker-training/sections/docker-swarm.html
+++ b/docker-training/sections/docker-swarm.html
@@ -7,6 +7,7 @@ Docker Swarm
src="imgs/swarm-overview.jpeg"
style="max-width: 70%"
alt="Docker Swarm Overview"
+ loading="lazy"
/>
@@ -18,6 +19,7 @@ Swarm Architecture
src="imgs/swarm-architecture.png"
style="max-width: 70%"
alt="Swarm Architecture"
+ loading="lazy"
/>
@@ -29,6 +31,7 @@ Deployment
src="imgs/swarm-deployment.png"
style="max-width: 70%"
alt="Swarm Deployment"
+ loading="lazy"
/>
@@ -40,6 +43,7 @@ Swarm Services
src="imgs/swarm-services.png"
style="max-width: 70%"
alt="Swarm Services"
+ loading="lazy"
/>
diff --git a/docker-training/sections/docker-volumes.html b/docker-training/sections/docker-volumes.html
index 8d55cb7..1ced3b6 100644
--- a/docker-training/sections/docker-volumes.html
+++ b/docker-training/sections/docker-volumes.html
@@ -20,6 +20,7 @@ Bind Mount
src="imgs/bind-mount.png"
alt="Bind Mount"
style="max-height: 220px"
+ loading="lazy"
/>
@@ -29,6 +30,7 @@
Volume
src="imgs/volume-mount.png"
alt="Volume Mount"
style="max-height: 220px"
+ loading="lazy"
/>
@@ -38,6 +40,7 @@
tmpfs
src="imgs/tmpfs-mount.png"
alt="tmpfs Mount"
style="max-height: 220px"
+ loading="lazy"
/>
diff --git a/docker-training/sections/monitoring.html b/docker-training/sections/monitoring.html
index 39458b7..32ac084 100644
--- a/docker-training/sections/monitoring.html
+++ b/docker-training/sections/monitoring.html
@@ -7,6 +7,7 @@ Custom Monitoring
src="imgs/custom-monitoring.png"
style="max-width: 80%"
alt="Custom Monitoring"
+ loading="lazy"
/>
diff --git a/docker-training/sections/serverless.html b/docker-training/sections/serverless.html
index 93943f4..dc16674 100644
--- a/docker-training/sections/serverless.html
+++ b/docker-training/sections/serverless.html
@@ -7,6 +7,7 @@ Future == Serverless
src="imgs/serverless-future.png"
style="max-width: 70%"
alt="Serverless Future"
+ loading="lazy"
/>
@@ -18,6 +19,7 @@ Serverless is made of Servers!
src="imgs/serverless-servers.png"
style="max-width: 70%"
alt="Serverless is made of Servers"
+ loading="lazy"
/>
@@ -50,6 +52,7 @@ OpenFaaS
src="imgs/openfaas.png"
style="max-width: 70%"
alt="OpenFaaS"
+ loading="lazy"
/>
diff --git a/docker-training/sections/why-docker.html b/docker-training/sections/why-docker.html
index 48972ee..a1ec711 100644
--- a/docker-training/sections/why-docker.html
+++ b/docker-training/sections/why-docker.html
@@ -123,7 +123,7 @@
The Evolution of Software Architecture
- Credit: @benorama
+
A Brief History Lesson
@@ -257,6 +257,7 @@ Build, Ship, Run — Any App, Anywhere
alt="Build, Ship, Run - Any App, Anywhere"
/>
+ Source: Docker, Inc.
Docker Hub in Numbers
diff --git a/shared/sections/jochen.html b/shared/sections/jochen.html
index 241a01c..88387f0 100644
--- a/shared/sections/jochen.html
+++ b/shared/sections/jochen.html
@@ -1,3 +1,4 @@
+
Jochen Zehnder
Engineering Leader Public Cloud Engineering at Inventx
@@ -88,3 +89,4 @@
+