diff --git a/content/blog/async/social.png b/content/blog/async/social.png index 706089f8..55929547 100644 Binary files a/content/blog/async/social.png and b/content/blog/async/social.png differ diff --git a/content/blog/bugs-rust-wont-catch/social.png b/content/blog/bugs-rust-wont-catch/social.png index 1e1272fb..a5e4699d 100644 Binary files a/content/blog/bugs-rust-wont-catch/social.png and b/content/blog/bugs-rust-wont-catch/social.png differ diff --git a/content/blog/cpp-rust-interop/social.png b/content/blog/cpp-rust-interop/social.png index 22ec206b..9e5c8906 100644 Binary files a/content/blog/cpp-rust-interop/social.png and b/content/blog/cpp-rust-interop/social.png differ diff --git a/content/blog/defensive-programming/social.png b/content/blog/defensive-programming/social.png index 6137279d..685eedbc 100644 Binary files a/content/blog/defensive-programming/social.png and b/content/blog/defensive-programming/social.png differ diff --git a/content/blog/dont-use-preludes-and-globs/social.png b/content/blog/dont-use-preludes-and-globs/social.png index 58c91c01..619b7a79 100644 Binary files a/content/blog/dont-use-preludes-and-globs/social.png and b/content/blog/dont-use-preludes-and-globs/social.png differ diff --git a/content/blog/expressions/social.png b/content/blog/expressions/social.png index 1f623086..06616156 100644 Binary files a/content/blog/expressions/social.png and b/content/blog/expressions/social.png differ diff --git a/content/blog/flattening-rusts-learning-curve/social.png b/content/blog/flattening-rusts-learning-curve/social.png index dcaf7be4..fa0b96d8 100644 Binary files a/content/blog/flattening-rusts-learning-curve/social.png and b/content/blog/flattening-rusts-learning-curve/social.png differ diff --git a/content/blog/foundational-software/social.png b/content/blog/foundational-software/social.png index d3efe6d4..7ec23238 100644 Binary files a/content/blog/foundational-software/social.png and b/content/blog/foundational-software/social.png differ diff --git a/content/blog/hiring-rust-engineers/social.png b/content/blog/hiring-rust-engineers/social.png index db7de58d..b9908c7a 100644 Binary files a/content/blog/hiring-rust-engineers/social.png and b/content/blog/hiring-rust-engineers/social.png differ diff --git a/content/blog/idiomatic-rust-resources/social.png b/content/blog/idiomatic-rust-resources/social.png index 15b8474c..3eca7784 100644 Binary files a/content/blog/idiomatic-rust-resources/social.png and b/content/blog/idiomatic-rust-resources/social.png differ diff --git a/content/blog/immutability/social.png b/content/blog/immutability/social.png index 4c1ecb38..43339dd6 100644 Binary files a/content/blog/immutability/social.png and b/content/blog/immutability/social.png differ diff --git a/content/blog/iterators/social.png b/content/blog/iterators/social.png index cac128b3..06609c42 100644 Binary files a/content/blog/iterators/social.png and b/content/blog/iterators/social.png differ diff --git a/content/blog/lifetimes/social.png b/content/blog/lifetimes/social.png index b30d1beb..f14a86a1 100644 Binary files a/content/blog/lifetimes/social.png and b/content/blog/lifetimes/social.png differ diff --git a/content/blog/long-term-rust-maintenance/social.png b/content/blog/long-term-rust-maintenance/social.png index 3dd78972..031cd4ce 100644 Binary files a/content/blog/long-term-rust-maintenance/social.png and b/content/blog/long-term-rust-maintenance/social.png differ diff --git a/content/blog/memory-safety/social.png b/content/blog/memory-safety/social.png index 91e71c12..2cc1637f 100644 Binary files a/content/blog/memory-safety/social.png and b/content/blog/memory-safety/social.png differ diff --git a/content/blog/paradigms/social.png b/content/blog/paradigms/social.png index d3c3a816..f2b984e4 100644 Binary files a/content/blog/paradigms/social.png and b/content/blog/paradigms/social.png differ diff --git a/content/blog/pitfalls-of-safe-rust/social.png b/content/blog/pitfalls-of-safe-rust/social.png index eba83789..c74dfbee 100644 Binary files a/content/blog/pitfalls-of-safe-rust/social.png and b/content/blog/pitfalls-of-safe-rust/social.png differ diff --git a/content/blog/prototyping/social.png b/content/blog/prototyping/social.png index 3a1e5500..4e4aca7f 100644 Binary files a/content/blog/prototyping/social.png and b/content/blog/prototyping/social.png differ diff --git a/content/blog/rust-conferences-2025/social.png b/content/blog/rust-conferences-2025/social.png index ce8e63ef..07b4f6b3 100644 Binary files a/content/blog/rust-conferences-2025/social.png and b/content/blog/rust-conferences-2025/social.png differ diff --git a/content/blog/rust-conferences-2026/social.png b/content/blog/rust-conferences-2026/social.png index 911c48c8..fae3d8e7 100644 Binary files a/content/blog/rust-conferences-2026/social.png and b/content/blog/rust-conferences-2026/social.png differ diff --git a/content/blog/rust-in-ten-years/social.png b/content/blog/rust-in-ten-years/social.png index 177a6b9d..bbfb3af6 100644 Binary files a/content/blog/rust-in-ten-years/social.png and b/content/blog/rust-in-ten-years/social.png differ diff --git a/content/blog/rust-learning-resources-2026/social.png b/content/blog/rust-learning-resources-2026/social.png index bdc30a9d..d28aeb89 100644 Binary files a/content/blog/rust-learning-resources-2026/social.png and b/content/blog/rust-learning-resources-2026/social.png differ diff --git a/content/blog/rust-option-handling-best-practices/social.png b/content/blog/rust-option-handling-best-practices/social.png index ed4fa543..9887a0b4 100644 Binary files a/content/blog/rust-option-handling-best-practices/social.png and b/content/blog/rust-option-handling-best-practices/social.png differ diff --git a/content/blog/rust-prevents-data-races-not-race-conditions/social.png b/content/blog/rust-prevents-data-races-not-race-conditions/social.png index f6fdb0ca..371d00b6 100644 Binary files a/content/blog/rust-prevents-data-races-not-race-conditions/social.png and b/content/blog/rust-prevents-data-races-not-race-conditions/social.png differ diff --git a/content/blog/sharp-edges-in-rust-std/social.png b/content/blog/sharp-edges-in-rust-std/social.png index 49f51bf7..c8b817f6 100644 Binary files a/content/blog/sharp-edges-in-rust-std/social.png and b/content/blog/sharp-edges-in-rust-std/social.png differ diff --git a/content/blog/simple/social.png b/content/blog/simple/social.png index a3fb43a0..2d3743ad 100644 Binary files a/content/blog/simple/social.png and b/content/blog/simple/social.png differ diff --git a/content/blog/social.png b/content/blog/social.png index 90e059b0..1a8ff750 100644 Binary files a/content/blog/social.png and b/content/blog/social.png differ diff --git a/content/blog/successful-rust-business-adoption-checklist/social.png b/content/blog/successful-rust-business-adoption-checklist/social.png index f213f806..d0607930 100644 Binary files a/content/blog/successful-rust-business-adoption-checklist/social.png and b/content/blog/successful-rust-business-adoption-checklist/social.png differ diff --git a/content/blog/tips-for-faster-ci-builds/social.png b/content/blog/tips-for-faster-ci-builds/social.png index bc62a205..01f64654 100644 Binary files a/content/blog/tips-for-faster-ci-builds/social.png and b/content/blog/tips-for-faster-ci-builds/social.png differ diff --git a/content/blog/tips-for-faster-rust-compile-times/social.png b/content/blog/tips-for-faster-rust-compile-times/social.png index db11349f..e50f616f 100644 Binary files a/content/blog/tips-for-faster-rust-compile-times/social.png and b/content/blog/tips-for-faster-rust-compile-times/social.png differ diff --git a/content/blog/why-rust/social.png b/content/blog/why-rust/social.png index 782e184d..ab2953fa 100644 Binary files a/content/blog/why-rust/social.png and b/content/blog/why-rust/social.png differ diff --git a/content/hello-rust/social.png b/content/hello-rust/social.png index 5d413226..d240cff9 100644 Binary files a/content/hello-rust/social.png and b/content/hello-rust/social.png differ diff --git a/content/learn/case-studies/hubstaff/social.png b/content/learn/case-studies/hubstaff/social.png index e4d79f34..dd61405c 100644 Binary files a/content/learn/case-studies/hubstaff/social.png and b/content/learn/case-studies/hubstaff/social.png differ diff --git a/content/learn/case-studies/social.png b/content/learn/case-studies/social.png index a7b208a0..23071338 100644 Binary files a/content/learn/case-studies/social.png and b/content/learn/case-studies/social.png differ diff --git a/content/learn/migration-guides/cpp-to-rust/social.png b/content/learn/migration-guides/cpp-to-rust/social.png index 30133f24..290c00b6 100644 Binary files a/content/learn/migration-guides/cpp-to-rust/social.png and b/content/learn/migration-guides/cpp-to-rust/social.png differ diff --git a/content/learn/migration-guides/go-to-rust/social.png b/content/learn/migration-guides/go-to-rust/social.png index 78907429..c3fad657 100644 Binary files a/content/learn/migration-guides/go-to-rust/social.png and b/content/learn/migration-guides/go-to-rust/social.png differ diff --git a/content/learn/migration-guides/java-to-rust/social.png b/content/learn/migration-guides/java-to-rust/social.png index 537d05b3..4151efde 100644 Binary files a/content/learn/migration-guides/java-to-rust/social.png and b/content/learn/migration-guides/java-to-rust/social.png differ diff --git a/content/learn/migration-guides/python-to-rust/social.png b/content/learn/migration-guides/python-to-rust/social.png index 9909ba8b..0663cb31 100644 Binary files a/content/learn/migration-guides/python-to-rust/social.png and b/content/learn/migration-guides/python-to-rust/social.png differ diff --git a/content/learn/migration-guides/scala-to-rust/social.png b/content/learn/migration-guides/scala-to-rust/social.png index b84670fc..3e494795 100644 Binary files a/content/learn/migration-guides/scala-to-rust/social.png and b/content/learn/migration-guides/scala-to-rust/social.png differ diff --git a/content/learn/migration-guides/social.png b/content/learn/migration-guides/social.png index f721a4e5..bd52b264 100644 Binary files a/content/learn/migration-guides/social.png and b/content/learn/migration-guides/social.png differ diff --git a/content/learn/migration-guides/typescript-to-rust/social.png b/content/learn/migration-guides/typescript-to-rust/social.png index a4cf402b..2d47da8e 100644 Binary files a/content/learn/migration-guides/typescript-to-rust/social.png and b/content/learn/migration-guides/typescript-to-rust/social.png differ diff --git a/content/legal/social.png b/content/legal/social.png index 1828c940..3068d174 100644 Binary files a/content/legal/social.png and b/content/legal/social.png differ diff --git a/content/mentorship/social.png b/content/mentorship/social.png index 96380747..1fa966e5 100644 Binary files a/content/mentorship/social.png and b/content/mentorship/social.png differ diff --git a/content/office-hours/social.png b/content/office-hours/social.png index 44905181..21ef93b1 100644 Binary files a/content/office-hours/social.png and b/content/office-hours/social.png differ diff --git a/content/podcast/s01e01-influxdata/social.png b/content/podcast/s01e01-influxdata/social.png index 04dc1d79..1149a8fc 100644 Binary files a/content/podcast/s01e01-influxdata/social.png and b/content/podcast/s01e01-influxdata/social.png differ diff --git a/content/podcast/s01e02-pubnub/social.png b/content/podcast/s01e02-pubnub/social.png index 24ba3fa1..a1e951c6 100644 Binary files a/content/podcast/s01e02-pubnub/social.png and b/content/podcast/s01e02-pubnub/social.png differ diff --git a/content/podcast/s01e03-apollo/social.png b/content/podcast/s01e03-apollo/social.png index a3cac8ec..a2adb316 100644 Binary files a/content/podcast/s01e03-apollo/social.png and b/content/podcast/s01e03-apollo/social.png differ diff --git a/content/podcast/s01e04-arroyo/social.png b/content/podcast/s01e04-arroyo/social.png index 3edf7196..76bc6080 100644 Binary files a/content/podcast/s01e04-arroyo/social.png and b/content/podcast/s01e04-arroyo/social.png differ diff --git a/content/podcast/s01e05-tweede-golf/social.png b/content/podcast/s01e05-tweede-golf/social.png index 182ace84..9509c208 100644 Binary files a/content/podcast/s01e05-tweede-golf/social.png and b/content/podcast/s01e05-tweede-golf/social.png differ diff --git a/content/podcast/s01e06-sentry/social.png b/content/podcast/s01e06-sentry/social.png index 7d0e2cbf..fae0cfcd 100644 Binary files a/content/podcast/s01e06-sentry/social.png and b/content/podcast/s01e06-sentry/social.png differ diff --git a/content/podcast/s02e01-curl/social.png b/content/podcast/s02e01-curl/social.png index 4f751602..7c46ef5c 100644 Binary files a/content/podcast/s02e01-curl/social.png and b/content/podcast/s02e01-curl/social.png differ diff --git a/content/podcast/s02e02-amp/social.png b/content/podcast/s02e02-amp/social.png index 98514f08..d6448b47 100644 Binary files a/content/podcast/s02e02-amp/social.png and b/content/podcast/s02e02-amp/social.png differ diff --git a/content/podcast/s02e03-thunderbird/social.png b/content/podcast/s02e03-thunderbird/social.png index 2349648b..3ae4a25b 100644 Binary files a/content/podcast/s02e03-thunderbird/social.png and b/content/podcast/s02e03-thunderbird/social.png differ diff --git a/content/podcast/s02e04-matic/social.png b/content/podcast/s02e04-matic/social.png index f4ea7599..da921820 100644 Binary files a/content/podcast/s02e04-matic/social.png and b/content/podcast/s02e04-matic/social.png differ diff --git a/content/podcast/s02e05-oxidos/social.png b/content/podcast/s02e05-oxidos/social.png index ee2b3a32..311f202b 100644 Binary files a/content/podcast/s02e05-oxidos/social.png and b/content/podcast/s02e05-oxidos/social.png differ diff --git a/content/podcast/s02e06-fusion-engineering/social.png b/content/podcast/s02e06-fusion-engineering/social.png index bc053efd..8b0921a5 100644 Binary files a/content/podcast/s02e06-fusion-engineering/social.png and b/content/podcast/s02e06-fusion-engineering/social.png differ diff --git a/content/podcast/s02e07-system76/social.png b/content/podcast/s02e07-system76/social.png index 84cae599..a8f06653 100644 Binary files a/content/podcast/s02e07-system76/social.png and b/content/podcast/s02e07-system76/social.png differ diff --git a/content/podcast/s03e01-zed/social.png b/content/podcast/s03e01-zed/social.png index 599b7011..7c5f2205 100644 Binary files a/content/podcast/s03e01-zed/social.png and b/content/podcast/s03e01-zed/social.png differ diff --git a/content/podcast/s03e02-infinyon/social.png b/content/podcast/s03e02-infinyon/social.png index 5c3835af..405124af 100644 Binary files a/content/podcast/s03e02-infinyon/social.png and b/content/podcast/s03e02-infinyon/social.png differ diff --git a/content/podcast/s03e03-oxide/social.png b/content/podcast/s03e03-oxide/social.png index 55e613f4..e2016f02 100644 Binary files a/content/podcast/s03e03-oxide/social.png and b/content/podcast/s03e03-oxide/social.png differ diff --git a/content/podcast/s03e04-gitbutler/social.png b/content/podcast/s03e04-gitbutler/social.png index 83e2381c..7d75b513 100644 Binary files a/content/podcast/s03e04-gitbutler/social.png and b/content/podcast/s03e04-gitbutler/social.png differ diff --git a/content/podcast/s03e05-zoo/social.png b/content/podcast/s03e05-zoo/social.png index 2f20ac38..5f097169 100644 Binary files a/content/podcast/s03e05-zoo/social.png and b/content/podcast/s03e05-zoo/social.png differ diff --git a/content/podcast/s03e07-brave/social.png b/content/podcast/s03e07-brave/social.png index 22132c33..3230ccf9 100644 Binary files a/content/podcast/s03e07-brave/social.png and b/content/podcast/s03e07-brave/social.png differ diff --git a/content/podcast/s03e08-volvo/social.png b/content/podcast/s03e08-volvo/social.png index ee079dce..6cc9e302 100644 Binary files a/content/podcast/s03e08-volvo/social.png and b/content/podcast/s03e08-volvo/social.png differ diff --git a/content/podcast/s04e01-microsoft/social.png b/content/podcast/s04e01-microsoft/social.png index bf23b3f6..31f625a6 100644 Binary files a/content/podcast/s04e01-microsoft/social.png and b/content/podcast/s04e01-microsoft/social.png differ diff --git a/content/podcast/s04e02-svix/social.png b/content/podcast/s04e02-svix/social.png index e00943aa..e3336622 100644 Binary files a/content/podcast/s04e02-svix/social.png and b/content/podcast/s04e02-svix/social.png differ diff --git a/content/podcast/s04e03-astral/social.png b/content/podcast/s04e03-astral/social.png index 0252b1be..c356b01c 100644 Binary files a/content/podcast/s04e03-astral/social.png and b/content/podcast/s04e03-astral/social.png differ diff --git a/content/podcast/s04e04-rust/social.png b/content/podcast/s04e04-rust/social.png index e9c2e14e..a1e1bb7c 100644 Binary files a/content/podcast/s04e04-rust/social.png and b/content/podcast/s04e04-rust/social.png differ diff --git a/content/podcast/s04e05-tembo/social.png b/content/podcast/s04e05-tembo/social.png index f63815e6..0beecd36 100644 Binary files a/content/podcast/s04e05-tembo/social.png and b/content/podcast/s04e05-tembo/social.png differ diff --git a/content/podcast/s04e06-1password/social.png b/content/podcast/s04e06-1password/social.png index 260a6d85..c5cdfff9 100644 Binary files a/content/podcast/s04e06-1password/social.png and b/content/podcast/s04e06-1password/social.png differ diff --git a/content/podcast/s04e07-ksat/social.png b/content/podcast/s04e07-ksat/social.png index b1d9499e..bea21acd 100644 Binary files a/content/podcast/s04e07-ksat/social.png and b/content/podcast/s04e07-ksat/social.png differ diff --git a/content/podcast/s05e01-prime-video/social.png b/content/podcast/s05e01-prime-video/social.png index c34ee737..cf8d7691 100644 Binary files a/content/podcast/s05e01-prime-video/social.png and b/content/podcast/s05e01-prime-video/social.png differ diff --git a/content/podcast/s05e02-scythe/social.png b/content/podcast/s05e02-scythe/social.png index ba61e9f0..53f55343 100644 Binary files a/content/podcast/s05e02-scythe/social.png and b/content/podcast/s05e02-scythe/social.png differ diff --git a/content/podcast/s05e03-cloudflare/social.png b/content/podcast/s05e03-cloudflare/social.png index b0109a2e..69f7f5e3 100644 Binary files a/content/podcast/s05e03-cloudflare/social.png and b/content/podcast/s05e03-cloudflare/social.png differ diff --git a/content/podcast/s05e04-roc/social.png b/content/podcast/s05e04-roc/social.png index 0d072cda..10b04e04 100644 Binary files a/content/podcast/s05e04-roc/social.png and b/content/podcast/s05e04-roc/social.png differ diff --git a/content/podcast/s05e05-canonical/social.png b/content/podcast/s05e05-canonical/social.png index eb2a24fd..2e5f1356 100644 Binary files a/content/podcast/s05e05-canonical/social.png and b/content/podcast/s05e05-canonical/social.png differ diff --git a/content/podcast/s05e06-rust4linux/social.png b/content/podcast/s05e06-rust4linux/social.png index 54e4bd41..6b12418b 100644 Binary files a/content/podcast/s05e06-rust4linux/social.png and b/content/podcast/s05e06-rust4linux/social.png differ diff --git a/content/podcast/s05e08-radar/social.png b/content/podcast/s05e08-radar/social.png index 275a1a44..8457a4e9 100644 Binary files a/content/podcast/s05e08-radar/social.png and b/content/podcast/s05e08-radar/social.png differ diff --git a/content/podcast/s05e09-gama-space/social.png b/content/podcast/s05e09-gama-space/social.png index 291e672a..e4a6bb76 100644 Binary files a/content/podcast/s05e09-gama-space/social.png and b/content/podcast/s05e09-gama-space/social.png differ diff --git a/content/podcast/s06e01-cloudsmith/social.png b/content/podcast/s06e01-cloudsmith/social.png index d3c62dd1..405fa2e3 100644 Binary files a/content/podcast/s06e01-cloudsmith/social.png and b/content/podcast/s06e01-cloudsmith/social.png differ diff --git a/content/podcast/s06e02-helsing/social.png b/content/podcast/s06e02-helsing/social.png index 0f921377..6396d471 100644 Binary files a/content/podcast/s06e02-helsing/social.png and b/content/podcast/s06e02-helsing/social.png differ diff --git a/content/podcast/s06e03-nlnet-labs/social.png b/content/podcast/s06e03-nlnet-labs/social.png index 6c8d08c1..f20f1970 100644 Binary files a/content/podcast/s06e03-nlnet-labs/social.png and b/content/podcast/s06e03-nlnet-labs/social.png differ diff --git a/content/podcast/s06e04-rust4linux/social.png b/content/podcast/s06e04-rust4linux/social.png index e67abd13..4fa84ae6 100644 Binary files a/content/podcast/s06e04-rust4linux/social.png and b/content/podcast/s06e04-rust4linux/social.png differ diff --git a/content/podcast/s06e05-veo/social.png b/content/podcast/s06e05-veo/social.png index a92ed168..85eebefc 100644 Binary files a/content/podcast/s06e05-veo/social.png and b/content/podcast/s06e05-veo/social.png differ diff --git a/content/podcast/s06e06-clickhouse/social.png b/content/podcast/s06e06-clickhouse/social.png index 45107992..93391e80 100644 Binary files a/content/podcast/s06e06-clickhouse/social.png and b/content/podcast/s06e06-clickhouse/social.png differ diff --git a/content/podcast/s06e07-rising-academies/social.png b/content/podcast/s06e07-rising-academies/social.png index 0a7ca068..47ed3acf 100644 Binary files a/content/podcast/s06e07-rising-academies/social.png and b/content/podcast/s06e07-rising-academies/social.png differ diff --git a/content/podcast/s06e08-rust-foundation/social.png b/content/podcast/s06e08-rust-foundation/social.png index e76349a4..cd0ed38f 100644 Binary files a/content/podcast/s06e08-rust-foundation/social.png and b/content/podcast/s06e08-rust-foundation/social.png differ diff --git a/content/quote/social.png b/content/quote/social.png index 2afae87a..968944fd 100644 Binary files a/content/quote/social.png and b/content/quote/social.png differ diff --git a/content/services/social.png b/content/services/social.png index fe3335e9..aa48fb90 100644 Binary files a/content/services/social.png and b/content/services/social.png differ diff --git a/content/survey/social.png b/content/survey/social.png index e3fc88f9..76714706 100644 Binary files a/content/survey/social.png and b/content/survey/social.png differ diff --git a/content/workshop/feedback/social.png b/content/workshop/feedback/social.png index 95858ad4..b9969342 100644 Binary files a/content/workshop/feedback/social.png and b/content/workshop/feedback/social.png differ diff --git a/content/workshop/survey/social.png b/content/workshop/survey/social.png index 95858ad4..b9969342 100644 Binary files a/content/workshop/survey/social.png and b/content/workshop/survey/social.png differ diff --git a/content/workshops/social.png b/content/workshops/social.png index 16d41197..4bbfe6e0 100644 Binary files a/content/workshops/social.png and b/content/workshops/social.png differ diff --git a/scripts/social.sh b/scripts/social.sh index 870ae478..70b005c4 100755 --- a/scripts/social.sh +++ b/scripts/social.sh @@ -34,6 +34,29 @@ PODCAST_TEXT='#1a1c26' # $darkBgrd PODCAST_MUTED='#8a691f' # $darkBgrd at 50% opacity blended over $brightBgrd (matches .episode-byline-role { opacity: 0.5 }) PODCAST_BADGE_BORDER='#1a1c26' +FONT_TMP_DIR=$(mktemp -d) +trap 'rm -rf "$FONT_TMP_DIR"' EXIT +INTER_BOLD_FONT="$FONT_TMP_DIR/Inter-Bold.ttf" + +prepare_inter_bold_font() { + if [[ -f "$INTER_BOLD_FONT" ]]; then + return + fi + + command -v woff2_decompress >/dev/null || { + echo "woff2_decompress is required to prepare bundled fonts" >&2 + exit 1 + } + command -v fonttools >/dev/null || { + echo "fonttools is required to instantiate Inter Bold from InterVariable.woff2" >&2 + exit 1 + } + + cp static/fonts/InterVariable.woff2 "$FONT_TMP_DIR/" + woff2_decompress "$FONT_TMP_DIR/InterVariable.woff2" >/dev/null + fonttools varLib.instancer "$FONT_TMP_DIR/InterVariable.ttf" wght=700 -o "$INTER_BOLD_FONT" >/dev/null 2>&1 +} + # Function to generate social image for a given title (blog posts etc.) generate_social_image() { local template_file=$1 @@ -48,11 +71,18 @@ generate_social_image() { # No caption; copy the template file as is cp "$template_file" "$output_file" else + local tmp_dir + tmp_dir=$(mktemp -d) + local text_img="$tmp_dir/text.png" + + prepare_inter_bold_font + # Generate the caption image - magick -background none -fill '#000000' -font Inter-Bold -pointsize 80 -size 670x caption:"$title" text.png + magick -background none -fill '#000000' -font "$INTER_BOLD_FONT" -pointsize 80 -size 670x caption:"$title" "$text_img" # Composite the caption over the background image - magick "$template_file" text.png -gravity northwest -geometry +80+80 -composite "$output_file" + magick "$template_file" "$text_img" -gravity northwest -geometry +80+80 -composite "$output_file" + rm -rf "$tmp_dir" fi } @@ -94,107 +124,6 @@ generate_podcast_social_image() { echo "Generating podcast episode social image: ${episode_label} – ${title} (with ${guest}) → ${output_file}" - # The Rust Foundation episode has a long three-guest byline. Render it as - # a custom card that keeps the normal podcast typography, uses the bundled - # fonts directly, and splits the byline across two lines to avoid overflow. - if [[ "$title" == "The Rust Foundation" ]]; then - local tmp_dir - tmp_dir=$(mktemp -d) - local bebas_font="$tmp_dir/BebasNeue-Bold.ttf" - local mono_font="$tmp_dir/JetBrainsMono-Regular.ttf" - local bg="$tmp_dir/bg.png" - local logo_img="$tmp_dir/logo.png" - local kicker="$tmp_dir/kicker.png" - local accent="$tmp_dir/accent.png" - local title_img="$tmp_dir/title.png" - local guests_img="$tmp_dir/guests.png" - local role_img="$tmp_dir/role.png" - local badge_text="$tmp_dir/badge_text.png" - local badge="$tmp_dir/badge.png" - local meta="$tmp_dir/meta.png" - - prepare_podcast_fonts "$tmp_dir" - - magick -background "$PODCAST_BG" -density 200 \ - static/social/podcast-episode.svg \ - -resize 1200x630 "$bg" - - if [[ -n "$logo_file" && -f "$logo_file" ]]; then - magick -background none -density 300 "$logo_file" \ - -resize 170x130 \ - -background none -gravity center \ - -extent 170x130 \ - "$logo_img" - else - logo_img="" - fi - - magick -background none -fill "$PODCAST_TEXT" \ - -font "$bebas_font" -pointsize 60 -kerning 5 \ - label:"RUST IN PRODUCTION" "$kicker" - magick -size "$(magick identify -format "%w" "$kicker")x12" "xc:${PODCAST_ACCENT}" "$accent" - - magick -background none -fill "$PODCAST_TEXT" \ - -font "$bebas_font" -pointsize 112 -kerning 1 \ - label:"$(printf '%s' "$title" | tr '[:lower:]' '[:upper:]')" "$title_img" - magick -background none -fill "$PODCAST_TEXT" \ - -font "$bebas_font" -pointsize 54 -kerning 1 \ - label:"$(printf '%s' "$guest" | tr '[:lower:]' '[:upper:]')" "$guests_img" - magick -background none -fill "$PODCAST_MUTED" \ - -font "$bebas_font" -pointsize 40 -kerning 1 \ - label:"$(printf '%s' "$role" | tr '[:lower:]' '[:upper:]')" "$role_img" - - local guests_w - guests_w=$(magick identify -format "%w" "$guests_img") - if [[ $guests_w -gt 1040 ]]; then - magick "$guests_img" -resize 1040x "$guests_img" - fi - - magick -background none -fill "$PODCAST_TEXT" \ - -font "$mono_font" -pointsize 30 \ - label:"$episode_label" "$badge_text" - local tw th - tw=$(magick identify -format "%w" "$badge_text") - th=$(magick identify -format "%h" "$badge_text") - local box_w=$((tw + 36)) - local box_h=$((th + 20)) - magick -size "${box_w}x${box_h}" "xc:${PODCAST_BG}" \ - -fill none -stroke "$PODCAST_BADGE_BORDER" -strokewidth 2 \ - -draw "roundrectangle 1,1 $((box_w-2)),$((box_h-2)) 6,6" \ - "$badge_text" -gravity Center -composite \ - "$badge" - magick -background none -fill "$PODCAST_MUTED" \ - -font "$mono_font" -pointsize 30 \ - label:"Published on ${date}" "$meta" - - local meta_x=$((80 + box_w + 24)) - if [[ -n "$logo_img" ]]; then - magick "$bg" \ - "$logo_img" -gravity NorthEast -geometry +70+70 -composite \ - "$kicker" -gravity NorthWest -geometry +80+70 -composite \ - "$accent" -gravity NorthWest -geometry +80+138 -composite \ - "$title_img" -gravity NorthWest -geometry +80+200 -composite \ - "$guests_img" -gravity NorthWest -geometry +80+330 -composite \ - "$role_img" -gravity NorthWest -geometry +80+385 -composite \ - "$badge" -gravity NorthWest -geometry +80+470 -composite \ - "$meta" -gravity NorthWest -geometry "+${meta_x}+480" -composite \ - "$output_file" - else - magick "$bg" \ - "$kicker" -gravity NorthWest -geometry +80+70 -composite \ - "$accent" -gravity NorthWest -geometry +80+138 -composite \ - "$title_img" -gravity NorthWest -geometry +80+200 -composite \ - "$guests_img" -gravity NorthWest -geometry +80+330 -composite \ - "$role_img" -gravity NorthWest -geometry +80+385 -composite \ - "$badge" -gravity NorthWest -geometry +80+470 -composite \ - "$meta" -gravity NorthWest -geometry "+${meta_x}+480" -composite \ - "$output_file" - fi - - rm -rf "$tmp_dir" - return - fi - local tmp_dir tmp_dir=$(mktemp -d) local bg="$tmp_dir/bg.png" @@ -217,29 +146,15 @@ generate_podcast_social_image() { -resize 1200x630 "$bg" # ---- Company logo (top-right) --------------------------------------- - # Render the per-episode logo as a flat dark silhouette so logos look - # consistent across episodes regardless of their original colors. - # Mirrors `filter: grayscale(1)` used on .podcast-logo-img on the site. + # Render logos on a transparent background and recolor visible pixels to + # the podcast text color. This avoids the fragile thresholding step that + # could turn transparent SVGs into a filled tile after ImageMagick updates. local logo_img="" if [[ -n "$logo_file" && -f "$logo_file" ]]; then logo_img="$tmp_dir/logo.png" - # Render the SVG at high density on the yellow background, then - # extract a dark-on-transparent silhouette via -colorspace gray + - # threshold/level. Hardcoded fills and gradients all collapse to - # the same flat shape. - # - # Logos vary wildly in aspect ratio (square icons, wide wordmarks, - # tall glyphs). To keep them visually consistent on the canvas we - # fit each silhouette inside a fixed 200x200 square box, preserving - # aspect ratio (`-resize 200x200` without `!`) and then padding - # transparent pixels around it with `-extent`. local logo_box=200 - magick -background "$PODCAST_BG" -density 300 "$logo_file" \ + magick -background none -density 300 "$logo_file" \ -resize "${logo_box}x${logo_box}" \ - -colorspace gray -level 0%,80% \ - -alpha off \ - \( +clone -threshold 60% -negate \) \ - -alpha off -compose copy_opacity -composite \ -fill "$PODCAST_TEXT" -colorize 100 \ -background none -gravity center \ -extent "${logo_box}x${logo_box}" \ @@ -264,11 +179,11 @@ generate_podcast_social_image() { # (left margin 80, right margin 80 → max content width 1040). local title_len=${#title} local title_pt=130 - if [[ $title_len -gt 17 ]]; then + if [[ $title_len -gt 24 ]]; then title_pt=88 + elif [[ $title_len -gt 18 ]]; then + title_pt=112 elif [[ $title_len -gt 12 ]]; then - title_pt=104 - elif [[ $title_len -gt 8 ]]; then title_pt=120 fi @@ -306,6 +221,7 @@ generate_podcast_social_image() { elif [[ $byline_len -gt 30 ]]; then byline_pt=64 fi + local role_line_img="" if [[ -n "$role" ]]; then local guest_part="$tmp_dir/guest.png" local sep_part="$tmp_dir/sep.png" @@ -332,6 +248,16 @@ generate_podcast_social_image() { local byline_w byline_w=$(magick identify -format "%w" "$byline_img") + if [[ $byline_w -gt 1040 && -n "$role" ]]; then + role_line_img="$tmp_dir/role-line.png" + magick -background none -fill "$PODCAST_TEXT" \ + -font "$bebas_font" -pointsize 54 -kerning 1 \ + label:"${guest_uc}" "$byline_img" + magick -background none -fill "$PODCAST_MUTED" \ + -font "$bebas_font" -pointsize 40 -kerning 1 \ + label:"${role_uc}" "$role_line_img" + byline_w=$(magick identify -format "%w" "$byline_img") + fi if [[ $byline_w -gt 1040 ]]; then magick "$byline_img" -resize 1040x "$byline_img" fi @@ -377,36 +303,44 @@ generate_podcast_social_image() { local title_h title_h=$(magick identify -format "%h" "$title_img") local byline_y=$((210 + title_h + 30)) + local role_line_y=$((byline_y + 55)) local meta_y=$((byline_y + 100)) + if [[ -n "$role_line_img" ]]; then + meta_y=$((byline_y + 140)) + fi # Badge+meta row: place badge then meta to its right with a gap. local badge_w badge_w=$(magick identify -format "%w" "$badge") local meta_x=$((80 + badge_w + 24)) - # Compose the final image. The logo (if any) is placed in the - # top-right, sitting comfortably over the dot-grid texture. + local composed="$tmp_dir/composed.png" if [[ -n "$logo_img" ]]; then magick "$bg" \ - "$logo_img" -gravity NorthEast -geometry +60+60 -composite \ - "$kicker" -gravity NorthWest -geometry +80+70 -composite \ - "$accent" -gravity NorthWest -geometry +80+138 -composite \ - "$title_img" -gravity NorthWest -geometry +80+200 -composite \ - "$byline_img" -gravity NorthWest -geometry "+80+${byline_y}" -composite \ - "$badge" -gravity NorthWest -geometry "+80+${meta_y}" -composite \ - "$meta" -gravity NorthWest -geometry "+${meta_x}+$((meta_y + 10))" -composite \ - "$output_file" + "$logo_img" -gravity NorthEast -geometry +60+60 -composite \ + "$composed" else - magick "$bg" \ - "$kicker" -gravity NorthWest -geometry +80+70 -composite \ - "$accent" -gravity NorthWest -geometry +80+138 -composite \ - "$title_img" -gravity NorthWest -geometry +80+200 -composite \ - "$byline_img" -gravity NorthWest -geometry "+80+${byline_y}" -composite \ - "$badge" -gravity NorthWest -geometry "+80+${meta_y}" -composite \ - "$meta" -gravity NorthWest -geometry "+${meta_x}+$((meta_y + 10))" -composite \ - "$output_file" + cp "$bg" "$composed" + fi + + magick "$composed" \ + "$kicker" -gravity NorthWest -geometry +80+70 -composite \ + "$accent" -gravity NorthWest -geometry +80+138 -composite \ + "$title_img" -gravity NorthWest -geometry +80+200 -composite \ + "$byline_img" -gravity NorthWest -geometry "+80+${byline_y}" -composite \ + "$composed" + + if [[ -n "$role_line_img" ]]; then + magick "$composed" \ + "$role_line_img" -gravity NorthWest -geometry "+80+${role_line_y}" -composite \ + "$composed" fi + magick "$composed" \ + "$badge" -gravity NorthWest -geometry "+80+${meta_y}" -composite \ + "$meta" -gravity NorthWest -geometry "+${meta_x}+$((meta_y + 10))" -composite \ + "$output_file" + rm -rf "$tmp_dir" } @@ -494,13 +428,21 @@ process_directory() { process_post "$dir/index.md" "$dir" fi - # Recursively Process all subdirectories + # Recursively process content subdirectories, skipping generated build output. local subdir_basename for subdir in "$dir"/*; do - if [[ -d "$subdir" && $(basename "$subdir") != _* ]]; then - subdir_basename="${base_output_name}-$(basename "$subdir")" - process_directory "$subdir" "$subdir_basename" + if [[ ! -d "$subdir" ]]; then + continue fi + + case "$(basename "$subdir")" in + _*|target) + continue + ;; + esac + + subdir_basename="${base_output_name}-$(basename "$subdir")" + process_directory "$subdir" "$subdir_basename" done # Process markdown files in current directory