You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asyncband.apache.org by ti...@apache.org on 2026/09/11 14:04:29 UTC

(asyncband-site) branch main updated: chore: format Markdown with dprint (#14)

This is an automated email from the ASF dual-hosted git repository.

tisonkun pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/asyncband-site.git


The following commit(s) were added to refs/heads/main by this push:
     new e34caf4  chore: format Markdown with dprint (#14)
e34caf4 is described below

commit e34caf46f9e46f5967788c0954c3163eda245f21
Author: tison <wa...@gmail.com>
AuthorDate: Fri Sep 11 22:04:25 2026 +0800

    chore: format Markdown with dprint (#14)
---
 .dprint.json               |  11 +++
 .oxfmtrc.json              |   2 +-
 AGENTS.md                  |  16 ++---
 README.md                  |   2 +
 package.json               |   6 +-
 pnpm-lock.yaml             | 162 +++++++++++++++++++++++++++++++++++++++++++++
 pnpm-workspace.yaml        |   1 +
 src/pages/_home-content.md |  46 ++++++-------
 src/pages/downloads.md     |   8 +--
 9 files changed, 216 insertions(+), 38 deletions(-)

diff --git a/.dprint.json b/.dprint.json
new file mode 100644
index 0000000..8d3d341
--- /dev/null
+++ b/.dprint.json
@@ -0,0 +1,11 @@
+{
+	"$schema": "https://dprint.dev/schemas/v0.json",
+	"markdown": {
+		"textWrap": "never",
+		"list.unorderedMarker": "asterisks",
+		"table.skipFormat": false
+	},
+	"includes": ["**/*.md"],
+	"excludes": ["**/node_modules", "static/**", "build/**", ".docusaurus/**"],
+	"plugins": ["./node_modules/@dprint/markdown/plugin.wasm"]
+}
diff --git a/.oxfmtrc.json b/.oxfmtrc.json
index b469725..4ac6b42 100644
--- a/.oxfmtrc.json
+++ b/.oxfmtrc.json
@@ -5,5 +5,5 @@
 	"trailingComma": "none",
 	"printWidth": 100,
 	"proseWrap": "never",
-	"ignorePatterns": ["pnpm-lock.yaml", "static/**", "build/**", ".docusaurus/**"]
+	"ignorePatterns": ["**/*.md", "pnpm-lock.yaml", "static/**", "build/**", ".docusaurus/**"]
 }
diff --git a/AGENTS.md b/AGENTS.md
index 33fb596..b290c4b 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -2,11 +2,11 @@
 
 ## Pull Request Preview Workflow
 
-- Fetch `origin/main` and create every pull request branch from its latest commit.
-- Name the source branch `preview/<name>`, where `<name>` uses lowercase letters, digits, and hyphens. Do not use `codex/`, `staging/`, or `site/` for a pull request branch.
-- Run `pnpm validate` before pushing the branch.
-- Push the `preview/<name>` branch before opening the pull request. The deploy workflow publishes its build to the generated `site/<name>-staging` branch and ASF serves it at `https://asyncband-<name>.staged.apache.org/`.
-- Treat `site/<name>-staging` as deployment output. Never base work on it, commit to it directly, or use it as the pull request head branch.
-- Open the pull request from `preview/<name>` into `main` and include the staging URL in the pull request description.
-- When the pull request is closed, the cleanup workflow deletes the `site/<name>-staging` branch so deployment output does not accumulate. The staged preview may remain reachable until ASF infrastructure prunes it. To remove a stale staging branch by hand, delete its `site/<name>-staging` branch.
-- Production publishing remains separate: pushes to `main` publish through the `asf-site` branch.
+* Fetch `origin/main` and create every pull request branch from its latest commit.
+* Name the source branch `preview/<name>`, where `<name>` uses lowercase letters, digits, and hyphens. Do not use `codex/`, `staging/`, or `site/` for a pull request branch.
+* Run `pnpm validate` before pushing the branch.
+* Push the `preview/<name>` branch before opening the pull request. The deploy workflow publishes its build to the generated `site/<name>-staging` branch and ASF serves it at `https://asyncband-<name>.staged.apache.org/`.
+* Treat `site/<name>-staging` as deployment output. Never base work on it, commit to it directly, or use it as the pull request head branch.
+* Open the pull request from `preview/<name>` into `main` and include the staging URL in the pull request description.
+* When the pull request is closed, the cleanup workflow deletes the `site/<name>-staging` branch so deployment output does not accumulate. The staged preview may remain reachable until ASF infrastructure prunes it. To remove a stale staging branch by hand, delete its `site/<name>-staging` branch.
+* Production publishing remains separate: pushes to `main` publish through the `asf-site` branch.
diff --git a/README.md b/README.md
index 85e8c79..55ecf8e 100644
--- a/README.md
+++ b/README.md
@@ -19,6 +19,8 @@ Pages live under `src/pages/`. The homepage is `src/pages/index.tsx`, with its p
 
 Fenced `bash` and `rust` code blocks are highlighted during the build. Docusaurus also supports MDX components when a page needs behavior beyond Markdown.
 
+Run `pnpm format` to format the repository.
+
 ## Validating
 
 Run the type, formatting, lint, and production-build checks:
diff --git a/package.json b/package.json
index 99b30e4..2dc0cdc 100644
--- a/package.json
+++ b/package.json
@@ -14,8 +14,8 @@
 		"build": "docusaurus build",
 		"preview": "docusaurus serve",
 		"check": "tsc",
-		"lint": "oxlint --deny-warnings && oxfmt --check .",
-		"format": "oxfmt .",
+		"lint": "oxlint --deny-warnings && oxfmt --check . && dprint check",
+		"format": "oxfmt . && dprint fmt",
 		"validate": "pnpm check && pnpm lint && pnpm build"
 	},
 	"dependencies": {
@@ -29,7 +29,9 @@
 		"@docusaurus/module-type-aliases": "^3.10.2",
 		"@docusaurus/tsconfig": "^3.10.2",
 		"@docusaurus/types": "^3.10.2",
+		"@dprint/markdown": "^0.23.3",
 		"@types/node": "^24",
+		"dprint": "^0.57.4",
 		"oxfmt": "^0.64.0",
 		"oxlint": "^1.79.0",
 		"typescript": "~5.9.3"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 87ada03..4f07fd2 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -134,9 +134,15 @@ importers:
       '@docusaurus/types':
         specifier: ^3.10.2
         version: 3.10.2(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.26))(csso@5.0.5)(html-minifier-terser@7.2.0)(lightningcss@1.33.0)(postcss@8.5.26)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@8.1.1)
+      '@dprint/markdown':
+        specifier: ^0.23.3
+        version: 0.23.3
       '@types/node':
         specifier: ^24
         version: 24.13.3
+      dprint:
+        specifier: ^0.57.4
+        version: 0.57.4
       oxfmt:
         specifier: ^0.64.0
         version: 0.64.0(svelte@5.56.10)
@@ -1328,6 +1334,93 @@ packages:
     resolution: {integrity: sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==}
     engines: {node: '>=20.0'}
 
+  '@dprint/android-arm64@0.57.4':
+    resolution: {integrity: sha512-vpafWVSNbB5ShCThZC3O5xOPsdxc2oeLedFVCsscSRf/iR6WZ62ROU2AGcxsJyE2y4/vxivejenbNYjWxL24sQ==}
+    cpu: [arm64]
+    os: [android]
+
+  '@dprint/android-x64@0.57.4':
+    resolution: {integrity: sha512-Zv2I12Zs9IK8yv1wdXGWluUram9h8Acy3NuF/7WzsxIfdlmnWzUGxoc4Z0dno6aJpv0ViXybkIHPvDKrQnvxVA==}
+    cpu: [x64]
+    os: [android]
+
+  '@dprint/darwin-arm64@0.57.4':
+    resolution: {integrity: sha512-2V1BzlP+5aLxMaq77MUn2EdRX+UtOq34QjyMwpq1wQkR5MAT2cglJro4Eh1tsI+btjt3FMsX4/PLvz6eUSLl3g==}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@dprint/darwin-x64@0.57.4':
+    resolution: {integrity: sha512-dQfzBLBQro1O+CxIkIVc9LJqgYsWCKXTf+3QA0Gq/NjW6KPBwlbiCquew3UOeWwGEvarNSA0/Rvz5J8HnykTPA==}
+    cpu: [x64]
+    os: [darwin]
+
+  '@dprint/linux-arm64-glibc@0.57.4':
+    resolution: {integrity: sha512-zFCgx2E2szEnMgtBCKiI/G5vV5mi7rnTVDMB2FrIa6JheqF8pgfrx6m3HWzIed74cFM3/KCH0LmIfCNZT5vRfw==}
+    cpu: [arm64]
+    os: [linux]
+    libc: [glibc]
+
+  '@dprint/linux-arm64-musl@0.57.4':
+    resolution: {integrity: sha512-8DV33dU5c5vp/TJJp4Dy/4HYc4r5KidlMJgoiG0S9JMygVGjhrXRNiI/C7M9hLgsamqeLYt4MWfEGKvtgOwoew==}
+    cpu: [arm64]
+    os: [linux]
+    libc: [musl]
+
+  '@dprint/linux-loong64-glibc@0.57.4':
+    resolution: {integrity: sha512-166HbqGPMiKjCUuaiG6xyKrw8EKFF6vPBcmwFWUYHpZE6ipVVxt1Zen9957FXoxqyA5aspmK72eQGm72dQI2Yg==}
+    cpu: [loong64]
+    os: [linux]
+    libc: [glibc]
+
+  '@dprint/linux-loong64-musl@0.57.4':
+    resolution: {integrity: sha512-TTNKhwDj4qCWSiP20pdktb/mF0MfjVnXEcCXAd37ll6lx+ri4M5aQKyeyFL1pVGU9msjQv++UTU7MGF9uKfOzA==}
+    cpu: [loong64]
+    os: [linux]
+    libc: [musl]
+
+  '@dprint/linux-ppc64-glibc@0.57.4':
+    resolution: {integrity: sha512-kQGTaEoZIk+aHtEltz+nBQ54dhJ3dSxN4jxBOnK2wYCTaMkRnGxfF9Uwc29u/BL3Fw6ieDOJCSHy2VWFZdyctA==}
+    cpu: [ppc64]
+    os: [linux]
+    libc: [glibc]
+
+  '@dprint/linux-ppc64-musl@0.57.4':
+    resolution: {integrity: sha512-NuhwpDFzyBovfpI3M47eBUju8eCxR7tfrMpPBWXyl9YgX0JeBZt6clOV/fwJ2P3DE/ARD9xoyQSGgHzDoSFlOQ==}
+    cpu: [ppc64]
+    os: [linux]
+    libc: [musl]
+
+  '@dprint/linux-riscv64-glibc@0.57.4':
+    resolution: {integrity: sha512-pWBdHK8SKt9IGldbuZGbec37RyQqP4zqsWfpq7iyH+m33f7Aagus5ktvKF85KYfLTewIg+ev3vlxryB9iHBiNA==}
+    cpu: [riscv64]
+    os: [linux]
+    libc: [glibc]
+
+  '@dprint/linux-x64-glibc@0.57.4':
+    resolution: {integrity: sha512-BYrSdjYo+nfUgXqgIbZZQnHvpM6UP7Dipfsuzxs0JmuHZRRkJIPjDdj/Qpbn/5Qv1gC4eV0cZsxRu8B634wkig==}
+    cpu: [x64]
+    os: [linux]
+    libc: [glibc]
+
+  '@dprint/linux-x64-musl@0.57.4':
+    resolution: {integrity: sha512-pBRF5Kfv59FLtWYWWKpDLOv2+uTIr/XG2oMuRBiXXZom0b506aMm3zKCZ7z5ELeIYutPpASfkDbHcsyTY0ky6w==}
+    cpu: [x64]
+    os: [linux]
+    libc: [musl]
+
+  '@dprint/markdown@0.23.3':
+    resolution: {integrity: sha512-llL0a6tjViXG8OIgyibfJZxW4vN3KsfoTPOl/LobFjCmdiunopoIxlDrjTR/PWHt9WJRd98m+TMfp4bb2Vc6vQ==}
+
+  '@dprint/win32-arm64@0.57.4':
+    resolution: {integrity: sha512-bGEtcSjl6T4xjwr9nUF5kgd3174NP7yb338+Ulqq5DMYcSN4ibI62eVQKBTuyLWByz56aVOL06dj8pKTUzn+yQ==}
+    cpu: [arm64]
+    os: [win32]
+
+  '@dprint/win32-x64@0.57.4':
+    resolution: {integrity: sha512-P91JJG2sDvK+SvZHdqjKygy7fYABbMH1KYop+WCowyjZUin09977qltdXwJ1vb77Cbi2OD0GWUuAlqO0PjNmaw==}
+    cpu: [x64]
+    os: [win32]
+
   '@hapi/hoek@9.3.0':
     resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==}
 
@@ -2844,6 +2937,10 @@ packages:
     resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==}
     engines: {node: '>=10'}
 
+  dprint@0.57.4:
+    resolution: {integrity: sha512-iiorgfJrrV7DDf7S9AB/d5ZB59Jn5idMDQoU7o6H9m6AvGVaLAPrGTAslmTwykkft9CYbWzqUrKjmKT80KWmAA==}
+    hasBin: true
+
   dunder-proto@1.0.1:
     resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
     engines: {node: '>= 0.4'}
@@ -7731,6 +7828,53 @@ snapshots:
       - uglify-js
       - webpack-cli
 
+  '@dprint/android-arm64@0.57.4':
+    optional: true
+
+  '@dprint/android-x64@0.57.4':
+    optional: true
+
+  '@dprint/darwin-arm64@0.57.4':
+    optional: true
+
+  '@dprint/darwin-x64@0.57.4':
+    optional: true
+
+  '@dprint/linux-arm64-glibc@0.57.4':
+    optional: true
+
+  '@dprint/linux-arm64-musl@0.57.4':
+    optional: true
+
+  '@dprint/linux-loong64-glibc@0.57.4':
+    optional: true
+
+  '@dprint/linux-loong64-musl@0.57.4':
+    optional: true
+
+  '@dprint/linux-ppc64-glibc@0.57.4':
+    optional: true
+
+  '@dprint/linux-ppc64-musl@0.57.4':
+    optional: true
+
+  '@dprint/linux-riscv64-glibc@0.57.4':
+    optional: true
+
+  '@dprint/linux-x64-glibc@0.57.4':
+    optional: true
+
+  '@dprint/linux-x64-musl@0.57.4':
+    optional: true
+
+  '@dprint/markdown@0.23.3': {}
+
+  '@dprint/win32-arm64@0.57.4':
+    optional: true
+
+  '@dprint/win32-x64@0.57.4':
+    optional: true
+
   '@hapi/hoek@9.3.0': {}
 
   '@hapi/topo@5.1.0':
@@ -9315,6 +9459,24 @@ snapshots:
     dependencies:
       is-obj: 2.0.0
 
+  dprint@0.57.4:
+    optionalDependencies:
+      '@dprint/android-arm64': 0.57.4
+      '@dprint/android-x64': 0.57.4
+      '@dprint/darwin-arm64': 0.57.4
+      '@dprint/darwin-x64': 0.57.4
+      '@dprint/linux-arm64-glibc': 0.57.4
+      '@dprint/linux-arm64-musl': 0.57.4
+      '@dprint/linux-loong64-glibc': 0.57.4
+      '@dprint/linux-loong64-musl': 0.57.4
+      '@dprint/linux-ppc64-glibc': 0.57.4
+      '@dprint/linux-ppc64-musl': 0.57.4
+      '@dprint/linux-riscv64-glibc': 0.57.4
+      '@dprint/linux-x64-glibc': 0.57.4
+      '@dprint/linux-x64-musl': 0.57.4
+      '@dprint/win32-arm64': 0.57.4
+      '@dprint/win32-x64': 0.57.4
+
   dunder-proto@1.0.1:
     dependencies:
       call-bind-apply-helpers: 1.0.2
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 10ed64a..bd0c63f 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,2 +1,3 @@
 allowBuilds:
   core-js: false
+  dprint: true
diff --git a/src/pages/_home-content.md b/src/pages/_home-content.md
index 55458ee..ef40c41 100644
--- a/src/pages/_home-content.md
+++ b/src/pages/_home-content.md
@@ -32,29 +32,29 @@ Public paths stay direct while Cargo features keep unused implementations out of
 
 ## API map
 
-| Area | API | Feature | Use |
-| --- | --- | --- | --- |
-| Locks and conditions | [`Mutex`](https://docs.rs/asyncband/*/asyncband/mutex/struct.Mutex.html) | `mutex` | Protect shared data with asynchronous mutual exclusion. |
-|  | [`RwLock`](https://docs.rs/asyncband/*/asyncband/rwlock/struct.RwLock.html) | `rwlock` | Allow multiple readers or one writer. |
-|  | [`Condvar`](https://docs.rs/asyncband/*/asyncband/condvar/struct.Condvar.html) | `condvar` | Wait for notifications while releasing a mutex. |
-| Coordination | [`Semaphore`](https://docs.rs/asyncband/*/asyncband/semaphore/struct.Semaphore.html) | `semaphore` | Limit concurrent work by acquiring permits. |
-|  | [`Barrier`](https://docs.rs/asyncband/*/asyncband/barrier/struct.Barrier.html) | `barrier` | Synchronize a fixed number of participants at a reusable rendezvous. |
-|  | [`ManualResetEvent`](https://docs.rs/asyncband/*/asyncband/event/struct.ManualResetEvent.html) | `event` | Signal current and future waits until explicitly reset. |
-|  | [`Latch`](https://docs.rs/asyncband/*/asyncband/latch/struct.Latch.html) | `latch` | Wait until a fixed one-way countdown reaches zero. |
-|  | [`WaitGroup`](https://docs.rs/asyncband/*/asyncband/waitgroup/struct.WaitGroup.html) | `waitgroup` | Dynamically register participants and wait until all have completed. |
-|  | [`Shutdown`](https://docs.rs/asyncband/*/asyncband/shutdown/struct.Shutdown.html) | `shutdown` | Request shutdown and wait until all completion guards are dropped. |
-| Work coalescing | [`Once`](https://docs.rs/asyncband/*/asyncband/once/struct.Once.html) | `once` | Complete one asynchronous initialization; cancelled or panicked attempts may be retried. |
-|  | [`OnceCell`](https://docs.rs/asyncband/*/asyncband/once/struct.OnceCell.html) | `once-cell` | Store one value from an access-time initializer; failed, cancelled, or panicked attempts may be retried. |
-|  | [`LazyCell`](https://docs.rs/asyncband/*/asyncband/once/struct.LazyCell.html) | `lazy-cell` | Initialize one value with a stored function and resume the same in-flight future after caller cancellation. |
-|  | [`OnceMap`](https://docs.rs/asyncband/*/asyncband/once/struct.OnceMap.html) | `once-map` | Coalesce work per key and retain each successful value until explicitly removed. |
-|  | [`Group`](https://docs.rs/asyncband/*/asyncband/singleflight/struct.Group.html) | `singleflight` | Coalesce overlapping work per key without retaining completed values. |
-| Communication | [`Completion`](https://docs.rs/asyncband/*/asyncband/completion/struct.Completion.html) | `completion` | Publish one shared result to any number of current and future observers. |
-|  | [`oneshot`](https://docs.rs/asyncband/*/asyncband/oneshot/) | `oneshot` | Send one value from one sender to one receiver. |
-|  | [`mpsc`](https://docs.rs/asyncband/*/asyncband/mpsc/) | `mpsc` | Send each value from multiple producers to one receiver with bounded backpressure or an unbounded queue. |
-|  | [`broadcast`](https://docs.rs/asyncband/*/asyncband/broadcast/) | `broadcast` | Deliver every value to receivers active at send time; retain an unbounded backlog until each consumes or drops. |
-|  | [`watch`](https://docs.rs/asyncband/*/asyncband/watch/) | `watch` | Publish cloneable latest state from one or more senders; receivers independently coalesce intermediate updates. |
-| Object reuse | [`pool`](https://docs.rs/asyncband/*/asyncband/pool/) | `pool` | Reuse objects through bounded or unbounded pool variants. |
-| Sync interop | [`FutureExt`](https://docs.rs/asyncband/*/asyncband/blocking/trait.FutureExt.html) | `blocking` | Drive one runtime-agnostic future from a blocking thread. |
+| Area                 | API                                                                                            | Feature        | Use                                                                                                             |
+| -------------------- | ---------------------------------------------------------------------------------------------- | -------------- | --------------------------------------------------------------------------------------------------------------- |
+| Locks and conditions | [`Mutex`](https://docs.rs/asyncband/*/asyncband/mutex/struct.Mutex.html)                       | `mutex`        | Protect shared data with asynchronous mutual exclusion.                                                         |
+|                      | [`RwLock`](https://docs.rs/asyncband/*/asyncband/rwlock/struct.RwLock.html)                    | `rwlock`       | Allow multiple readers or one writer.                                                                           |
+|                      | [`Condvar`](https://docs.rs/asyncband/*/asyncband/condvar/struct.Condvar.html)                 | `condvar`      | Wait for notifications while releasing a mutex.                                                                 |
+| Coordination         | [`Semaphore`](https://docs.rs/asyncband/*/asyncband/semaphore/struct.Semaphore.html)           | `semaphore`    | Limit concurrent work by acquiring permits.                                                                     |
+|                      | [`Barrier`](https://docs.rs/asyncband/*/asyncband/barrier/struct.Barrier.html)                 | `barrier`      | Synchronize a fixed number of participants at a reusable rendezvous.                                            |
+|                      | [`ManualResetEvent`](https://docs.rs/asyncband/*/asyncband/event/struct.ManualResetEvent.html) | `event`        | Signal current and future waits until explicitly reset.                                                         |
+|                      | [`Latch`](https://docs.rs/asyncband/*/asyncband/latch/struct.Latch.html)                       | `latch`        | Wait until a fixed one-way countdown reaches zero.                                                              |
+|                      | [`WaitGroup`](https://docs.rs/asyncband/*/asyncband/waitgroup/struct.WaitGroup.html)           | `waitgroup`    | Dynamically register participants and wait until all have completed.                                            |
+|                      | [`Shutdown`](https://docs.rs/asyncband/*/asyncband/shutdown/struct.Shutdown.html)              | `shutdown`     | Request shutdown and wait until all completion guards are dropped.                                              |
+| Work coalescing      | [`Once`](https://docs.rs/asyncband/*/asyncband/once/struct.Once.html)                          | `once`         | Complete one asynchronous initialization; cancelled or panicked attempts may be retried.                        |
+|                      | [`OnceCell`](https://docs.rs/asyncband/*/asyncband/once/struct.OnceCell.html)                  | `once-cell`    | Store one value from an access-time initializer; failed, cancelled, or panicked attempts may be retried.        |
+|                      | [`LazyCell`](https://docs.rs/asyncband/*/asyncband/once/struct.LazyCell.html)                  | `lazy-cell`    | Initialize one value with a stored function and resume the same in-flight future after caller cancellation.     |
+|                      | [`OnceMap`](https://docs.rs/asyncband/*/asyncband/once/struct.OnceMap.html)                    | `once-map`     | Coalesce work per key and retain each successful value until explicitly removed.                                |
+|                      | [`Group`](https://docs.rs/asyncband/*/asyncband/singleflight/struct.Group.html)                | `singleflight` | Coalesce overlapping work per key without retaining completed values.                                           |
+| Communication        | [`Completion`](https://docs.rs/asyncband/*/asyncband/completion/struct.Completion.html)        | `completion`   | Publish one shared result to any number of current and future observers.                                        |
+|                      | [`oneshot`](https://docs.rs/asyncband/*/asyncband/oneshot/)                                    | `oneshot`      | Send one value from one sender to one receiver.                                                                 |
+|                      | [`mpsc`](https://docs.rs/asyncband/*/asyncband/mpsc/)                                          | `mpsc`         | Send each value from multiple producers to one receiver with bounded backpressure or an unbounded queue.        |
+|                      | [`broadcast`](https://docs.rs/asyncband/*/asyncband/broadcast/)                                | `broadcast`    | Deliver every value to receivers active at send time; retain an unbounded backlog until each consumes or drops. |
+|                      | [`watch`](https://docs.rs/asyncband/*/asyncband/watch/)                                        | `watch`        | Publish cloneable latest state from one or more senders; receivers independently coalesce intermediate updates. |
+| Object reuse         | [`pool`](https://docs.rs/asyncband/*/asyncband/pool/)                                          | `pool`         | Reuse objects through bounded or unbounded pool variants.                                                       |
+| Sync interop         | [`FutureExt`](https://docs.rs/asyncband/*/asyncband/blocking/trait.FutureExt.html)             | `blocking`     | Drive one runtime-agnostic future from a blocking thread.                                                       |
 
 ## Synchronous interoperability
 
diff --git a/src/pages/downloads.md b/src/pages/downloads.md
index ec85956..ada7e8c 100644
--- a/src/pages/downloads.md
+++ b/src/pages/downloads.md
@@ -20,7 +20,7 @@ You can verify the integrity of a downloaded release using the PGP signatures an
 
 Apache Asyncband (Incubating) releases are provided as source archives. The latest release is **0.7.2**, the first Apache Incubator release.
 
-- Current release: [apache-asyncband-0.7.2-incubating-src.tar.gz](https://www.apache.org/dyn/closer.lua/incubator/asyncband/apache-asyncband-0.7.2-incubating-src.tar.gz)
-- PGP: [apache-asyncband-0.7.2-incubating-src.tar.gz.asc](https://downloads.apache.org/incubator/asyncband/apache-asyncband-0.7.2-incubating-src.tar.gz.asc)
-- SHA-512: [apache-asyncband-0.7.2-incubating-src.tar.gz.sha512](https://downloads.apache.org/incubator/asyncband/apache-asyncband-0.7.2-incubating-src.tar.gz.sha512)
-- Keys: [KEYS](https://downloads.apache.org/incubator/asyncband/KEYS)
+* Current release: [apache-asyncband-0.7.2-incubating-src.tar.gz](https://www.apache.org/dyn/closer.lua/incubator/asyncband/apache-asyncband-0.7.2-incubating-src.tar.gz)
+* PGP: [apache-asyncband-0.7.2-incubating-src.tar.gz.asc](https://downloads.apache.org/incubator/asyncband/apache-asyncband-0.7.2-incubating-src.tar.gz.asc)
+* SHA-512: [apache-asyncband-0.7.2-incubating-src.tar.gz.sha512](https://downloads.apache.org/incubator/asyncband/apache-asyncband-0.7.2-incubating-src.tar.gz.sha512)
+* Keys: [KEYS](https://downloads.apache.org/incubator/asyncband/KEYS)


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@asyncband.apache.org
For additional commands, e-mail: commits-help@asyncband.apache.org