diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 554dbd1..c54d5d3 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -21,7 +21,7 @@ build backend, and a `justfile` with fixed recipe names as the only task entry p
```bash
# Clone your fork, then from the repo root:
uv sync # install dependencies into a local venv
-just --list # see available tasks (lint, test, etc.) where a justfile exists
+just --list # see available tasks (lint, test, etc.)
```
## Pull request workflow
@@ -30,10 +30,11 @@ just --list # see available tasks (lint, test, etc.) where a justfil
2. Make your change. Keep it focused — one logical change per PR.
3. Run lint, type check, and tests locally before pushing:
```bash
- uv run ruff check . && uv run ruff format --check .
- uv run ty check # type check, where ty is configured (some repos also run mypy/pyrefly)
- # run the project's test command (often `just test` or `uv run pytest`)
+ just lint-ci # read-only lint, format, and type checks
+ just test
```
+ `just lint` runs the same checks and applies fixes. The templates and `chat-app` have
+ only `just lint`. `that-depends` also runs mypy and pyrefly in both recipes.
4. Update docs if you changed behavior or public API.
5. Open the PR using the template. Link the issue it resolves.
diff --git a/brand/README.md b/brand/README.md
index 663809f..0bd22df 100644
--- a/brand/README.md
+++ b/brand/README.md
@@ -22,8 +22,9 @@ Without it the SVGs are still written and PNGs are skipped.
## Mark
-Two interlocked "snakes" (corner brackets with square heads) as a pinwheel. The
-**icon** wraps them around a gold core dot (favicon + avatar). The **wordmark
+Two "snakes" (corner brackets with square heads and diagonal-cut tails), one
+ink and one gold, in opposite corners. The **icon** frames a gold chevron
+between them (favicon, avatar, and the site header logo). The **wordmark
lockup** pulls them into crop marks framing `MODERN` / `PYTHON` set in **Jost**
(SIL OFL, outlined to paths at build time — see `brand/build/fonts/Jost-OFL.txt`).
@@ -70,7 +71,3 @@ FASTOCTREE) — indexed-colour, with no visible change (the art is flat-colour).
The large assets (social cards, 1024px marks) shrink ~70–80% vs raw
`rsvg-convert` output; the tiny favicons less. Regenerate with
`uv run python -m brand.build.render`.
-
-## Deferred (not in this kit)
-
-The header nav logo redesign is a follow-up.
diff --git a/brand/STORY.md b/brand/STORY.md
deleted file mode 100644
index 52d3abe..0000000
--- a/brand/STORY.md
+++ /dev/null
@@ -1,98 +0,0 @@
-# Backstage: how the modern-python mark got made
-
-A short story of the design session that produced the org favicon + social card —
-the ideas, the dead-ends, and the pivots. (The little marks below are SVGs in
-[`story-assets/`](story-assets); the finished assets live in [`org/`](org).)
-
----
-
-## The starting point was an old favorite
-
-We began with the original `MODERN / PYTHON` wordmark — corner brackets framing
-thin caps. You liked it, but it had three problems: **no Python in it**, **too
-welded to the text**, and **meaningless without the words**. So: start from the
-beginning.
-
-## Act 1 — finding the symbol
-
-Four core directions went up in the browser companion:
-
-
-
-
-
-
-
-
-*Syntax brackets `[ ]` · interlocked brackets · woven "snakes" · REPL prompt `>_`.*
-
-You took **brackets** and **interlock**, then asked to go broader — with a note
-that became the whole identity: *make them snake-like, square, no rounded
-corners.* Dozens of square-snake sketches later, the winner was a **pinwheel with
-square "block-head" snakes** (and its siblings):
-
-
-
-
-
-
-## Act 2 — the family that never shipped (yet)
-
-To make the ecosystem feel related, we studied how real icon families nest —
-Adobe CC, JetBrains, AWS, Material — and chose a scheme where the frame stays
-constant and an **inner glyph** marks each sub-family. I drew ~50 candidate
-glyphs (node graphs, walrus `:=`, prompts, gears…). Then you made the smart call
-to **narrow scope**: ship just the org favicon + social card now, defer the
-per-project system. That saved us from painting the whole org before the org
-mark was final.
-
-## Act 3 — the wordmark fights back
-
-The big lockup felt "not harmonic." First attempt: the brackets drifted off the
-text (I was guessing letter widths). The fix was pinning the text to an exact
-width so the corners always frame it. Then we chased the original's feel —
-thinner letters, thinner crop-marks, breathing room — and on type asked *which
-font says "modern"?* Geometric sans, the Bauhaus answer. Fifty options (Futura,
-Avenir, Montserrat…), narrowed to **commercial-safe SIL OFL** faces, landing on
-**Jost**, two-line caps, green `MODERN` / gold `PYTHON`:
-
-
-
-## Act 4 — the icon gets teeth
-
-For the standalone mark you first chose a **core dot**, then questioned what a dot
-*means* (fair — nothing). The breakthrough: **push the snakes to the borders,
-give them triangular tails, and try a chevron `>` inside.** We compared dot vs
-chevron at true favicon sizes — chevron won:
-
-
-
-
- →
-
-
-
-It reads like a terminal prompt woven into a snake frame — Python *and* tooling
-in one tile.
-
-## Act 5 — the details that matter at 1024px
-
-You caught what only shows up at full size: Telegram crops avatars to a **circle**
-(so a full-bleed mark gets clipped → we added a padded variant), a **1px
-tail/body seam**, and asked for the **tails on the social cards** too. The seam
-fix overlapped the tail into the stroke — which you then caught *stepped the
-inner edge*. The real fix: a 4-point tail that overlaps for the seam but starts
-the inner diagonal exactly at the body's corner, so the line runs straight.
-
-
-
-
-
-
-*Full-bleed for GitHub · padded for circular crops.*
-
----
-
-From "where's the Python?" to a chevron-in-a-snake-frame that ships as a favicon,
-a circle-safe avatar, and a wordmark social card. The brackets we started with
-are still in there — they just grew tails and learned to hold a prompt.
diff --git a/brand/build/projects.py b/brand/build/projects.py
index f11fdab..506a570 100644
--- a/brand/build/projects.py
+++ b/brand/build/projects.py
@@ -31,9 +31,10 @@
"modern-di-starlette": lambda: sym.sparkle_cluster(_CX, _CY, R),
"modern-di-taskiq": lambda: sym.task_q(_CX, _CY, R),
"modern-di-typer": lambda: sym.terminal(_CX, _CY, R),
- # templates — reuse the org chevron
+ # templates and the reference app reuse the org chevron
"fastapi-sqlalchemy-template": lambda: sym.chevron(_CX, _CY, R - 1),
"litestar-sqlalchemy-template": lambda: sym.chevron(_CX, _CY, R - 1),
+ "chat-app": lambda: sym.chevron(_CX, _CY, R - 1),
# microservices, http & messaging
"lite-bootstrap": lambda: sym.rocket(_CX, _CY, R),
"httpware": lambda: sym.chain(_CX, _CY, R),
diff --git a/brand/projects/chat-app/lockup-dark.svg b/brand/projects/chat-app/lockup-dark.svg
new file mode 100644
index 0000000..e467135
--- /dev/null
+++ b/brand/projects/chat-app/lockup-dark.svg
@@ -0,0 +1 @@
+
diff --git a/brand/projects/chat-app/lockup-light.svg b/brand/projects/chat-app/lockup-light.svg
new file mode 100644
index 0000000..904e1d4
--- /dev/null
+++ b/brand/projects/chat-app/lockup-light.svg
@@ -0,0 +1 @@
+
diff --git a/brand/projects/chat-app/lockup.png b/brand/projects/chat-app/lockup.png
new file mode 100644
index 0000000..4d3498d
Binary files /dev/null and b/brand/projects/chat-app/lockup.png differ
diff --git a/brand/projects/chat-app/mark-1024.png b/brand/projects/chat-app/mark-1024.png
new file mode 100644
index 0000000..a75ec99
Binary files /dev/null and b/brand/projects/chat-app/mark-1024.png differ
diff --git a/brand/projects/chat-app/mark-512.png b/brand/projects/chat-app/mark-512.png
new file mode 100644
index 0000000..b77e90c
Binary files /dev/null and b/brand/projects/chat-app/mark-512.png differ
diff --git a/brand/projects/chat-app/mark.svg b/brand/projects/chat-app/mark.svg
new file mode 100644
index 0000000..d90c924
--- /dev/null
+++ b/brand/projects/chat-app/mark.svg
@@ -0,0 +1 @@
+
diff --git a/brand/story-assets/dir-brackets.svg b/brand/story-assets/dir-brackets.svg
deleted file mode 100644
index b51f415..0000000
--- a/brand/story-assets/dir-brackets.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/brand/story-assets/dir-interlock.svg b/brand/story-assets/dir-interlock.svg
deleted file mode 100644
index 2db9433..0000000
--- a/brand/story-assets/dir-interlock.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/brand/story-assets/dir-repl.svg b/brand/story-assets/dir-repl.svg
deleted file mode 100644
index 93db14a..0000000
--- a/brand/story-assets/dir-repl.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/brand/story-assets/dir-woven.svg b/brand/story-assets/dir-woven.svg
deleted file mode 100644
index 5832f3e..0000000
--- a/brand/story-assets/dir-woven.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/brand/story-assets/fav-chevron.svg b/brand/story-assets/fav-chevron.svg
deleted file mode 100644
index 8ca7f74..0000000
--- a/brand/story-assets/fav-chevron.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/brand/story-assets/fav-dot.svg b/brand/story-assets/fav-dot.svg
deleted file mode 100644
index d864be1..0000000
--- a/brand/story-assets/fav-dot.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/brand/story-assets/p2-pinwheel.svg b/brand/story-assets/p2-pinwheel.svg
deleted file mode 100644
index 99bafff..0000000
--- a/brand/story-assets/p2-pinwheel.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/brand/story-assets/snake-square.svg b/brand/story-assets/snake-square.svg
deleted file mode 100644
index ff3bc0c..0000000
--- a/brand/story-assets/snake-square.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/docs/index.md b/docs/index.md
index 81816e2..756b191 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -69,8 +69,8 @@ production Python services. Use one piece or all of them — each is independent
dependency injection with one wiring shared across web frameworks (FastAPI,
Litestar, Starlette, Flask, aiohttp), task queues (Celery, arq, taskiq), RPC
and messaging (gRPC, FastStream, aiogram), and CLIs (Typer).
- ([`that-depends`](https://github.com/modern-python/that-depends), its
- production-proven predecessor, is still maintained.)
+ ([`that-depends`](https://github.com/modern-python/that-depends), the older
+ DI framework, is still maintained.)
- **Call other services reliably** with
[`httpware`](https://github.com/modern-python/httpware) — an httpx-based client
with typed errors, typed response bodies, and a composable resilience chain
@@ -91,8 +91,9 @@ Every project is built with the same tooling
## Project templates { #templates }
-- [`fastapi-sqlalchemy-template`](https://github.com/modern-python/fastapi-sqlalchemy-template) — dockerized web application with DI on FastAPI, SQLAlchemy 2, PostgreSQL.
-- [`litestar-sqlalchemy-template`](https://github.com/modern-python/litestar-sqlalchemy-template) — dockerized web application on Litestar, SQLAlchemy 2, PostgreSQL.
+- [`fastapi-sqlalchemy-template`](https://github.com/modern-python/fastapi-sqlalchemy-template): Dockerized FastAPI + SQLAlchemy 2 + PostgreSQL app template with DI
+- [`litestar-sqlalchemy-template`](https://github.com/modern-python/litestar-sqlalchemy-template): Dockerized Litestar + SQLAlchemy 2 + PostgreSQL app template with DI
+- [`chat-app`](https://github.com/modern-python/chat-app): Reference chat application for the modern-python organisation
## Dependency injection { #di }
@@ -102,43 +103,43 @@ Every project is built with the same tooling
— a minimal core plus the integrations listed below.
[`that-depends`](https://github.com/modern-python/that-depends) is the earlier,
- async-first sibling and stays maintained. Coming from it? `modern-di` ships a
- [migration guide](https://modern-di.modern-python.org/migration/from-that-depends/)
- — and one
+ async-first sibling and stays maintained. `modern-di` has migration guides
+ [from `that-depends`](https://modern-di.modern-python.org/migration/from-that-depends/)
+ and
[from `dependency-injector`](https://modern-di.modern-python.org/migration/from-dependency-injector/).
-- [`modern-di`](https://github.com/modern-python/modern-di) — powerful DI framework with scopes.
-- [`modern-di-aiogram`](https://github.com/modern-python/modern-di-aiogram) — `modern-di` integration for aiogram.
-- [`modern-di-aiohttp`](https://github.com/modern-python/modern-di-aiohttp) — `modern-di` integration for aiohttp.
-- [`modern-di-arq`](https://github.com/modern-python/modern-di-arq) — `modern-di` integration for arq.
-- [`modern-di-celery`](https://github.com/modern-python/modern-di-celery) — `modern-di` integration for Celery.
-- [`modern-di-fastapi`](https://github.com/modern-python/modern-di-fastapi) — `modern-di` integration for FastAPI.
-- [`modern-di-faststream`](https://github.com/modern-python/modern-di-faststream) — `modern-di` integration for FastStream.
-- [`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) — `modern-di` integration for pytest.
-- [`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.
-- [`that-depends`](https://github.com/modern-python/that-depends) — predecessor DI framework, still actively maintained.
+- [`modern-di`](https://github.com/modern-python/modern-di): Powerful dependency-injection framework with IoC container and scopes
+- [`modern-di-aiogram`](https://github.com/modern-python/modern-di-aiogram): modern-di integration for aiogram
+- [`modern-di-aiohttp`](https://github.com/modern-python/modern-di-aiohttp): modern-di integration for aiohttp
+- [`modern-di-arq`](https://github.com/modern-python/modern-di-arq): modern-di integration for arq
+- [`modern-di-celery`](https://github.com/modern-python/modern-di-celery): modern-di integration for Celery
+- [`modern-di-fastapi`](https://github.com/modern-python/modern-di-fastapi): modern-di integration for FastAPI
+- [`modern-di-faststream`](https://github.com/modern-python/modern-di-faststream): modern-di integration for FastStream
+- [`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-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
+- [`that-depends`](https://github.com/modern-python/that-depends): Simple, typed dependency-injection framework for Python
## Microservices, HTTP & messaging { #services }
-- [`lite-bootstrap`](https://github.com/modern-python/lite-bootstrap) — lightweight package for bootstrapping new microservices.
-- [`httpware`](https://github.com/modern-python/httpware) — HTTP client framework with sync/async clients, middleware chain, and built-in resilience (retry, bulkhead).
-- [`jwks-client`](https://github.com/modern-python/jwks-client) — async JWKS client for verifying JWTs, with key caching, resilient fetching, and Litestar and FastAPI integrations.
-- [`faststream-redis-timers`](https://github.com/modern-python/faststream-redis-timers) — FastStream broker integration for Redis-backed distributed timer scheduling.
-- [`faststream-concurrent-aiokafka`](https://github.com/modern-python/faststream-concurrent-aiokafka) — concurrent message processing middleware for FastStream with `aiokafka`.
-- [`faststream-outbox`](https://github.com/modern-python/faststream-outbox) — FastStream broker integration for the transactional outbox pattern with Postgres.
+- [`lite-bootstrap`](https://github.com/modern-python/lite-bootstrap): Lightweight bootstrap for production-ready Python microservices
+- [`httpware`](https://github.com/modern-python/httpware): Typed, resilient HTTP clients for Python, sync and async
+- [`jwks-client`](https://github.com/modern-python/jwks-client): Async JWKS client for verifying JWTs, with key caching, resilient fetching, and Litestar and FastAPI integrations
+- [`faststream-redis-timers`](https://github.com/modern-python/faststream-redis-timers): FastStream integration for Redis-backed distributed timer scheduling
+- [`faststream-concurrent-aiokafka`](https://github.com/modern-python/faststream-concurrent-aiokafka): Concurrent message-processing middleware for FastStream + aiokafka
+- [`faststream-outbox`](https://github.com/modern-python/faststream-outbox): FastStream transactional-outbox integration backed by a Postgres table
## Utilities { #utilities }
-- [`compose2pod`](https://github.com/modern-python/compose2pod) — convert a Docker Compose file into a script that runs its services as a single Podman pod.
-- [`db-retry`](https://github.com/modern-python/db-retry) — retry helpers for database operations.
-- [`eof-fixer`](https://github.com/modern-python/eof-fixer) — automatically fix newlines at the end of files.
-- [`release-scope`](https://github.com/modern-python/release-scope) — collect what sits between production and the default branch across GitLab services: tags, MRs, Jira keys, failed jobs.
-- [`semvertag`](https://github.com/modern-python/semvertag) — auto-tag your GitHub/GitLab repo with semantic version tags from CI.
+- [`compose2pod`](https://github.com/modern-python/compose2pod): Convert a Docker Compose file into a script that runs its services as a single Podman pod
+- [`db-retry`](https://github.com/modern-python/db-retry): Retry helpers for PostgreSQL / SQLAlchemy database operations
+- [`eof-fixer`](https://github.com/modern-python/eof-fixer): CLI tool that ensures text files end with exactly one newline
+- [`release-scope`](https://github.com/modern-python/release-scope): Collect what sits between production and the default branch across GitLab services: tags, MRs, Jira keys, failed jobs
+- [`semvertag`](https://github.com/modern-python/semvertag): Auto-tag GitHub & GitLab repos with semantic version tags from CI
Built with uv,
ruff, and
diff --git a/docs/standard.md b/docs/standard.md
index 1c78355..9ac1e6f 100644
--- a/docs/standard.md
+++ b/docs/standard.md
@@ -1,8 +1,8 @@
# The standard
What makes a repository a modern-python repository. It is written for the maintainer,
-contributors, and the coding agents that work across the org's repositories. It is not a guide to
-writing Python; it is the shape every repo shares so that tooling, CI, and agents can rely on it.
+contributors, and the coding agents that work across the org's repositories. It describes the shape
+every repo shares so tooling, CI, and agents can rely on it.
## Scope
diff --git a/profile/README.md b/profile/README.md
index 5779085..858e257 100644
--- a/profile/README.md
+++ b/profile/README.md
@@ -18,12 +18,13 @@ Open-source templates and libraries for building production-ready Python applica
|---|---|---|
| [`fastapi-sqlalchemy-template`](https://github.com/modern-python/fastapi-sqlalchemy-template) | Dockerized FastAPI + SQLAlchemy 2 + PostgreSQL app template with DI | [](https://github.com/modern-python/fastapi-sqlalchemy-template/stargazers) |
| [`litestar-sqlalchemy-template`](https://github.com/modern-python/litestar-sqlalchemy-template) | Dockerized Litestar + SQLAlchemy 2 + PostgreSQL app template with DI | [](https://github.com/modern-python/litestar-sqlalchemy-template/stargazers) |
+| [`chat-app`](https://github.com/modern-python/chat-app) | Reference chat application for the modern-python organisation | [](https://github.com/modern-python/chat-app/stargazers) |
### Dependency injection
**Which one?** Start new projects on [`modern-di`](https://github.com/modern-python/modern-di) — a minimal core plus the integrations below.
-[`that-depends`](https://github.com/modern-python/that-depends) is the earlier, async-first sibling and stays maintained. Coming from it? `modern-di` ships a [migration guide](https://modern-di.modern-python.org/migration/from-that-depends/) — and one [from `dependency-injector`](https://modern-di.modern-python.org/migration/from-dependency-injector/).
+[`that-depends`](https://github.com/modern-python/that-depends) is the earlier, async-first sibling and stays maintained. `modern-di` has migration guides [from `that-depends`](https://modern-di.modern-python.org/migration/from-that-depends/) and [from `dependency-injector`](https://modern-di.modern-python.org/migration/from-dependency-injector/).
| Project | What it is | Stars | Downloads |
|---|---|---|---|
@@ -48,7 +49,7 @@ Open-source templates and libraries for building production-ready Python applica
| Project | What it is | Stars | Downloads |
|---|---|---|---|
| [`lite-bootstrap`](https://github.com/modern-python/lite-bootstrap) | Lightweight bootstrap for production-ready Python microservices | [](https://github.com/modern-python/lite-bootstrap/stargazers) | [](https://pepy.tech/projects/lite-bootstrap) |
-| [`httpware`](https://github.com/modern-python/httpware) | Python HTTP client framework with sync & async clients and built-in resilience | [](https://github.com/modern-python/httpware/stargazers) | [](https://pepy.tech/projects/httpware) |
+| [`httpware`](https://github.com/modern-python/httpware) | Typed, resilient HTTP clients for Python, sync and async | [](https://github.com/modern-python/httpware/stargazers) | [](https://pepy.tech/projects/httpware) |
| [`jwks-client`](https://github.com/modern-python/jwks-client) | Async JWKS client for verifying JWTs, with key caching, resilient fetching, and Litestar and FastAPI integrations | [](https://github.com/modern-python/jwks-client/stargazers) | [](https://pepy.tech/projects/jwks-client) |
| [`faststream-redis-timers`](https://github.com/modern-python/faststream-redis-timers) | FastStream integration for Redis-backed distributed timer scheduling | [](https://github.com/modern-python/faststream-redis-timers/stargazers) | [](https://pepy.tech/projects/faststream-redis-timers) |
| [`faststream-concurrent-aiokafka`](https://github.com/modern-python/faststream-concurrent-aiokafka) | Concurrent message-processing middleware for FastStream + aiokafka | [](https://github.com/modern-python/faststream-concurrent-aiokafka/stargazers) | [](https://pepy.tech/projects/faststream-concurrent-aiokafka) |
diff --git a/scripts/check_site_content.sh b/scripts/check_site_content.sh
index 68fbcd5..ac92caf 100755
--- a/scripts/check_site_content.sh
+++ b/scripts/check_site_content.sh
@@ -6,7 +6,7 @@ HTML="site/index.html"
test -f "$HTML" || { echo "MISSING $HTML — run 'uv run mkdocs build' first"; exit 1; }
REPOS=(
- fastapi-sqlalchemy-template litestar-sqlalchemy-template
+ fastapi-sqlalchemy-template litestar-sqlalchemy-template chat-app
modern-di modern-di-fastapi modern-di-litestar modern-di-faststream
modern-di-typer modern-di-pytest that-depends
lite-bootstrap httpware jwks-client faststream-redis-timers
diff --git a/tests/test_projects.py b/tests/test_projects.py
index bee515e..83c4e0b 100644
--- a/tests/test_projects.py
+++ b/tests/test_projects.py
@@ -31,6 +31,7 @@ def test_project_frame_parses_and_uses_tokens() -> None:
"modern-di-aiogram",
"fastapi-sqlalchemy-template",
"litestar-sqlalchemy-template",
+ "chat-app",
"lite-bootstrap",
"httpware",
"faststream-redis-timers",