diff --git a/brand/build/projects.py b/brand/build/projects.py
index 506a570..6005e86 100644
--- a/brand/build/projects.py
+++ b/brand/build/projects.py
@@ -1,4 +1,5 @@
from collections.abc import Callable
+from html import escape
from pathlib import Path
from brand.build import geometry as g
@@ -165,13 +166,13 @@ def wrap_text(text: str, size: float, max_w: float) -> list[str]:
DOCS_REPOS: dict[str, str] = {
- "modern-di": "powerful DI framework with scopes",
- "that-depends": "predecessor DI framework, still actively maintained",
- "lite-bootstrap": "lightweight package for bootstrapping new microservices",
- "httpware": "HTTP client framework with sync/async clients, middleware chain, and built-in resilience (retry, bulkhead)",
- "faststream-redis-timers": "FastStream broker integration for Redis-backed distributed timer scheduling",
- "faststream-outbox": "FastStream broker integration for the transactional outbox pattern with Postgres",
- "semvertag": "auto-tag your GitHub/GitLab repo with semantic version tags from CI",
+ "modern-di": "Powerful dependency-injection framework with IoC container and scopes",
+ "that-depends": "Simple, typed dependency-injection framework for Python",
+ "lite-bootstrap": "Lightweight bootstrap for production-ready Python microservices",
+ "httpware": "Typed, resilient HTTP clients for Python, sync and async",
+ "faststream-redis-timers": "FastStream integration for Redis-backed distributed timer scheduling",
+ "faststream-outbox": "FastStream transactional-outbox integration backed by a Postgres table",
+ "semvertag": "Auto-tag GitHub & GitLab repos with semantic version tags from CI",
}
_CARD_W = 1280
@@ -228,6 +229,6 @@ def project_social_card(repo: str, *, tagline: str) -> str:
)
return (
f'"
)
diff --git a/brand/projects/faststream-outbox/social-card.png b/brand/projects/faststream-outbox/social-card.png
index 14145e4..700edf3 100644
Binary files a/brand/projects/faststream-outbox/social-card.png and b/brand/projects/faststream-outbox/social-card.png differ
diff --git a/brand/projects/faststream-outbox/social-card.svg b/brand/projects/faststream-outbox/social-card.svg
index 0769625..b65183d 100644
--- a/brand/projects/faststream-outbox/social-card.svg
+++ b/brand/projects/faststream-outbox/social-card.svg
@@ -1 +1 @@
-
+
diff --git a/brand/projects/faststream-redis-timers/social-card.png b/brand/projects/faststream-redis-timers/social-card.png
index 820f10e..56e50d4 100644
Binary files a/brand/projects/faststream-redis-timers/social-card.png and b/brand/projects/faststream-redis-timers/social-card.png differ
diff --git a/brand/projects/faststream-redis-timers/social-card.svg b/brand/projects/faststream-redis-timers/social-card.svg
index 07837f1..97dbd6a 100644
--- a/brand/projects/faststream-redis-timers/social-card.svg
+++ b/brand/projects/faststream-redis-timers/social-card.svg
@@ -1 +1 @@
-
+
diff --git a/brand/projects/httpware/social-card.png b/brand/projects/httpware/social-card.png
index c926775..a824b53 100644
Binary files a/brand/projects/httpware/social-card.png and b/brand/projects/httpware/social-card.png differ
diff --git a/brand/projects/httpware/social-card.svg b/brand/projects/httpware/social-card.svg
index d8732da..88edca5 100644
--- a/brand/projects/httpware/social-card.svg
+++ b/brand/projects/httpware/social-card.svg
@@ -1 +1 @@
-
+
diff --git a/brand/projects/lite-bootstrap/social-card.png b/brand/projects/lite-bootstrap/social-card.png
index 865bd5d..425cb1b 100644
Binary files a/brand/projects/lite-bootstrap/social-card.png and b/brand/projects/lite-bootstrap/social-card.png differ
diff --git a/brand/projects/lite-bootstrap/social-card.svg b/brand/projects/lite-bootstrap/social-card.svg
index c8eec27..917692b 100644
--- a/brand/projects/lite-bootstrap/social-card.svg
+++ b/brand/projects/lite-bootstrap/social-card.svg
@@ -1 +1 @@
-
+
diff --git a/brand/projects/modern-di/social-card.png b/brand/projects/modern-di/social-card.png
index 49e6ffe..5771970 100644
Binary files a/brand/projects/modern-di/social-card.png and b/brand/projects/modern-di/social-card.png differ
diff --git a/brand/projects/modern-di/social-card.svg b/brand/projects/modern-di/social-card.svg
index e3b70dd..6e51d07 100644
--- a/brand/projects/modern-di/social-card.svg
+++ b/brand/projects/modern-di/social-card.svg
@@ -1 +1 @@
-
+
diff --git a/brand/projects/semvertag/social-card.png b/brand/projects/semvertag/social-card.png
index 14a6722..11c9c84 100644
Binary files a/brand/projects/semvertag/social-card.png and b/brand/projects/semvertag/social-card.png differ
diff --git a/brand/projects/semvertag/social-card.svg b/brand/projects/semvertag/social-card.svg
index df9d756..75ee83f 100644
--- a/brand/projects/semvertag/social-card.svg
+++ b/brand/projects/semvertag/social-card.svg
@@ -1 +1 @@
-
+
diff --git a/brand/projects/that-depends/social-card.png b/brand/projects/that-depends/social-card.png
index 6ab02ea..9569337 100644
Binary files a/brand/projects/that-depends/social-card.png and b/brand/projects/that-depends/social-card.png differ
diff --git a/brand/projects/that-depends/social-card.svg b/brand/projects/that-depends/social-card.svg
index 524160b..e71989e 100644
--- a/brand/projects/that-depends/social-card.svg
+++ b/brand/projects/that-depends/social-card.svg
@@ -1 +1 @@
-
+
diff --git a/docs/index.md b/docs/index.md
index 756b191..65baf38 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -118,7 +118,7 @@ Every project is built with the same tooling
- [`modern-di-flask`](https://github.com/modern-python/modern-di-flask): modern-di integration for Flask
- [`modern-di-grpc`](https://github.com/modern-python/modern-di-grpc): modern-di integration for gRPC
- [`modern-di-litestar`](https://github.com/modern-python/modern-di-litestar): modern-di integration for Litestar
-- [`modern-di-pytest`](https://github.com/modern-python/modern-di-pytest): Pytest integration for modern-di — turn DI dependencies into fixtures
+- [`modern-di-pytest`](https://github.com/modern-python/modern-di-pytest): Pytest integration for modern-di that turns DI dependencies into fixtures
- [`modern-di-starlette`](https://github.com/modern-python/modern-di-starlette): modern-di integration for Starlette
- [`modern-di-taskiq`](https://github.com/modern-python/modern-di-taskiq): modern-di integration for taskiq
- [`modern-di-typer`](https://github.com/modern-python/modern-di-typer): modern-di integration for Typer
diff --git a/profile/README.md b/profile/README.md
index 858e257..4334d0a 100644
--- a/profile/README.md
+++ b/profile/README.md
@@ -38,7 +38,7 @@ Open-source templates and libraries for building production-ready Python applica
| [`modern-di-flask`](https://github.com/modern-python/modern-di-flask) | modern-di integration for Flask | [](https://github.com/modern-python/modern-di-flask/stargazers) | [](https://pepy.tech/projects/modern-di-flask) |
| [`modern-di-grpc`](https://github.com/modern-python/modern-di-grpc) | modern-di integration for gRPC | [](https://github.com/modern-python/modern-di-grpc/stargazers) | [](https://pepy.tech/projects/modern-di-grpc) |
| [`modern-di-litestar`](https://github.com/modern-python/modern-di-litestar) | modern-di integration for Litestar | [](https://github.com/modern-python/modern-di-litestar/stargazers) | [](https://pepy.tech/projects/modern-di-litestar) |
-| [`modern-di-pytest`](https://github.com/modern-python/modern-di-pytest) | Pytest integration for modern-di — turn DI dependencies into fixtures | [](https://github.com/modern-python/modern-di-pytest/stargazers) | [](https://pepy.tech/projects/modern-di-pytest) |
+| [`modern-di-pytest`](https://github.com/modern-python/modern-di-pytest) | Pytest integration for modern-di that turns DI dependencies into fixtures | [](https://github.com/modern-python/modern-di-pytest/stargazers) | [](https://pepy.tech/projects/modern-di-pytest) |
| [`modern-di-starlette`](https://github.com/modern-python/modern-di-starlette) | modern-di integration for Starlette | [](https://github.com/modern-python/modern-di-starlette/stargazers) | [](https://pepy.tech/projects/modern-di-starlette) |
| [`modern-di-taskiq`](https://github.com/modern-python/modern-di-taskiq) | modern-di integration for taskiq | [](https://github.com/modern-python/modern-di-taskiq/stargazers) | [](https://pepy.tech/projects/modern-di-taskiq) |
| [`modern-di-typer`](https://github.com/modern-python/modern-di-typer) | modern-di integration for Typer | [](https://github.com/modern-python/modern-di-typer/stargazers) | [](https://pepy.tech/projects/modern-di-typer) |
diff --git a/tests/test_profile.py b/tests/test_profile.py
index e639340..2e2fb01 100644
--- a/tests/test_profile.py
+++ b/tests/test_profile.py
@@ -80,3 +80,16 @@ def test_every_download_badge_is_pepy_and_names_its_repo() -> None:
)
assert len(rows) == len(badges)
assert [repo for repo, package in rows if repo != package] == []
+
+
+def test_every_social_card_tagline_is_its_profile_description() -> None:
+ """INVARIANT: a docs repo's social-card tagline is the description in its profile row.
+
+ The profile row already mirrors the GitHub description and the pyproject
+ `description`. The card tagline is a fourth copy that lives in Python, so a
+ description rewrite updates the other three and leaves the card telling link
+ previews something the repo no longer says.
+ """
+ text = _PROFILE.read_text(encoding="utf-8")
+ descriptions = dict(re.findall(r"^\| \[`([^`]+)`\]\([^)]*\) \| ([^|]+?) \|", text, flags=re.M))
+ assert p.DOCS_REPOS == {repo: descriptions[repo] for repo in p.DOCS_REPOS}