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

(asyncband-site) 01/01: deploy: 320e5c9c5ecc68dbd2953683c81e84d01d0d96d4

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

github-actions[bot] pushed a commit to branch site/local-author-avatars-staging
in repository https://gitbox.apache.org/repos/asf/asyncband-site.git

commit 60007c09f4864c0c4ec9066709ddd28a5125f665
Author: tisonkun <ti...@users.noreply.github.com>
AuthorDate: Thu Oct 15 11:14:05 2026 +0000

    deploy: 320e5c9c5ecc68dbd2953683c81e84d01d0d96d4
---
 .asf.yaml                                          |  41 +++++
 .nojekyll                                          |   0
 404.html                                           |  17 ++
 asf-logo.svg                                       |  58 +++++++
 assets/css/styles.6eac8809.css                     |   1 +
 assets/js/01a85c17.778d577f.js                     |   1 +
 assets/js/08af526d.c5189b2b.js                     |   1 +
 assets/js/112.8efa302c.js                          |   1 +
 assets/js/15fde409.e859bedc.js                     |   1 +
 assets/js/1df93b7f.91bac7ec.js                     |   1 +
 assets/js/1f391b9e.3bc213a8.js                     |   1 +
 assets/js/2063472f.4bfeb7e1.js                     |   1 +
 assets/js/262.7e82fe17.js                          |   1 +
 assets/js/36994c47.6c929656.js                     |   1 +
 assets/js/4d6bcb0d.b3be3e69.js                     |   1 +
 assets/js/621db11d.68b6166f.js                     |   1 +
 assets/js/674.284ae362.js                          |   1 +
 assets/js/6875c492.8f5c0bc8.js                     |   1 +
 assets/js/7ce54071.5158a402.js                     |   1 +
 assets/js/814f3328.6d4106b8.js                     |   1 +
 assets/js/821.9dab4af2.js                          |   1 +
 assets/js/86.1bb03a0c.js                           |   1 +
 assets/js/9e4087bc.ad2c8772.js                     |   1 +
 assets/js/a6aa9e1f.db98cbd3.js                     |   1 +
 assets/js/a7456010.ee6b39c2.js                     |   1 +
 assets/js/acecf23e.1d48c40a.js                     |   1 +
 assets/js/b3649d1e.9067cbfe.js                     |   1 +
 assets/js/ccc49370.cf3bb771.js                     |   1 +
 assets/js/common.188eaf07.js                       |   2 +
 assets/js/common.188eaf07.js.LICENSE.txt           |   1 +
 assets/js/da5fc804.58a218b4.js                     |   1 +
 assets/js/dbfc4782.79b087c0.js                     |   1 +
 assets/js/dd04b75e.cbbdbd7d.js                     |   1 +
 assets/js/main.e72938d6.js                         |   2 +
 assets/js/main.e72938d6.js.LICENSE.txt             |  61 +++++++
 assets/js/runtime~main.cc7ce440.js                 |   1 +
 avatars/nanami.png                                 | Bin 0 -> 90654 bytes
 .../10/14/choosing-the-right-primitive/index.html  |  41 +++++
 blog/archive/index.html                            |  17 ++
 blog/atom.xml                                      |  48 ++++++
 blog/authors/index.html                            |  17 ++
 blog/index.html                                    |  18 ++
 blog/rss.xml                                       |  46 ++++++
 blog/tags/async-rust/index.html                    |  18 ++
 blog/tags/concurrency/index.html                   |  18 ++
 blog/tags/index.html                               |  17 ++
 downloads/index.html                               |  30 ++++
 favicon.svg                                        |  29 ++++
 index.html                                         | 182 +++++++++++++++++++++
 og.png                                             | Bin 0 -> 614429 bytes
 robots.txt                                         |   3 +
 sitemap.xml                                        |   1 +
 52 files changed, 695 insertions(+)

diff --git a/.asf.yaml b/.asf.yaml
new file mode 100644
index 0000000..5400f88
--- /dev/null
+++ b/.asf.yaml
@@ -0,0 +1,41 @@
+# See https://github.com/apache/infrastructure-asfyaml for the configuration reference.
+
+github:
+  description: Apache Asyncband (Incubating) Website
+  homepage: https://asyncband.apache.org
+  features:
+    issues: true
+    projects: false
+    wiki: false
+  labels:
+    - asyncband
+    - docusaurus
+    - website
+  enabled_merge_buttons:
+    squash: true
+    merge: false
+    rebase: false
+  pull_requests:
+    del_branch_on_merge: true
+  rulesets:
+    - name: Protect site branches
+      type: branch
+      branches:
+        includes:
+          - main
+          - asf-site
+      restrict_deletion: true
+      restrict_force_push: true
+
+staging:
+  profile: ~
+  whoami: asf-site
+  autostage: site/*
+
+publish:
+  whoami: asf-site
+
+notifications:
+  commits: commits@asyncband.apache.org
+  pullrequests: commits@asyncband.apache.org
+  jobs: commits@asyncband.apache.org
diff --git a/.nojekyll b/.nojekyll
new file mode 100644
index 0000000..e69de29
diff --git a/404.html b/404.html
new file mode 100644
index 0000000..3ff0196
--- /dev/null
+++ b/404.html
@@ -0,0 +1,17 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="plugin-native plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.10.2">
+<title data-rh="true">Page Not Found | Apache Asyncband (Incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://asyncband.apache.org/og.png"><meta data-rh="true" name="twitter:image" content="https://asyncband.apache.org/og.png"><meta data-rh="true" property="og:url" content="https://asyncband.apache.org/404.html/"> [...]
+<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Asyncband (Incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.6eac8809.css">
+<script src="/assets/js/runtime~main.cc7ce440.js" defer="defer"></script>
+<script src="/assets/js/main.e72938d6.js" defer="defer"></script>
+</head>
+<body>
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/asf-logo.svg"><div role="region" aria-label="Skip to ma [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/asf-logo.svg b/asf-logo.svg
new file mode 100644
index 0000000..def74b2
--- /dev/null
+++ b/asf-logo.svg
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 293.9285746">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #7c297d;
+      }
+
+      .cls-2 {
+        fill: #f79a23;
+      }
+
+      .cls-3 {
+        fill: #dd552c;
+      }
+
+      .cls-4 {
+        fill: #d22128;
+      }
+    </style>
+  </defs>
+  <path class="cls-1" d="M338.7559108,209.493365l-49.6682702-125.0581554h-27.8676331l-49.6682702,125.0581554h30.1934425l8.5764219-21.6170206h49.6644449l8.3966307,21.6170206h30.3732336ZM257.6471359,165.5439845l17.5086008-45.7358163,17.6845666,45.7358163h-35.1931674Z"/>
+  <path class="cls-1" d="M392.0544328,174.6559546h20.366133c30.1934425,0,49.6644449-17.688392,49.6644449-45.2002681,0-27.3359103-19.4710024-45.0204769-49.6644449-45.0204769h-48.7731397v125.0581554h28.4070067v-34.8374104ZM391.8746416,109.2693447h18.2239402c14.8270345,0,23.2236652,7.5015001,23.2236652,20.366133,0,13.2203899-8.3966307,20.5459242-23.2236652,20.5459242h-18.2239402v-40.9120571Z"/>
+  <path class="cls-1" d="M546.3190918,84.4352096h-27.8676331l-49.6682702,125.0581554h30.1934425l8.5764219-21.6170206h49.6644449l8.3966307,21.6170206h30.3732336l-49.6682702-125.0581554ZM514.8785871,165.5439845l17.5086008-45.7358163,17.6845666,45.7358163h-35.1931674Z"/>
+  <path class="cls-1" d="M708.1311551,161.6153559c-5.1795162,14.4712774-18.399906,23.4034563-34.8374104,23.4034563-21.2612635,0-36.2680892-15.5423738-36.2680892-38.054525,0-22.688117,15.1866168-38.054525,36.4478804-38.054525,15.8981309,0,29.1185207,8.5764219,33.7624887,22.5121511h29.3021372c-7.1457431-30.1934425-32.1596694-49.488479-63.9597565-49.488479-37.8747338,0-64.4953047,26.7965367-64.4953047,65.0308529,0,38.2304908,26.6205709,65.0308529,64.6750958,65.0308529,32.8711835,0,58.420657 [...]
+  <polygon class="cls-1" points="795.7468406 159.1135808 844.5199803 159.1135808 844.5199803 209.493365 872.9231616 209.493365 872.9231616 84.4352096 844.5199803 84.4352096 844.5199803 132.4930099 795.7468406 132.4930099 795.7468406 84.4352096 767.339834 84.4352096 767.339834 209.493365 795.7468406 209.493365 795.7468406 159.1135808"/>
+  <polygon class="cls-1" points="939.759577 185.3745693 939.759577 158.038659 988.8884736 158.038659 988.8884736 134.0996545 939.759577 134.0996545 939.759577 108.3742142 993.536267 108.3742142 993.536267 84.4352096 911.5323615 84.4352096 911.5323615 209.493365 995.4986686 209.493365 995.4986686 185.3745693 939.759577 185.3745693"/>
+  <polygon class="cls-1" points="221.3560947 62.43948 226.6197684 62.43948 226.6197684 27.0971241 239.8860624 27.0971241 239.8860624 21.9482107 208.0898007 21.9482107 208.0898007 27.0971241 221.3560947 27.0971241 221.3560947 62.43948"/>
+  <polygon class="cls-1" points="255.8377481 44.3838549 276.5596381 44.3838549 276.5596381 62.43948 281.8768666 62.43948 281.8768666 21.9482107 276.5596381 21.9482107 276.5596381 39.2311162 255.8377481 39.2311162 255.8377481 21.9482107 250.5778997 21.9482107 250.5778997 62.43948 255.8377481 62.43948 255.8377481 44.3838549"/>
+  <polygon class="cls-1" points="322.0621084 57.4550564 302.0785098 57.4550564 302.0785098 44.3264748 320.0270252 44.3264748 320.0270252 39.3420512 302.0785098 39.3420512 302.0785098 26.8790795 321.457704 26.8790795 321.457704 21.9482107 296.8186614 21.9482107 296.8186614 62.43948 322.0621084 62.43948 322.0621084 57.4550564"/>
+  <path class="cls-1" d="M226.0191894,253.3853654c-8.5037403-1.9203228-10.244272-4.2843856-10.244272-7.2452021,0-3.8100429,3.4007311-6.177931,8.8747987-6.177931,5.9598864,0,9.4065216,2.7236451,9.7010731,7.6659899l.0573802.921908h5.1948175l-.0459041-1.0251923c-.355757-7.8228291-5.9254583-12.4935744-14.9073667-12.4935744-8.5878979,0-14.1384725,4.3608925-14.1384725,11.1087998,0,6.2926914,4.2308308,9.888515,14.1422978,12.0192317,9.0048604,2.0159564,10.244272,4.7281255,10.244272,7.3561371,0,3 [...]
+  <path class="cls-1" d="M271.3533445,235.0313635c-12.344386,0-20.9628867,8.5955486-20.9628867,20.9055065s8.6185007,20.9093319,20.9628867,20.9093319c12.3099579,0,20.9055065-8.599374,20.9055065-20.9093319s-8.5955486-20.9055065-20.9055065-20.9055065ZM271.3533445,271.6934631c-9.3261894,0-15.5921033-6.3309448-15.5921033-15.7565931,0-9.421823,6.2659139-15.7527678,15.5921033-15.7527678,9.2917613,0,15.5347231,6.3309448,15.5347231,15.7527678,0,9.4256483-6.2429619,15.7565931-15.5347231,15.7565931Z"/>
+  <polygon class="cls-1" points="305.0048982 276.1844173 310.2647466 276.1844173 310.2647466 259.0660016 326.725203 259.0660016 326.725203 254.0777527 310.2647466 254.0777527 310.2647466 240.7311265 328.1558818 240.7311265 328.1558818 235.693148 305.0048982 235.693148 305.0048982 276.1844173"/>
+  <polygon class="cls-1" points="337.669513 240.8420614 350.935807 240.8420614 350.935807 276.1844173 356.1994808 276.1844173 356.1994808 240.8420614 369.4657747 240.8420614 369.4657747 235.693148 337.669513 235.693148 337.669513 240.8420614"/>
+  <polygon class="cls-1" points="420.5685491 266.9691629 409.2493553 235.693148 404.6818942 235.693148 393.3550498 266.9041321 383.1184285 235.693148 377.5946314 235.693148 390.8379733 276.1844173 395.5431467 276.1844173 406.9656248 244.6100256 418.445483 276.1844173 423.0856256 276.1844173 436.3939984 235.693148 430.8051704 235.693148 420.5685491 266.9691629"/>
+  <path class="cls-1" d="M460.2679721,235.693148h-4.555985l-16.7741347,40.4912693h5.6385575l4.0739917-9.7431519h18.6256013l4.0739917,9.7431519h5.6385575l-16.4681072-39.8868649-.2524727-.6044044ZM465.4207108,261.5639514h-14.8576372l7.4058665-18.0785771,7.4517707,18.0785771Z"/>
+  <path class="cls-1" d="M516.1830295,248.726096c0-7.9184627-5.4205129-13.032948-13.8056675-13.032948h-15.3472813v40.4912693h5.2598484v-14.4789281h8.8097679l10.2404467,14.4789281h6.3653729l-10.710964-15.0527298c5.7074137-1.6181206,9.188477-6.2506126,9.188477-12.4055915ZM492.2899291,240.6775716h9.7584533c5.5199718,0,8.8174186,3.010546,8.8174186,8.0485244,0,5.0073757-3.2974468,7.9949696-8.8174186,7.9949696h-9.7584533v-16.0434939Z"/>
+  <polygon class="cls-1" points="534.6403157 258.0714121 552.5888311 258.0714121 552.5888311 253.0869885 534.6403157 253.0869885 534.6403157 240.6240168 554.0195098 240.6240168 554.0195098 235.693148 529.3804673 235.693148 529.3804673 276.1844173 554.6239142 276.1844173 554.6239142 271.1999937 534.6403157 271.1999937 534.6403157 258.0714121"/>
+  <polygon class="cls-1" points="588.6273996 276.1844173 593.887248 276.1844173 593.887248 259.0660016 610.3477045 259.0660016 610.3477045 254.0777527 593.887248 254.0777527 593.887248 240.7311265 611.7783832 240.7311265 611.7783832 235.693148 588.6273996 235.693148 588.6273996 276.1844173"/>
+  <path class="cls-1" d="M642.220473,235.0313635c-12.344386,0-20.9628867,8.5955486-20.9628867,20.9055065s8.6185007,20.9093319,20.9628867,20.9093319c12.3099579,0,20.9055065-8.599374,20.9055065-20.9093319s-8.5955486-20.9055065-20.9055065-20.9055065ZM642.220473,271.6934631c-9.3261894,0-15.5921033-6.3309448-15.5921033-15.7565931,0-9.421823,6.2659139-15.7527678,15.5921033-15.7527678,9.2917613,0,15.5347231,6.3309448,15.5347231,15.7527678,0,9.4256483-6.2429619,15.7565931-15.5347231,15.7565931Z"/>
+  <path class="cls-1" d="M701.2149326,260.0108617c0,7.5321029-3.6608545,11.6826015-10.3054775,11.6826015-6.6101949,0-10.2519227-4.1504986-10.2519227-11.6826015v-24.3177136h-5.2636737v24.5395836c0,10.2480973,5.944585,16.6134702,15.5155964,16.6134702,9.6016142,0,15.5653259-6.3653729,15.5653259-16.6134702v-24.5395836h-5.2598484v24.3177136Z"/>
+  <polygon class="cls-1" points="748.0141946 266.4489161 725.8233724 235.693148 721.3171169 235.693148 721.3171169 276.1844173 726.5769652 276.1844173 726.5769652 245.3750944 748.4732359 275.7789308 748.7677875 276.1844173 753.2204882 276.1844173 753.2204882 235.693148 748.0141946 235.693148 748.0141946 266.4489161"/>
+  <path class="cls-1" d="M781.5012585,235.693148h-13.032948v40.4912693h13.032948c12.8684582,0,21.1847567-7.9490654,21.1847567-20.2475473s-8.3162985-20.243722-21.1847567-20.243722ZM781.5012585,271.0890587h-7.7730996v-30.3005521h7.6659899c9.9688472,0,15.9210829,5.6615095,15.9210829,15.1483634,0,9.3453161-6.0593453,15.1521887-15.8139733,15.1521887Z"/>
+  <path class="cls-1" d="M829.8383089,235.693148h-4.555985l-16.7741347,40.4912693h5.6385575l4.0739917-9.7431519h18.6256013l4.0739917,9.7431519h5.6385575l-16.4681072-39.8868649-.2524727-.6044044ZM834.9910477,261.5639514h-14.8576372l7.4058665-18.0785771,7.4517707,18.0785771Z"/>
+  <polygon class="cls-1" points="847.8327284 240.8420614 861.0990224 240.8420614 861.0990224 276.1844173 866.3626962 276.1844173 866.3626962 240.8420614 879.6289901 240.8420614 879.6289901 235.693148 847.8327284 235.693148 847.8327284 240.8420614"/>
+  <rect class="cls-1" x="890.5962522" y="235.693148" width="5.2598484" height="40.4912693"/>
+  <path class="cls-1" d="M929.5497331,235.0313635c-12.344386,0-20.9628867,8.5955486-20.9628867,20.9055065s8.6185007,20.9093319,20.9628867,20.9093319c12.3099579,0,20.9055065-8.599374,20.9055065-20.9093319s-8.5955486-20.9055065-20.9055065-20.9055065ZM929.5497331,271.6934631c-9.3261894,0-15.5921033-6.3309448-15.5921033-15.7565931,0-9.421823,6.2659139-15.7527678,15.5921033-15.7527678,9.2917613,0,15.5347231,6.3309448,15.5347231,15.7527678,0,9.4256483-6.2429619,15.7565931-15.5347231,15.7565931Z"/>
+  <polygon class="cls-1" points="989.8983645 266.4489161 967.7075423 235.693148 963.2012868 235.693148 963.2012868 276.1844173 968.4611352 276.1844173 968.4611352 245.3750944 990.3574059 275.7789308 990.6519574 276.1844173 995.1046581 276.1844173 995.1046581 235.693148 989.8983645 235.693148 989.8983645 266.4489161"/>
+  <g>
+    <path class="cls-3" d="M79.3529196,117.0700188c7.4928931-18.5280551,15.8531831-37.0197693,24.8236154-53.4094569-13.3906177-9.9458951-26.2485562-31.3926879-31.5313566-40.8948431-1.8973708,2.1555815-3.1291316,4.6382299-3.6876319,6.6580117-4.9767729,17.9695548,12.7393528,39.6688202-1.5301377,31.7407942-11.88917-6.6063696-38.660842-21.0738217-48.8725986-6.6943525,11.4368231,14.6950601,41.3500591,51.6670126,60.7981094,62.5998466Z"/>
+    <path class="cls-2" d="M104.1765351,63.6605618c8.6921386-15.8809168,17.9552097-29.7898686,27.5587366-39.810358,0,0-9.5786621,13.8649604-23.2600059,41.5814924,8.2856957,2.2818179,31.8832883,6.9640393,64.7525591-1.5263124.808104-5.9732751-3.2075512-12.5433039-23.2188835-14.7428769-13.0645071-1.4345041,15.6810426-31.1956827-5.1431754-45.271037-.6723043-.455216-1.3331325-.8568771-1.980572-1.2164595-.6981253-.2505601-1.4354604-.4800807-2.222525-.6847366-24.3205826-6.3462462-27.6916673,34. [...]
+    <path class="cls-4" d="M59.7920216,170.4526983c5.4903254-16.4470678,12.0947823-34.9253933,19.560898-53.3826795-19.4480504-10.932834-49.3612863-47.9047865-60.7981094-62.5998466-2.0417775,2.8728336-3.4370718,6.8798817-3.9018512,12.3596874-2.4941245,29.4341116,27.8714585,51.2251853,21.8178511,55.2054561-8.0074019,5.2655864-23.9447426-12.6485009-30.2259579-1.266189,9.1043194,11.6959902,27.6495885,32.8291047,53.5471693,49.6835716Z"/>
+    <path class="cls-3" d="M143.9285565,106.9730225c-15.375015-5.483631,16.066446-20.1901671,26.2762899-35.7918338,1.3063551-1.994917,2.6567016-4.5731991,3.0229783-7.2758048-32.8692708,8.4903516-56.4668633,3.8081302-64.7525591,1.5263124-7.0826249,14.3507791-15.261211,32.4350942-23.7907725,54.2395566,8.8834058,3.7985669,45.1553203,17.8299297,96.3881563,17.9026113,8.613719-22.4356442-22.5523172-25.3983734-37.144093-30.6008416Z"/>
+    <path class="cls-4" d="M65.7327813,173.4135148c9.0345069,2.8154534,38.9697386,11.2254728,70.7621749,9.9592838,4.2709969-11.5640158-11.6969465-12.6924923-12.9975635-21.9670396-1.0070219-7.1763459,42.0223633,6.0306553,55.8672406-20.0639308.700038-1.3197438,1.2461059-2.5648933,1.7080162-3.7679641-51.232836-.0726815-87.5047505-14.1040444-96.3881563-17.9026113-6.2333985,15.9344716-12.6456319,33.8179562-18.9517119,53.7422619Z"/>
+    <path class="cls-1" d="M65.7327813,173.4135148c-4.0596466,12.8244667-8.0647821,26.5249373-11.9522882,41.0038654-1.3790366,5.133612-2.7418155,10.3628577-4.0854677,15.7068636,30.1752721,9.9611965,57.9616166.0229521,58.9036077-12.2946565.0076507-.0975463-.0105197-.1702278-.0047817-.2639488.7182084-13.0463367-18.8359953-5.8145233-18.3731286-13.6583918.4647793-7.9012486,34.1383287-.0459041,44.5518722-16.9864413.7985406-1.2987044,1.3187874-2.4520457,1.7223613-3.5480068-31.7924364,1.266189- [...]
+    <path class="cls-1" d="M6.2448523,120.7691267c-.4399146.7975843-.8367941,1.7194923-1.175337,2.8211914-5.8479951,19.0062231,35.5039767,44.5384835,29.8778515,50.1043595-5.0714502,5.0150264-11.6806888-6.4457051-19.8305848-1.7118416-.8932179.5202468-1.7998245,1.1762934-2.7303395,2.1307168-9.2171671,9.4428624-.1444067,36.6467983,26.0066031,51.1678052-6.1023805,20.4904567-12.1779835,43.3832296-18.1254376,67.3241468,2.1574942-.7555055,4.7396016-1.5129237,5.3822594-3.5480068.9649431-3.966882 [...]
+  </g>
+</svg>
\ No newline at end of file
diff --git a/assets/css/styles.6eac8809.css b/assets/css/styles.6eac8809.css
new file mode 100644
index 0000000..73ddfb0
--- /dev/null
+++ b/assets/css/styles.6eac8809.css
@@ -0,0 +1 @@
+code,pre{background-color:#f6f7f8}.card,kbd{background-color:#fff}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}html,pre code,table tr{background-color:transparent}a code,pre,table td,table th{color:inherit}blockquote,ol,pre,ul{margin:0 0 1rem}.button,code{vertical-align:middle}.button--out [...]
\ No newline at end of file
diff --git a/assets/js/01a85c17.778d577f.js b/assets/js/01a85c17.778d577f.js
new file mode 100644
index 0000000..a6d31e9
--- /dev/null
+++ b/assets/js/01a85c17.778d577f.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[209],{7673(e,t,a){a.r(t),a.d(t,{default:()=>j});a(1763);var r=a(3526),s=a(4232);var n=a(792),l=a(8931),i=a(6539),c=a(5774),u=a(3499);const g="tag_smEZ";var o=a(1987);function d(e){var t=e.letterEntry;return(0,o.jsxs)("article",{children:[(0,o.jsx)(u.A,{as:"h2",id:t.letter,children:t.letter}),(0,o.jsx)("ul",{className:"padding--none",children:t.tags.map(function(e){return(0,o.jsx)("li",{className:g,c [...]
\ No newline at end of file
diff --git a/assets/js/08af526d.c5189b2b.js b/assets/js/08af526d.c5189b2b.js
new file mode 100644
index 0000000..5765924
--- /dev/null
+++ b/assets/js/08af526d.c5189b2b.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[529],{1344(e){e.exports=JSON.parse('{"metadata":{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/112.8efa302c.js b/assets/js/112.8efa302c.js
new file mode 100644
index 0000000..1d2d39d
--- /dev/null
+++ b/assets/js/112.8efa302c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[112],{2112(e,t,n){n.r(t),n.d(t,{default:()=>l});n(1763);var i=n(4232),s=n(792),a=n(3759),o=n(3526),r=n(3499),d=n(1987);function h(e){var t=e.className;return(0,d.jsx)("main",{className:(0,o.A)("container margin-vert--xl",t),children:(0,d.jsx)("div",{className:"row",children:(0,d.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,d.jsx)(r.A,{as:"h1",className:"hero__title",children:(0,d.j [...]
\ No newline at end of file
diff --git a/assets/js/15fde409.e859bedc.js b/assets/js/15fde409.e859bedc.js
new file mode 100644
index 0000000..988376c
--- /dev/null
+++ b/assets/js/15fde409.e859bedc.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[361],{2592(a){a.exports=JSON.parse('{"tag":{"label":"async rust","permalink":"/blog/tags/async-rust","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/async-rust","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/1df93b7f.91bac7ec.js b/assets/js/1df93b7f.91bac7ec.js
new file mode 100644
index 0000000..f8726b1
--- /dev/null
+++ b/assets/js/1df93b7f.91bac7ec.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[583],{5353(e,n,s){s.r(n),s.d(n,{default:()=>o});var r=s(4688),t=s(3759),c=s(1987),d=s(7008);function i(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,d.R)(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,c.jsx)(n.p,{children:"Asyncband's async AP [...]
\ No newline at end of file
diff --git a/assets/js/1f391b9e.3bc213a8.js b/assets/js/1f391b9e.3bc213a8.js
new file mode 100644
index 0000000..9403ad9
--- /dev/null
+++ b/assets/js/1f391b9e.3bc213a8.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[61],{9394(e,a,s){s.r(a),s.d(a,{default:()=>x});s(1763);var t=s(3526),l=s(792),d=s(8931),i=s(3759),n=s(4688),c=s(3716),r=s(4669),o=s(8239);const m="mdxPageWrapper_zCGC";var p=s(1987);function x(e){var a,s=e.content,x=s.metadata,g=s.assets,h=x.title,j=x.editUrl,_=x.description,v=x.frontMatter,A=x.lastUpdatedBy,u=x.lastUpdatedAt,w=v.keywords,f=v.wrapperClassName,N=v.hide_table_of_contents,b=null!=(a=g. [...]
\ No newline at end of file
diff --git a/assets/js/2063472f.4bfeb7e1.js b/assets/js/2063472f.4bfeb7e1.js
new file mode 100644
index 0000000..c72275c
--- /dev/null
+++ b/assets/js/2063472f.4bfeb7e1.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[215],{7646(s){s.exports=JSON.parse('{"tags":[{"label":"async rust","permalink":"/blog/tags/async-rust","count":1},{"label":"concurrency","permalink":"/blog/tags/concurrency","count":1}]}')}}]);
\ No newline at end of file
diff --git a/assets/js/262.7e82fe17.js b/assets/js/262.7e82fe17.js
new file mode 100644
index 0000000..c1af27c
--- /dev/null
+++ b/assets/js/262.7e82fe17.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[262],{5811(e,n,t){t.d(n,{A:()=>c});t(1763);var a=t(3526),i=t(8931),s=t(248),r=t(5930),l=t(1987);function d(e){var n=e.className;return(0,l.jsx)(r.A,{type:"caution",title:(0,l.jsx)(s.Rc,{}),className:(0,a.A)(n,i.G.common.unlistedBanner),children:(0,l.jsx)(s.Uh,{})})}function c(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(s.AE,{}),(0,l.jsx)(d,Object.assign({},e))]})}},4669(e,n,t){t.d(n,{A:()=>o [...]
\ No newline at end of file
diff --git a/assets/js/36994c47.6c929656.js b/assets/js/36994c47.6c929656.js
new file mode 100644
index 0000000..34c4346
--- /dev/null
+++ b/assets/js/36994c47.6c929656.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[858],{5516(s){s.exports=JSON.parse('{"name":"docusaurus-plugin-content-blog","id":"default"}')}}]);
\ No newline at end of file
diff --git a/assets/js/4d6bcb0d.b3be3e69.js b/assets/js/4d6bcb0d.b3be3e69.js
new file mode 100644
index 0000000..4fe939b
--- /dev/null
+++ b/assets/js/4d6bcb0d.b3be3e69.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[200],{3237(e,n,t){t.r(n),t.d(n,{default:()=>c,metadata:()=>s});var s=t(7047),i=t(1987),a=t(7008);const r={authorsImageUrls:[void 0]};function o(e){const n={a:"a",code:"code",em:"em",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:(0,i.jsx)(n.em,{children:"This post is written against asyncband 0.7 (l [...]
\ No newline at end of file
diff --git a/assets/js/621db11d.68b6166f.js b/assets/js/621db11d.68b6166f.js
new file mode 100644
index 0000000..ba20f96
--- /dev/null
+++ b/assets/js/621db11d.68b6166f.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[212],{138(t,e,s){s.r(e),s.d(e,{default:()=>m});s(1763);var a=s(3526),r=s(792),u=s(8931),o=s(8425),n=s(6539),l=s(2706),i=s(3499),c=s(7354);const h={authorListItem:"authorListItem_AOlD"};var g=s(1987);function p(t){var e=t.author;return(0,g.jsx)("li",{className:h.authorListItem,children:(0,g.jsx)(c.A,{as:"h2",author:e,count:e.count})})}function d(t){var e=t.authors;return(0,g.jsx)("section",{className [...]
\ No newline at end of file
diff --git a/assets/js/674.284ae362.js b/assets/js/674.284ae362.js
new file mode 100644
index 0000000..c0dfaac
--- /dev/null
+++ b/assets/js/674.284ae362.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[674],{1518(e,a,t){t.d(a,{A:()=>i});t(1763);var s=t(4232),n=t(1579),r=t(1987);function i(e){var a=e.metadata,t=a.previousPage,i=a.nextPage;return(0,r.jsxs)("nav",{className:"pagination-nav","aria-label":(0,s.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[t&&(0,r.jsx)(n.A,{permalink:t,title:(0,r.jsx)(s.A,{ [...]
\ No newline at end of file
diff --git a/assets/js/6875c492.8f5c0bc8.js b/assets/js/6875c492.8f5c0bc8.js
new file mode 100644
index 0000000..e02f850
--- /dev/null
+++ b/assets/js/6875c492.8f5c0bc8.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[813],{326(e,t,n){n.r(t),n.d(t,{default:()=>x});n(1763);var s=n(3526),i=n(4232),a=n(8931),r=n(792),l=n(8425),o=n(7403),c=n(6539),d=n(1518),u=n(2706),g=n(2771),h=n(5811),p=n(3499),m=n(1987);function b(e){var t=e.tag,n=(0,l.ZD)(t);return(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(r.be,{title:n,description:t.description}),(0,m.jsx)(u.A,{tag:"blog_tags_posts"})]})}function f(e){var t=e.tag,n=e.items,s=e.s [...]
\ No newline at end of file
diff --git a/assets/js/7ce54071.5158a402.js b/assets/js/7ce54071.5158a402.js
new file mode 100644
index 0000000..0b27b8e
--- /dev/null
+++ b/assets/js/7ce54071.5158a402.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[591],{167(e,n,t){t.r(n),t.d(n,{default:()=>c,metadata:()=>s});var s=t(7047),a=t(1987),i=t(7008);const o={authorsImageUrls:[void 0]};function r(e){const n={a:"a",code:"code",em:"em",p:"p",strong:"strong",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.p,{children:(0,a.jsx)(n.em,{children:"This post is written against asyncband 0.7 (links point to the 0.7.3 docs); the  [...]
\ No newline at end of file
diff --git a/assets/js/814f3328.6d4106b8.js b/assets/js/814f3328.6d4106b8.js
new file mode 100644
index 0000000..c2ceb84
--- /dev/null
+++ b/assets/js/814f3328.6d4106b8.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[472],{5513(e){e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"Counting, Signaling, and Cancelling: Choosing the Right Asyncband Primitive","permalink":"/blog/2026/10/14/choosing-the-right-primitive","unlisted":false,"date":"2026-10-14T00:00:00.000Z"}]}')}}]);
\ No newline at end of file
diff --git a/assets/js/821.9dab4af2.js b/assets/js/821.9dab4af2.js
new file mode 100644
index 0000000..633c748
--- /dev/null
+++ b/assets/js/821.9dab4af2.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[821],{821(e,t,n){function o(e,{target:t=document.body}={}){if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const n=document.createElement("textarea"),o=document.activeElement;n.value=e,n.setAttribute("readonly",""),n.style.all="unset",n.style.contain="strict",n.style.position="absolute",n.style.left="-9999px",n.style.width="2em",n.sty [...]
\ No newline at end of file
diff --git a/assets/js/86.1bb03a0c.js b/assets/js/86.1bb03a0c.js
new file mode 100644
index 0000000..093c98f
--- /dev/null
+++ b/assets/js/86.1bb03a0c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[86],{7354(e,t,s){s.d(t,{A:()=>A});var a=s(1763),n=s(3526),l=s(7403),r=s(1987);const i="githubSvg_Yq27";const o="xSvg_ukBb";const c="linkedinSvg_Cdjo";const h=function(e){return(0,r.jsxs)("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},e,{children:[(0,r. [...]
\ No newline at end of file
diff --git a/assets/js/9e4087bc.ad2c8772.js b/assets/js/9e4087bc.ad2c8772.js
new file mode 100644
index 0000000..9c6aafa
--- /dev/null
+++ b/assets/js/9e4087bc.ad2c8772.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[711],{5968(e,a,r){r.r(a),r.d(a,{default:()=>m});r(1763);var s=r(7403),t=r(4232),i=r(792),n=r(1094),c=r(3759),l=r(3499),d=r(1987);function h(e){var a=e.year,r=e.posts,t=(0,n.i)({day:"numeric",month:"long",timeZone:"UTC"});return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(l.A,{as:"h3",id:a,children:a}),(0,d.jsx)("ul",{children:r.map(function(e){return(0,d.jsx)("li",{children:(0,d.jsxs)(s.A,{to:e.metada [...]
\ No newline at end of file
diff --git a/assets/js/a6aa9e1f.db98cbd3.js b/assets/js/a6aa9e1f.db98cbd3.js
new file mode 100644
index 0000000..f2cec99
--- /dev/null
+++ b/assets/js/a6aa9e1f.db98cbd3.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[643],{6978(s,e,t){t.r(e),t.d(e,{default:()=>f});t(1763);var a=t(3526),i=t(5795),n=t(792),r=t(8931),c=t(6539),l=t(1518),d=t(2706),j=t(2771),b=t(9633),g=t(8140),o=t(1987);function p(s){var e=(0,g.kJ)(s);return(0,o.jsx)(b.A,{children:(0,o.jsx)("script",{type:"application/ld+json",children:JSON.stringify(e)})})}function u(s){var e=s.metadata,t=(0,i.A)().siteConfig.title,a=e.blogDescription,r=e.blogTitle [...]
\ No newline at end of file
diff --git a/assets/js/a7456010.ee6b39c2.js b/assets/js/a7456010.ee6b39c2.js
new file mode 100644
index 0000000..b1b9b50
--- /dev/null
+++ b/assets/js/a7456010.ee6b39c2.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[235],{8552(s){s.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]);
\ No newline at end of file
diff --git a/assets/js/acecf23e.1d48c40a.js b/assets/js/acecf23e.1d48c40a.js
new file mode 100644
index 0000000..718d6e5
--- /dev/null
+++ b/assets/js/acecf23e.1d48c40a.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[903],{1912(s){s.exports=JSON.parse('{"blogBasePath":"/blog","blogTitle":"Blog","authorsListPath":"/blog/authors"}')}}]);
\ No newline at end of file
diff --git a/assets/js/b3649d1e.9067cbfe.js b/assets/js/b3649d1e.9067cbfe.js
new file mode 100644
index 0000000..a2d6391
--- /dev/null
+++ b/assets/js/b3649d1e.9067cbfe.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[713],{7852(a){a.exports=JSON.parse('{"tag":{"label":"concurrency","permalink":"/blog/tags/concurrency","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/concurrency","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/ccc49370.cf3bb771.js b/assets/js/ccc49370.cf3bb771.js
new file mode 100644
index 0000000..d1beb48
--- /dev/null
+++ b/assets/js/ccc49370.cf3bb771.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[249],{5373(e,t,a){a.d(t,{A:()=>W});a(1763);var n=a(3526),r=a(8140),s=a(1987);function i(e){var t=e.children,a=e.className;return(0,s.jsx)("article",{className:a,children:t})}var l=a(7403);const o="title_ANO6";function c(e){var t=e.className,a=(0,r.e7)(),i=a.metadata,c=a.isBlogPostPage,d=i.permalink,m=i.title,g=c?"h1":"h2";return(0,s.jsx)(g,{className:(0,n.A)(o,t),children:c?m:(0,s.jsx)(l.A,{to:d,chi [...]
\ No newline at end of file
diff --git a/assets/js/common.188eaf07.js b/assets/js/common.188eaf07.js
new file mode 100644
index 0000000..7bb6407
--- /dev/null
+++ b/assets/js/common.188eaf07.js
@@ -0,0 +1,2 @@
+/*! For license information please see common.188eaf07.js.LICENSE.txt */
+(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[76],{8140(e,n,t){"use strict";t.d(n,{in:()=>l,OU:()=>w,Ki:()=>C,kJ:()=>v,x:()=>o,e7:()=>u,J_:()=>p,Gx:()=>A});var r=t(1763),a=t(1329),s=t(2436),i=t(1987);function o(){var e,n=(0,s.A)(),t=null==n||null==(e=n.data)?void 0:e.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}var c=r.createContext(null);f [...]
\ No newline at end of file
diff --git a/assets/js/common.188eaf07.js.LICENSE.txt b/assets/js/common.188eaf07.js.LICENSE.txt
new file mode 100644
index 0000000..775d393
--- /dev/null
+++ b/assets/js/common.188eaf07.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */
diff --git a/assets/js/da5fc804.58a218b4.js b/assets/js/da5fc804.58a218b4.js
new file mode 100644
index 0000000..e584258
--- /dev/null
+++ b/assets/js/da5fc804.58a218b4.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[822],{7246(e,a,n){n.r(a),n.d(a,{assets:()=>d,contentTitle:()=>i,default:()=>l,frontMatter:()=>t,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"type":"mdx","permalink":"/downloads","source":"@site/src/pages/downloads.md","title":"Downloads","description":"Apache Asyncband (Incubating) release downloads.","frontMatter":{"title":"Downloads","description":"Apache Asyncband (Incubating) release downloa [...]
\ No newline at end of file
diff --git a/assets/js/dbfc4782.79b087c0.js b/assets/js/dbfc4782.79b087c0.js
new file mode 100644
index 0000000..eccc652
--- /dev/null
+++ b/assets/js/dbfc4782.79b087c0.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[749],{1895(e){e.exports=JSON.parse('{"archive":{"blogPosts":[{"id":"/2026/10/14/choosing-the-right-primitive","metadata":{"permalink":"/blog/2026/10/14/choosing-the-right-primitive","source":"@site/blog/2026-10-14-choosing-the-right-primitive.md","title":"Counting, Signaling, and Cancelling: Choosing the Right Asyncband Primitive","description":"A field guide to picking between Semaphore, ManualRese [...]
\ No newline at end of file
diff --git a/assets/js/dd04b75e.cbbdbd7d.js b/assets/js/dd04b75e.cbbdbd7d.js
new file mode 100644
index 0000000..814198c
--- /dev/null
+++ b/assets/js/dd04b75e.cbbdbd7d.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[672],{3024(a){a.exports=JSON.parse('{"authors":[{"name":"Nanami","title":"Asyncband Contributor","url":"https://github.com/nanami-0713","imageURL":"/avatars/nanami.png","key":"nanami","page":null,"count":1}]}')}}]);
\ No newline at end of file
diff --git a/assets/js/main.e72938d6.js b/assets/js/main.e72938d6.js
new file mode 100644
index 0000000..0063d43
--- /dev/null
+++ b/assets/js/main.e72938d6.js
@@ -0,0 +1,2 @@
+/*! For license information please see main.e72938d6.js.LICENSE.txt */
+(self.webpackChunkasyncband_site=self.webpackChunkasyncband_site||[]).push([[792],{7552(e,t,n){const r={"./prism-bash":1022,"./prism-rust":2398,"./prism-toml":100};function a(e){const t=o(e);return n(t)}function o(e){if(!n.o(r,e)){const t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=7552},6977(e,t,n){"use strict";n.d(t,{mg:()=>J,vd:()=>W});var r=n.cw(function(e,t){e.exports=func [...]
\ No newline at end of file
diff --git a/assets/js/main.e72938d6.js.LICENSE.txt b/assets/js/main.e72938d6.js.LICENSE.txt
new file mode 100644
index 0000000..4c963e4
--- /dev/null
+++ b/assets/js/main.e72938d6.js.LICENSE.txt
@@ -0,0 +1,61 @@
+/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress
+ * @license MIT */
+
+/**
+ * @license React
+ * react-dom-client.production.js
+ *
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * react-dom.production.js
+ *
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * react-jsx-runtime.production.js
+ *
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * react.production.js
+ *
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * scheduler.production.js
+ *
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/** @license React v16.13.1
+ * react-is.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
diff --git a/assets/js/runtime~main.cc7ce440.js b/assets/js/runtime~main.cc7ce440.js
new file mode 100644
index 0000000..ad0b2a1
--- /dev/null
+++ b/assets/js/runtime~main.cc7ce440.js
@@ -0,0 +1 @@
+(()=>{"use strict";var e={};const t={};function r(n){const o=t[n];if(void 0!==o)return o.exports;const c=t[n]={exports:{}};return e[n].call(c.exports,c,c.exports,r),c.exports}r.m=e,(()=>{const e=[];r.O=(t,n,o,c)=>{if(n){c=c||0;for(var a=e.length;a>0&&e[a-1][2]>c;a--)e[a]=e[a-1];return void(e[a]=[n,o,c])}let f=1/0;for(a=0;a<e.length;a++){let[n,o,c]=e[a],i=!0;for(var d=0;d<n.length;d++)1&c&&!(f>=c)||!Object.keys(r.O).every(e=>r.O[e](n[d]))?(i=!1,c<f&&(f=c)):n.splice(d--,1);if(i){e.splice(a [...]
\ No newline at end of file
diff --git a/avatars/nanami.png b/avatars/nanami.png
new file mode 100644
index 0000000..668b859
Binary files /dev/null and b/avatars/nanami.png differ
diff --git a/blog/2026/10/14/choosing-the-right-primitive/index.html b/blog/2026/10/14/choosing-the-right-primitive/index.html
new file mode 100644
index 0000000..69b19df
--- /dev/null
+++ b/blog/2026/10/14/choosing-the-right-primitive/index.html
@@ -0,0 +1,41 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.10.2">
+<title data-rh="true">Counting, Signaling, and Cancelling: Choosing the Right Asyncband Primitive | Apache Asyncband (Incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://asyncband.apache.org/og.png"><meta data-rh="true" name="twitter:image" content="https://asyncband.apache.org/og.png"><meta data-rh="true" proper [...]
+<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Asyncband (Incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.6eac8809.css">
+<script src="/assets/js/runtime~main.cc7ce440.js" defer="defer"></script>
+<script src="/assets/js/main.e72938d6.js" defer="defer"></script>
+</head>
+<body>
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/avatars/nanami.png"><link rel="preload" as="image" href [...]
+<p>Asyncband ships a wide box of coordination primitives: locks, channels, latches, pools. Wide enough that the daily question is rarely &quot;how do I use X&quot; but &quot;which X is this job&quot;. This post walks the three you will reach for most often — <a href="https://docs.rs/asyncband/0.7.3/asyncband/semaphore/struct.Semaphore.html" target="_blank" rel="noopener noreferrer" class=""><code>Semaphore</code></a>, <a href="https://docs.rs/asyncband/0.7.3/asyncband/event/struct.Manual [...]
+<h2 class="anchor anchorTargetStickyNavbar_zq6S" id="count-when-you-bound-work">Count when you bound work<a href="#count-when-you-bound-work" class="hash-link" aria-label="Direct link to Count when you bound work" title="Direct link to Count when you bound work" translate="no">​</a></h2>
+<p>A semaphore&#x27;s state is a <em>number</em>. You reach for it when your condition is &quot;no more than N of these at once&quot;: concurrent requests against one backend, buffers in flight, tasks sharing a scarce resource.</p>
+<div class="language-rust codeBlockContainer_lkHg theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_KnrP"><pre tabindex="0" class="prism-code language-rust codeBlock_FDzL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pYqn"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token names [...]
+<p>The returned guard is the whole accounting story: acquire to enter, drop to leave, and the count stays consistent even if a task panics or is cancelled mid-work.</p>
+<h2 class="anchor anchorTargetStickyNavbar_zq6S" id="signal-when-you-notify">Signal when you notify<a href="#signal-when-you-notify" class="hash-link" aria-label="Direct link to Signal when you notify" title="Direct link to Signal when you notify" translate="no">​</a></h2>
+<p>When your condition is not a number but a <em>fact</em>, counting permits is the wrong shape. Asyncband&#x27;s events come in the two classic flavors, and the difference is how they treat state:</p>
+<ul>
+<li class=""><a href="https://docs.rs/asyncband/0.7.3/asyncband/event/struct.ManualResetEvent.html" target="_blank" rel="noopener noreferrer" class=""><code>ManualResetEvent</code></a> is a <em>level</em>. <code>set</code> releases every registered waiter and stays set — future waits pass immediately — until an explicit <code>reset</code>. Use it as a readiness gate: configuration loaded, connection established, shutdown initiated.</li>
+<li class=""><a href="https://docs.rs/asyncband/0.7.3/asyncband/event/struct.AutoResetEvent.html" target="_blank" rel="noopener noreferrer" class=""><code>AutoResetEvent</code></a> is an <em>edge</em>. Each <code>set</code> delivers one signal to one waiter; if nobody is waiting, one signal is retained. Bursts coalesce: three sets with no consumer in between leave one stored signal, not three.</li>
+</ul>
+<p>The clearest way to feel the difference is a workload that screams &quot;queue&quot; at first glance: a single worker that rebuilds a snapshot whenever a new revision is requested. Revisions arrive in bursts, but only the latest one matters — processing each intermediate revision would be wasted work. That rules out a channel: a channel&#x27;s contract is that every sent value is delivered, which is exactly the work you want to <em>avoid</em>. A <code>ManualResetEvent</code> is also w [...]
+<p>An <code>AutoResetEvent</code> plus an atomic for the latest revision fits:</p>
+<div class="language-rust codeBlockContainer_lkHg theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_KnrP"><pre tabindex="0" class="prism-code language-rust codeBlock_FDzL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pYqn"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token names [...]
+<p>Many producers call <code>request</code>; one consumer wakes, observes the <em>latest</em> state, and sleeps again. A signal that arrives between the state check and the wait is retained, so the worker cannot miss a change, and a leftover signal costs at most one extra predicate check. (This pattern is adapted from the <code>coalesced_worker</code> example in the <a href="https://github.com/apache/asyncband/tree/main/examples" target="_blank" rel="noopener noreferrer" class="">asyncba [...]
+<h2 class="anchor anchorTargetStickyNavbar_zq6S" id="the-sharp-edges-of-counting">The sharp edges of counting<a href="#the-sharp-edges-of-counting" class="hash-link" aria-label="Direct link to The sharp edges of counting" title="Direct link to The sharp edges of counting" translate="no">​</a></h2>
+<p>Semaphores look like the simplest primitive in the box, and most of the time they are. Four behaviors are worth internalizing before you build on them — all verified against the current implementation:</p>
+<p><strong>An acquisition larger than the semaphore can ever grant never completes.</strong> Permits arrive only when someone releases them. <code>acquire(5)</code> against a semaphore initialized with 3 and never topped up waits forever. Unlike a channel, there is no &quot;closed&quot; state that fails the wait; the caller owns the timeout.</p>
+<p><strong>Pending acquisitions complete in request order, and a big one at the head holds back smaller ones behind it.</strong> Permits are assigned to the queue head first. A partially satisfied <code>acquire(100)</code> keeps its place in line, so a stream of <code>acquire(1)</code> callers queued behind it waits until the big acquisition completes. This is fair — nobody jumps the line, and <code>try_acquire</code> cannot steal a handoff already assigned to a waiter — but if you mix s [...]
+<p><strong>Cancelling a pending acquisition passes its credit forward.</strong> Wrap <code>acquire</code> in a timeout or <code>select!</code> and the cancelled future returns the permits <em>already assigned to it</em> to the next queued waiters — not to the available count. Nothing is lost and nothing leaks; the place in line is what you give up. So a timeout like this is always safe on the semaphore side:</p>
+<div class="language-rust codeBlockContainer_lkHg theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_KnrP"><pre tabindex="0" class="prism-code language-rust codeBlock_FDzL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pYqn"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">match</span><span class="token plain"> </span><span class="token nam [...]
+<p><strong><code>drain_permits</code> and <code>reduce_permits</code> shrink by different rules.</strong> <a href="https://docs.rs/asyncband/0.7.3/asyncband/semaphore/struct.Semaphore.html#method.drain_permits" target="_blank" rel="noopener noreferrer" class=""><code>drain_permits(n)</code></a> removes up to <code>n</code> <em>currently available</em> permits and never creates a deficit; <a href="https://docs.rs/asyncband/0.7.3/asyncband/semaphore/struct.Semaphore.html#method.reduce_perm [...]
+<h2 class="anchor anchorTargetStickyNavbar_zq6S" id="where-to-go-next">Where to go next<a href="#where-to-go-next" class="hash-link" aria-label="Direct link to Where to go next" title="Direct link to Where to go next" translate="no">​</a></h2>
+<p>The <a href="https://docs.rs/asyncband/" target="_blank" rel="noopener noreferrer" class="">API documentation</a> covers each primitive&#x27;s ordering, cancellation, and memory-model contracts in detail, and the <a href="https://github.com/apache/asyncband/tree/main/examples" target="_blank" rel="noopener noreferrer" class="">examples crate</a> demonstrates the patterns above as complete runnable programs.</p></div><footer class="docusaurus-mt-lg"><div class="row margin-top--sm theme [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/blog/archive/index.html b/blog/archive/index.html
new file mode 100644
index 0000000..0d07aaa
--- /dev/null
+++ b/blog/archive/index.html
@@ -0,0 +1,17 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.10.2">
+<title data-rh="true">Archive | Apache Asyncband (Incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://asyncband.apache.org/og.png"><meta data-rh="true" name="twitter:image" content="https://asyncband.apache.org/og.png"><meta data-rh="true" property="og:url" content="https://asyncband.apache.org/blog/archive/"><me [...]
+<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Asyncband (Incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.6eac8809.css">
+<script src="/assets/js/runtime~main.cc7ce440.js" defer="defer"></script>
+<script src="/assets/js/main.e72938d6.js" defer="defer"></script>
+</head>
+<body>
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/asf-logo.svg"><div role="region" aria-label="Skip to ma [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/blog/atom.xml b/blog/atom.xml
new file mode 100644
index 0000000..2150aa1
--- /dev/null
+++ b/blog/atom.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+    <id>https://asyncband.apache.org/blog/</id>
+    <title>Apache Asyncband (Incubating) Blog</title>
+    <updated>2026-10-14T00:00:00.000Z</updated>
+    <generator>https://github.com/jpmonette/feed</generator>
+    <link rel="alternate" href="https://asyncband.apache.org/blog/"/>
+    <subtitle>Apache Asyncband (Incubating) Blog</subtitle>
+    <icon>https://asyncband.apache.org/favicon.svg</icon>
+    <entry>
+        <title type="html"><![CDATA[Counting, Signaling, and Cancelling: Choosing the Right Asyncband Primitive]]></title>
+        <id>https://asyncband.apache.org/blog/2026/10/14/choosing-the-right-primitive/</id>
+        <link href="https://asyncband.apache.org/blog/2026/10/14/choosing-the-right-primitive/"/>
+        <updated>2026-10-14T00:00:00.000Z</updated>
+        <summary type="html"><![CDATA[A field guide to picking between Semaphore, ManualResetEvent, and AutoResetEvent, and the sharp edges worth knowing before you rely on them.]]></summary>
+        <content type="html"><![CDATA[<p><em>This post is written against asyncband 0.7 (links point to the 0.7.3 docs); the crate is still pre-1.0, so later versions may require some adjustment.</em></p>
+<p>Asyncband ships a wide box of coordination primitives: locks, channels, latches, pools. Wide enough that the daily question is rarely "how do I use X" but "which X is this job". This post walks the three you will reach for most often — <a href="https://docs.rs/asyncband/0.7.3/asyncband/semaphore/struct.Semaphore.html" target="_blank" rel="noopener noreferrer" class=""><code>Semaphore</code></a>, <a href="https://docs.rs/asyncband/0.7.3/asyncband/event/struct.ManualResetEvent.html" tar [...]
+<h2 class="anchor anchorTargetStickyNavbar_zq6S" id="count-when-you-bound-work">Count when you bound work<a href="https://asyncband.apache.org/blog/2026/10/14/choosing-the-right-primitive/#count-when-you-bound-work" class="hash-link" aria-label="Direct link to Count when you bound work" title="Direct link to Count when you bound work" translate="no">​</a></h2>
+<p>A semaphore's state is a <em>number</em>. You reach for it when your condition is "no more than N of these at once": concurrent requests against one backend, buffers in flight, tasks sharing a scarce resource.</p>
+<div class="language-rust codeBlockContainer_lkHg theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_KnrP"><pre tabindex="0" class="prism-code language-rust codeBlock_FDzL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pYqn"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token names [...]
+<p>The returned guard is the whole accounting story: acquire to enter, drop to leave, and the count stays consistent even if a task panics or is cancelled mid-work.</p>
+<h2 class="anchor anchorTargetStickyNavbar_zq6S" id="signal-when-you-notify">Signal when you notify<a href="https://asyncband.apache.org/blog/2026/10/14/choosing-the-right-primitive/#signal-when-you-notify" class="hash-link" aria-label="Direct link to Signal when you notify" title="Direct link to Signal when you notify" translate="no">​</a></h2>
+<p>When your condition is not a number but a <em>fact</em>, counting permits is the wrong shape. Asyncband's events come in the two classic flavors, and the difference is how they treat state:</p>
+<ul>
+<li class=""><a href="https://docs.rs/asyncband/0.7.3/asyncband/event/struct.ManualResetEvent.html" target="_blank" rel="noopener noreferrer" class=""><code>ManualResetEvent</code></a> is a <em>level</em>. <code>set</code> releases every registered waiter and stays set — future waits pass immediately — until an explicit <code>reset</code>. Use it as a readiness gate: configuration loaded, connection established, shutdown initiated.</li>
+<li class=""><a href="https://docs.rs/asyncband/0.7.3/asyncband/event/struct.AutoResetEvent.html" target="_blank" rel="noopener noreferrer" class=""><code>AutoResetEvent</code></a> is an <em>edge</em>. Each <code>set</code> delivers one signal to one waiter; if nobody is waiting, one signal is retained. Bursts coalesce: three sets with no consumer in between leave one stored signal, not three.</li>
+</ul>
+<p>The clearest way to feel the difference is a workload that screams "queue" at first glance: a single worker that rebuilds a snapshot whenever a new revision is requested. Revisions arrive in bursts, but only the latest one matters — processing each intermediate revision would be wasted work. That rules out a channel: a channel's contract is that every sent value is delivered, which is exactly the work you want to <em>avoid</em>. A <code>ManualResetEvent</code> is also wrong: it would  [...]
+<p>An <code>AutoResetEvent</code> plus an atomic for the latest revision fits:</p>
+<div class="language-rust codeBlockContainer_lkHg theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_KnrP"><pre tabindex="0" class="prism-code language-rust codeBlock_FDzL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pYqn"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token names [...]
+<p>Many producers call <code>request</code>; one consumer wakes, observes the <em>latest</em> state, and sleeps again. A signal that arrives between the state check and the wait is retained, so the worker cannot miss a change, and a leftover signal costs at most one extra predicate check. (This pattern is adapted from the <code>coalesced_worker</code> example in the <a href="https://github.com/apache/asyncband/tree/main/examples" target="_blank" rel="noopener noreferrer" class="">asyncba [...]
+<h2 class="anchor anchorTargetStickyNavbar_zq6S" id="the-sharp-edges-of-counting">The sharp edges of counting<a href="https://asyncband.apache.org/blog/2026/10/14/choosing-the-right-primitive/#the-sharp-edges-of-counting" class="hash-link" aria-label="Direct link to The sharp edges of counting" title="Direct link to The sharp edges of counting" translate="no">​</a></h2>
+<p>Semaphores look like the simplest primitive in the box, and most of the time they are. Four behaviors are worth internalizing before you build on them — all verified against the current implementation:</p>
+<p><strong>An acquisition larger than the semaphore can ever grant never completes.</strong> Permits arrive only when someone releases them. <code>acquire(5)</code> against a semaphore initialized with 3 and never topped up waits forever. Unlike a channel, there is no "closed" state that fails the wait; the caller owns the timeout.</p>
+<p><strong>Pending acquisitions complete in request order, and a big one at the head holds back smaller ones behind it.</strong> Permits are assigned to the queue head first. A partially satisfied <code>acquire(100)</code> keeps its place in line, so a stream of <code>acquire(1)</code> callers queued behind it waits until the big acquisition completes. This is fair — nobody jumps the line, and <code>try_acquire</code> cannot steal a handoff already assigned to a waiter — but if you mix s [...]
+<p><strong>Cancelling a pending acquisition passes its credit forward.</strong> Wrap <code>acquire</code> in a timeout or <code>select!</code> and the cancelled future returns the permits <em>already assigned to it</em> to the next queued waiters — not to the available count. Nothing is lost and nothing leaks; the place in line is what you give up. So a timeout like this is always safe on the semaphore side:</p>
+<div class="language-rust codeBlockContainer_lkHg theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_KnrP"><pre tabindex="0" class="prism-code language-rust codeBlock_FDzL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pYqn"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">match</span><span class="token plain"> </span><span class="token nam [...]
+<p><strong><code>drain_permits</code> and <code>reduce_permits</code> shrink by different rules.</strong> <a href="https://docs.rs/asyncband/0.7.3/asyncband/semaphore/struct.Semaphore.html#method.drain_permits" target="_blank" rel="noopener noreferrer" class=""><code>drain_permits(n)</code></a> removes up to <code>n</code> <em>currently available</em> permits and never creates a deficit; <a href="https://docs.rs/asyncband/0.7.3/asyncband/semaphore/struct.Semaphore.html#method.reduce_perm [...]
+<h2 class="anchor anchorTargetStickyNavbar_zq6S" id="where-to-go-next">Where to go next<a href="https://asyncband.apache.org/blog/2026/10/14/choosing-the-right-primitive/#where-to-go-next" class="hash-link" aria-label="Direct link to Where to go next" title="Direct link to Where to go next" translate="no">​</a></h2>
+<p>The <a href="https://docs.rs/asyncband/" target="_blank" rel="noopener noreferrer" class="">API documentation</a> covers each primitive's ordering, cancellation, and memory-model contracts in detail, and the <a href="https://github.com/apache/asyncband/tree/main/examples" target="_blank" rel="noopener noreferrer" class="">examples crate</a> demonstrates the patterns above as complete runnable programs.</p>]]></content>
+        <author>
+            <name>Nanami</name>
+            <uri>https://github.com/nanami-0713</uri>
+        </author>
+        <category label="async rust" term="async rust"/>
+        <category label="concurrency" term="concurrency"/>
+    </entry>
+</feed>
\ No newline at end of file
diff --git a/blog/authors/index.html b/blog/authors/index.html
new file mode 100644
index 0000000..5fd06a0
--- /dev/null
+++ b/blog/authors/index.html
@@ -0,0 +1,17 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-authors-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.10.2">
+<title data-rh="true">Authors | Apache Asyncband (Incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://asyncband.apache.org/og.png"><meta data-rh="true" name="twitter:image" content="https://asyncband.apache.org/og.png"><meta data-rh="true" property="og:url" content="https://asyncband.apache.org/blog/authors/"><me [...]
+<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Asyncband (Incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.6eac8809.css">
+<script src="/assets/js/runtime~main.cc7ce440.js" defer="defer"></script>
+<script src="/assets/js/main.e72938d6.js" defer="defer"></script>
+</head>
+<body>
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/avatars/nanami.png"><link rel="preload" as="image" href [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/blog/index.html b/blog/index.html
new file mode 100644
index 0000000..9945192
--- /dev/null
+++ b/blog/index.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.10.2">
+<title data-rh="true">Blog | Apache Asyncband (Incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://asyncband.apache.org/og.png"><meta data-rh="true" name="twitter:image" content="https://asyncband.apache.org/og.png"><meta data-rh="true" property="og:url" content="https://asyncband.apache.org/blog/"><meta data-rh= [...]
+<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Asyncband (Incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.6eac8809.css">
+<script src="/assets/js/runtime~main.cc7ce440.js" defer="defer"></script>
+<script src="/assets/js/main.e72938d6.js" defer="defer"></script>
+</head>
+<body>
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/avatars/nanami.png"><link rel="preload" as="image" href [...]
+<p>Asyncband ships a wide box of coordination primitives: locks, channels, latches, pools. Wide enough that the daily question is rarely &quot;how do I use X&quot; but &quot;which X is this job&quot;. This post walks the three you will reach for most often — <a href="https://docs.rs/asyncband/0.7.3/asyncband/semaphore/struct.Semaphore.html" target="_blank" rel="noopener noreferrer" class=""><code>Semaphore</code></a>, <a href="https://docs.rs/asyncband/0.7.3/asyncband/event/struct.Manual [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/blog/rss.xml b/blog/rss.xml
new file mode 100644
index 0000000..8237ad8
--- /dev/null
+++ b/blog/rss.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
+    <channel>
+        <title>Apache Asyncband (Incubating) Blog</title>
+        <link>https://asyncband.apache.org/blog/</link>
+        <description>Apache Asyncband (Incubating) Blog</description>
+        <lastBuildDate>Wed, 14 Oct 2026 00:00:00 GMT</lastBuildDate>
+        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
+        <generator>https://github.com/jpmonette/feed</generator>
+        <language>en</language>
+        <item>
+            <title><![CDATA[Counting, Signaling, and Cancelling: Choosing the Right Asyncband Primitive]]></title>
+            <link>https://asyncband.apache.org/blog/2026/10/14/choosing-the-right-primitive/</link>
+            <guid>https://asyncband.apache.org/blog/2026/10/14/choosing-the-right-primitive/</guid>
+            <pubDate>Wed, 14 Oct 2026 00:00:00 GMT</pubDate>
+            <description><![CDATA[A field guide to picking between Semaphore, ManualResetEvent, and AutoResetEvent, and the sharp edges worth knowing before you rely on them.]]></description>
+            <content:encoded><![CDATA[<p><em>This post is written against asyncband 0.7 (links point to the 0.7.3 docs); the crate is still pre-1.0, so later versions may require some adjustment.</em></p>
+<p>Asyncband ships a wide box of coordination primitives: locks, channels, latches, pools. Wide enough that the daily question is rarely "how do I use X" but "which X is this job". This post walks the three you will reach for most often — <a href="https://docs.rs/asyncband/0.7.3/asyncband/semaphore/struct.Semaphore.html" target="_blank" rel="noopener noreferrer" class=""><code>Semaphore</code></a>, <a href="https://docs.rs/asyncband/0.7.3/asyncband/event/struct.ManualResetEvent.html" tar [...]
+<h2 class="anchor anchorTargetStickyNavbar_zq6S" id="count-when-you-bound-work">Count when you bound work<a href="https://asyncband.apache.org/blog/2026/10/14/choosing-the-right-primitive/#count-when-you-bound-work" class="hash-link" aria-label="Direct link to Count when you bound work" title="Direct link to Count when you bound work" translate="no">​</a></h2>
+<p>A semaphore's state is a <em>number</em>. You reach for it when your condition is "no more than N of these at once": concurrent requests against one backend, buffers in flight, tasks sharing a scarce resource.</p>
+<div class="language-rust codeBlockContainer_lkHg theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_KnrP"><pre tabindex="0" class="prism-code language-rust codeBlock_FDzL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pYqn"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token names [...]
+<p>The returned guard is the whole accounting story: acquire to enter, drop to leave, and the count stays consistent even if a task panics or is cancelled mid-work.</p>
+<h2 class="anchor anchorTargetStickyNavbar_zq6S" id="signal-when-you-notify">Signal when you notify<a href="https://asyncband.apache.org/blog/2026/10/14/choosing-the-right-primitive/#signal-when-you-notify" class="hash-link" aria-label="Direct link to Signal when you notify" title="Direct link to Signal when you notify" translate="no">​</a></h2>
+<p>When your condition is not a number but a <em>fact</em>, counting permits is the wrong shape. Asyncband's events come in the two classic flavors, and the difference is how they treat state:</p>
+<ul>
+<li class=""><a href="https://docs.rs/asyncband/0.7.3/asyncband/event/struct.ManualResetEvent.html" target="_blank" rel="noopener noreferrer" class=""><code>ManualResetEvent</code></a> is a <em>level</em>. <code>set</code> releases every registered waiter and stays set — future waits pass immediately — until an explicit <code>reset</code>. Use it as a readiness gate: configuration loaded, connection established, shutdown initiated.</li>
+<li class=""><a href="https://docs.rs/asyncband/0.7.3/asyncband/event/struct.AutoResetEvent.html" target="_blank" rel="noopener noreferrer" class=""><code>AutoResetEvent</code></a> is an <em>edge</em>. Each <code>set</code> delivers one signal to one waiter; if nobody is waiting, one signal is retained. Bursts coalesce: three sets with no consumer in between leave one stored signal, not three.</li>
+</ul>
+<p>The clearest way to feel the difference is a workload that screams "queue" at first glance: a single worker that rebuilds a snapshot whenever a new revision is requested. Revisions arrive in bursts, but only the latest one matters — processing each intermediate revision would be wasted work. That rules out a channel: a channel's contract is that every sent value is delivered, which is exactly the work you want to <em>avoid</em>. A <code>ManualResetEvent</code> is also wrong: it would  [...]
+<p>An <code>AutoResetEvent</code> plus an atomic for the latest revision fits:</p>
+<div class="language-rust codeBlockContainer_lkHg theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_KnrP"><pre tabindex="0" class="prism-code language-rust codeBlock_FDzL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pYqn"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token names [...]
+<p>Many producers call <code>request</code>; one consumer wakes, observes the <em>latest</em> state, and sleeps again. A signal that arrives between the state check and the wait is retained, so the worker cannot miss a change, and a leftover signal costs at most one extra predicate check. (This pattern is adapted from the <code>coalesced_worker</code> example in the <a href="https://github.com/apache/asyncband/tree/main/examples" target="_blank" rel="noopener noreferrer" class="">asyncba [...]
+<h2 class="anchor anchorTargetStickyNavbar_zq6S" id="the-sharp-edges-of-counting">The sharp edges of counting<a href="https://asyncband.apache.org/blog/2026/10/14/choosing-the-right-primitive/#the-sharp-edges-of-counting" class="hash-link" aria-label="Direct link to The sharp edges of counting" title="Direct link to The sharp edges of counting" translate="no">​</a></h2>
+<p>Semaphores look like the simplest primitive in the box, and most of the time they are. Four behaviors are worth internalizing before you build on them — all verified against the current implementation:</p>
+<p><strong>An acquisition larger than the semaphore can ever grant never completes.</strong> Permits arrive only when someone releases them. <code>acquire(5)</code> against a semaphore initialized with 3 and never topped up waits forever. Unlike a channel, there is no "closed" state that fails the wait; the caller owns the timeout.</p>
+<p><strong>Pending acquisitions complete in request order, and a big one at the head holds back smaller ones behind it.</strong> Permits are assigned to the queue head first. A partially satisfied <code>acquire(100)</code> keeps its place in line, so a stream of <code>acquire(1)</code> callers queued behind it waits until the big acquisition completes. This is fair — nobody jumps the line, and <code>try_acquire</code> cannot steal a handoff already assigned to a waiter — but if you mix s [...]
+<p><strong>Cancelling a pending acquisition passes its credit forward.</strong> Wrap <code>acquire</code> in a timeout or <code>select!</code> and the cancelled future returns the permits <em>already assigned to it</em> to the next queued waiters — not to the available count. Nothing is lost and nothing leaks; the place in line is what you give up. So a timeout like this is always safe on the semaphore side:</p>
+<div class="language-rust codeBlockContainer_lkHg theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_KnrP"><pre tabindex="0" class="prism-code language-rust codeBlock_FDzL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pYqn"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">match</span><span class="token plain"> </span><span class="token nam [...]
+<p><strong><code>drain_permits</code> and <code>reduce_permits</code> shrink by different rules.</strong> <a href="https://docs.rs/asyncband/0.7.3/asyncband/semaphore/struct.Semaphore.html#method.drain_permits" target="_blank" rel="noopener noreferrer" class=""><code>drain_permits(n)</code></a> removes up to <code>n</code> <em>currently available</em> permits and never creates a deficit; <a href="https://docs.rs/asyncband/0.7.3/asyncband/semaphore/struct.Semaphore.html#method.reduce_perm [...]
+<h2 class="anchor anchorTargetStickyNavbar_zq6S" id="where-to-go-next">Where to go next<a href="https://asyncband.apache.org/blog/2026/10/14/choosing-the-right-primitive/#where-to-go-next" class="hash-link" aria-label="Direct link to Where to go next" title="Direct link to Where to go next" translate="no">​</a></h2>
+<p>The <a href="https://docs.rs/asyncband/" target="_blank" rel="noopener noreferrer" class="">API documentation</a> covers each primitive's ordering, cancellation, and memory-model contracts in detail, and the <a href="https://github.com/apache/asyncband/tree/main/examples" target="_blank" rel="noopener noreferrer" class="">examples crate</a> demonstrates the patterns above as complete runnable programs.</p>]]></content:encoded>
+            <category>async rust</category>
+            <category>concurrency</category>
+        </item>
+    </channel>
+</rss>
\ No newline at end of file
diff --git a/blog/tags/async-rust/index.html b/blog/tags/async-rust/index.html
new file mode 100644
index 0000000..e851867
--- /dev/null
+++ b/blog/tags/async-rust/index.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.10.2">
+<title data-rh="true">One post tagged with &quot;async rust&quot; | Apache Asyncband (Incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://asyncband.apache.org/og.png"><meta data-rh="true" name="twitter:image" content="https://asyncband.apache.org/og.png"><meta data-rh="true" property="og:url" content="https://asy [...]
+<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Asyncband (Incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.6eac8809.css">
+<script src="/assets/js/runtime~main.cc7ce440.js" defer="defer"></script>
+<script src="/assets/js/main.e72938d6.js" defer="defer"></script>
+</head>
+<body>
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/avatars/nanami.png"><link rel="preload" as="image" href [...]
+<p>Asyncband ships a wide box of coordination primitives: locks, channels, latches, pools. Wide enough that the daily question is rarely &quot;how do I use X&quot; but &quot;which X is this job&quot;. This post walks the three you will reach for most often — <a href="https://docs.rs/asyncband/0.7.3/asyncband/semaphore/struct.Semaphore.html" target="_blank" rel="noopener noreferrer" class=""><code>Semaphore</code></a>, <a href="https://docs.rs/asyncband/0.7.3/asyncband/event/struct.Manual [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/blog/tags/concurrency/index.html b/blog/tags/concurrency/index.html
new file mode 100644
index 0000000..733352d
--- /dev/null
+++ b/blog/tags/concurrency/index.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.10.2">
+<title data-rh="true">One post tagged with &quot;concurrency&quot; | Apache Asyncband (Incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://asyncband.apache.org/og.png"><meta data-rh="true" name="twitter:image" content="https://asyncband.apache.org/og.png"><meta data-rh="true" property="og:url" content="https://as [...]
+<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Asyncband (Incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.6eac8809.css">
+<script src="/assets/js/runtime~main.cc7ce440.js" defer="defer"></script>
+<script src="/assets/js/main.e72938d6.js" defer="defer"></script>
+</head>
+<body>
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/avatars/nanami.png"><link rel="preload" as="image" href [...]
+<p>Asyncband ships a wide box of coordination primitives: locks, channels, latches, pools. Wide enough that the daily question is rarely &quot;how do I use X&quot; but &quot;which X is this job&quot;. This post walks the three you will reach for most often — <a href="https://docs.rs/asyncband/0.7.3/asyncband/semaphore/struct.Semaphore.html" target="_blank" rel="noopener noreferrer" class=""><code>Semaphore</code></a>, <a href="https://docs.rs/asyncband/0.7.3/asyncband/event/struct.Manual [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/blog/tags/index.html b/blog/tags/index.html
new file mode 100644
index 0000000..3fbbf8e
--- /dev/null
+++ b/blog/tags/index.html
@@ -0,0 +1,17 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.10.2">
+<title data-rh="true">Tags | Apache Asyncband (Incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://asyncband.apache.org/og.png"><meta data-rh="true" name="twitter:image" content="https://asyncband.apache.org/og.png"><meta data-rh="true" property="og:url" content="https://asyncband.apache.org/blog/tags/"><meta dat [...]
+<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Asyncband (Incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.6eac8809.css">
+<script src="/assets/js/runtime~main.cc7ce440.js" defer="defer"></script>
+<script src="/assets/js/main.e72938d6.js" defer="defer"></script>
+</head>
+<body>
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/asf-logo.svg"><div role="region" aria-label="Skip to ma [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/downloads/index.html b/downloads/index.html
new file mode 100644
index 0000000..8cfe245
--- /dev/null
+++ b/downloads/index.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="mdx-wrapper mdx-page plugin-pages plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.10.2">
+<title data-rh="true">Downloads | Apache Asyncband (Incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://asyncband.apache.org/og.png"><meta data-rh="true" name="twitter:image" content="https://asyncband.apache.org/og.png"><meta data-rh="true" property="og:url" content="https://asyncband.apache.org/downloads/"><met [...]
+<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Asyncband (Incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.6eac8809.css">
+<script src="/assets/js/runtime~main.cc7ce440.js" defer="defer"></script>
+<script src="/assets/js/main.e72938d6.js" defer="defer"></script>
+</head>
+<body>
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/asf-logo.svg"><div role="region" aria-label="Skip to ma [...]
+<h2 class="anchor anchorTargetStickyNavbar_zq6S" id="download">Download<a href="#download" class="hash-link" aria-label="Direct link to Download" title="Direct link to Download" translate="no">​</a></h2>
+<p>Apache Asyncband (Incubating) maintains only the current version and do monotonic releases; that is, no backport.</p>
+<p>The current release can be <a href="#current-release" class="">downloaded using these links</a>.</p>
+<p>Older releases are available from the <a href="https://archive.apache.org/dist/incubator/asyncband/" target="_blank" rel="noopener noreferrer" class="">Apache archive</a>.</p>
+<p>You can verify the integrity of a downloaded release using the PGP signatures and hashes hosted at the main Apache distribution site. For additional information, refer to the Apache documentation for <a href="https://www.apache.org/info/verification.html" target="_blank" rel="noopener noreferrer" class="">verifying the integrity of Apache project releases</a>. The crates.io release for Asyncband are available at <a href="https://crates.io/crates/asyncband" target="_blank" rel="noopene [...]
+<h2 class="anchor anchorTargetStickyNavbar_zq6S" id="current-release">Current release<a href="#current-release" class="hash-link" aria-label="Direct link to Current release" title="Direct link to Current release" translate="no">​</a></h2>
+<p>Apache Asyncband (Incubating) releases are provided as source archives. The latest release is <strong>0.7.3</strong>.</p>
+<ul>
+<li class="">Current release: <a href="https://www.apache.org/dyn/closer.lua/incubator/asyncband/0.7.3/apache-asyncband-0.7.3-incubating-src.tar.gz" target="_blank" rel="noopener noreferrer" class="">apache-asyncband-0.7.3-incubating-src.tar.gz</a></li>
+<li class="">PGP: <a href="https://downloads.apache.org/incubator/asyncband/0.7.3/apache-asyncband-0.7.3-incubating-src.tar.gz.asc" target="_blank" rel="noopener noreferrer" class="">apache-asyncband-0.7.3-incubating-src.tar.gz.asc</a></li>
+<li class="">SHA-512: <a href="https://downloads.apache.org/incubator/asyncband/0.7.3/apache-asyncband-0.7.3-incubating-src.tar.gz.sha512" target="_blank" rel="noopener noreferrer" class="">apache-asyncband-0.7.3-incubating-src.tar.gz.sha512</a></li>
+<li class="">Keys: <a href="https://downloads.apache.org/incubator/asyncband/KEYS" target="_blank" rel="noopener noreferrer" class="">KEYS</a></li>
+</ul></article></div></div></main></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Documentation</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/">About</a></li><li class="footer__item"><a class="footer__link-item" href="/downloads/">Downloads</a></li><li class="footer__ [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/favicon.svg b/favicon.svg
new file mode 100644
index 0000000..de18b25
--- /dev/null
+++ b/favicon.svg
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 650 1000">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #7c297d;
+      }
+
+      .cls-2 {
+        fill: #f79a23;
+      }
+
+      .cls-3 {
+        fill: #dd552c;
+      }
+
+      .cls-4 {
+        fill: #d22128;
+      }
+    </style>
+  </defs>
+  <path class="cls-3" d="M276.7092915,398.1515795c25.5279479-63.1242453,54.0110775-126.1246793,84.5729347-181.9636035-45.6212286-33.8852148-89.4276433-106.9534674-107.4259055-139.3268803-6.4642564,7.3439687-10.6608099,15.8022396-12.563595,22.6835448-16.9556402,61.2214602,43.4023987,135.1498759-5.21311,108.1394499-40.5058645-22.5076023-131.7157397-71.797557-166.5067324-22.8073561,38.9647388,50.0654049,140.8777805,176.0271745,207.1364082,213.2748452Z"/>
+  <path class="cls-2" d="M361.2822261,216.187976c29.6137228-54.1055651,61.1725873-101.4927347,93.8913687-135.6320886,0,0-32.6340684,47.2372927-79.2457879,141.6662634,28.2289905,7.7740502,108.6249208,23.7261667,220.6090393-5.2000772,2.7531737-20.350678-10.9279818-42.734469-79.1056856-50.2283145-44.5101845-4.8872906,53.4246026-106.2822795-17.5225659-154.2363748-2.2905102-1.5509002-4.5419221-2.9193416-6.7477192-4.1444224-2.3784814-.8536468-4.8905488-1.6356133-7.5720422-2.3328667-82.8591248- [...]
+  <path class="cls-4" d="M210.0661969,580.0239535c18.7052902-56.0344158,41.2063761-118.989235,66.6430946-181.872374-66.2586277-37.2476707-168.1716694-163.2094403-207.1364082-213.2748452-6.9562436,9.787614-11.7099483,23.4394457-13.2934304,42.1088958-8.4973692,100.2806866,94.9567981,174.521889,74.3324318,188.0824913-27.2808561,17.9396147-81.5786546-43.0928703-102.978471-4.3138485,31.0180043,39.8477093,94.2008971,111.8472744,182.4327833,169.2696807Z"/>
+  <path class="cls-3" d="M496.7155649,363.7515701c-52.3819806-18.6824828,54.7376547-68.786986,89.5221309-121.9411586,4.4506926-6.7965921,9.0512622-15.5806824,10.2991504-24.7883379-111.9841185,28.9262439-192.3800488,12.9741274-220.6090393,5.2000772-24.1301828,48.8924551-51.9942555,110.5048986-81.0540854,184.7917156,30.2653616,12.9415455,153.8421334,60.7457639,328.3900879,60.9933866,29.3465509-76.4372249-76.8347245-86.5311091-126.5482445-104.255683Z"/>
+  <path class="cls-4" d="M230.3060964,590.1113213c30.7801562,9.5921223,132.7681363,38.244678,241.0835287,33.9308295,14.5510932-39.3980786-39.8509675-43.2427472-44.282111-74.84071-3.430878-24.4494858,143.1682907,20.5461697,190.3371613-68.3569045,2.3849978-4.4963073,4.2454264-8.7384756,5.819134-12.8372833-174.5479545-.2476227-298.1247263-48.0518411-328.3900879-60.9933866-21.2369067,54.2880239-43.0830957,115.2162467-64.5676252,183.0974549Z"/>
+  <path class="cls-1" d="M230.3060964,590.1113213c-13.8310324,43.6923779-27.4763477,90.3692613-40.7209052,139.6983144-4.6983154,17.4899839-9.3412414,35.3057873-13.9190036,53.5125738,102.8057868,33.9373459,197.4726056.0781966,200.6819264-41.8873386.0260655-.3323358-.0358401-.5799585-.016291-.8992615,2.4469035-44.4482789-64.1733837-19.8098179-62.5964179-46.5335229,1.5834822-26.9191966,116.3077416-.1563933,151.7862131-57.872037,2.7205918-4.4246271,4.4930492-8.3540087,5.8680069-12.0878987-10 [...]
+  <path class="cls-1" d="M27.6334136,410.7542728c-1.4987691,2.7173336-2.8509195,5.8582323-4.0043201,9.6116715-19.9238547,64.7533422,120.9604422,151.7405984,101.7924885,170.7032859-17.2782014,17.0859679-39.7955782-21.9602257-67.5619052-5.8321668-3.0431529,1.7724574-6.1319206,4.0075783-9.3021431,7.2592556-31.4024712,32.1714049-.4919873,124.8539837,88.6033203,174.3263973-20.7905342,69.8100589-41.489839,147.8047004-61.7525458,229.3703222,7.3504851-2.573973,16.1476081-5.1544625,18.3371143-12. [...]
+</svg>
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..47eecd5
--- /dev/null
+++ b/index.html
@@ -0,0 +1,182 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="plugin-pages plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.10.2">
+<title data-rh="true">Apache Asyncband (Incubating)</title><meta data-rh="true" property="og:title" content="Apache Asyncband (Incubating)"><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://asyncband.apache.org/og.png"><meta data-rh="true" name="twitter:image" content="https://asyncband.apache.org/og.png"><meta data-rh="true" pro [...]
+<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Asyncband (Incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.6eac8809.css">
+<script src="/assets/js/runtime~main.cc7ce440.js" defer="defer"></script>
+<script src="/assets/js/main.e72938d6.js" defer="defer"></script>
+</head>
+<body>
+<svg style="display: none;"><defs>
+<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
+</defs></svg>
+<script>document.documentElement.setAttribute("data-theme","light"),document.documentElement.setAttribute("data-theme-choice","light"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/asf-logo.svg"><div role="region" aria-label="Skip to ma [...]
+<p>Asyncband&#x27;s async APIs are built on standard futures and wakers. The library does not spawn tasks, own worker threads, install timers, or require a reactor or I/O driver. Applications can poll its futures with Tokio, async-std, smol, a custom executor, or any other standards-based runtime, and compose runtime services such as deadlines around them.</p>
+<h3 class="anchor anchorTargetStickyNavbar_zq6S" id="project-scope">Project scope<a href="#project-scope" class="hash-link" aria-label="Direct link to Project scope" title="Direct link to Project scope" translate="no">​</a></h3>
+<p>The project is not limited to small or stateless synchronization primitives. Stateful utilities such as a singleflight group or an object pool fit when they provide a generally reusable coordination mechanism and remain independent of executor policy.</p>
+<p>The boundary is mechanism versus policy. Task placement, timers, deadlines, retries, periodic maintenance, and application lifecycle orchestration stay with the caller and its runtime. Potential future-concurrency or scheduling APIs are evaluated against the same boundary: they must remain executor-independent and compose with caller-owned execution and timing.</p>
+<h2 class="anchor anchorTargetStickyNavbar_zq6S" id="getting-started">Getting started<a href="#getting-started" class="hash-link" aria-label="Direct link to Getting started" title="Direct link to Getting started" translate="no">​</a></h2>
+<p>The crate enables no APIs by default. Enable only the features your application uses:</p>
+<div class="language-shell codeBlockContainer_lkHg theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_KnrP"><pre tabindex="0" class="prism-code language-shell codeBlock_FDzL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pYqn"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">cargo</span><span class="token plain"> </span><span class="token  [...]
+<div class="language-rust codeBlockContainer_lkHg theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_KnrP"><pre tabindex="0" class="prism-code language-rust codeBlock_FDzL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pYqn"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token names [...]
+<p>Public paths stay direct while Cargo features keep unused implementations out of the build.</p>
+<h2 class="anchor anchorTargetStickyNavbar_zq6S" id="api-map">API map<a href="#api-map" class="hash-link" aria-label="Direct link to API map" title="Direct link to API map" translate="no">​</a></h2>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<table><thead><tr><th>Area</th><th>API</th><th>Feature</th><th>Use</th></tr></thead><tbody><tr><td>Locks and conditions</td><td><a href="https://docs.rs/asyncband/*/asyncband/mutex/struct.Mutex.html" target="_blank" rel="noopener noreferrer" class=""><code>Mutex</code></a></td><td><code>mutex</code></td><td>Protect shared data with asynchronous mutual exclusion.</td></tr><tr><td></td><td><a href="https://docs.rs/asyncband/*/asyncband/rwlock/struct.RwLock.html" target="_blank" rel="noopen [...]
+<h2 class="anchor anchorTargetStickyNavbar_zq6S" id="synchronous-interoperability">Synchronous interoperability<a href="#synchronous-interoperability" class="hash-link" aria-label="Direct link to Synchronous interoperability" title="Direct link to Synchronous interoperability" translate="no">​</a></h2>
+<p>The optional <code>blocking</code> module is a boundary adapter for synchronous callers. It parks the calling thread while driving one future; it is not a general-purpose executor.</p>
+<div class="language-shell codeBlockContainer_lkHg theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_KnrP"><pre tabindex="0" class="prism-code language-shell codeBlock_FDzL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pYqn"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">cargo</span><span class="token plain"> </span><span class="token  [...]
+<div class="language-rust codeBlockContainer_lkHg theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_KnrP"><pre tabindex="0" class="prism-code language-rust codeBlock_FDzL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_pYqn"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token names [...]
+<h3 class="anchor anchorTargetStickyNavbar_zq6S" id="async-first-blocking-by-adaptation">Async first, blocking by adaptation<a href="#async-first-blocking-by-adaptation" class="hash-link" aria-label="Direct link to Async first, blocking by adaptation" title="Direct link to Async first, blocking by adaptation" translate="no">​</a></h3>
+<p>Async and synchronous synchronization primitives have different optimization constraints. Once an async operation is exposed as a runtime-agnostic future, synchronous code can usually drive that future through a <code>block_on</code> adapter. Asyncband therefore designs its primitives for async use and provides blocking interoperability at the boundary instead of duplicating synchronous methods across every type.</p>
+<p>A sync-first implementation can exploit OS- or platform-specific facilities that an async implementation cannot assume. Libraries focused on synchronous code can therefore make different and sometimes better tradeoffs. Asyncband leaves those optimizations to dedicated libraries rather than treating blocking adaptation as a second family of primitives.</p>
+<h3 class="anchor anchorTargetStickyNavbar_zq6S" id="execution-constraints">Execution constraints<a href="#execution-constraints" class="hash-link" aria-label="Direct link to Execution constraints" title="Direct link to Execution constraints" translate="no">​</a></h3>
+<p>The <code>blocking</code> module is a lightweight, thread-parking single-future executor, not a general-purpose async runtime. <code>wait_timeout</code> drops the future on timeout. Futures that depend on a runtime-specific timer or I/O driver still need that runtime&#x27;s driver to make progress, and blocking an executor thread can cause starvation or deadlocks. See the <a href="https://docs.rs/asyncband/*/asyncband/blocking/" target="_blank" rel="noopener noreferrer" class=""><code [...]
+<h2 class="anchor anchorTargetStickyNavbar_zq6S" id="thread-safety">Thread safety<a href="#thread-safety" class="hash-link" aria-label="Direct link to Thread safety" title="Direct link to Thread safety" translate="no">​</a></h2>
+<p>Asyncband types implement <code>Send</code> and <code>Sync</code> only when the protected, transferred, or managed value satisfies the necessary bounds. See each API&#x27;s documentation for its exact contract.</p>
+<h2 class="anchor anchorTargetStickyNavbar_zq6S" id="minimum-supported-rust-version-msrv">Minimum Supported Rust Version (MSRV)<a href="#minimum-supported-rust-version-msrv" class="hash-link" aria-label="Direct link to Minimum Supported Rust Version (MSRV)" title="Direct link to Minimum Supported Rust Version (MSRV)" translate="no">​</a></h2>
+<p>This crate is built against the latest stable release, and its minimum supported rustc version is 1.86.0.</p>
+<p>The policy is that the minimum Rust version required to use this crate can be increased in minor version updates. For example, if Asyncband 1.0 requires Rust 1.20.0, then Asyncband 1.0.z for all values of z will also require Rust 1.20.0 or newer. However, Asyncband 1.y for y &gt; 0 may require a newer minimum version.</p>
+<h2 class="anchor anchorTargetStickyNavbar_zq6S" id="license-and-trademarks">License and Trademarks<a href="#license-and-trademarks" class="hash-link" aria-label="Direct link to License and Trademarks" title="Direct link to License and Trademarks" translate="no">​</a></h2>
+<p>This project is licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0" target="_blank" rel="noopener noreferrer" class="">Apache License, Version 2.0</a>.</p>
+<p>Apache Asyncband, Asyncband, and Apache are either registered trademarks or trademarks of The Apache Software Foundation in the United States and/or other countries.</p></article></main></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Documentation</div><ul class="footer__items clean-list"><li class="footer__item"><a clas [...]
+</body>
+</html>
\ No newline at end of file
diff --git a/og.png b/og.png
new file mode 100644
index 0000000..3845f17
Binary files /dev/null and b/og.png differ
diff --git a/robots.txt b/robots.txt
new file mode 100644
index 0000000..87404f3
--- /dev/null
+++ b/robots.txt
@@ -0,0 +1,3 @@
+# Allow crawling the public project website.
+User-agent: *
+Allow: /
diff --git a/sitemap.xml b/sitemap.xml
new file mode 100644
index 0000000..7415780
--- /dev/null
+++ b/sitemap.xml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://asyncband.apache.org/blog/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://asyncband.apache.org/blog/2026/10/14/c [...]
\ No newline at end of file


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