diff --git a/src/components/SkillGroup.astro b/src/components/SkillGroup.astro
index 1a61b00..55dca05 100644
--- a/src/components/SkillGroup.astro
+++ b/src/components/SkillGroup.astro
@@ -25,6 +25,13 @@ const spanClass =
{group.flag &&
{group.flag}
}
{group.title}
{group.blurb}
+ {group.points && (
+
+ {group.points.map((point) => (
+ - {point}
+ ))}
+
+ )}
{group.items.map((item) => (
- {item}
@@ -97,12 +104,12 @@ const spanClass =
position: relative;
margin: 0;
font-family: var(--font-display);
- font-size: 19px;
- font-weight: 600;
+ font-size: 23px;
+ font-weight: 700;
color: var(--text-strong);
}
.tile--hero .tile__title {
- font-size: 26px;
+ font-size: 30px;
}
.tile__blurb {
position: relative;
@@ -118,6 +125,39 @@ const spanClass =
max-width: 420px;
}
+ .tile__points {
+ position: relative;
+ list-style: none;
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ margin: 6px 0 0;
+ padding: 0;
+ font-size: 13.5px;
+ line-height: 1.55;
+ color: var(--text-dim);
+ }
+ .tile__points li {
+ padding-left: 18px;
+ position: relative;
+ text-wrap: pretty;
+ }
+ .tile__points li::before {
+ content: "";
+ position: absolute;
+ left: 0;
+ top: 0.55em;
+ width: 8px;
+ height: 2px;
+ background: linear-gradient(90deg, var(--accent), var(--accent-2));
+ border-radius: 1px;
+ }
+ .tile--hero .tile__points {
+ font-size: 14.5px;
+ gap: 12px;
+ max-width: 460px;
+ }
+
.tile__chips {
position: relative;
list-style: none;
diff --git a/src/data/skills.ts b/src/data/skills.ts
index 733a1ab..5e3d352 100644
--- a/src/data/skills.ts
+++ b/src/data/skills.ts
@@ -5,6 +5,9 @@ export type SkillGroup = {
title: string;
// Short framing line for the group.
blurb: string;
+ /** Proof-point lines rendered between the blurb and the chips — fills the
+ * tall tiles (hero / full) so the tile reads as substance, not whitespace. */
+ points?: string[];
items: string[];
/** Bento tile size — "hero" = 2×2 flagship · "wide" = 2×1 · "full" = whole row · default 1×1. */
span?: "hero" | "wide" | "full";
@@ -20,6 +23,12 @@ export const skills: SkillGroup[] = [
span: "hero",
flag: "FLAGSHIP",
blurb: "Serving vision and language models on real hardware at the edge.",
+ points: [
+ "Fail-closed computer vision on single-node OpenShift — probes that catch a silently dead model, not just a dead pod.",
+ "One GPU, two jobs — a single card time-sliced between LLM serving and video transcode, with neither noticing.",
+ "DeepStream analytics pipelines run as first-class Kubernetes workloads, not appliances.",
+ "Local models behind an OpenAI-compatible gateway — swap the backend, keep every client.",
+ ],
items: [
"NVIDIA GPU Operator",
"GPU passthrough (ESXi, as code)",
@@ -89,6 +98,11 @@ export const skills: SkillGroup[] = [
title: "Observability & Ops",
span: "full",
blurb: "Knowing the system is healthy — and the GPUs with it.",
+ points: [
+ "Fleet metrics by remote-write — every cluster ships to one Prometheus, GPUs included (DCGM / Intel Xe).",
+ "Alerts that reach a phone and mean it — tuned until silence means healthy, not unmonitored.",
+ "A backup is a rumour until a restore drill proves it — drills are scheduled, not aspirational.",
+ ],
items: [
"Prometheus",
"Grafana",