From 06a62fe69bdb9bcbbf5b9052489f9210c108e901 Mon Sep 17 00:00:00 2001 From: Artur Shiriev Date: Thu, 29 Oct 2026 23:17:22 +0300 Subject: [PATCH 1/2] feat: skip PNG renders whose source has not changed --- brand/build/raster.py | 35 ++++++++++++++++++++++----- tests/test_raster.py | 55 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 6 deletions(-) create mode 100644 tests/test_raster.py diff --git a/brand/build/raster.py b/brand/build/raster.py index 0a9c61f..710de4b 100644 --- a/brand/build/raster.py +++ b/brand/build/raster.py @@ -1,21 +1,41 @@ +import hashlib import shutil import subprocess from pathlib import Path +try: + from PIL import Image, PngImagePlugin +except ModuleNotFoundError: + Image = PngImagePlugin = None + _PNG_COLORS = 32 # palette size; flat art needs few (8 already looked clean; 32 = headroom) +_SOURCE_KEY = "source-sha256" + + +def _source_hash(svg_path: Path, width: int | None, height: int | None) -> str: + h = hashlib.sha256(svg_path.read_bytes()) + h.update(f"|{width}|{height}|{_PNG_COLORS}".encode()) + return h.hexdigest() + + +def _stored_hash(png_path: Path) -> str | None: + if Image is None or not png_path.is_file(): + return None + with Image.open(png_path) as im: + return im.info.get(_SOURCE_KEY) -def _quantize_png(path: Path, colors: int = _PNG_COLORS) -> None: +def _quantize_png(path: Path, source_hash: str, colors: int = _PNG_COLORS) -> None: """Re-save a PNG as an indexed-palette image — visually lossless for flat art. FASTOCTREE preserves alpha, so it is correct for both the opaque social cards and the transparent marks. No-op if Pillow is unavailable.""" - try: - from PIL import Image - except ModuleNotFoundError: + if Image is None: return im = Image.open(path).convert("RGBA") q = im.quantize(colors=colors, method=Image.Quantize.FASTOCTREE) - q.save(path, format="PNG", optimize=True) + info = PngImagePlugin.PngInfo() + info.add_text(_SOURCE_KEY, source_hash) + q.save(path, format="PNG", optimize=True, pnginfo=info) def export_png( @@ -28,6 +48,9 @@ def export_png( exe = shutil.which("rsvg-convert") if exe is None: return False + source_hash = _source_hash(svg_path, width, height) + if _stored_hash(png_path) == source_hash: + return True args = [exe] if width is not None: args += ["-w", str(width)] @@ -35,5 +58,5 @@ def export_png( args += ["-h", str(height)] args += [str(svg_path), "-o", str(png_path)] subprocess.run(args, check=True) - _quantize_png(png_path) + _quantize_png(png_path, source_hash) return True diff --git a/tests/test_raster.py b/tests/test_raster.py new file mode 100644 index 0000000..c982ee2 --- /dev/null +++ b/tests/test_raster.py @@ -0,0 +1,55 @@ +import shutil +from pathlib import Path + +import pytest + +from brand.build.raster import export_png + +pytestmark = pytest.mark.skipif( + shutil.which("rsvg-convert") is None, reason="rsvg-convert not installed" +) + +_SVG = '' + + +def _write_svg(path: Path, fill: str = "#c98a00") -> Path: + path.write_text(_SVG.format(fill=fill), encoding="utf-8") + return path + + +def test_unchanged_source_leaves_png_untouched(tmp_path: Path) -> None: + """INVARIANT: re-rendering an unchanged SVG does not rewrite its PNG. + + rsvg-convert builds differ byte-wise from machine to machine, so a render that + always rewrites turns every brand PR into a diff of every committed PNG. + """ + svg = _write_svg(tmp_path / "a.svg") + png = tmp_path / "a.png" + assert export_png(svg, png, width=32, height=32) + before = png.read_bytes() + stamp = png.stat().st_mtime_ns + + assert export_png(svg, png, width=32, height=32) + assert png.stat().st_mtime_ns == stamp + assert png.read_bytes() == before + + +def test_changed_svg_rerenders(tmp_path: Path) -> None: + svg = _write_svg(tmp_path / "a.svg") + png = tmp_path / "a.png" + assert export_png(svg, png, width=32, height=32) + before = png.read_bytes() + + _write_svg(svg, fill="#1f4d3a") + assert export_png(svg, png, width=32, height=32) + assert png.read_bytes() != before + + +def test_changed_size_rerenders(tmp_path: Path) -> None: + svg = _write_svg(tmp_path / "a.svg") + png = tmp_path / "a.png" + assert export_png(svg, png, width=32, height=32) + before = png.read_bytes() + + assert export_png(svg, png, width=64, height=64) + assert png.read_bytes() != before From 257cfff42dce694159bfccc58031086535770878 Mon Sep 17 00:00:00 2001 From: Artur Shiriev Date: Thu, 29 Oct 2026 23:17:22 +0300 Subject: [PATCH 2/2] chore: re-render every PNG once to stamp its source hash --- brand/apparel/back-lockup-2400.png | Bin 36755 -> 36845 bytes brand/apparel/chest-mark-1050.png | Bin 5691 -> 5781 bytes brand/org/apple-touch-icon-180.png | Bin 793 -> 883 bytes brand/org/avatar-1024.png | Bin 5696 -> 5786 bytes brand/org/avatar-circle-1024.png | Bin 4829 -> 4919 bytes brand/org/boosty-cover.png | Bin 3925 -> 4015 bytes brand/org/favicon-16.png | Bin 304 -> 394 bytes brand/org/favicon-32.png | Bin 359 -> 449 bytes brand/org/favicon-48.png | Bin 400 -> 490 bytes brand/org/social-card-green.png | Bin 6858 -> 6948 bytes brand/org/social-card.png | Bin 7656 -> 7746 bytes brand/org/social-square-green.png | Bin 5888 -> 5978 bytes brand/org/social-square.png | Bin 6234 -> 6324 bytes brand/projects/chat-app/lockup.png | Bin 1363 -> 1453 bytes brand/projects/chat-app/mark-1024.png | Bin 7198 -> 7288 bytes brand/projects/chat-app/mark-512.png | Bin 3128 -> 3218 bytes brand/projects/compose2pod/lockup.png | Bin 1994 -> 2084 bytes brand/projects/compose2pod/mark-1024.png | Bin 8466 -> 8556 bytes brand/projects/compose2pod/mark-512.png | Bin 3963 -> 4053 bytes brand/projects/db-retry/lockup.png | Bin 1518 -> 1608 bytes brand/projects/db-retry/mark-1024.png | Bin 10799 -> 10889 bytes brand/projects/db-retry/mark-512.png | Bin 4640 -> 4730 bytes brand/projects/eof-fixer/lockup.png | Bin 1231 -> 1321 bytes brand/projects/eof-fixer/mark-1024.png | Bin 5951 -> 6041 bytes brand/projects/eof-fixer/mark-512.png | Bin 2368 -> 2458 bytes .../fastapi-sqlalchemy-template/lockup.png | Bin 2711 -> 2801 bytes .../fastapi-sqlalchemy-template/mark-1024.png | Bin 7198 -> 7288 bytes .../fastapi-sqlalchemy-template/mark-512.png | Bin 3128 -> 3218 bytes .../faststream-concurrent-aiokafka/lockup.png | Bin 2626 -> 2716 bytes .../mark-1024.png | Bin 5483 -> 5573 bytes .../mark-512.png | Bin 2313 -> 2403 bytes brand/projects/faststream-outbox/lockup.png | Bin 2027 -> 2117 bytes .../projects/faststream-outbox/mark-1024.png | Bin 8105 -> 8195 bytes brand/projects/faststream-outbox/mark-512.png | Bin 3383 -> 3473 bytes .../faststream-outbox/social-card.png | Bin 13755 -> 13845 bytes .../faststream-redis-timers/lockup.png | Bin 2499 -> 2589 bytes .../faststream-redis-timers/mark-1024.png | Bin 9512 -> 9602 bytes .../faststream-redis-timers/mark-512.png | Bin 4183 -> 4273 bytes .../faststream-redis-timers/social-card.png | Bin 14708 -> 14798 bytes brand/projects/httpware/lockup.png | Bin 1274 -> 1364 bytes brand/projects/httpware/mark-1024.png | Bin 6693 -> 6783 bytes brand/projects/httpware/mark-512.png | Bin 2601 -> 2691 bytes brand/projects/httpware/social-card.png | Bin 10339 -> 10429 bytes brand/projects/jwks-client/lockup.png | Bin 1419 -> 1509 bytes brand/projects/jwks-client/mark-1024.png | Bin 6134 -> 6224 bytes brand/projects/jwks-client/mark-512.png | Bin 2407 -> 2497 bytes brand/projects/lite-bootstrap/lockup.png | Bin 1688 -> 1778 bytes brand/projects/lite-bootstrap/mark-1024.png | Bin 7511 -> 7601 bytes brand/projects/lite-bootstrap/mark-512.png | Bin 3227 -> 3317 bytes brand/projects/lite-bootstrap/social-card.png | Bin 12302 -> 12392 bytes .../litestar-sqlalchemy-template/lockup.png | Bin 2512 -> 2602 bytes .../mark-1024.png | Bin 7198 -> 7288 bytes .../litestar-sqlalchemy-template/mark-512.png | Bin 3128 -> 3218 bytes brand/projects/modern-di-aiogram/lockup.png | Bin 2073 -> 2163 bytes .../projects/modern-di-aiogram/mark-1024.png | Bin 7623 -> 7713 bytes brand/projects/modern-di-aiogram/mark-512.png | Bin 3349 -> 3439 bytes brand/projects/modern-di-aiohttp/lockup.png | Bin 2074 -> 2164 bytes .../projects/modern-di-aiohttp/mark-1024.png | Bin 9754 -> 9844 bytes brand/projects/modern-di-aiohttp/mark-512.png | Bin 4443 -> 4533 bytes brand/projects/modern-di-arq/lockup.png | Bin 1540 -> 1630 bytes brand/projects/modern-di-arq/mark-1024.png | Bin 5865 -> 5955 bytes brand/projects/modern-di-arq/mark-512.png | Bin 2504 -> 2594 bytes brand/projects/modern-di-celery/lockup.png | Bin 1753 -> 1843 bytes brand/projects/modern-di-celery/mark-1024.png | Bin 5977 -> 6067 bytes brand/projects/modern-di-celery/mark-512.png | Bin 2385 -> 2475 bytes brand/projects/modern-di-fastapi/lockup.png | Bin 2088 -> 2178 bytes .../projects/modern-di-fastapi/mark-1024.png | Bin 8913 -> 9003 bytes brand/projects/modern-di-fastapi/mark-512.png | Bin 3970 -> 4060 bytes brand/projects/modern-di-fastmcp/lockup.png | Bin 2047 -> 2137 bytes .../projects/modern-di-fastmcp/mark-1024.png | Bin 7649 -> 7739 bytes brand/projects/modern-di-fastmcp/mark-512.png | Bin 3410 -> 3500 bytes .../projects/modern-di-faststream/lockup.png | Bin 2214 -> 2304 bytes .../modern-di-faststream/mark-1024.png | Bin 8786 -> 8876 bytes .../modern-di-faststream/mark-512.png | Bin 3728 -> 3818 bytes brand/projects/modern-di-flask/lockup.png | Bin 1793 -> 1883 bytes brand/projects/modern-di-flask/mark-1024.png | Bin 7248 -> 7338 bytes brand/projects/modern-di-flask/mark-512.png | Bin 3348 -> 3438 bytes brand/projects/modern-di-grpc/lockup.png | Bin 1707 -> 1797 bytes brand/projects/modern-di-grpc/mark-1024.png | Bin 6379 -> 6469 bytes brand/projects/modern-di-grpc/mark-512.png | Bin 2645 -> 2735 bytes brand/projects/modern-di-litestar/lockup.png | Bin 2050 -> 2140 bytes .../projects/modern-di-litestar/mark-1024.png | Bin 9275 -> 9365 bytes .../projects/modern-di-litestar/mark-512.png | Bin 4266 -> 4356 bytes brand/projects/modern-di-pytest/lockup.png | Bin 1748 -> 1838 bytes brand/projects/modern-di-pytest/mark-1024.png | Bin 5899 -> 5989 bytes brand/projects/modern-di-pytest/mark-512.png | Bin 2265 -> 2355 bytes brand/projects/modern-di-starlette/lockup.png | Bin 1961 -> 2051 bytes .../modern-di-starlette/mark-1024.png | Bin 7241 -> 7331 bytes .../projects/modern-di-starlette/mark-512.png | Bin 3284 -> 3374 bytes brand/projects/modern-di-taskiq/lockup.png | Bin 1904 -> 1994 bytes brand/projects/modern-di-taskiq/mark-1024.png | Bin 7939 -> 8029 bytes brand/projects/modern-di-taskiq/mark-512.png | Bin 3451 -> 3541 bytes brand/projects/modern-di-typer/lockup.png | Bin 1706 -> 1796 bytes brand/projects/modern-di-typer/mark-1024.png | Bin 6485 -> 6575 bytes brand/projects/modern-di-typer/mark-512.png | Bin 2629 -> 2719 bytes brand/projects/modern-di/lockup.png | Bin 1452 -> 1542 bytes brand/projects/modern-di/mark-1024.png | Bin 8043 -> 8133 bytes brand/projects/modern-di/mark-512.png | Bin 3512 -> 3602 bytes brand/projects/modern-di/social-card.png | Bin 12031 -> 12121 bytes brand/projects/release-scope/lockup.png | Bin 1763 -> 1853 bytes brand/projects/release-scope/mark-1024.png | Bin 7990 -> 8080 bytes brand/projects/release-scope/mark-512.png | Bin 3380 -> 3470 bytes brand/projects/semvertag/lockup.png | Bin 1360 -> 1450 bytes brand/projects/semvertag/mark-1024.png | Bin 5535 -> 5625 bytes brand/projects/semvertag/mark-512.png | Bin 2169 -> 2259 bytes brand/projects/semvertag/social-card.png | Bin 11745 -> 11835 bytes brand/projects/sqlalchemy-inbox/lockup.png | Bin 1949 -> 2039 bytes brand/projects/sqlalchemy-inbox/mark-1024.png | Bin 7806 -> 7896 bytes brand/projects/sqlalchemy-inbox/mark-512.png | Bin 3345 -> 3435 bytes brand/projects/that-depends/lockup.png | Bin 1649 -> 1739 bytes brand/projects/that-depends/mark-1024.png | Bin 7339 -> 7429 bytes brand/projects/that-depends/mark-512.png | Bin 3244 -> 3334 bytes brand/projects/that-depends/social-card.png | Bin 11947 -> 12037 bytes docs/assets/social-card-green.png | Bin 6818 -> 6948 bytes 114 files changed, 0 insertions(+), 0 deletions(-) diff --git a/brand/apparel/back-lockup-2400.png b/brand/apparel/back-lockup-2400.png index b1fe6635a85d63173ba6b4e281e83e56829dc112..5b2a56005f0182c2ef79a57c90c73a9247b7c818 100644 GIT binary patch delta 100 zcmbO{pXu#IW){XtsRjmV#-+<^nCIJPc diff --git a/brand/apparel/chest-mark-1050.png b/brand/apparel/chest-mark-1050.png index 976252819f61aa2dac29bb00373d95d3ea1fc266..736fbe48304d3055027f01ee5e9834121ec9c81d 100644 GIT binary patch delta 98 zcmdn3GgWtjO1NK%YeY$LerZv1s%~*cqLHZ?gMopCL875WQevXHv6*FZih+r_VQO+p zin&FaX_{fGrMXFJN}92`p^;&-rAdl~iGgvdMOun+a#BjFp;=0D@|I8Qq&F%`i2(rn CV;T2fk4ieaL$kx{a#S#{8le;XBlFaZGC CJs&3k delta 10 Rcmey&Hj{0F%Er2{OaK_}1aklY diff --git a/brand/org/avatar-1024.png b/brand/org/avatar-1024.png index e4afcd90e8a574019cd4a3e9a844321e690030da..6ffa7b92e6107d9ee9964b6988679f6b64665b0b 100644 GIT binary patch delta 98 zcmX@0GfQ`ZO1NK%YeY$LerZv1s%~*cqLHZ?gQZ!jQBtBsVp>X~X_~pEg-MdJ0gy;C zPD@NNF*QvwG)OW|G)giyPD(aOvNW_XOiDGfG)y+JFiJDCNKH2OXf*t_QBhtD01!SN AF8}}l delta 10 RcmbQGdq8J`%EmewF#s2L1IYjY diff --git a/brand/org/avatar-circle-1024.png b/brand/org/avatar-circle-1024.png index 9162765b62c824b75a0d31f7fdc9f127c0745087..eb3859af5496b068fe3a695aced4e3730327fdcf 100644 GIT binary patch delta 98 zcmcbsx?OF8O1NK%YeY$LerZv1s%~*cqLHZ?gQbB%QcALEa*~OWv6-Pckg_mHNi;M` zPE1WSvq-WqvPeoaHZo30F-bH{O*S@2H8nFzNis1^Oi49LO-@UDYg59pQE`tD021LJ A7ytkO delta 10 Rcmdn4c2{+R%Er2#LI4^^1dadz diff --git a/brand/org/boosty-cover.png b/brand/org/boosty-cover.png index 51f950e3b1be63d70d1c4ae574ab6b07aa6c5a5f..079487dbf665acd553bd4cffe8f8be484c71df84 100644 GIT binary patch delta 98 zcmcaAw_bjNO1NK%YeY$LerZv1s%~*cqLHZ?gOQPik)=^mYHDJtWpZ+=nXyGmYHFHA znpt9+xv_y!ig}8Og}ITLK~j=sqDiWyrAabS#MsOv$sDM|+{j3|^{eehMH7Ai8#EqP delta 10 RcmZ24e^qXR%EmfFegGIW1LXh! diff --git a/brand/org/favicon-16.png b/brand/org/favicon-16.png index c432e1c6b259e55359ad74f7653f9cc7829265ca..8ed91a8c15fdfb5d36067504059c0aae1dce9772 100644 GIT binary patch delta 98 zcmdnM)WtkOCETyXHKL?AzqBYhRkt`J(a6+{!6eDR#Kg$L+|b0*FvTL-%sA1+GR53H z%{V#9G$}bL%`nN>GQ}u0+0fG1B+=3|(cHq+G|ezI)!foB&A`ks@v_6#!y6U(83DNM B9e)4- delta 10 RcmeBT-oP|LWn&!=BLEYE126yp diff --git a/brand/org/favicon-32.png b/brand/org/favicon-32.png index 3103071ea3854bc9566f03fab69bdb15f6bd0bbb..4c1a8e6ddc24f8d0cc61155c2f41dea4bf3e0e59 100644 GIT binary patch delta 98 zcmaFPbdY(1O1NK%YeY$LerZv1s%~*cqLHZ?gPFOBp|L?)TC$0`fn}ONs@)BL85V5l8LE>g{5htv4MfHk%fsxVw!1+xv^<-s->ZE;=LUoLN+SqGXenP C>mE-4 delta 10 RcmaFGJb`(F%Er1JMgSKH1JM8g diff --git a/brand/org/social-card-green.png b/brand/org/social-card-green.png index 7049cb5537d4c9d6206ad29d4570a0140b46623d..2679913af57ad0e25b37728ce17e0a6fa5f516e3 100644 GIT binary patch delta 98 zcmX?Qy2NaPO1NK%YeY$LerZv1s%~*cqLHZ?Ly~E7s)cEyc~VlEiK&I9sgY$`nyF>7 zNus5tS+Y^8adM(*Vp^i5NvgSJvZ-;3rKzDono+7nQi@@+xv8O1>bXz*3^ppRlmY-M C0w2Wy delta 10 RcmZ2tcFJ^u%Er27QUDp#1bqMi diff --git a/brand/org/social-card.png b/brand/org/social-card.png index 79a58f604268e35bd4656fca14ed93a44c3737a7..14859c8332dc06f555411ce1a7821e75e287d210 100644 GIT binary patch delta 98 zcmaE1eaL2lO1NK%YeY$LerZv1s%~*cqLHZ?Lt>hVL0YO|qJ_CxVv4z;L2{a9s;RN1 zMM|oHg$0mnWN2WTVxDGZlx%L1W@Kz)lxAs|WMpKLXliMYXknNr#gzAVqvCN{02nD9 A^8f$< delta 10 RcmX?P^TK+9%Er1QvH%>81m*w$ diff --git a/brand/org/social-square-green.png b/brand/org/social-square-green.png index 78c919ac78565e376af0761f21754886e771712b..2c5c64cf3b390fa8f6badf95afc5969920a9ad9c 100644 GIT binary patch delta 98 zcmZqByQMclCETyXHKL?AzqBYhRkt`J(a6+{!PG3t(%j52#lSo*B_-9^DAmZ)%pl1! z(a1Q(Jk2CEG0DKh!Z;<((m2sF#U#lfInB}}#Wcmh&@9L26) delta 10 Rcmcbm*Pu5+Wn=Ks~|BA9eYsZy)S%lJzg*K`8H3_ z*f3p(t{lxGJlt6nGrBO6W>W&o0iumHsc5>4pw&c(5v=@w>*IYW`wau< B9#;SW delta 10 RcmdmDc*|gd%Eme~2>=!g^5v`nPpm%DUdKO5Ds0rQPGGM0MlR{ A6951J delta 10 RcmZ3>eVJ>5%EmfaLVTwtzWm;OQ zVXA4WrAbOkvY~}pqG3|1DTtY3WR{X>oMvKdoMM)2oR*qsmX>Qp`np+YKnzvYFbK)g^97Dg}GsxnVG3svVmc;fn};?TJupAu8oQ-*#WOn B9DD!( delta 10 RcmZ1?aEgC|%Er27>;M;F1RekY diff --git a/brand/projects/compose2pod/mark-1024.png b/brand/projects/compose2pod/mark-1024.png index 8c5967f06ca7d8211edf9aae861a31d85145018c..72ac6ef9b365963b58dddb0e99c4c32c938aef1f 100644 GIT binary patch delta 98 zcmbQ_^u}p|O1NK%YeY$LerZv1s%~*cqLHZ?gK@ICMQV~!qJ=?9Qi_FfvT>@BMVf_S znz?CmnnkjSk$I9?N>XBCnu&#(xtUR7VoIW^S!zn6g`r`Rfq9~F(w^LcsT&nPDgXdJ CeIO_R delta 10 RcmaFkG|6d#%Er2P3IH5H1oQv^ diff --git a/brand/projects/compose2pod/mark-512.png b/brand/projects/compose2pod/mark-512.png index 70a9ad4f6cd0f9586f656948e77c72ee2fbdf222..4f08b064734196b1463def10697c3a60b1062436 100644 GIT binary patch delta 98 zcmew@cU69ZO1NK%YeY$LerZv1s%~*cqLHZ?L$bM~*vH}3x CZXJsN delta 10 RcmX@X^NxFh%Er1=tNHO0gt#mFed#4ORoEH%m0 zJk7!~DJ?lI$<)Zy+$7N`&D1i{&@9C`#n9N)#KO=Z)yyC<$->k$MaguZ=0-(6EdU4v B9W4L= delta 10 RcmeAST^}+*Wn&$;762Hx1Nr~} diff --git a/brand/projects/db-retry/mark-512.png b/brand/projects/db-retry/mark-512.png index 8350b71ba02d6af7429b4ce93e4b8685e05df432..eb8dfb9eac35305b372ba5d5f499679671250d24 100644 GIT binary patch delta 98 zcmZ3W@=IlcO1NK%YeY$LerZv1s%~*cqLHZ?gN3>~a!RUUilK#RvSE^8 zijkRxk&&s9u}O-lSyG~@L9(HFa-z9KlBscGvY~~cfq|KMiiJgzk;&q#XE!ST7X$zS CjvmVZ delta 10 RcmeyRvOr~m%Er1sf&d$71k(Tj diff --git a/brand/projects/eof-fixer/lockup.png b/brand/projects/eof-fixer/lockup.png index 16e269c809696d4d9a43997efde80960da21ab89..1e8c26d99d187f8b017c80a09beaa1225c42a0ea 100644 GIT binary patch delta 98 zcmX@lxsq#wO1NK%YeY$LerZv1s%~*cqLHZ?LvoTuvSDJfQKDs%ahjPWkeQfhY?PdA zY@B42W}1|0W|CxRZf2B{YGR(2Y@C#ol4hQ2o|tA}m}r)gVw#jBAgmv-QE?p$03=Wz Aod5s; delta 10 RcmZ3gG)s7bO1NK%YeY$LerZv1s%~*cqLHZ?LsDw0xv`0viJ3vNNs4i*xtXDfXQu|Z0bp@oIHskym%itjOva~l=qIRVHC B9HIaK delta 10 RcmbOwd_ZV|%EmewP5>3k1Bd_s diff --git a/brand/projects/fastapi-sqlalchemy-template/lockup.png b/brand/projects/fastapi-sqlalchemy-template/lockup.png index 5c81cbd891e423fe5e48d93ad8e0878d2966b46e..af0a2faec88a7e70ed99e8897e32bb0120b3b4a1 100644 GIT binary patch delta 98 zcmbO(`cZU(O1NK%YeY$LerZv1s%~*cqLHZ?Ly~DyT5?jNxrMobiD|N7qJg0?P{i2M z!rUk=%`zz|DKW)3H8C;S*vQl(HQB^8G1WNP!Z_K`z%a?uz}Vb!RmHQ*8x_mA03duH Ah5!Hn delta 10 Rcmew;I$d;v%Er24E&v$51QP%N diff --git a/brand/projects/fastapi-sqlalchemy-template/mark-1024.png b/brand/projects/fastapi-sqlalchemy-template/mark-1024.png index 6424c44da4e57f3ac13dda2e9f15481166eea8c8..b733f7410f15b956e3934fb252cd6b9507da4b10 100644 GIT binary patch delta 98 zcmbPd@xx+*O1NK%YeY$LerZv1s%~*cqLHZ?LsC+bv9YkGDmcRO1NK%YeY$LerZv1s%~*cqLHZ?gPDQ3g}Je@X<|~6X_|#;Qc{vhqJf#2 zfl;!Vk)?5}nPp0{L6W&;s*!J+oKYa106xd6*l B9ccgn delta 10 RcmbOudPrn~%Emf5E&vu21Csy% diff --git a/brand/projects/faststream-concurrent-aiokafka/mark-1024.png b/brand/projects/faststream-concurrent-aiokafka/mark-1024.png index 8edf5f256e127fa958ee82176cde709147b2ba73..3649db88ada30040df8923463c804c67259d88f5 100644 GIT binary patch delta 98 zcmaE@byRzTO1NK%YeY$LerZv1s%~*cqLHZ?gQ=0FfrV*uvO$uWp-GxinvsQ>g=J#0 z8Bi|SJlVuD(a6v|(bB-kB-tpEn0{|Ve BA9Mf! delta 10 RcmX>q@S1;u%Er3m>;M_`1c3km diff --git a/brand/projects/faststream-outbox/mark-1024.png b/brand/projects/faststream-outbox/mark-1024.png index 7908b309078498ce67b7ced2eba5536aad50c691..fd4d09b9098d487ce6a016d9ee96df2f2cb65cbd 100644 GIT binary patch delta 98 zcmZ2!-|R3!CETyXHKL?AzqBYhRkt`J(a6+{AuYuy)zZ}1GC9@2GTFq;B*ntg(8S!( zAl1S+EiutB&BD;cz%tR;%q-2=)F3IPvG1bV(yjW%VnT?7a@&M_~ B9wYz& delta 10 RcmZp6SZO~&Wn*2dJOCHu1Tz2t diff --git a/brand/projects/faststream-outbox/mark-512.png b/brand/projects/faststream-outbox/mark-512.png index 5795186a35872e928a553e746e81e279d2beaac2..da2f21beaca926593e218909dcd97d20bdc7f538 100644 GIT binary patch delta 98 zcmdlkHBowkO1NK%YeY$LerZv1s%~*cqLHZ?LzUYFctil7X2?Qj%$^Ns6hdk)N~Q+>MH2yZ{%{ B9$Wwb delta 10 RcmbOzy7O1NK%YeY$LerZv1s%~*cqLHZ?L!ybfQIe^Nv1xLug|VfHd9p#WX=-9} zvSp%$sZnB5s#%h8lBJn}fl0E3MY4&ZxnW|OscEWNVw!=8QL?#F;?)NSZ*NqbWeNZ* Clpr_& delta 10 RcmbQ5vpai&%Er3srT`ow1lIrn diff --git a/brand/projects/faststream-redis-timers/lockup.png b/brand/projects/faststream-redis-timers/lockup.png index 7e0449f54d43b42d91f9b4760ffd547828282174..b54e8f2592f68cb9731c44ae31464a64318dc0d7 100644 GIT binary patch delta 98 zcmX>sJXd6bO1NK%YeY$LerZv1s%~*cqLHZ?Lz;y}l7*qEsYQ~pg@JL3VVXr!Vv*wWC#B-zBs#MHs%C33+t_Kk|{ssQ_i B9b^Ci delta 10 RcmZqjUg0%CWn&$SDgYOT1Iz#b diff --git a/brand/projects/faststream-redis-timers/mark-512.png b/brand/projects/faststream-redis-timers/mark-512.png index 1d5522ec697f8c91f524ac621fc7934d72de3af1..699be7854ea1da2cefb35b221c200c40852072f9 100644 GIT binary patch delta 98 zcmcbvuu*Y>O1NK%YeY$LerZv1s%~*cqLHZ?LrPkTp_xHyvbm|TnTctNrDc+3l1Xxk zd7`C>iJ^swxrw2nX_9G@ahkcYMVg7Jsj+dgg=MORL8`H_abl9Gc~_La*G5G%0RZPw B9FYJ3 delta 10 Rcmdm}cwJ$F%Emfl0RR|%1MmO< diff --git a/brand/projects/faststream-redis-timers/social-card.png b/brand/projects/faststream-redis-timers/social-card.png index 33db2c6a58c196ff4c4e3c3977105e68d3bf9467..8bd096eb884733d1071cd430988c596edfe389f7 100644 GIT binary patch delta 98 zcmexTbgp=UO1NK%YeY$LerZv1s%~*cqLHZ?gPBpHnW?dnrGcqwifO7*lBKzYd7_D7 zVxqaFagvd-xmij|s%5g7rHPTHiDg=vk%38yxj~v?Qd+8oxrISul56fK`;CghmH;N% B9%%po delta 10 RcmX?C{H17u%Er0?O8_7W1rz`P diff --git a/brand/projects/httpware/lockup.png b/brand/projects/httpware/lockup.png index 336bbe69c0a1edeb8186b18bc527220f5943bdb0..36b11265f5d36706a268cb6bd6bad430991c0518 100644 GIT binary patch delta 98 zcmeyxd4+3&O1NK%YeY$LerZv1s%~*cqLHZ?gPDnmsfn3cqPcmBk!4D9lCf#3sflrt zWr}%fa+;yJVUnqZiG`7YMN*1Ua$2IHiDh!KX`->InT2U$TAHPWAy32C)f*LWvH$?~ C&>o!t delta 10 Rcmcb@^^0?Y%Er2DEC3q41fKu^ diff --git a/brand/projects/httpware/mark-1024.png b/brand/projects/httpware/mark-1024.png index 529799d63d089c1681125c7726324b1decb296dc..9d586bbc2695cfe636601c930a05d1cb55a4b329 100644 GIT binary patch delta 98 zcmZ2#^50~FO1NK%YeY$LerZv1s%~*cqLHZ?gHf7knwfEuWpY|tnu%#*N}^eEa-ylR zg+)q|foY0?VOo-zp>a}@r9q;ld9ty2nq`V{szr*Cp{Ye;vazXQny2vhw;L5%qyR`d BA1MF; delta 10 RcmexwveaaP%EmfIDF7PQ1PcHF diff --git a/brand/projects/httpware/mark-512.png b/brand/projects/httpware/mark-512.png index 7d506aeb89a61aec7b6238bd637ffc039fae9884..6bd22dffebe1df52f1eb2bf9383ad34148c4a535 100644 GIT binary patch delta 98 zcmZ1}(kwbbCETyXHKL?AzqBYhRkt`J(a6+{!92+%ImO)2C^6O8A}KL7HQC(EGTAiI xC?zd5)xtQ%BGJGo+0rn{Jjuc^4ahQ0vP?EfGyx(Y( diff --git a/brand/projects/httpware/social-card.png b/brand/projects/httpware/social-card.png index 6c3a0482e4316e146bd7cec39d3d4eaf75ceac9c..3b7347afe93b17422b77c33b5f4be5b114c3a03e 100644 GIT binary patch delta 98 zcmaDHus3jmO1NK%YeY$LerZv1s%~*cqLHZ?Lt2`VnQ3yWrEyAHYND}aifK|(qNSm+ zMXIHRMRIbIsfAf;YO<-BMN+DPVWN4mfiX}##URPTD9tQ2Db+YF>>&H!jfzeh0AOt& A(*OVf delta 10 RcmdlR_&8vK%Emf-4FDX41dIRx diff --git a/brand/projects/jwks-client/lockup.png b/brand/projects/jwks-client/lockup.png index ed684cf32404a3790b1874737de590e410a78eed..2c15da263fc99fb38fdad9e9534816608a731e58 100644 GIT binary patch delta 98 zcmeC?e#$*TCETyXHKL?AzqBYhRkt`J(a6+{!Q3n|n0Q89}Z0LqLW AKmY&$ delta 10 RcmaFL-OW8gWn*1BD*zWM1J(cl diff --git a/brand/projects/jwks-client/mark-1024.png b/brand/projects/jwks-client/mark-1024.png index f6e1db6a675a5a1a2ebfdfe9162b38cd71cc2a99..4f494aca7d0e85fa4af47082b0bec52597ed51e7 100644 GIT binary patch delta 98 zcmeySf5BjaO1NK%YeY$LerZv1s%~*cqLHZ?gK1hyl7V58nQ^MAWlE}Ps;QBMp+$0v zsfCe=rE!XhiCMB`s)?nMiD7DrL6T{bxv_DYfk{%bQHq&~p_zfHX{f4&_D034;s6iv B9W4L= delta 10 Rcmca$@J)Y$%Er1&;s6}r1o8j? diff --git a/brand/projects/jwks-client/mark-512.png b/brand/projects/jwks-client/mark-512.png index 3db791230650a8b3acf89e39c601ac7f5a48edcf..3d4114c43c572470d6ed1d437c34d1821defd418 100644 GIT binary patch delta 98 zcmaDZbWnJLO1NK%YeY$LerZv1s%~*cqLHZ?gNbEwqLGP-Won{%a*DCJak7y~l6k6m znn99La+-mKnSp_Yg+-!)nMG2vNt&6Fg-K#knrTu}vZZlqiiL%t!4aXQc^ehoH~|6* B9tHpa delta 10 RcmX>o{9I^)%EmfpP5>Cz1N{I1 diff --git a/brand/projects/lite-bootstrap/lockup.png b/brand/projects/lite-bootstrap/lockup.png index 1a487e20f875ef04c6a5cf9cc2126a1bb3c63284..edeb64ea12733c14b6018bbba7012bb4e55bf58a 100644 GIT binary patch delta 98 zcmbQi`-yjgO1NK%YeY$LerZv1s%~*cqLHZ?L#nx{Nn)a@rGilw=+Nt&^dv4M$knrVtfs(DgsvZ0Z2Qfi8UxuKrGXX delta 10 RcmdmJecft;%EmflSpXU;1Tg>r diff --git a/brand/projects/lite-bootstrap/mark-512.png b/brand/projects/lite-bootstrap/mark-512.png index a8b09468bdec96a133fba3a1292e5a17d29050a8..91d9209824b027dd12f866b40486bf109f78a83c 100644 GIT binary patch delta 98 zcmbO&`Bid)O1NK%YeY$LerZv1s%~*cqLHZ?gJEK_fkl#~X=+-kfpLminyF!ug@uKA zqN#~RvWdB|X=0jrnvsR61(0cwoMM(_Y@Cu}W@c)ZYLJp<4%ED$|FPai#VQ^E`xG8% delta 10 Rcmew=Ia_jq%Er2K9sn6o1StRj diff --git a/brand/projects/lite-bootstrap/social-card.png b/brand/projects/lite-bootstrap/social-card.png index 1326c9174b3d8673bce64dbba1b1e62a5d62785a..88a64ecb957954b07808348aa6666516423ee775 100644 GIT binary patch delta 98 zcmeB6c#$wcCETyXHKL?AzqBYhRkt`J(a6+{A=N0wG||x1ILXw=A~6-nN-;Auu`o_C zGBLEYG)zn~H?TA|NlG>|O0zUFO-nXNOE$LvvQm;#jLcHg%u^Lj>ep;ke5(%t6ObOE delta 10 RcmaEn(3dblWnz(O1NK%YeY$LerZv1s%~*cqLHZ?L$bMvg;|oBL7IiRnQ^LRs!5WWrFn{( ziA9RJaaxk0nW?E!QktP*nt7^4vVnnOUk?vSnIYaw*W B9ryqM delta 10 RcmbOvxkF-t%Emeo9sm`M1AhPj diff --git a/brand/projects/modern-di-aiogram/lockup.png b/brand/projects/modern-di-aiogram/lockup.png index 255e264daaf40fb22d9cb86df4d425ef6d5f4b63..2e0150bc44e6e9d60696fba0ca37247951b9f433 100644 GIT binary patch delta 98 zcmbO!@L6DjO1NK%YeY$LerZv1s%~*cqLHZ?gMp=`d8%cip^1T|MUsiRrEzMqfw7TE zYLa1^K~j=oqGh6mX;P|1YLcl%8c^KWJTc86*}^Q%*v!n(FvZ+_O`7!0jfy|m0pDgG ADF6Tf delta 10 Rcmew?FjHWH%Er2{>;M^)1dIRx diff --git a/brand/projects/modern-di-aiogram/mark-1024.png b/brand/projects/modern-di-aiogram/mark-1024.png index 3d50d591594318d6b2a1dbfd95a85519448037a2..06fe400ffc59a007f38ef0bfad3048997171aa49 100644 GIT binary patch delta 98 zcmX?Zz0hWYO1NK%YeY$LerZv1s%~*cqLHZ?gK469qNPDfTC$NrVv3=miA9oGs)4Cd znpuj0rJ1F1vWcl_nnkL4vVoz6WtydFvZaZEg_(JBVzQA%vRPV+`K+%e&TLd%CJO)t C5FdE} delta 10 RcmZ2zbKH7@%Er3IvH%(S1cLwo diff --git a/brand/projects/modern-di-aiogram/mark-512.png b/brand/projects/modern-di-aiogram/mark-512.png index 15ae7b37857ea1bb38aa1893fa8dc3df8bbfb390..e259367b643eb31f859d9b0a924d208e77c9a104 100644 GIT binary patch delta 98 zcmbO#^Vq&ssnnjYKd0J|Ug^`&> zvWZc$S&C6wN}55Eu~}kjvbjl;aZ*ZZlA(!ZTB1pEa*C0ekwr?HA%|p3^hU)mJOC`8 BA0Yq$ delta 10 RcmaDaHC1YY%Er2nJOCN!1epK; diff --git a/brand/projects/modern-di-aiohttp/lockup.png b/brand/projects/modern-di-aiohttp/lockup.png index e8f88ec3236e328cd031a5e64f62ffbab6c7d546..6eb646712f8e48686ad66a8e7a69571f170b69e7 100644 GIT binary patch delta 98 zcmbOw@I_#PO1NK%YeY$LerZv1s%~*cqLHZ?gQ-DUl2KZUMY55BrD3X(nWd$PshL@t zp?RXQg;|=Jk%fu5X=-9pie*Zgg-Mc$sey$BP`Qb*g@tKyTC!;M_31djj! diff --git a/brand/projects/modern-di-aiohttp/mark-1024.png b/brand/projects/modern-di-aiohttp/mark-1024.png index 272fc5604541cdb4089df6256bf816c3ebfdb52a..5f1d94b867807d291b92c4d99f54e836c9af4db2 100644 GIT binary patch delta 98 zcmbQ`^TlU^O1NK%YeY$LerZv1s%~*cqLHZ?LrSu_g^5|Bk(r5wp}CQ{MOu52=7EH)}y2?78W C79Sn} delta 10 Rcmdn0d|PRP%Emf#K>!%;1OWg5 diff --git a/brand/projects/modern-di-arq/lockup.png b/brand/projects/modern-di-arq/lockup.png index 487c6e27166b456dddc3b96cfa44b27a2c4862d9..7d5774991d41c7ce735ba0a855456e9ea848acef 100644 GIT binary patch delta 98 zcmZqSxyLg>CETyXHKL?AzqBYhRkt`J(a6+{!6Gr$+|tCv)FRQ`)YR0%(!|uCMk%_U9rGb$}qM@;YWs-q~QF5w*xnYXAg{fJpQQuFI!i|b2!~hbb B9#jAT delta 10 RcmX@C_fmI)%Er2*VgMVv1jYaW diff --git a/brand/projects/modern-di-arq/mark-512.png b/brand/projects/modern-di-arq/mark-512.png index c185caa373f7420a5412a7b5aef60371a2bd3226..8b11fb412db928b667e16fe9fdb0b76d010dfe9c 100644 GIT binary patch delta 98 zcmX>hyhvn%O1NK%YeY$LerZv1s%~*cqLHZ?Lz1Ccs!?*Hd6K1>nSq&wkx@#bVTxf& zs!5WiMUt6$vWca!MY3t4sYzn0v1zJdvPq(`xsjofX_`TzacXL+aZH&;_(sL$oB-uU B9f1G< delta 10 RcmZ1^azc25%Er1SoB$Vk1R?+c diff --git a/brand/projects/modern-di-celery/lockup.png b/brand/projects/modern-di-celery/lockup.png index 31da466d72e1119a11f690ac6181ecaa02d930ac..fb59a5935dcdc4e949d710c6ed723abba79e2b05 100644 GIT binary patch delta 98 zcmcb~yP0o-O1NK%YeY$LerZv1s%~*cqLHZ?Lt3&yih-e_VQQ*@sj*>-k$Iv;QkuCz zl7&TbvZ0}cX|jc3N{X?iiG_u6VycCSsihfE*3dl3BH17@&C3!kM#UX$0Oz_L A+W-In delta 10 RcmdnYcawL5%Er2_YycQ*1V#V= diff --git a/brand/projects/modern-di-celery/mark-1024.png b/brand/projects/modern-di-celery/mark-1024.png index d985fa0db933ca50138883927ecd5a7cd1d257a5..e41c9c7e9590ef44e72e74c233e8d8c0b54df064 100644 GIT binary patch delta 98 zcmcbqw^@IJO1NK%YeY$LerZv1s%~*cqLHZ?gMqoZp|OQ=VydM{no*KLlBq>vvXOam zlCh;}Vp5W6ils%WX`;EAiKStpd8%PbvWc;gu|=|Fnz@l>vbmXQns4!Wrj3dg;sE>$ B9eMx& delta 10 Rcmdn2e^YOQ%EmfVaR3>N1Q`GT diff --git a/brand/projects/modern-di-celery/mark-512.png b/brand/projects/modern-di-celery/mark-512.png index 499be13b48e5a87186dce355270fb04a023ca050..815ac34fc2f4768e710c17888013a381956a4939 100644 GIT binary patch delta 98 zcmca8v|4zAO1NK%YeY$LerZv1s%~*cqLHZ?gOPD+s#$7kQkrp+sfmHHg;|P)WlEBT zfvJU&S#q+aiG{g^d6GqfW9S$r}|7I05CU B9e4l$ delta 10 RcmZ22d{JnE%EmffP5>7k1G@kK diff --git a/brand/projects/modern-di-fastapi/lockup.png b/brand/projects/modern-di-fastapi/lockup.png index c9d937e6d5e6844d95a85f20058757863d704666..de0f1d179b38624dd466004a3c3a94a303065bce 100644 GIT binary patch delta 98 zcmZ1>&?GoPCETyXHKL?AzqBYhRkt`J(a6+{!8pYr#nLP##XLF9JlWFF%*fQhAj#O! z!Z0a0&CDb@+0w|uEIG|2&D_)?G1W39Db2vd!qV8#EX6#_G#gWCB*nd+YeQypOl*Jl^N& zxxB2Orbh$k9U3THi%}@K+MrT1K!$WSsfiUH!pbh0dsK;%;NG}WaOqh87=HWjVFNAA BA1eR= delta 10 RcmZ4OcF}c$%Er32N&p*Y1iAnK diff --git a/brand/projects/modern-di-fastapi/mark-512.png b/brand/projects/modern-di-fastapi/mark-512.png index cf2dc618c02809d04ca7a32495509085e9594249..9d0c2bc48f57dc2884de459a064fdfd966a4f9a0 100644 GIT binary patch delta 98 zcmZpYzau|ECETyXHKL?AzqBYhRkt`J(a6+{!64Pb#3Cs7ize9qvAbw00UYc A5C8xG delta 10 Rcmca9@SlHz%Er3e>;M~t1ib(N diff --git a/brand/projects/modern-di-fastmcp/mark-1024.png b/brand/projects/modern-di-fastmcp/mark-1024.png index b0245aee52865d9b56a17d49229c39d833b74346..817b10291c2e6b029a8ff8e0b5851f9109defac7 100644 GIT binary patch delta 98 zcmaE8z1wDjO1NK%YeY$LerZv1s%~*cqLHZ?gF&K!fpLn3g{66FQmTcCp+$;?L9&UF znQ5wNiiJ_Kd17LcX=0LviGjJHp?Qi~s)>a~nyGWN{ilsrS ziIK5+vT=$ delta 10 RcmZn=S|&I_Wn*0v2LKeY1GfMG diff --git a/brand/projects/modern-di-faststream/mark-1024.png b/brand/projects/modern-di-faststream/mark-1024.png index 43c40c6e15a9ff1632c2fa6fd53397226494861b..c602fb6086ba378ddfb0d9657b4237366eeb1efd 100644 GIT binary patch delta 98 zcmccQvc`3SO1NK%YeY$LerZv1s%~*cqLHZ?gPDnmL7J(#d6K2MQDSmhQi_pznt{2I zX`*G4fu)IIl3ALeX>yvOk-1@#p}9d)l6jJek!7kyl98#oiE*-}vEj?vtQ!>#l>q%U B9ZvuN delta 10 RcmZ4EddX#i%Emf9B>)<01Umo# diff --git a/brand/projects/modern-di-faststream/mark-512.png b/brand/projects/modern-di-faststream/mark-512.png index 3138b0d966a65bf57578919c9c7317696bf54995..9121fa0f812ec8aa530f64bb5ddf422fa2bcabc4 100644 GIT binary patch delta 98 zcmbOr`$~3#O1NK%YeY$LerZv1s%~*cqLHZ?gSkO!s!?j1fpMy(K}u?}xoMKInVFG= zp^1S>N}5S(lChCVih;4IskynKv1v-OMXFJXK{AjqOENW2Gd4826q&@hQ8Awn0PK$) AQUCw| delta 10 RcmaDQJ3)4W%Er1JJ^&cD1QGxM diff --git a/brand/projects/modern-di-flask/lockup.png b/brand/projects/modern-di-flask/lockup.png index a960ca43cf70322a0625a2d94d045d4e1fd79607..1b47b36296b39e09d3c727c680c6d3973c7991f3 100644 GIT binary patch delta 98 zcmZqVyUjO2CETyXHKL?AzqBYhRkt`J(a6+{!NNSr#3ISSB-PR=#n{}~Ak8v0CCS{_ z&@9m)DKX91#5~PB)i}{2IoTl5)G#?E#lR#f#mv;w)WXOj)jZY0WY58^n>H#wU;_Z@ Cs~<@K delta 10 Rcmcc3*T^?PWnT5?iK zvPGg%l7(ri5m3s&IMpoG&@|E5GBMH6+%(O|BH7T=*v#A@CCSY2r?=DHjf$Un028+# AF8}}l delta 10 RcmaDSHAQNI%Er16JOCNg1eO2* diff --git a/brand/projects/modern-di-grpc/lockup.png b/brand/projects/modern-di-grpc/lockup.png index a96def66dcb9ba1dc9e8a489ba189e6b29958ea4..0a9d3be1865c28aa801033d41437cfec8b5364d4 100644 GIT binary patch delta 98 zcmZ3@+sZdVCETyXHKL?AzqBYhRkt`J(a6+{!Pwj&F*PyK)H205#mLmi!X(io+0ZmC zIVma0EZN8;F(t_?DcQop(A+pJ)xz8)Eiu_3B{eD8z{JcV)yOQ-{NEdn#EptwYykJi B9}EBh delta 10 RcmZqWTg^K`Wn*1C8vqp31H1qL diff --git a/brand/projects/modern-di-grpc/mark-1024.png b/brand/projects/modern-di-grpc/mark-1024.png index fbe4591296b9fc29d1e12f0f0d31d0eee4178a33..637c14d672cfdf217335294bf45b1b1588cc85ac 100644 GIT binary patch delta 98 zcmaEDc+_ZuO1NK%YeY$LerZv1s%~*cqLHZ?gMnqLnQ@x2MXIr}frVvSqH$uXg_&`x zfw@Vlv5{G7Vv=E^xuu!8g{eWZnW>?HSz?lzAyA3Ap`lrFO0ua@x7*{cjf$rv005yL AaR2}S delta 10 RcmX?V^xANO%Er3m5&#?}1l9lm diff --git a/brand/projects/modern-di-grpc/mark-512.png b/brand/projects/modern-di-grpc/mark-512.png index b99ff4a10b6c52c9ea9a433d364d544020a8c993..4614e43e264c03c8e652084f28c22618f4a87710 100644 GIT binary patch delta 98 zcmcaAvR-t8O1NK%YeY$LerZv1s%~*cqLHZ?gQ;bbfu)6|g@LJsk%@(cNs4)zi9xbO zvZ0A_T5_UclCg<_iD_b5l7)q-X{tqHnq{iFS)xT!N}9Q`aayW{rRZbFhZ_}5xB$#> B9i9LH delta 10 RcmZ24dR1hC%EmfFE&vyg1Iz#b diff --git a/brand/projects/modern-di-litestar/lockup.png b/brand/projects/modern-di-litestar/lockup.png index ff75e0fc659ef3fcc3505d08636678c523856ae4..49e7ccb1efa035be54ba44bad4e52519f8b795d2 100644 GIT binary patch delta 98 zcmZn?xFaw@CETyXHKL?AzqBYhRkt`J(a6+{!7{}lIWZ|UE!Dux#30GQ#Kqf;M7d B9(n)( delta 10 Rcmca3&?GQHWn diff --git a/brand/projects/modern-di-litestar/mark-1024.png b/brand/projects/modern-di-litestar/mark-1024.png index fc889394d683c293e43840b14e4bdf58d17f62a5..d32210f61ee86de60a640c8efd3c65648b215340 100644 GIT binary patch delta 98 zcmdn(G1YT|O1NK%YeY$LerZv1s%~*cqLHZ?gN2!CQev8^k%d{RNn&c6p@m7Rv5AGD znPF AN&o-= delta 10 RcmbR0x!Yrc%Emfz6#y9F1ONa4 diff --git a/brand/projects/modern-di-litestar/mark-512.png b/brand/projects/modern-di-litestar/mark-512.png index e4b84e186ab0b9e3d3ec330b0a633d90bcafde04..810adc9e86c885266bece43f1c277e93a75e90e8 100644 GIT binary patch delta 98 zcmZ3b*rGH+CETyXHKL?AzqBYhRkt`J(a6+{AvML)FxkQ&#mFSZGS$Gq)ZD}@IoUEP zHQ6#HCB@P_%`!F3&@9y=H7U`;BGDqr%p%#uAkjP}Eiut3ImtZ9DC@rs-$unw0RRp0 BA0Ge! delta 10 RcmZosTBSHaWn*2N000&V1M2_) diff --git a/brand/projects/modern-di-pytest/lockup.png b/brand/projects/modern-di-pytest/lockup.png index 37ad331f7b655a08a463c5bb0edc013538a58414..1a2e42955a2dffbfe643cac2f64769fb544e425d 100644 GIT binary patch delta 98 zcmcb@yN+*yO1NK%YeY$LerZv1s%~*cqLHZ?LyDncs)>QQiK)4?YNCO$g@L(2 za*DZeqN#;xnt768l7Xc~im`!Vnu&=~a*Cy8Vp57(vWcOQxru>s3M0z|-HnQy*#Ng6 B90~vc delta 10 RcmZ3-cZGL?%Er14YycPs1UCQx diff --git a/brand/projects/modern-di-pytest/mark-1024.png b/brand/projects/modern-di-pytest/mark-1024.png index 92e436581f6a176eed49857e6b2675b650449c54..9da9ee64ff0fd26c1340f87794e3aa9cf62d6738 100644 GIT binary patch delta 98 zcmeCyd#X1+!pJzJQE>+c0OE!o Ae*gdg delta 10 RcmdlibW?DG%Er2_8~_-t1W*6~ diff --git a/brand/projects/modern-di-starlette/lockup.png b/brand/projects/modern-di-starlette/lockup.png index ace12de5fbd8a05420b3bd280526d928dc5500e4..0c47bdc573f1b93965dc53095c6cad7e2599b952 100644 GIT binary patch delta 98 zcmZ3<-z+deCETyXHKL?AzqBYhRkt`J(a6+{Avwv+JS8>7&@k1|$kfEb#MIEp&@?SI z%^=OdFfAq7*wVt#GRY_@Ing3HHQB(_%*@E#!pzb%+1SD~$=o2(pk>?67aJ8j*a6bX B9!vlL delta 10 RcmZn`Sjj&@Wn*0{I{*~S1G@kK diff --git a/brand/projects/modern-di-starlette/mark-1024.png b/brand/projects/modern-di-starlette/mark-1024.png index e765cda38a75db46a85549536d7a8c1941d6e565..b2e61cc0bd13e5ebb682365df9cb6d68d5ed3047 100644 GIT binary patch delta 98 zcmX?UvDk8gO1NK%YeY$LerZv1s%~*cqLHZ?LrStynqi`up^0fqYO<+Gs)4zYp{0Sb zp_!q%xskb_p`odnaaxk4@s5LACT>*JkO2S% CDIUxK delta 10 RcmZ2%dD3En%EmfX82}jZ1Ofm6 diff --git a/brand/projects/modern-di-starlette/mark-512.png b/brand/projects/modern-di-starlette/mark-512.png index 7ccf4e31f1e21f7d31d46a6ad211e632460b0cc7..e598d05d02117ab8a736129b3856cceaee80f89d 100644 GIT binary patch delta 98 zcmca2xlU?=O1NK%YeY$LerZv1s%~*cqLHZ?L!zmng>jmJkzrbjrI|sRkx8PlX{uS0 zL8^g)fr&w)iJ3*Baf*>iYHC_ivYC;Ig_%K8N}^>_vaz{&s#%(ax!rPEn~jQ_c>v$| B9d7^t delta 10 RcmZ1{bwzT5%Er14JOCKY1XTb4 diff --git a/brand/projects/modern-di-taskiq/lockup.png b/brand/projects/modern-di-taskiq/lockup.png index 83e07df84aa97e900047836df2ee5fb707c598ec..80148525a608dfaff2b3cbe772872e01c5314b27 100644 GIT binary patch delta 98 zcmeyscZz?4O1NK%YeY$LerZv1s%~*cqLHZ?gSm-inu)2Ik)g4fSxT~znSrILsj-=9 zvT>rZrIAshg{487Ns?)bxsi!ciji@OWr~?;nx(0cWpavPqD5MYY08?Fwi^}w*#W(C B9OnQ4 delta 10 RcmX@b|AB9U%Eme$b^sYj1P%ZI diff --git a/brand/projects/modern-di-taskiq/mark-1024.png b/brand/projects/modern-di-taskiq/mark-1024.png index 44011599d704dd4248a8729db0ffc8a8c2493ab7..b220ba38eed376cb1ce1dca7fee6cc7f2630a15c 100644 GIT binary patch delta 98 zcmZp+yK6T=CETyXHKL?AzqBYhRkt`J(a6+{!7|0r$Rfqi#5CC;(cH+?$SBF&FwHd8 zDAm+7(ZImi+%VZREyXAe$Vy8zF)}i+G%`p|O*Kw6NKG{}PBl!q)S&TYqv9hu0OyS! A#Q*>R delta 10 Rcmca>*K9XIWnG`5l%Qh-T@d5xS CV;=ng delta 10 RcmcaA{ab2+%Er2IUH}^E1Wf<{ diff --git a/brand/projects/modern-di-typer/lockup.png b/brand/projects/modern-di-typer/lockup.png index ab8313782bb3adeb01a664d1367eed9af1399d59..3f2f5ae4cbb46509c8299a005975f6ca0904aa4d 100644 GIT binary patch delta 98 zcmZ3*+rl?NCETyXHKL?AzqBYhRkt`J(a6+{!Q3n*)hs0?Ez!)}A|*8`$vD{{#mvOQ z(7@OzIW09QIW^fV)!f)H#mv|uDa|Y?ImOh##3DJ((8A2j#K0^m@pQ{h%Z-YiYyb-U B9|-^e delta 10 RcmZqSTg5v;Wn*0%8vqo)1GxYI diff --git a/brand/projects/modern-di-typer/mark-1024.png b/brand/projects/modern-di-typer/mark-1024.png index e82b6b8f024a17647c74f3fc0eb3c49781f11d76..837a6c9957a03e52cbb71969ce533252979907f6 100644 GIT binary patch delta 98 zcmca=wBC4vO1NK%YeY$LerZv1s%~*cqLHZ?gQ;bTNt&T?qGg(asj;PrQL?3>rJ+%h zv9VD~TC!1MlA&dqVUlH(|*c8x>6?0RiA2 AJOBUy delta 10 RcmZ2)eAQ@z%EmfFNdOss1Q!4R diff --git a/brand/projects/modern-di-typer/mark-512.png b/brand/projects/modern-di-typer/mark-512.png index 7c8acf6a110f83054b39a9b701edd7ceda8be971..e6627acd10fb571eb023a4d83e4a93f74baed30e 100644 GIT binary patch delta 98 zcmX>qGGBCpO1NK%YeY$LerZv1s%~*cqLHZ?gM~@5rJ+HRS&DhGk)efoqNQ1~g=Mmd ziMeUAd0Lv8xuJHvXNz?1q1&(uZ@Z-TmaI( B9KHYm delta 10 RcmbO)dQ@bB%EmfHE&vu!1DpT= diff --git a/brand/projects/modern-di/lockup.png b/brand/projects/modern-di/lockup.png index e54a3c1b00e6bdea43e76d2da20835c09034fbdd..482fba34299c56b351c2292bec5f85c763f31dd8 100644 GIT binary patch delta 98 zcmZ3(-NrLPCETyXHKL?AzqBYhRkt`J(a6+{!N@2zCDAm^)F8<`*#ZbGjVvuKQWFym z3{ull%#G8M%ncILQjHDF42%=gER9nPl1x&JEYeJp%o7dGj8YA3^^SRLRP1I20N4f{ AeEvU#$F zQBtaLlA%GOvAMZrszFMUp_ze6swq%|S#p|1T557qN~%ekWwN2s7mWayjf!6K075e! A{Qv*} delta 10 RcmX?V|JrVX%Emf(c>o*y1a|-c diff --git a/brand/projects/modern-di/mark-512.png b/brand/projects/modern-di/mark-512.png index 2137d835762db891934d69fbf4990e055f9b0210..cf0e0de7a30c5166695676478356e45ee5d45bff 100644 GIT binary patch delta 98 zcmdlXJxOMQO1NK%YeY$LerZv1s%~*cqLHZ?gNcPnvPGg%s*ypmrE#LUg+-b%5T_*@ zo0waenx&a0nj5E@8zmYUrW&Q085$U-C7BqcSz06;SsJFKC8wD$$uwWJQE@si0MO7K A$p8QV delta 10 RcmbOvvqO4<%Er1WyZ{!y1O@;A diff --git a/brand/projects/modern-di/social-card.png b/brand/projects/modern-di/social-card.png index 0e3585af64975aa05bc8e71146f46b81736cb5aa..20aca1fa7db83e712c10d933feeda620f9548ab9 100644 GIT binary patch delta 98 zcmew#doyl=O1NK%YeY$LerZv1s%~*cqLHZ?Lz-!-g^5v;MY5rZp;@Alu~Bl8aZ-|r zaf*qFWpY|_N}8o{a$>TDg_)tDg`uTUqJgPFifNLWrAdluqNS;UsbqF~#74z?dH_aY B9(Mo$ delta 10 RcmcZ^_dj-m%Er3edH^7c1%Lnm diff --git a/brand/projects/release-scope/lockup.png b/brand/projects/release-scope/lockup.png index 3c2bc5ee91567b0a60984dd431144a55f9f31577..48491e90df9cd5ddb285dff0cf35edb7abdbaaaf 100644 GIT binary patch delta 98 zcmaFNyO(c*O1NK%YeY$LerZv1s%~*cqLHZ?gPEm~p^<@^kx7z4Qc|LYp{a$1nQ@}A zX|j=#rJ;dA8c-t1!pPJ-#W2;tG9@L^z^(IUm%$TBg-!ZJ0vCL)_*qv9bp0J~Zo A^8f$< delta 10 RcmdnX_n3Er%Er3=YycTE1Y`gJ diff --git a/brand/projects/release-scope/mark-1024.png b/brand/projects/release-scope/mark-1024.png index c3f3e5723038c520d149ade8098f3f50f19c7344..dec0597ff2e330eb7c840f546bd9e8bd13172a4d 100644 GIT binary patch delta 98 zcmdmHH^F{_O1NK%YeY$LerZv1s%~*cqLHZ?gMpD{N@_~7L0YOsqNzceQL1@jVxqZ` zSyFOpYLZ2wMOuovK1K0on diff --git a/brand/projects/release-scope/mark-512.png b/brand/projects/release-scope/mark-512.png index 65558f99fdc20271fa83e7857a42a552d53b867e..2767cae800a9d5018bbd7e833aac067328fc2152 100644 GIT binary patch delta 98 zcmdlY)h9hcCETyXHKL?AzqBYhRkt`J(a6+{A;ly))x;n*DakM;*(k}t#5mD7F)hW! z)WX0t(Ztd?*)q+*(8Mg!*vKR~IVmkMB`ql_$;i^!+{`l3*uv1wTgR!O1NK%YeY$LerZv1s%~*cqLHZ?gJF_!l2Kw(ig{A9sby-SMWSV*xnW9@ zxtW=zxk0jpMPgE_iKT^kvZbkMilt?ufvK5Enz2D*s;NbirD>8u>I%OzQnI;aYND~3 zX_`fu}M-|nvtcUL9%69Vw#ajQevV(a$1ss`SMx6^)@Qji2?u+ Cr5{NE delta 10 RcmeyVJzsl*%Er2CQ2-jr1Y!UH diff --git a/brand/projects/semvertag/mark-512.png b/brand/projects/semvertag/mark-512.png index d34d566cd3e76cf3d75f0670dbdd4875f9df2fba..0cc0362db7498c4c78009e050255238d34098406 100644 GIT binary patch delta 98 zcmewAla+*a-nqiuGvbmX&rMZDcGXHGr{Tme{H~{R2 B9VY+) delta 10 RcmcaC_)}nl%Er1-4geY*1TFvo diff --git a/brand/projects/semvertag/social-card.png b/brand/projects/semvertag/social-card.png index 75be50bf6f915996b6238139f6a97cb754637538..55088827915e09e17ae688a8737952f4da258241 100644 GIT binary patch delta 98 zcmaDDy*p-tO1NK%YeY$LerZv1s%~*cqLHZ?LyB=?QgV{HrI~TEacZiGk%4K7d7^=Z zX_8@zscBkLYMNQ1xrJexQEFmxiivSjs)d1NqPc0ZS+a?RMT)VB;o9f#cWhKVpbG$D Cm>~xM delta 10 RcmdlT^DugX%Er3Ax&R&$1t9A%Er1VIRG731gii5 diff --git a/brand/projects/sqlalchemy-inbox/mark-512.png b/brand/projects/sqlalchemy-inbox/mark-512.png index 14269d736313b8d0614922b69fcf1a4ef5e66df5..b9b59a58cca81b358d6720f1822ac9852c39a394 100644 GIT binary patch delta 98 zcmbOz^;&9zO1NK%YeY$LerZv1s%~*cqLHZ?Lz+QaT8f#Gagv3(X_|>iqCrZUp}9$N ziiwe#Ns395rLkFRa$<6-k%dK?iMd6hfssXGN|L#ONt%(RL87slskV;(W-1(ljm2)W|$BH8Ih`D8<~^(7@O*InBs4%{(zJ$-*$nynpN8n;R9oWB}!0 BA0_|* delta 10 RcmZp*T5UN&Wn*2t3;-9Y1S$Xk diff --git a/brand/projects/that-depends/mark-512.png b/brand/projects/that-depends/mark-512.png index 6897aa6e7047f7e32b99147e4062ffb36f14bad1..dc96e8166bc70ed7c9864e87154a9e9241838edc 100644 GIT binary patch delta 98 zcmZ1@*(NnXCETyXHKL?AzqBYhRkt`J(a6+{!N4-f$kM>v!YIkaA}!I_(!{_b&D=66 z#Ud@u#N5)%+&J09z%0ewG}YY9+}zOI*whdxk!WddVv%H$nq+Ez^L)aajf&ko0I={K A)Bpeg delta 10 RcmZpZS|d3@Wn*0j4*(Ud1Kj`s diff --git a/brand/projects/that-depends/social-card.png b/brand/projects/that-depends/social-card.png index 7abb0614e05ac5e950213e5c315fd1f37021938d..47b6fb6ec649e0ca1a64d724d3b6fa9bb7f0b4a2 100644 GIT binary patch delta 98 zcmZ1-+Zs1PCETyXHKL?AzqBYhRkt`J(a6+{!Q8~a+|)cd*}y2tAkiev&@jn7(agdk z*)Z8SInmrS#mKWMZCTm};1mYHpBR-qdfrQL#%80P@Hk A^8f$< delta 10 RcmZpTTOB(=Wn*2t9sn8p1cU$p diff --git a/docs/assets/social-card-green.png b/docs/assets/social-card-green.png index 0d23f9367fe7b19653e6e04995bdbcd60782b941..2679913af57ad0e25b37728ce17e0a6fa5f516e3 100644 GIT binary patch literal 6948 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 delta 6048 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 H+`az;lozX)