Case study
+{p.title}
+{p.outcome}
+ + + +-
+ {p.stack.map((s) =>
- {s} )} +
+ {p.links.map((l) => ( + {l.label} → + ))} +
+ )} +{project.outcome}
-{project.summary}
+{p.outcome}
+{p.summary}
+ Lessons from edge Kubernetes, GPUs, and running infrastructure like it matters. +
+ + {tags.length > 0 && ( + + )} + ++ ← All posts +
+
All projects →
diff --git a/src/pages/projects/[slug].astro b/src/pages/projects/[slug].astro
new file mode 100644
index 0000000..d8da119
--- /dev/null
+++ b/src/pages/projects/[slug].astro
@@ -0,0 +1,105 @@
+---
+import Layout from "../../layouts/Layout.astro";
+import { getCollection, render } from "astro:content";
+import type { GetStaticPaths } from "astro";
+
+export const getStaticPaths = (async () => {
+ const projects = await getCollection("projects");
+ return projects.map((entry) => ({ params: { slug: entry.id }, props: { entry } }));
+}) satisfies GetStaticPaths;
+
+const { entry } = Astro.props;
+const p = entry.data;
+const { Content } = await render(entry);
+---
+
+ Case study {p.outcome}
+ {p.links.map((l) => (
+ {l.label} →
+ ))}
+
- Edge Kubernetes, GPU inference, self-hosted AI, and the automation that ties
- it together. Full case studies are on the way.
+ Edge Kubernetes, GPU inference, self-hosted AI, and the automation that ties it
+ together — each with the problem, the design, and the outcome.
{p.title}
+
+ {p.stack.map((s) =>
+
+ {p.links && (
+