diff --git a/docs/assets/social-preview.png b/docs/assets/social-preview.png
new file mode 100644
index 0000000..3d65afa
Binary files /dev/null and b/docs/assets/social-preview.png differ
diff --git a/docs/assets/social-preview.svg b/docs/assets/social-preview.svg
new file mode 100644
index 0000000..efcda6b
--- /dev/null
+++ b/docs/assets/social-preview.svg
@@ -0,0 +1,33 @@
+
diff --git a/scripts/render_social_preview.py b/scripts/render_social_preview.py
new file mode 100644
index 0000000..237b113
--- /dev/null
+++ b/scripts/render_social_preview.py
@@ -0,0 +1,171 @@
+#!/usr/bin/env python3
+from __future__ import annotations
+
+from pathlib import Path
+
+from PIL import Image, ImageDraw, ImageFont
+
+
+WIDTH = 1280
+HEIGHT = 640
+BACKGROUND = "#FFFFFF"
+INK = "#111111"
+MUTED = "#4B5563"
+ACCENT = "#D9DDE3"
+
+ROOT = Path(__file__).resolve().parents[1]
+OUT_DIR = ROOT / "docs" / "assets"
+PNG_PATH = OUT_DIR / "social-preview.png"
+SVG_PATH = OUT_DIR / "social-preview.svg"
+
+
+def font(path: str, size: int) -> ImageFont.FreeTypeFont:
+ return ImageFont.truetype(path, size)
+
+
+SERIF = "/System/Library/Fonts/Supplemental/Georgia.ttf"
+SANS = "/System/Library/Fonts/SFNS.ttf"
+
+
+def draw_png() -> None:
+ OUT_DIR.mkdir(parents=True, exist_ok=True)
+ image = Image.new("RGB", (WIDTH, HEIGHT), BACKGROUND)
+ draw = ImageDraw.Draw(image)
+
+ title_font = font(SERIF, 74)
+ headline_font = font(SANS, 34)
+ body_font = font(SANS, 21)
+ stat_font = font(SANS, 18)
+ small_font = font(SANS, 16)
+
+ x = 92
+ y = 82
+
+ draw.text((x, y), "YAO", fill=INK, font=title_font)
+ y += 90
+ draw.text((x, y), "Yielding AI Outcomes", fill=INK, font=headline_font)
+ y += 60
+ draw.text(
+ (x, y),
+ "A rigorous engineering, evaluation, governance, and portability system",
+ fill=INK,
+ font=body_font,
+ )
+ y += 34
+ draw.text(
+ (x, y),
+ "for reusable agent skills.",
+ fill=INK,
+ font=body_font,
+ )
+
+ y += 62
+ draw.line((x, y, WIDTH - 92, y), fill=ACCENT, width=2)
+ y += 34
+
+ score_box_w = 250
+ score_box_h = 118
+ draw.rounded_rectangle(
+ (x, y, x + score_box_w, y + score_box_h),
+ radius=18,
+ outline=ACCENT,
+ width=2,
+ fill=BACKGROUND,
+ )
+ draw.text((x + 22, y + 18), "Weighted Score", fill=MUTED, font=stat_font)
+ draw.text((x + 22, y + 48), "91.5", fill=INK, font=font(SERIF, 42))
+ draw.text((x + 124, y + 62), "/ 100", fill=MUTED, font=stat_font)
+ draw.text(
+ (x + 22, y + 88),
+ "Method 9.5 · Eval 9.5 · Governance 9.5",
+ fill=MUTED,
+ font=small_font,
+ )
+
+ pillar_x = x + score_box_w + 36
+ pillar_y = y + 4
+ pillars = [
+ ("Engineering", "Unified CLI, CI, validation, reporting, and packaging."),
+ ("Evaluation", "Holdouts, route confusion, judge-backed blind evals."),
+ ("Governance", "Lifecycle, maturity, promotion, and review evidence."),
+ ("Portability", "Neutral metadata, adapters, contracts, and degradation."),
+ ]
+
+ box_w = 400
+ box_h = 68
+ gap_x = 24
+ gap_y = 18
+ for idx, (label, desc) in enumerate(pillars):
+ col = idx % 2
+ row = idx // 2
+ bx = pillar_x + col * (box_w + gap_x)
+ by = pillar_y + row * (box_h + gap_y)
+ draw.rounded_rectangle(
+ (bx, by, bx + box_w, by + box_h),
+ radius=16,
+ outline=ACCENT,
+ width=2,
+ fill=BACKGROUND,
+ )
+ draw.text((bx + 18, by + 14), label, fill=INK, font=stat_font)
+ draw.text((bx + 18, by + 38), desc, fill=MUTED, font=small_font)
+
+ footer_y = HEIGHT - 84
+ draw.line((x, footer_y - 26, WIDTH - 92, footer_y - 26), fill=ACCENT, width=2)
+ draw.text(
+ (x, footer_y),
+ "Reusable agent skills with explicit boundaries, strict evaluation, visible governance, and local reliability.",
+ fill=MUTED,
+ font=small_font,
+ )
+
+ image.save(PNG_PATH)
+
+
+def draw_svg() -> None:
+ svg = f"""
+"""
+ SVG_PATH.write_text(svg, encoding="utf-8")
+
+
+def main() -> None:
+ draw_png()
+ draw_svg()
+ print(f"Wrote {PNG_PATH}")
+ print(f"Wrote {SVG_PATH}")
+
+
+if __name__ == "__main__":
+ main()