diff --git a/public/covers/edge-ai-platform.webp b/public/covers/edge-ai-platform.webp new file mode 100644 index 0000000..3f31b49 Binary files /dev/null and b/public/covers/edge-ai-platform.webp differ diff --git a/public/covers/global-infra-modernisation.webp b/public/covers/global-infra-modernisation.webp new file mode 100644 index 0000000..ce5b85c Binary files /dev/null and b/public/covers/global-infra-modernisation.webp differ diff --git a/public/covers/gpu-as-code.webp b/public/covers/gpu-as-code.webp new file mode 100644 index 0000000..3187236 Binary files /dev/null and b/public/covers/gpu-as-code.webp differ diff --git a/public/covers/iac-fleet-automation.webp b/public/covers/iac-fleet-automation.webp new file mode 100644 index 0000000..3af444b Binary files /dev/null and b/public/covers/iac-fleet-automation.webp differ diff --git a/public/covers/network-automation-fleet.webp b/public/covers/network-automation-fleet.webp new file mode 100644 index 0000000..d263743 Binary files /dev/null and b/public/covers/network-automation-fleet.webp differ diff --git a/public/covers/self-hosted-ai-homelab.webp b/public/covers/self-hosted-ai-homelab.webp new file mode 100644 index 0000000..9f276cd Binary files /dev/null and b/public/covers/self-hosted-ai-homelab.webp differ diff --git a/src/content.config.ts b/src/content.config.ts index 12ab186..20d7089 100644 --- a/src/content.config.ts +++ b/src/content.config.ts @@ -18,6 +18,9 @@ const projects = defineCollection({ order: z.number().default(50), // Optional diagram key → rendered by the Diagram component (M3). diagram: z.string().optional(), + // Optional cover art → /covers/.webp, rendered above the case header. + // Sells the story at a glance; the diagram still carries the architecture. + cover: z.string().optional(), links: z .array(z.object({ label: z.string(), href: z.string().url() })) .optional(), diff --git a/src/content/projects/edge-ai-platform.md b/src/content/projects/edge-ai-platform.md index 65e2f8f..dd52f76 100644 --- a/src/content/projects/edge-ai-platform.md +++ b/src/content/projects/edge-ai-platform.md @@ -7,6 +7,7 @@ period: "2025 – Present" stack: ["Kubernetes", "Edge", "NVIDIA GPU", "CD pipelines", "Helm", "Python"] featured: true order: 10 +cover: "edge-ai-platform" diagram: "edge-ai" --- diff --git a/src/content/projects/global-infra-modernisation.md b/src/content/projects/global-infra-modernisation.md index afc5c1f..b0693c1 100644 --- a/src/content/projects/global-infra-modernisation.md +++ b/src/content/projects/global-infra-modernisation.md @@ -7,6 +7,7 @@ period: "2019 – 2025" stack: ["VMware / vSphere", "Azure (Blob, AVS)", "Microsoft 365", "SD-WAN", "Aruba ClearPass", "Palo Alto / FortiGate", "Veeam"] featured: false order: 40 +cover: "global-infra-modernisation" --- ## Problem diff --git a/src/content/projects/gpu-as-code.md b/src/content/projects/gpu-as-code.md index 0bfa446..c5a994d 100644 --- a/src/content/projects/gpu-as-code.md +++ b/src/content/projects/gpu-as-code.md @@ -7,6 +7,7 @@ period: "2025 – Present" stack: ["GPU passthrough", "ESXi", "DCGM Exporter", "Prometheus", "Bash", "Watchdogs"] featured: false order: 30 +cover: "gpu-as-code" --- ## Problem diff --git a/src/content/projects/iac-fleet-automation.md b/src/content/projects/iac-fleet-automation.md index 9f3585b..3e3deec 100644 --- a/src/content/projects/iac-fleet-automation.md +++ b/src/content/projects/iac-fleet-automation.md @@ -7,6 +7,7 @@ period: "2025 – Present" stack: ["Ansible", "AWX", "GitOps", "ACR / NVCR", "Image pre-pull", "Secrets mgmt"] featured: true order: 20 +cover: "iac-fleet-automation" diagram: "iac-fleet" --- diff --git a/src/content/projects/network-automation-fleet.md b/src/content/projects/network-automation-fleet.md index e61cc1f..a546ce7 100644 --- a/src/content/projects/network-automation-fleet.md +++ b/src/content/projects/network-automation-fleet.md @@ -7,6 +7,7 @@ period: "2019 – 2022" stack: ["Unimus (NCM)", "NetBox (IPAM / SoT)", "Config backup & DR", "Bulk config push", "Credential vaulting + rotation", "Multi-vendor switching"] featured: false order: 45 +cover: "network-automation-fleet" diagram: "network-fleet" links: - label: "Unimus" diff --git a/src/content/projects/self-hosted-ai-homelab.md b/src/content/projects/self-hosted-ai-homelab.md index ee0fa7e..1d0d371 100644 --- a/src/content/projects/self-hosted-ai-homelab.md +++ b/src/content/projects/self-hosted-ai-homelab.md @@ -7,6 +7,7 @@ period: "Ongoing" stack: ["Talos", "OpenShift", "ArgoCD", "Proxmox", "Local LLM", "Cloudflare Tunnel"] featured: true order: 15 +cover: "self-hosted-ai-homelab" diagram: "homelab" --- diff --git a/src/pages/projects/[slug].astro b/src/pages/projects/[slug].astro index 6958e9c..d516a22 100644 --- a/src/pages/projects/[slug].astro +++ b/src/pages/projects/[slug].astro @@ -19,6 +19,19 @@ const { Content } = await render(entry);
← All projects + {p.cover && ( +
+ {`${p.title} +
+ )} +

Case study

{p.title}

@@ -65,6 +78,21 @@ const { Content } = await render(entry); color: var(--accent); text-decoration: none; } + /* Cover art is generated in the site palette on near-black, so it sits on the + page background directly - no light card (that's for the fixed-colour SVG + diagrams, which need a constant surface to stay legible in dark mode). */ + .case__cover { + margin: 0 0 var(--space-6); + border: 1px solid var(--border-accent); + border-radius: var(--radius); + overflow: hidden; + line-height: 0; + } + .case__cover img { + width: 100%; + height: auto; + display: block; + } .case__title { margin-top: var(--space-3); font-size: var(--step-4);