diff --git a/TODO.md b/TODO.md index 3f297a0..55c9533 100644 --- a/TODO.md +++ b/TODO.md @@ -43,12 +43,14 @@ approved plan for full rationale on each decision referenced below. Scholar nor arXiv offers a reliable image source for papers, so `cover_image` stays manually-set for papers (or gets one later from the OG-image pipeline below) -- [ ] OG image auto-generation extended from the legacy per-post script to - all three content types (writings, portfolio, bookshelf) — **blocked - on the design system**: `scripts/generate-og-images.mjs` is hard-coded - to the old "CASE FILE" hacker-terminal branding being fully replaced; - building this now would just be redone once the new visual identity - lands +- [x] OG image auto-generation extended to all three content types + (writings, portfolio, bookshelf) using the new design system — + `scripts/generate-og-images.astro-site.mjs`, wired into `apps/site`'s + build script; `Base.astro` renders `og:image`/`twitter:image` from a + per-page `ogImage` prop (writings/bookshelf detail pages wire it in; + portfolio has no detail page yet to wire it into). Uses static-weight + Fraunces/Newsreader font packages, not the variable fonts the site + ships — satori's opentype.js parser can't read the variable fvar table - [x] `llms.txt` generation extended to cover all content types — unblocked once `site.config.ts` existed (built above for feeds/meta anyway): `scripts/generate-llms.astro-site.mjs` reads all four content diff --git a/apps/site/package.json b/apps/site/package.json index b27fb8c..a8a5c24 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -8,7 +8,8 @@ "scripts": { "dev": "astro dev", "generate:llms": "node ../../scripts/generate-llms.astro-site.mjs", - "build": "pnpm run generate:llms && astro build && pagefind --site dist", + "generate:og": "node ../../scripts/generate-og-images.astro-site.mjs", + "build": "pnpm run generate:llms && pnpm run generate:og && astro build && pagefind --site dist", "preview": "astro preview", "check": "astro check", "astro": "astro" diff --git a/apps/site/public/images/og/bookshelf/attention-is-all-you-need.png b/apps/site/public/images/og/bookshelf/attention-is-all-you-need.png new file mode 100644 index 0000000..4c3025b Binary files /dev/null and b/apps/site/public/images/og/bookshelf/attention-is-all-you-need.png differ diff --git a/apps/site/public/images/og/bookshelf/designing-data-intensive-applications-2nd-edition.png b/apps/site/public/images/og/bookshelf/designing-data-intensive-applications-2nd-edition.png new file mode 100644 index 0000000..f7fde4b Binary files /dev/null and b/apps/site/public/images/og/bookshelf/designing-data-intensive-applications-2nd-edition.png differ diff --git a/apps/site/public/images/og/bookshelf/structure-and-interpretation-of-computer-programs.png b/apps/site/public/images/og/bookshelf/structure-and-interpretation-of-computer-programs.png new file mode 100644 index 0000000..7f9597a Binary files /dev/null and b/apps/site/public/images/og/bookshelf/structure-and-interpretation-of-computer-programs.png differ diff --git a/apps/site/public/images/og/portfolio/example-project.png b/apps/site/public/images/og/portfolio/example-project.png new file mode 100644 index 0000000..cce3252 Binary files /dev/null and b/apps/site/public/images/og/portfolio/example-project.png differ diff --git a/apps/site/public/images/og/writings/a-fresh-coat-of-paint.png b/apps/site/public/images/og/writings/a-fresh-coat-of-paint.png new file mode 100644 index 0000000..2969618 Binary files /dev/null and b/apps/site/public/images/og/writings/a-fresh-coat-of-paint.png differ diff --git a/apps/site/public/images/og/writings/example-first-post.png b/apps/site/public/images/og/writings/example-first-post.png new file mode 100644 index 0000000..4bf42d8 Binary files /dev/null and b/apps/site/public/images/og/writings/example-first-post.png differ diff --git a/apps/site/public/images/og/writings/from-c-to-machine-code.png b/apps/site/public/images/og/writings/from-c-to-machine-code.png new file mode 100644 index 0000000..a06ad25 Binary files /dev/null and b/apps/site/public/images/og/writings/from-c-to-machine-code.png differ diff --git a/apps/site/public/images/og/writings/generate-django-secret-key.png b/apps/site/public/images/og/writings/generate-django-secret-key.png new file mode 100644 index 0000000..e136faf Binary files /dev/null and b/apps/site/public/images/og/writings/generate-django-secret-key.png differ diff --git a/apps/site/public/images/og/writings/hello-world.png b/apps/site/public/images/og/writings/hello-world.png new file mode 100644 index 0000000..097eb84 Binary files /dev/null and b/apps/site/public/images/og/writings/hello-world.png differ diff --git a/apps/site/public/images/og/writings/inertia.png b/apps/site/public/images/og/writings/inertia.png new file mode 100644 index 0000000..0843730 Binary files /dev/null and b/apps/site/public/images/og/writings/inertia.png differ diff --git a/apps/site/public/images/og/writings/install-postgresql-15-on-arch-manjaro-garuda-linux.png b/apps/site/public/images/og/writings/install-postgresql-15-on-arch-manjaro-garuda-linux.png new file mode 100644 index 0000000..0f1581b Binary files /dev/null and b/apps/site/public/images/og/writings/install-postgresql-15-on-arch-manjaro-garuda-linux.png differ diff --git a/apps/site/public/images/og/writings/integrating-netlify.png b/apps/site/public/images/og/writings/integrating-netlify.png new file mode 100644 index 0000000..73f0338 Binary files /dev/null and b/apps/site/public/images/og/writings/integrating-netlify.png differ diff --git a/apps/site/public/images/og/writings/javascript-exporting-modules.png b/apps/site/public/images/og/writings/javascript-exporting-modules.png new file mode 100644 index 0000000..b8606ae Binary files /dev/null and b/apps/site/public/images/og/writings/javascript-exporting-modules.png differ diff --git a/apps/site/public/images/og/writings/mmuctf2025.png b/apps/site/public/images/og/writings/mmuctf2025.png new file mode 100644 index 0000000..2c61d65 Binary files /dev/null and b/apps/site/public/images/og/writings/mmuctf2025.png differ diff --git a/apps/site/public/images/og/writings/obsidian-sync.png b/apps/site/public/images/og/writings/obsidian-sync.png new file mode 100644 index 0000000..7b4689d Binary files /dev/null and b/apps/site/public/images/og/writings/obsidian-sync.png differ diff --git a/apps/site/public/images/og/writings/scriptctf2025.png b/apps/site/public/images/og/writings/scriptctf2025.png new file mode 100644 index 0000000..60957ff Binary files /dev/null and b/apps/site/public/images/og/writings/scriptctf2025.png differ diff --git a/apps/site/public/images/og/writings/self-hosting-gitea-and-mirroring-github.png b/apps/site/public/images/og/writings/self-hosting-gitea-and-mirroring-github.png new file mode 100644 index 0000000..c00c6f3 Binary files /dev/null and b/apps/site/public/images/og/writings/self-hosting-gitea-and-mirroring-github.png differ diff --git a/apps/site/public/images/og/writings/semantic-version-and-conventional-commits.png b/apps/site/public/images/og/writings/semantic-version-and-conventional-commits.png new file mode 100644 index 0000000..45bf7bd Binary files /dev/null and b/apps/site/public/images/og/writings/semantic-version-and-conventional-commits.png differ diff --git a/apps/site/public/images/og/writings/subresource-integrity.png b/apps/site/public/images/og/writings/subresource-integrity.png new file mode 100644 index 0000000..95704ce Binary files /dev/null and b/apps/site/public/images/og/writings/subresource-integrity.png differ diff --git a/apps/site/public/images/og/writings/the-single-byte-that-kills-your-exploit-understanding-endianness.png b/apps/site/public/images/og/writings/the-single-byte-that-kills-your-exploit-understanding-endianness.png new file mode 100644 index 0000000..e91179b Binary files /dev/null and b/apps/site/public/images/og/writings/the-single-byte-that-kills-your-exploit-understanding-endianness.png differ diff --git a/apps/site/public/images/og/writings/utterances-comments.png b/apps/site/public/images/og/writings/utterances-comments.png new file mode 100644 index 0000000..9e97029 Binary files /dev/null and b/apps/site/public/images/og/writings/utterances-comments.png differ diff --git a/apps/site/public/images/og/writings/vuejs-tailwind.png b/apps/site/public/images/og/writings/vuejs-tailwind.png new file mode 100644 index 0000000..c679b5a Binary files /dev/null and b/apps/site/public/images/og/writings/vuejs-tailwind.png differ diff --git a/apps/site/public/images/og/writings/what-is-pwn.png b/apps/site/public/images/og/writings/what-is-pwn.png new file mode 100644 index 0000000..c205482 Binary files /dev/null and b/apps/site/public/images/og/writings/what-is-pwn.png differ diff --git a/apps/site/public/images/og/writings/wifi-hotspot-arch.png b/apps/site/public/images/og/writings/wifi-hotspot-arch.png new file mode 100644 index 0000000..7303347 Binary files /dev/null and b/apps/site/public/images/og/writings/wifi-hotspot-arch.png differ diff --git a/apps/site/src/layouts/Base.astro b/apps/site/src/layouts/Base.astro index e26b205..afcf47a 100644 --- a/apps/site/src/layouts/Base.astro +++ b/apps/site/src/layouts/Base.astro @@ -11,22 +11,35 @@ interface Props { description?: string; /** Widens .container for dashboard-style layouts (currently just the homepage). */ wide?: boolean; + /** Site-root-relative path to a per-page OG image, e.g. /images/og/writings/foo.png */ + ogImage?: string; } -const { title, description, wide = false } = Astro.props; +const { title, description, wide = false, ogImage } = Astro.props; const metaDescription = description ?? siteConfig.description; const currentPath = Astro.url.pathname; const copyrightRange = await copyrightYearRange(); +const pageTitle = `${title} — ${siteConfig.title}`; +const ogImageUrl = new URL(ogImage ?? "/favicon.svg", siteConfig.baseUrl).href; ---
-