diff --git a/planning/changes/2026-07-02.03-profile-badge-columns/change.md b/planning/changes/2026-07-02.03-profile-badge-columns/change.md new file mode 100644 index 0000000..79bdc93 --- /dev/null +++ b/planning/changes/2026-07-02.03-profile-badge-columns/change.md @@ -0,0 +1,51 @@ +--- +summary: Give the profile README tables a dedicated Stars column and drop the PyPI-version and Context7 badges, keeping Downloads. +--- + +# Change: profile README — Stars column, drop version + Context7 badges + +## What & why + +All four tables in `profile/README.md` currently use three columns — +`| Project | What it is | Badges |` — where the Badges cell packs several +shields together (Stars, PyPI version, Downloads, Context7; templates instead +carry Stars, Context7, and a Template chip). Pull **Stars** into its own column +and **remove the PyPI-version and Context7 badges**. The DI/services/utilities +tables become `| Project | What it is | Stars | Downloads |` (the fourth column, +now holding only the Downloads badge, is renamed from "Badges" to "Downloads"). +The templates table becomes `| Project | What it is | Stars | Badges |`, its +Badges cell holding just the **Template chip** (templates have no Downloads +badge, so its fourth column keeps the "Badges" label). Requested to make the +star counts scannable in their own column and to declutter the badge cell. + +## Scope + +- One file: `profile/README.md`. +- Four tables: **Project templates**, **Dependency injection**, + **Microservices, HTTP & messaging**, **Utilities**. +- All four tables: add a `Stars` third column (divider `|---|---|---|---|`) and + move each row's `[![Stars]…]` badge into it; delete each row's `[![Context7]…]` + badge. +- DI / services / utilities tables: header becomes + `| Project | What it is | Stars | Downloads |`; also delete each row's + `[![PyPI]…]` version badge, leaving the fourth cell holding only Downloads. +- Templates table: header becomes `| Project | What it is | Stars | Badges |`; + its fourth cell holds only the Template chip (no PyPI badge existed). +- Leave every other badge, link, blurb, and row order untouched. + +## Verification + +- `just check-planning` prints `planning: OK`. +- `grep -c 'pypi/v/' profile/README.md` returns `0` (no version badges remain). +- `grep -ci context7 profile/README.md` returns `0` (no Context7 badges remain). +- Header lines: three read `| Project | What it is | Stars | Downloads |` + (DI/services/utilities) and one reads `| Project | What it is | Stars | Badges |` + (templates). All four dividers are `|---|---|---|---|`. +- Spot-check the rendered table columns are aligned and Downloads is still + present in the Badges cell of the DI/services/utilities tables. +- No unrelated lines changed (`git diff` touches only `profile/README.md`). + +## Notes + +Pure Markdown/table formatting; no code, no tests, no brand assets. Independent +of the aiohttp brand change (2026-07-02.02) — ships as its own PR. diff --git a/profile/README.md b/profile/README.md index ff9d5e4..5f768d2 100644 --- a/profile/README.md +++ b/profile/README.md @@ -14,38 +14,38 @@ Open-source templates and libraries for building production-ready Python applica ### Project templates -| Project | What it is | Badges | -|---|---|---| -| [`fastapi-sqlalchemy-template`](https://github.com/modern-python/fastapi-sqlalchemy-template) | Dockerized web application with DI on FastAPI, SQLAlchemy 2, PostgreSQL | [![Stars](https://img.shields.io/github/stars/modern-python/fastapi-sqlalchemy-template)](https://github.com/modern-python/fastapi-sqlalchemy-template/stargazers) [![Context7](https://img.shields.io/badge/Context7-docs-blue)](https://context7.com/modern-python/fastapi-sqlalchemy-template) ![Template](https://img.shields.io/badge/type-template-blue) | -| [`litestar-sqlalchemy-template`](https://github.com/modern-python/litestar-sqlalchemy-template) | Dockerized web application on Litestar, SQLAlchemy 2, PostgreSQL | [![Stars](https://img.shields.io/github/stars/modern-python/litestar-sqlalchemy-template)](https://github.com/modern-python/litestar-sqlalchemy-template/stargazers) [![Context7](https://img.shields.io/badge/Context7-docs-blue)](https://context7.com/modern-python/litestar-sqlalchemy-template) ![Template](https://img.shields.io/badge/type-template-blue) | +| Project | What it is | Stars | Badges | +|---|---|---|---| +| [`fastapi-sqlalchemy-template`](https://github.com/modern-python/fastapi-sqlalchemy-template) | Dockerized web application with DI on FastAPI, SQLAlchemy 2, PostgreSQL | [![Stars](https://img.shields.io/github/stars/modern-python/fastapi-sqlalchemy-template)](https://github.com/modern-python/fastapi-sqlalchemy-template/stargazers) | ![Template](https://img.shields.io/badge/type-template-blue) | +| [`litestar-sqlalchemy-template`](https://github.com/modern-python/litestar-sqlalchemy-template) | Dockerized web application on Litestar, SQLAlchemy 2, PostgreSQL | [![Stars](https://img.shields.io/github/stars/modern-python/litestar-sqlalchemy-template)](https://github.com/modern-python/litestar-sqlalchemy-template/stargazers) | ![Template](https://img.shields.io/badge/type-template-blue) | ### Dependency injection -| Project | What it is | Badges | -|---|---|---| -| [`modern-di`](https://github.com/modern-python/modern-di) | Powerful DI framework with scopes | [![Stars](https://img.shields.io/github/stars/modern-python/modern-di)](https://github.com/modern-python/modern-di/stargazers) [![PyPI](https://img.shields.io/pypi/v/modern-di)](https://pypi.org/project/modern-di/) [![Downloads](https://static.pepy.tech/badge/modern-di/month)](https://pepy.tech/projects/modern-di) [![Context7](https://img.shields.io/badge/Context7-docs-blue)](https://context7.com/modern-python/modern-di) | -| [`modern-di-fastapi`](https://github.com/modern-python/modern-di-fastapi) | modern-di integration for FastAPI | [![Stars](https://img.shields.io/github/stars/modern-python/modern-di-fastapi)](https://github.com/modern-python/modern-di-fastapi/stargazers) [![PyPI](https://img.shields.io/pypi/v/modern-di-fastapi)](https://pypi.org/project/modern-di-fastapi/) [![Downloads](https://static.pepy.tech/badge/modern-di-fastapi/month)](https://pepy.tech/projects/modern-di-fastapi) [![Context7](https://img.shields.io/badge/Context7-docs-blue)](https://context7.com/modern-python/modern-di-fastapi) | -| [`modern-di-litestar`](https://github.com/modern-python/modern-di-litestar) | modern-di integration for Litestar | [![Stars](https://img.shields.io/github/stars/modern-python/modern-di-litestar)](https://github.com/modern-python/modern-di-litestar/stargazers) [![PyPI](https://img.shields.io/pypi/v/modern-di-litestar)](https://pypi.org/project/modern-di-litestar/) [![Downloads](https://static.pepy.tech/badge/modern-di-litestar/month)](https://pepy.tech/projects/modern-di-litestar) [![Context7](https://img.shields.io/badge/Context7-docs-blue)](https://context7.com/modern-python/modern-di-litestar) | -| [`modern-di-starlette`](https://github.com/modern-python/modern-di-starlette) | modern-di integration for Starlette | [![Stars](https://img.shields.io/github/stars/modern-python/modern-di-starlette)](https://github.com/modern-python/modern-di-starlette/stargazers) [![PyPI](https://img.shields.io/pypi/v/modern-di-starlette)](https://pypi.org/project/modern-di-starlette/) [![Downloads](https://static.pepy.tech/badge/modern-di-starlette/month)](https://pepy.tech/projects/modern-di-starlette) [![Context7](https://img.shields.io/badge/Context7-docs-blue)](https://context7.com/modern-python/modern-di-starlette) | -| [`modern-di-faststream`](https://github.com/modern-python/modern-di-faststream) | modern-di integration for FastStream | [![Stars](https://img.shields.io/github/stars/modern-python/modern-di-faststream)](https://github.com/modern-python/modern-di-faststream/stargazers) [![PyPI](https://img.shields.io/pypi/v/modern-di-faststream)](https://pypi.org/project/modern-di-faststream/) [![Downloads](https://static.pepy.tech/badge/modern-di-faststream/month)](https://pepy.tech/projects/modern-di-faststream) [![Context7](https://img.shields.io/badge/Context7-docs-blue)](https://context7.com/modern-python/modern-di-faststream) | -| [`modern-di-typer`](https://github.com/modern-python/modern-di-typer) | modern-di integration for Typer | [![Stars](https://img.shields.io/github/stars/modern-python/modern-di-typer)](https://github.com/modern-python/modern-di-typer/stargazers) [![PyPI](https://img.shields.io/pypi/v/modern-di-typer)](https://pypi.org/project/modern-di-typer/) [![Downloads](https://static.pepy.tech/badge/modern-di-typer/month)](https://pepy.tech/projects/modern-di-typer) [![Context7](https://img.shields.io/badge/Context7-docs-blue)](https://context7.com/modern-python/modern-di-typer) | -| [`modern-di-pytest`](https://github.com/modern-python/modern-di-pytest) | modern-di integration for pytest | [![Stars](https://img.shields.io/github/stars/modern-python/modern-di-pytest)](https://github.com/modern-python/modern-di-pytest/stargazers) [![PyPI](https://img.shields.io/pypi/v/modern-di-pytest)](https://pypi.org/project/modern-di-pytest/) [![Downloads](https://static.pepy.tech/badge/modern-di-pytest/month)](https://pepy.tech/projects/modern-di-pytest) [![Context7](https://img.shields.io/badge/Context7-docs-blue)](https://context7.com/modern-python/modern-di-pytest) | -| [`that-depends`](https://github.com/modern-python/that-depends) | Predecessor DI framework, still actively maintained | [![Stars](https://img.shields.io/github/stars/modern-python/that-depends)](https://github.com/modern-python/that-depends/stargazers) [![PyPI](https://img.shields.io/pypi/v/that-depends)](https://pypi.org/project/that-depends/) [![Downloads](https://static.pepy.tech/badge/that-depends/month)](https://pepy.tech/projects/that-depends) [![Context7](https://img.shields.io/badge/Context7-docs-blue)](https://context7.com/modern-python/that-depends) | +| Project | What it is | Stars | Downloads | +|---|---|---|---| +| [`modern-di`](https://github.com/modern-python/modern-di) | Powerful DI framework with scopes | [![Stars](https://img.shields.io/github/stars/modern-python/modern-di)](https://github.com/modern-python/modern-di/stargazers) | [![Downloads](https://static.pepy.tech/badge/modern-di/month)](https://pepy.tech/projects/modern-di) | +| [`modern-di-fastapi`](https://github.com/modern-python/modern-di-fastapi) | modern-di integration for FastAPI | [![Stars](https://img.shields.io/github/stars/modern-python/modern-di-fastapi)](https://github.com/modern-python/modern-di-fastapi/stargazers) | [![Downloads](https://static.pepy.tech/badge/modern-di-fastapi/month)](https://pepy.tech/projects/modern-di-fastapi) | +| [`modern-di-litestar`](https://github.com/modern-python/modern-di-litestar) | modern-di integration for Litestar | [![Stars](https://img.shields.io/github/stars/modern-python/modern-di-litestar)](https://github.com/modern-python/modern-di-litestar/stargazers) | [![Downloads](https://static.pepy.tech/badge/modern-di-litestar/month)](https://pepy.tech/projects/modern-di-litestar) | +| [`modern-di-starlette`](https://github.com/modern-python/modern-di-starlette) | modern-di integration for Starlette | [![Stars](https://img.shields.io/github/stars/modern-python/modern-di-starlette)](https://github.com/modern-python/modern-di-starlette/stargazers) | [![Downloads](https://static.pepy.tech/badge/modern-di-starlette/month)](https://pepy.tech/projects/modern-di-starlette) | +| [`modern-di-faststream`](https://github.com/modern-python/modern-di-faststream) | modern-di integration for FastStream | [![Stars](https://img.shields.io/github/stars/modern-python/modern-di-faststream)](https://github.com/modern-python/modern-di-faststream/stargazers) | [![Downloads](https://static.pepy.tech/badge/modern-di-faststream/month)](https://pepy.tech/projects/modern-di-faststream) | +| [`modern-di-typer`](https://github.com/modern-python/modern-di-typer) | modern-di integration for Typer | [![Stars](https://img.shields.io/github/stars/modern-python/modern-di-typer)](https://github.com/modern-python/modern-di-typer/stargazers) | [![Downloads](https://static.pepy.tech/badge/modern-di-typer/month)](https://pepy.tech/projects/modern-di-typer) | +| [`modern-di-pytest`](https://github.com/modern-python/modern-di-pytest) | modern-di integration for pytest | [![Stars](https://img.shields.io/github/stars/modern-python/modern-di-pytest)](https://github.com/modern-python/modern-di-pytest/stargazers) | [![Downloads](https://static.pepy.tech/badge/modern-di-pytest/month)](https://pepy.tech/projects/modern-di-pytest) | +| [`that-depends`](https://github.com/modern-python/that-depends) | Predecessor DI framework, still actively maintained | [![Stars](https://img.shields.io/github/stars/modern-python/that-depends)](https://github.com/modern-python/that-depends/stargazers) | [![Downloads](https://static.pepy.tech/badge/that-depends/month)](https://pepy.tech/projects/that-depends) | ### Microservices, HTTP & messaging -| Project | What it is | Badges | -|---|---|---| -| [`lite-bootstrap`](https://github.com/modern-python/lite-bootstrap) | Lightweight package for bootstrapping new microservices | [![Stars](https://img.shields.io/github/stars/modern-python/lite-bootstrap)](https://github.com/modern-python/lite-bootstrap/stargazers) [![PyPI](https://img.shields.io/pypi/v/lite-bootstrap)](https://pypi.org/project/lite-bootstrap/) [![Downloads](https://static.pepy.tech/badge/lite-bootstrap/month)](https://pepy.tech/projects/lite-bootstrap) [![Context7](https://img.shields.io/badge/Context7-docs-blue)](https://context7.com/modern-python/lite-bootstrap) | -| [`httpware`](https://github.com/modern-python/httpware) | HTTP client framework with sync/async clients, middleware chain, and built-in resilience (retry, bulkhead) | [![Stars](https://img.shields.io/github/stars/modern-python/httpware)](https://github.com/modern-python/httpware/stargazers) [![PyPI](https://img.shields.io/pypi/v/httpware)](https://pypi.org/project/httpware/) [![Downloads](https://static.pepy.tech/badge/httpware/month)](https://pepy.tech/projects/httpware) [![Context7](https://img.shields.io/badge/Context7-docs-blue)](https://context7.com/modern-python/httpware) | -| [`faststream-redis-timers`](https://github.com/modern-python/faststream-redis-timers) | FastStream broker integration for Redis-backed distributed timer scheduling | [![Stars](https://img.shields.io/github/stars/modern-python/faststream-redis-timers)](https://github.com/modern-python/faststream-redis-timers/stargazers) [![PyPI](https://img.shields.io/pypi/v/faststream-redis-timers)](https://pypi.org/project/faststream-redis-timers/) [![Downloads](https://static.pepy.tech/badge/faststream-redis-timers/month)](https://pepy.tech/projects/faststream-redis-timers) [![Context7](https://img.shields.io/badge/Context7-docs-blue)](https://context7.com/modern-python/faststream-redis-timers) | -| [`faststream-concurrent-aiokafka`](https://github.com/modern-python/faststream-concurrent-aiokafka) | Concurrent message processing middleware for FastStream with aiokafka | [![Stars](https://img.shields.io/github/stars/modern-python/faststream-concurrent-aiokafka)](https://github.com/modern-python/faststream-concurrent-aiokafka/stargazers) [![PyPI](https://img.shields.io/pypi/v/faststream-concurrent-aiokafka)](https://pypi.org/project/faststream-concurrent-aiokafka/) [![Downloads](https://static.pepy.tech/badge/faststream-concurrent-aiokafka/month)](https://pepy.tech/projects/faststream-concurrent-aiokafka) [![Context7](https://img.shields.io/badge/Context7-docs-blue)](https://context7.com/modern-python/faststream-concurrent-aiokafka) | -| [`faststream-outbox`](https://github.com/modern-python/faststream-outbox) | FastStream broker integration for the transactional outbox pattern with Postgres | [![Stars](https://img.shields.io/github/stars/modern-python/faststream-outbox)](https://github.com/modern-python/faststream-outbox/stargazers) [![PyPI](https://img.shields.io/pypi/v/faststream-outbox)](https://pypi.org/project/faststream-outbox/) [![Downloads](https://static.pepy.tech/badge/faststream-outbox/month)](https://pepy.tech/projects/faststream-outbox) [![Context7](https://img.shields.io/badge/Context7-docs-blue)](https://context7.com/modern-python/faststream-outbox) | +| Project | What it is | Stars | Downloads | +|---|---|---|---| +| [`lite-bootstrap`](https://github.com/modern-python/lite-bootstrap) | Lightweight package for bootstrapping new microservices | [![Stars](https://img.shields.io/github/stars/modern-python/lite-bootstrap)](https://github.com/modern-python/lite-bootstrap/stargazers) | [![Downloads](https://static.pepy.tech/badge/lite-bootstrap/month)](https://pepy.tech/projects/lite-bootstrap) | +| [`httpware`](https://github.com/modern-python/httpware) | HTTP client framework with sync/async clients, middleware chain, and built-in resilience (retry, bulkhead) | [![Stars](https://img.shields.io/github/stars/modern-python/httpware)](https://github.com/modern-python/httpware/stargazers) | [![Downloads](https://static.pepy.tech/badge/httpware/month)](https://pepy.tech/projects/httpware) | +| [`faststream-redis-timers`](https://github.com/modern-python/faststream-redis-timers) | FastStream broker integration for Redis-backed distributed timer scheduling | [![Stars](https://img.shields.io/github/stars/modern-python/faststream-redis-timers)](https://github.com/modern-python/faststream-redis-timers/stargazers) | [![Downloads](https://static.pepy.tech/badge/faststream-redis-timers/month)](https://pepy.tech/projects/faststream-redis-timers) | +| [`faststream-concurrent-aiokafka`](https://github.com/modern-python/faststream-concurrent-aiokafka) | Concurrent message processing middleware for FastStream with aiokafka | [![Stars](https://img.shields.io/github/stars/modern-python/faststream-concurrent-aiokafka)](https://github.com/modern-python/faststream-concurrent-aiokafka/stargazers) | [![Downloads](https://static.pepy.tech/badge/faststream-concurrent-aiokafka/month)](https://pepy.tech/projects/faststream-concurrent-aiokafka) | +| [`faststream-outbox`](https://github.com/modern-python/faststream-outbox) | FastStream broker integration for the transactional outbox pattern with Postgres | [![Stars](https://img.shields.io/github/stars/modern-python/faststream-outbox)](https://github.com/modern-python/faststream-outbox/stargazers) | [![Downloads](https://static.pepy.tech/badge/faststream-outbox/month)](https://pepy.tech/projects/faststream-outbox) | ### Utilities -| Project | What it is | Badges | -|---|---|---| -| [`db-retry`](https://github.com/modern-python/db-retry) | Retry helpers for PostgreSQL / SQLAlchemy database operations | [![Stars](https://img.shields.io/github/stars/modern-python/db-retry)](https://github.com/modern-python/db-retry/stargazers) [![PyPI](https://img.shields.io/pypi/v/db-retry)](https://pypi.org/project/db-retry/) [![Downloads](https://static.pepy.tech/badge/db-retry/month)](https://pepy.tech/projects/db-retry) [![Context7](https://img.shields.io/badge/Context7-docs-blue)](https://context7.com/modern-python/db-retry) | -| [`eof-fixer`](https://github.com/modern-python/eof-fixer) | Automatically fix newlines at the end of files | [![Stars](https://img.shields.io/github/stars/modern-python/eof-fixer)](https://github.com/modern-python/eof-fixer/stargazers) [![PyPI](https://img.shields.io/pypi/v/eof-fixer)](https://pypi.org/project/eof-fixer/) [![Downloads](https://static.pepy.tech/badge/eof-fixer/month)](https://pepy.tech/projects/eof-fixer) [![Context7](https://img.shields.io/badge/Context7-docs-blue)](https://context7.com/modern-python/eof-fixer) | -| [`semvertag`](https://github.com/modern-python/semvertag) | Auto-tag your GitHub/GitLab repo with semantic version tags from CI | [![Stars](https://img.shields.io/github/stars/modern-python/semvertag)](https://github.com/modern-python/semvertag/stargazers) [![PyPI](https://img.shields.io/pypi/v/semvertag)](https://pypi.org/project/semvertag/) [![Downloads](https://static.pepy.tech/badge/semvertag/month)](https://pepy.tech/projects/semvertag) [![Context7](https://img.shields.io/badge/Context7-docs-blue)](https://context7.com/modern-python/semvertag) | +| Project | What it is | Stars | Downloads | +|---|---|---|---| +| [`db-retry`](https://github.com/modern-python/db-retry) | Retry helpers for PostgreSQL / SQLAlchemy database operations | [![Stars](https://img.shields.io/github/stars/modern-python/db-retry)](https://github.com/modern-python/db-retry/stargazers) | [![Downloads](https://static.pepy.tech/badge/db-retry/month)](https://pepy.tech/projects/db-retry) | +| [`eof-fixer`](https://github.com/modern-python/eof-fixer) | Automatically fix newlines at the end of files | [![Stars](https://img.shields.io/github/stars/modern-python/eof-fixer)](https://github.com/modern-python/eof-fixer/stargazers) | [![Downloads](https://static.pepy.tech/badge/eof-fixer/month)](https://pepy.tech/projects/eof-fixer) | +| [`semvertag`](https://github.com/modern-python/semvertag) | Auto-tag your GitHub/GitLab repo with semantic version tags from CI | [![Stars](https://img.shields.io/github/stars/modern-python/semvertag)](https://github.com/modern-python/semvertag/stargazers) | [![Downloads](https://static.pepy.tech/badge/semvertag/month)](https://pepy.tech/projects/semvertag) |