diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..6e42511
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,99 @@
+name: Release wheels
+
+on:
+ push:
+ tags:
+ - "v*"
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+jobs:
+ linux-wheels:
+ name: Linux x86-64 wheels
+ runs-on: ubuntu-latest
+ timeout-minutes: 90
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - uses: actions/setup-python@v5
+ with:
+ python-version: "3.14"
+
+ - name: Check tag matches package version
+ if: github.event_name == 'push'
+ env:
+ RELEASE_TAG: ${{ github.ref_name }}
+ run: |
+ python - <<'PY'
+ import os
+ import tomllib
+
+ with open("pyproject.toml", "rb") as file:
+ version = tomllib.load(file)["project"]["version"]
+
+ expected_tag = f"v{version}"
+ if os.environ["RELEASE_TAG"] != expected_tag:
+ raise SystemExit(
+ f"release tag {os.environ['RELEASE_TAG']!r} does not match "
+ f"package version {version!r}; expected {expected_tag!r}"
+ )
+ PY
+
+ - name: Build and test wheels
+ uses: pypa/cibuildwheel@v4.2.0
+ with:
+ output-dir: wheelhouse
+
+ - name: Store wheel artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: linux-x86_64-wheels
+ path: wheelhouse/*.whl
+ if-no-files-found: error
+
+ pypi-publish:
+ name: Publish wheels to PyPI
+ if: github.event_name == 'push'
+ needs: linux-wheels
+ runs-on: ubuntu-latest
+ environment:
+ name: pypi
+ url: https://pypi.org/project/rabitqlib/
+ permissions:
+ id-token: write
+
+ steps:
+ - name: Download wheel artifacts
+ uses: actions/download-artifact@v4
+ with:
+ name: linux-x86_64-wheels
+ path: wheelhouse
+
+ - name: Publish wheels
+ uses: pypa/gh-action-pypi-publish@release/v1
+ with:
+ packages-dir: wheelhouse
+
+ github-release:
+ name: Create GitHub release
+ if: github.event_name == 'push'
+ needs: [linux-wheels, pypi-publish]
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+
+ steps:
+ - name: Download wheel artifacts
+ uses: actions/download-artifact@v4
+ with:
+ name: linux-x86_64-wheels
+ path: wheelhouse
+
+ - name: Create GitHub release
+ env:
+ GH_TOKEN: ${{ github.token }}
+ RELEASE_TAG: ${{ github.ref_name }}
+ run: gh release create "$RELEASE_TAG" wheelhouse/*.whl --generate-notes --verify-tag
diff --git a/README.md b/README.md
index a750565..ddf9538 100644
--- a/README.md
+++ b/README.md
@@ -1,55 +1,81 @@
-# RaBitQ Library
+
-[](https://github.com/VectorDB-NTU/RaBitQ-Library/actions/workflows/test.yaml)
-[](https://github.com/VectorDB-NTU/RaBitQ-Library/actions/workflows/python.yml)
-[](LICENSE)
+
RaBitQ Library
-RaBitQ Library is a C++17 library with Python bindings for compact, accurate
-vector quantization and approximate nearest-neighbor search. It provides:
+
Compact vectors. Accurate distances. Fast ANN search.
-- the [1-bit](https://arxiv.org/abs/2405.12497) and
- [multi-bit](https://arxiv.org/abs/2409.09913) RaBitQ quantizers;
-- IVF, HNSW, and [SymphonyQG](https://dl.acm.org/doi/abs/10.1145/3709730)
- indexes powered by RaBitQ;
-- Euclidean distance and inner-product search (cosine search is
- available by normalizing vectors before using inner product); and
-- optimized AVX2 and AVX-512 kernels with runtime CPU dispatch.
+
+ A research-backed C++17 library with Python bindings for 1-bit and multi-bit
+ vector quantization, IVF, HNSW, and SymphonyQG.
+
-RaBitQ is developed by the
-[VectorDB group](https://vectordb-ntu.github.io/) at Nanyang Technological
-University, Singapore. A GPU implementation is also available in
-[cuvs_rabitq](https://github.com/Stardust-SJF/cuvs_rabitq/tree/cuvs_ivf_rabitq).
+
+
+
+
+
+
+
+
+
-## Quick start
+
+ Documentation ·
+ Python package ·
+ Paper ·
+ Releases
+
-### Python
+
-#### Requirements
+## Install
-- Python 3.9 or newer
-- a C++17 compiler
-- CMake 3.15 or newer
-- OpenMP
-- an x86-64 CPU supported by the selected kernels: most paths accept either
- AVX2 with FMA or AVX-512F/BW/DQ with FMA
+```bash
+pip install rabitqlib
+```
-Most SIMD entry points select AVX-512 kernels when AVX-512F, AVX-512BW, and
-AVX-512DQ are detected; otherwise they use AVX2 when AVX2 and FMA are
-available. AVX-512 VPOPCNTDQ enables additional popcount kernels. The HNSW
-AVX-512 core path also checks for AVX2 and FMA, and otherwise uses its AVX2
-path when available. AVX-512 translation units are compiled with FMA enabled.
+Prebuilt wheels support Linux x86-64 and CPython 3.9–3.14. AVX2 + FMA is the
+portable CPU baseline; supported AVX-512 kernels are selected at runtime.
-On Ubuntu or Debian, install the system build tools and then install RaBitQ
-from the repository:
+## Adopted across the vector-search ecosystem
-```bash
-sudo apt-get update
-sudo apt-get install -y build-essential cmake libomp-dev
+[Milvus](https://github.com/milvus-io/milvus) ·
+[Faiss](https://github.com/facebookresearch/faiss) ·
+[VSAG](https://github.com/antgroup/vsag) ·
+[VectorChord](https://github.com/tensorchord/VectorChord) ·
+[Volcengine OpenSearch](https://www.volcengine.com/docs/6465/1553583) ·
+[CockroachDB](https://github.com/cockroachdb/cockroach) ·
+[Elasticsearch](https://github.com/elastic/elasticsearch) ·
+[Lucene](https://github.com/apache/lucene) ·
+[turbopuffer](https://turbopuffer.com/blog/ann-v3#:~:text=ANN%20v3%20employs%20the%20RaBitQ) ·
+[Zvec](https://github.com/alibaba/zvec)
-git clone https://github.com/VectorDB-NTU/RaBitQ-Library.git
-cd RaBitQ-Library
-python -m pip install .
-```
+## Accuracy at a glance
+
+
+
+*Average and maximum relative estimation error across six datasets; lower is
+better. Results from the
+[SIGMOD camera-ready paper](https://doi.org/10.1145/3725413).*
+
+## Why RaBitQ?
+
+| | |
+| --- | --- |
+| **Compact by design** | Choose [1-bit](https://arxiv.org/abs/2405.12497) or [multi-bit](https://doi.org/10.1145/3725413) codes to match your memory and accuracy target. |
+| **Accurate estimates** | An asymptotically optimal theoretical error bound supports reliable ordering and reranking. |
+| **Fast on x86-64** | Dedicated AVX2 and AVX-512 kernels are selected through runtime CPU dispatch. |
+| **Ready for ANN search** | Use the quantizer directly or build complete IVF, HNSW, and [SymphonyQG](https://dl.acm.org/doi/abs/10.1145/3709730) indexes. |
+
+The library supports Euclidean distance and inner product. Cosine search is
+available by normalizing vectors before using inner product.
+
+RaBitQ is developed by the
+[VectorDB group](https://vectordb-ntu.github.io/) at Nanyang Technological
+University, Singapore. A GPU implementation is also available in
+[cuvs_rabitq](https://github.com/Stardust-SJF/cuvs_rabitq/tree/cuvs_ivf_rabitq).
+
+## Python quick start
The following complete example builds a small IVF index and searches it. It
uses deterministic synthetic data, so no dataset download is required.
@@ -86,20 +112,41 @@ Python bindings are also available for `HnswIndex` and `SymqgIndex`. See the
[Python examples](sample/python/) for index construction, querying, and index
persistence.
-### C++
+