Repository: unum-cloud/usearch (language: rust)

Issue:
Bug: macos release builds do not contain the library
### Describe the bug

The zip files usearch_macOS_arm64_2.8.14.zip and usearch_macOS_amd64_2.8.14.zip only contain usearch.h but no library (.so or .dyld).


### Steps to reproduce

Download usearch_macOS_arm64_2.8.14.zip or usearch_macOS_amd64_2.8.14.zip and unzip.

### Expected behavior

The release should contain the library (libusearch_c.so/dyld)

### USearch version

v2.8.14

### Operating System

macOS 14.2

### Hardware architecture

Arm

### Which interface are you using?

Other bindings

### Contact Details

_No response_

### Is there an existing issue for this?

- [X] I have searched the existing issues

### Code of Conduct

- [X] I agree to follow this project's Code of Conduct


Discussion / hints:
Checking older releases, it looks like the last release package with libusearch_c.so for mac was 2.7.4

Note that this affects usage of the golang bindings with the latest releases. Using 2.7.4 is a fine workaround.
I haven’t had a chance to look into it yet. @comunidadio and @ehsanul can you by any chance help fix this?
The library being built is called `libusearch_c.dylib` but the script is assuming it is called `libusearch_c.so` so it is not being included in the ZIP file.
Nice catch, @sroussey! Then it would only take a wildcard to fix.
This also seems to affect the Java bindings for mac osx. Maven only shows 2.8.12, 2.8.6, and 2.8.4 so the workaround of using 2.7.4 doesn't seem to be an option (see https://mvnrepository.com/artifact/cloud.unum/usearch). 

Related: the docs for java show 2.8.11 which doesn't seem to be available on maven (https://unum-cloud.github.io/usearch/java/).

**USearch version**
v2.8.4 and v2.8.12

**Operating System**
macOS 14.0

**Hardware architecture**
Arm

**Which interface are you using?**
Java

@phronmophobic is it possible to mark only the major version for Java dependencies?

@ehsanul and @comunidadio, would you be open to patching the CI to match the right binaries, possibly using a wildcard?
@ashvardanian 
I ended up writing my own clojure wrapper, https://github.com/phronmophobic/usearch.clj

Fix patch:
diff --git a/.github/workflows/Dockerfile.libs b/.github/workflows/Dockerfile.libs
deleted file mode 100644
index f996cfc7..00000000
--- a/.github/workflows/Dockerfile.libs
+++ /dev/null
@@ -1,36 +0,0 @@
-FROM ubuntu:22.04
-ENV DEBIAN_FRONTEND=noninteractive
-
-ENV user_name="runner"
-ARG TARGETPLATFORM
-ARG docker_ip
-ARG user_pass
-
-RUN apt-get update && \
-    apt-get install -y --no-install-recommends cmake g++-12 gcc-12 libc++-dev libc++abi-dev build-essential libjemalloc-dev openssh-client sshpass && \
-    apt-get clean && \
-    rm -rf /var/lib/apt/lists/*
-
-ENV CC=gcc-12
-ENV CXX=g++-12
-
-COPY . .
-
-RUN cmake -DCMAKE_BUILD_TYPE=Release -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_BUILD_TEST_CPP=0 -DUSEARCH_BUILD_BENCH_CPP=0 -B ./build_release
-RUN cmake --build ./build_release --config Release
-
-RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then \
-        export arch="amd"; \
-    elif [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
-        export arch="arm"; \
-    fi && \
-    version=$(cat VERSION) && \
-    mkdir -p usearch_linux_"$arch"_"$version"/DEBIAN && \
-    touch usearch_linux_"$arch"_"$version"/DEBIAN/control && \
-    mkdir -p usearch_linux_"$arch"_"$version"/usr/local/lib && \
-    mkdir usearch_linux_"$arch"_"$version"/usr/local/include && \
-    cp c/usearch.h usearch_linux_"$arch"_"$version"/usr/local/include/ && \
-    cp build_release/libusearch_c.so usearch_linux_"$arch"_"$version"/usr/local/lib/ && \
-    echo "Package: usearch\nVersion: $version\nMaintainer: Ash Vardanian\nArchitecture: "$arch"\nDescription: Faster & Smaller Single-File Search Engine for Vectors & Texts" > usearch_linux_"$arch"_"$version"/DEBIAN/control && \
-    dpkg-deb --build usearch_linux_"$arch"_"$version" && \
-    sshpass -p "$user_pass" scp -o StrictHostKeyChecking=no usearch_linux_"$arch"_"$version".deb "$user_name"@"$docker_ip":/home/$user_name/work/usearch/usearch/
\ No newline at end of file
diff --git a/.github/workflows/prerelease.yml b/.github/workflows/prerelease.yml
index d6d97ebe..3237cc97 100644
--- a/.github/workflows/prerelease.yml
+++ b/.github/workflows/prerelease.yml
@@ -25,9 +25,7 @@ jobs:
       CXX: g++-12
 
     steps:
-      - uses: actions/checkout@v3
-        with:
-          ref: main-dev
+      - uses: actions/checkout@v4
       - run: git submodule update --init --recursive
 
         # C/C++
@@ -35,7 +33,7 @@ jobs:
         run: |
           sudo apt update
           sudo apt install -y cmake build-essential libjemalloc-dev libomp-dev gcc-12 g++-12
-          cmake -B build_artifacts -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUSEARCH_BUILD_TEST_CPP=1 -DUSEARCH_BUILD_TEST_C=1 -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_USE_OPENMP=1 -DUSEARCH_USE_SIMSIMD=1 -DUSEARCH_USE_JEMALLOC=1
+          cmake -B build_artifacts -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUSEARCH_BUILD_TEST_CPP=1 -DUSEARCH_BUILD_TEST_C=1 -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_BUILD_SQLITE=1 -DUSEARCH_USE_OPENMP=1 -DUSEARCH_USE_SIMSIMD=1 -DUSEARCH_USE_JEMALLOC=1
           cmake --build build_artifacts --config RelWithDebInfo
       - name: Test C++
         run: ./build_artifacts/test_cpp
@@ -44,24 +42,27 @@ jobs:
 
         # Python
       - name: Set up Python ${{ env.PYTHON_VERSION }}
-        uses: actions/setup-python@v4
+        uses: actions/setup-python@v5
         with:
           python-version: ${{ env.PYTHON_VERSION }}
       - name: Build Python
         run: |
           python -m pip install --upgrade pip
-          pip install pytest numpy
+          pip install pytest pytest-repeat numpy numba cppyy
+          pip install --upgrade git+https://github.com/Maratyszcza/PeachPy
           python -m pip install .
       - name: Test Python
-        run: pytest python/scripts/ -s -x
+        run: pytest
 
         # JavaScript
       - name: Set up Node.js
-        uses: actions/setup-node@v3
+        uses: actions/setup-node@v4
         with:
           node-version: 20
+      - name: Install dependencies
+        run: npm ci --skip-scripts
       - name: Build JavaScript
-        run: npm ci
+        run: npm run build-js
       - name: Test JavaScript
         run: npm test
 
@@ -113,9 +114,7 @@ jobs:
       CXX: clang++-16
 
     steps:
-      - uses: actions/checkout@v3
-        with:
-          ref: main-dev
+      - uses: actions/checkout@v4
       - run: git submodule update --init --recursive
 
         # C/C++
@@ -127,13 +126,25 @@ jobs:
           wget https://apt.llvm.org/llvm.sh
           chmod +x llvm.sh
           sudo ./llvm.sh 16
-          cmake -B build_artifacts -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUSEARCH_BUILD_TEST_CPP=1 -DUSEARCH_BUILD_TEST_C=1 -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_USE_OPENMP=0 -DUSEARCH_USE_SIMSIMD=1 -DUSEARCH_USE_JEMALLOC=1
+          cmake -B build_artifacts -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUSEARCH_BUILD_TEST_CPP=1 -DUSEARCH_BUILD_TEST_C=1 -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_BUILD_SQLITE=1 -DUSEARCH_USE_OPENMP=0 -DUSEARCH_USE_SIMSIMD=1 -DUSEARCH_USE_JEMALLOC=1
           cmake --build build_artifacts --config RelWithDebInfo
       - name: Test C++
         run: ./build_artifacts/test_cpp
       - name: Test C
         run: ./build_artifacts/test_c
 
+        # JavaScript
+      - name: Set up Node.js
+        uses: actions/setup-node@v4
+        with:
+          node-version: 20
+      - name: Install dependencies
+        run: npm ci --skip-scripts
+      - name: Build JavaScript
+        run: npm run build-js
+      - name: Test JavaScript
+        run: npm test
+
         # Python
       - name: Set up Python ${{ env.PYTHON_VERSION }}
         uses: actions/setup-python@v4
@@ -142,20 +153,11 @@ jobs:
       - name: Build Python
         run: |
           python -m pip install --upgrade pip
-          pip install pytest numpy
+          pip install pytest pytest-repeat numpy numba cppyy
+          pip install --upgrade git+https://github.com/Maratyszcza/PeachPy
           python -m pip install .
       - name: Test Python
-        run: pytest python/scripts/ -s -x
-
-        # JavaScript
-      - name: Set up Node.js
-        uses: actions/setup-node@v3
-        with:
-          node-version: 20
-      - name: Build and test JavaScript
-        run: |
-          npm ci
-          npm test
+        run: pytest
 
         # C#
       - name: Setup .NET ${{ env.DOTNET_VERSION }}
@@ -175,9 +177,7 @@ jobs:
     runs-on: macos-12
 
     steps:
-      - uses: actions/checkout@v3
-        with:
-          ref: main-dev
+      - uses: actions/checkout@v4
       - run: git submodule update --init --recursive
 
         # C/C++
@@ -185,13 +185,25 @@ jobs:
         run: |
           brew update
           brew install cmake
-          cmake -B build_artifacts -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUSEARCH_BUILD_TEST_CPP=1 -DUSEARCH_BUILD_TEST_C=1 -DUSEARCH_BUILD_LIB_C=1
+          cmake -B build_artifacts -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUSEARCH_BUILD_TEST_CPP=1 -DUSEARCH_BUILD_TEST_C=1 -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_BUILD_SQLITE=1
           cmake --build build_artifacts --config RelWithDebInfo
       - name: Test C++
         run: ./build_artifacts/test_cpp
       - name: Test C
         run: ./build_artifacts/test_c
 
+        # JavaScript
+      - name: Set up Node.js
+        uses: actions/setup-node@v4
+        with:
+          node-version: 20
+      - name: Install dependencies
+        run: npm ci --skip-scripts
+      - name: Build JavaScript
+        run: npm run build-js
+      - name: Test JavaScript
+        run: npm test
+
         # Python
       - name: Set up Python ${{ env.PYTHON_VERSION }}
         uses: actions/setup-python@v4
@@ -200,20 +212,10 @@ jobs:
       - name: Build Python
         run: |
           python -m pip install --upgrade pip
-          pip install pytest numpy
+          pip install pytest pytest-repeat numpy
           python -m pip install .
       - name: Test Python
-        run: pytest python/scripts/ -s -x
-
-        # JavaScript
-      - name: Set up Node.js
-        uses: actions/setup-node@v3
-        with:
-          node-version: 20
-      - name: Build JavaScript
-        run: npm ci
-      - name: Test JavaScript
-        run: npm test
+        run: pytest
 
         # ObjC/Swift
       - name: Build ObjC/Swift
@@ -238,16 +240,14 @@ jobs:
     name: Windows
     runs-on: windows-2022
     steps:
-      - uses: actions/checkout@v3
-        with:
-          ref: main-dev
+      - uses: actions/checkout@v4
       - run: git submodule update --init --recursive
 
         # C/C++
       - name: Build C/C++
         run: |
           choco install cmake
-          cmake -B build_artifacts -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUSEARCH_BUILD_TEST_CPP=1 -DUSEARCH_BUILD_TEST_C=1 -DUSEARCH_BUILD_LIB_C=1
+          cmake -B build_artifacts -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUSEARCH_BUILD_TEST_CPP=1 -DUSEARCH_BUILD_TEST_C=1 -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_BUILD_SQLITE=0
           cmake --build build_artifacts --config RelWithDebInfo
       - name: Test C++
         run: .\build_artifacts\test_cpp.exe
@@ -262,18 +262,20 @@ jobs:
       - name: Build Python
         run: |
           python -m pip install --upgrade pip
-          pip install pytest numpy
+          pip install pytest pytest-repeat numpy
           python -m pip install .
       - name: Test Python
-        run: pytest python/scripts/ -s -x
+        run: pytest
 
         # JavaScript
       - name: Set up Node.js
-        uses: actions/setup-node@v3
+        uses: actions/setup-node@v4
         with:
           node-version: 20
+      - name: Install dependencies
+        run: npm ci --skip-scripts
       - name: Build JavaScript
-        run: npm ci
+        run: npm run build-js
       - name: Test JavaScript
         run: npm test
 
@@ -294,7 +296,7 @@ jobs:
     name: Docker
     runs-on: ubuntu-22.04
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
       - run: git submodule update --init --recursive
       - name: Build
         uses: docker/build-push-action@v4
@@ -303,7 +305,6 @@ jobs:
           load: true
           push: false
 
-
   build_wheels:
     name: Build Python ${{ matrix.python-version }} for ${{ matrix.os }}
     runs-on: ${{ matrix.os }}
@@ -329,3 +330,55 @@ jobs:
         run: cibuildwheel --output-dir wheelhouse
         env:
           CIBW_BUILD: cp${{ matrix.python-version }}-*
+
+  test_ubuntu_cross_compilation:
+    name: Cross Compilation
+    runs-on: ubuntu-22.04
+    env:
+      CC: clang
+      CXX: clang++
+      AR: llvm-ar
+      NM: llvm-nm
+      RANLIB: llvm-ranlib
+
+    strategy:
+      fail-fast: false
+      matrix:
+        include:
+          - arch: amd64
+            target: x86_64-linux-gnu
+          - arch: arm64
+            target: aarch64-linux-gnu
+
+    steps:
+      - uses: actions/checkout@v4
+      - run: git submodule update --init --recursive
+
+        # C/C++
+        # We need to install the cross-compilation toolchain for ARM64 and ARMHF
+      - name: Install dependencies
+        run: |
+          sudo apt-get update
+          sudo apt-get install -y clang lld make crossbuild-essential-arm64 crossbuild-essential-armhf libjemalloc-dev
+
+      - name: Build C/C++
+        run: |
+          cmake -B build_artifacts \
+            -DCMAKE_BUILD_TYPE=RelWithDebInfo \
+            -DCMAKE_EXPORT_COMPILE_COMMANDS=1 \
+            -DCMAKE_C_COMPILER_TARGET=${{ matrix.target }} \
+            -DCMAKE_CXX_COMPILER_TARGET=${{ matrix.target }} \
+            -DCMAKE_SYSTEM_NAME=Linux \
+            -DCMAKE_SYSTEM_PROCESSOR=${{ matrix.arch }} \
+            -DUSEARCH_BUILD_LIB_C=1 \
+            -DUSEARCH_BUILD_SQLITE=1 \
+            -DUSEARCH_BUILD_TEST_CPP=0 \
+            -DUSEARCH_BUILD_BENCH_CPP=0
+
+          cmake --build build_artifacts --config RelWithDebInfo
+
+        # We can't run the produced builds, but we can make sure they exist
+      - name: Test artifacts presense
+        run: |
+          test -e build_artifacts/libusearch_c.so
+          test -e build_artifacts/libusearch_sqlite.so
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 30e64c37..4d0478bb 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -21,11 +21,11 @@ jobs:
     name: Semantic Release
     runs-on: ubuntu-22.04
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
         with:
           persist-credentials: false
       - name: Set up Node.js
-        uses: actions/setup-node@v3
+        uses: actions/setup-node@v4
         with:
           node-version: 20
       - run: npm install --save-dev --prefix ./package-ci @semantic-release/exec @semantic-release/git conventional-changelog-eslint semantic-release && npx --prefix ./package-ci semantic-release
@@ -36,7 +36,7 @@ jobs:
     runs-on: ubuntu-22.04
     steps:
       - name: Checkout the latest code
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
         with:
           fetch-depth: 0
 
@@ -58,48 +58,75 @@ jobs:
     name: Create Debian Package for ${{ matrix.arch }}
     runs-on: ubuntu-22.04
     needs: versioning
+    env:
+      CC: clang
+      CXX: clang++
+      AR: llvm-ar
+      NM: llvm-nm
+      RANLIB: llvm-ranlib
+
     strategy:
       fail-fast: false
       matrix:
-        arch: ["linux/amd64", "linux/arm64"]
+        include:
+          - arch: amd64
+            target: x86_64-linux-gnu
+          - arch: arm64
+            target: aarch64-linux-gnu
+
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
         with:
           persist-credentials: false
-          ref: "main"
       - run: git submodule update --init --recursive
 
-      - name: Setup QEMU
-        uses: docker/setup-qemu-action@v2
-
-      - name: Setup Docker
-        uses: docker/setup-buildx-action@v2
-
-      - name: Get Docker daemon IP
-        id: dockerip
+      - name: Get version
+        id: set_version
         run: |
-          docker_ip=$(ip addr show docker0 | grep -Po 'inet \K[\d.]+') && \
-          echo "docker_ip=$docker_ip" >> "$GITHUB_OUTPUT"
+          version=$(cat VERSION)
+          echo "version=$version" >> $GITHUB_OUTPUT
 
-      - name: Set runner user password
-        id: userpass
+      - name: Install dependencies
         run: |
-          user_pass="1122"
-          echo "runner:$user_pass" | sudo chpasswd
-          echo "user_pass=$user_pass" >> "$GITHUB_OUTPUT"
+          sudo apt-get update
+          sudo apt-get install -y clang lld make crossbuild-essential-arm64 crossbuild-essential-armhf libjemalloc-dev
 
-      - name: Build library
+      - name: Build C/C++
         run: |
-          docker buildx create --use
-          docker buildx build \
-          --platform ${{ matrix.arch }} \
-          --build-arg docker_ip=${{ steps.dockerip.outputs.docker_ip }} \
-          --build-arg user_pass=${{ steps.userpass.outputs.user_pass }} \
-          --file .github/workflows/Dockerfile.libs \
-          --tag unum/usearch-library:latest \
-          --load .
-      - name: Clear Docker buildx cache
-        run: docker buildx prune --all --force
+          # Configure and build the project
+          cmake -B build_release \
+            -DCMAKE_BUILD_TYPE=Release \
+            -DCMAKE_EXPORT_COMPILE_COMMANDS=1 \
+            -DCMAKE_C_COMPILER_TARGET=${{ matrix.target }} \
+            -DCMAKE_CXX_COMPILER_TARGET=${{ matrix.target }} \
+            -DCMAKE_SYSTEM_NAME=Linux \
+            -DCMAKE_SYSTEM_PROCESSOR=${{ matrix.arch }} \
+            -DUSEARCH_BUILD_LIB_C=1 \
+            -DUSEARCH_BUILD_SQLITE=1 \
+            -DUSEARCH_BUILD_TEST_CPP=0 \
+            -DUSEARCH_BUILD_BENCH_CPP=0
+
+          cmake --build build_release --config Release
+
+          cp build_release/libusearch_c.so "usearch_linux_${{ matrix.arch }}_${{ steps.set_version.outputs.version }}.so"
+          cp build_release/libusearch_sqlite.so "usearch_sqlite_linux_${{ matrix.arch }}_${{ steps.set_version.outputs.version }}.so"
+
+          mkdir -p "usearch_linux_${{ matrix.arch }}_${{ steps.set_version.outputs.version }}/DEBIAN"
+          touch "usearch_linux_${{ matrix.arch }}_${{ steps.set_version.outputs.version }}/DEBIAN/control"
+          mkdir -p "usearch_linux_${{ matrix.arch }}_${{ steps.set_version.outputs.version }}/usr/local/lib"
+          mkdir "usearch_linux_${{ matrix.arch }}_${{ steps.set_version.outputs.version }}/usr/local/include"
+          cp include/usearch/usearch.h "usearch_linux_${{ matrix.arch }}_${{ steps.set_version.outputs.version }}/usr/local/include/"
+          cp build_release/libusearch_c.so "usearch_linux_${{ matrix.arch }}_${{ steps.set_version.outputs.version }}/usr/local/lib/"
+          echo -e "Package: usearch\nVersion: ${{ steps.set_version.outputs.version }}\nMaintainer: Ash Vardanian\nArchitecture: ${{ matrix.arch }}\nDescription: Faster & Smaller Single-File Search Engine for Vectors & Texts" > "usearch_linux_${{ matrix.arch }}_${{ steps.set_version.outputs.version }}/DEBIAN/control"
+          dpkg-deb --build "usearch_linux_${{ matrix.arch }}_${{ steps.set_version.outputs.version }}"
+
+      - name: Upload library
+        uses: xresloader/upload-to-github-release@v1
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          file: "*.so"
+          update_latest_release: true
 
       - name: Upload archive
         uses: xresloader/upload-to-github-release@v1
@@ -118,10 +145,9 @@ jobs:
       matrix:
         arch: [x64, x86]
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
         with:
           persist-credentials: false
-          ref: "main"
       - run: git submodule update --init --recursive
 
       - name: Setup CMake
@@ -146,7 +172,7 @@ jobs:
 
       - name: Build library
         run: |
-          cmake -DCMAKE_BUILD_TYPE=Release -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_BUILD_TEST_CPP=0 -DUSEARCH_BUILD_BENCH_CPP=0 -B ./build_release
+          cmake -DCMAKE_BUILD_TYPE=Release -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_BUILD_SQLITE=0 -DUSEARCH_BUILD_TEST_CPP=0 -DUSEARCH_BUILD_BENCH_CPP=0 -B ./build_release
           cmake --build ./build_release --config Release
           tar -cvf usearch_windows_${{ matrix.arch }}_${{ steps.set_version.outputs.version }}.tar .\build_release\libusearch_c.dll .\c\usearch.h
 
@@ -167,10 +193,9 @@ jobs:
       matrix:
         arch: [arm64, x86_64]
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
         with:
           persist-credentials: false
-          ref: "main"
       - run: git submodule update --init --recursive
 
       - uses: actions/setup-go@v4
@@ -178,16 +203,25 @@ jobs:
           go-version: "^1.21.0"
 
       - name: Get version
-        id: version
+        id: set_version
         run: |
           version=$(cat VERSION)
           echo "version=$version" >> $GITHUB_OUTPUT
 
       - name: Build library
         run: |
-          cmake -DCMAKE_BUILD_TYPE=Release -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_BUILD_TEST_CPP=0 -DUSEARCH_BUILD_BENCH_CPP=0 -B ./build_release
+          cmake -DCMAKE_BUILD_TYPE=Release -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_BUILD_SQLITE=1 -DUSEARCH_BUILD_TEST_CPP=0 -DUSEARCH_BUILD_BENCH_CPP=0 -B ./build_release
           cmake --build ./build_release --config Release        
-          zip -r usearch_macOS_${{ matrix.arch }}_${{ steps.version.outputs.version }}.zip build_release/libusearch_c.so c/usearch.h
+          zip -r usearch_macos_${{ matrix.arch }}_${{ steps.set_version.outputs.version }}.zip build_release/libusearch_c.dylib c/usearch.h
+          mv build_release/libusearch_sqlite.dylib usearch_sqlite_macos_${{ matrix.arch }}_${{ steps.set_version.outputs.version }}.dylib
+
+      - name: Upload library
+        uses: xresloader/upload-to-github-release@v1
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          file: "*.dylib"
+          update_latest_release: true
 
       - name: Upload archive
         uses: xresloader/upload-to-github-release@v1
@@ -206,14 +240,13 @@ jobs:
       matrix:
         os: [ubuntu-22.04, macOS-11, windows-2022]
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
         with:
           persist-credentials: false
-          ref: "main"
       - run: git submodule update --init --recursive
 
       - name: Get version
-        id: version
+        id: set_version
         run: |
           version=$(cat VERSION)
           echo "version=$version" >> $GITHUB_OUTPUT
@@ -232,8 +265,8 @@ jobs:
           for arch in "${archs[@]}"
           do
             ../wasi-sdk-20.0/bin/clang++ --sysroot=${WASI_SDK_PATH}/share/wasi-sysroot -o libusearch_c.so -O3 lib.cpp -I.  -I ../include/  -I ../fp16/include/ -shared --target=wasm32-wasi-threads  -Wl,--no-entry -nostdlib -D_WASI_EMULATED_MMAN -march="$arch"
-            tar -czvf usearch_wasm_linux_"$arch"_${{ steps.version.outputs.version }}.tar.gz libusearch_c.so
-            mv usearch_wasm_linux_"$arch"_${{ steps.version.outputs.version }}.tar.gz ../ && rm -rf libusearch_c.so
+            tar -czvf usearch_wasm_linux_"$arch"_${{ steps.set_version.outputs.version }}.tar.gz libusearch_c.so
+            mv usearch_wasm_linux_"$arch"_${{ steps.set_version.outputs.version }}.tar.gz ../ && rm -rf libusearch_c.so
           done
         if: matrix.os == 'ubuntu-22.04'
 
@@ -249,9 +282,9 @@ jobs:
           cd ./c 
           for arch in "${archs[@]}"
           do
-            ../wasi-sdk-20.0/bin/clang++ --sysroot=${WASI_SDK_PATH}/share/wasi-sysroot -o libusearch_c.so -O3 lib.cpp -I.  -I ../include/  -I ../fp16/include/ -shared --target=wasm32-wasi-threads  -Wl,--no-entry -nostdlib -D_WASI_EMULATED_MMAN -march="$arch"
-            zip -r usearch_wasm_macos_"$arch"_${{ steps.version.outputs.version }}.zip libusearch_c.so
-            mv usearch_wasm_macos_"$arch"_${{ steps.version.outputs.version }}.zip ../ && rm -rf libusearch_c.so
+            ../wasi-sdk-20.0/bin/clang++ --sysroot=${WASI_SDK_PATH}/share/wasi-sysroot -o libusearch_c.dylib -O3 lib.cpp -I.  -I ../include/  -I ../fp16/include/ -shared --target=wasm32-wasi-threads  -Wl,--no-entry -nostdlib -D_WASI_EMULATED_MMAN -march="$arch"
+            zip -r usearch_wasm_macos_"$arch"_${{ steps.set_version.outputs.version }}.zip libusearch_c.dylib
+            mv usearch_wasm_macos_"$arch"_${{ steps.set_version.outputs.version }}.zip ../ && rm -rf libusearch_c.dylib
           done
         if: matrix.os == 'macOS-11'
 
@@ -268,8 +301,8 @@ jobs:
           for arch in "${archs[@]}"
           do
             ../wasi-sdk-20.0+m/bin/clang++ --sysroot=${WASI_SDK_PATH}/share/wasi-sysroot -o libusearch_c.so -O3 lib.cpp -I.  -I ../include/  -I ../fp16/include/ -shared --target=wasm32-wasi-threads  -Wl,--no-entry -nostdlib -D_WASI_EMULATED_MMAN -march="$arch"
-            tar -cvf usearch_wasm_windows_"$arch"_${{ steps.version.outputs.version }}.tar.gz libusearch_c.so
-            mv usearch_wasm_windows_"$arch"_${{ steps.version.outputs.version }}.tar.gz ../ && rm -rf libusearch_c.so
+            tar -cvf usearch_wasm_windows_"$arch"_${{ steps.set_version.outputs.version }}.tar.gz libusearch_c.so
+            mv usearch_wasm_windows_"$arch"_${{ steps.set_version.outputs.version }}.tar.gz ../ && rm -rf libusearch_c.so
           done
         shell: bash
         if: matrix.os == 'windows-2022'
@@ -360,6 +393,9 @@ jobs:
       - uses: actions/checkout@v4
         with:
           ref: "main"
+      - name: Setup Docker
+        if: matrix.os == 'ubuntu-22.04'
+        uses: crazy-max/ghaction-setup-docker@v1.0.0
       - name: Set up Python
         uses: actions/setup-python@v5
         with:
@@ -405,48 +441,114 @@ jobs:
           packages-dir: dist
           verbose: true
           print-hash: true
-          
-  publish_javascript:
-    name: Publish JavaScript
+
+  build_javascript:
+    name: Build JavaScript Native Modules
     needs: versioning
-    runs-on: ubuntu-22.04
+    strategy:
+      fail-fast: false
+      matrix:
+        arch:
+          - x64
+          - x86
+        os:
+          - macos-latest
+          - ubuntu-22.04
+          - windows-latest
+        exclude:
+          - arch: x86
+            os: macos-latest
+          - arch: x86
+            os: ubuntu-22.04
+    runs-on: ${{ matrix.os }}
     env:
       CC: gcc-12
       CXX: g++-12
 
     steps:
-      - uses: actions/checkout@v3
+      - name: Checkout the latest code
+        uses: actions/checkout@v4
         with:
           ref: "main"
       - run: git submodule update --init --recursive
 
+      - name: Set up Node.js
+        uses: actions/setup-node@v4
+        with:
+          node-version: 20
+          architecture: ${{ matrix.arch }}
+
       - name: Update compilers
+        if: matrix.os == 'ubuntu-22.04'
         run: |
           sudo apt update
           sudo apt install -y cmake build-essential libjemalloc-dev libomp-dev gcc-12 g++-12
+          sudo apt install gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu
+
+      - run: npm ci --ignore-scripts
+      - run: npm run prebuild-single
+        if: matrix.os != 'macos-latest'
+      - run: npm run prebuild-darwin-x64+arm64
+        env:
+          CC: clang
+          CXX: clang++
+        if: matrix.os == 'macos-latest'
+      - run: file prebuilds/*/*
+        if: matrix.os == 'macos-latest'
+      - name: Extra for cross build
+        if: matrix.os == 'ubuntu-22.04'
+        run: npm run prebuild-arm64
+      - uses: actions/upload-artifact@v3
+        with:
+          name: prebuilds
+          path: prebuilds
+          retention-days: 1
+
+  publish_javascript:
+    name: Publish JavaScript
+    needs: build_javascript
+    runs-on: ubuntu-22.04
+
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          ref: "main"
+      - run: git submodule update --init --recursive
 
       - name: Set up Node.js
-        uses: actions/setup-node@v3
+        uses: actions/setup-node@v4
         with:
           node-version: 20
 
-      - name: Build and Test
-        run: |
-          npm ci
-          npm test
-          npm run typegen
+      - uses: actions/download-artifact@v3
+
+      - name: Look for links
+        run: find . -type f -links +1
+
+      - name: Install Dependencies
+        run: npm ci --ignore-scripts
+
+      - name: Build the JS from TS
+        run: npm run build-js
+
+      - name: Last minute test with prebuild artifact
+        run: npm run test
+
+      - name: Publish Dry Run
+        run: npm publish --dry-run
 
       - name: Publish
-        uses: JS-DevTools/npm-publish@v2
+        uses: JS-DevTools/npm-publish@v3
         with:
           token: ${{ secrets.NPM_TOKEN }}
+          access: public
 
   publish_rust:
     name: Publish Rust
     needs: versioning
     runs-on: ubuntu-22.04
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
         with:
           ref: "main"
       - run: git submodule update --init --recursive
@@ -473,7 +575,7 @@ jobs:
       ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.ORG_GRADLE_PROJECT_SIGNINGPASSWORD }}
 
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
         with:
           ref: "main"
       - run: git submodule update --init --recursive
@@ -493,7 +595,7 @@ jobs:
     needs: versioning
     runs-on: macos-12
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
         with:
           ref: "main"
       - run: git submodule update --init --recursive
@@ -512,7 +614,7 @@ jobs:
       contents: read
       packages: write
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
         with:
           ref: "main"
       - run: git submodule update --init --recursive
@@ -557,7 +659,7 @@ jobs:
         shell: bash
 
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
         with:
           ref: "main"
       - run: git submodule update --init --recursive
@@ -611,7 +713,7 @@ jobs:
       NUGET_SOURCE: https://api.nuget.org/v3/index.json
       GITHUB_PACKAGES_SOURCE: https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
         with:
           ref: "main"
       - run: git submodule update --init --recursive
@@ -659,7 +761,7 @@ jobs:
       contents: write
     steps:
       - name: Checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
         with:
           ref: "main"
       - name: Install dependencies
diff --git a/.gitignore b/.gitignore
index dc54cab5..8d85d9a2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -34,6 +34,13 @@ venv/
 
 # JS wrappers
 node_modules/
+javascript/dist/
+prebuilds/
+
+
+# Wasm
+
+wasi-sdk-*
 
 # Rust builds
 Cargo.lock
diff --git a/.npmignore b/.npmignore
index f932e9da..86779772 100644
--- a/.npmignore
+++ b/.npmignore
@@ -11,4 +11,5 @@ wolfram/
 python/
 docs/
 wasm/
-Package.swift
\ No newline at end of file
+Package.swift
+_deps/
\ No newline at end of file
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index 16af83eb..23e5997e 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -3,7 +3,7 @@
     "tasks": [
         {
             "label": "Linux Build Debug",
-            "command": "cmake -DCMAKE_CXX_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12 -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_BUILD_TEST_C=1 -DCMAKE_BUILD_TYPE=Debug -B ./build_debug && cmake --build ./build_debug --config Debug",
+            "command": "cmake -DCMAKE_CXX_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12 -DUSEARCH_BUILD_TEST_CPP=1 -DUSEARCH_BUILD_TEST_C=1 -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_USE_OPENMP=1 -DUSEARCH_USE_SIMSIMD=1 -DUSEARCH_USE_JEMALLOC=1 -DCMAKE_BUILD_TYPE=Debug -B ./build_debug && cmake --build ./build_debug --config Debug",
             "args": [],
             "type": "shell",
             "problemMatcher": [
@@ -12,7 +12,7 @@
         },
         {
             "label": "Linux Build Release",
-            "command": "cmake -DCMAKE_CXX_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12 -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_BUILD_TEST_C=1 -DCMAKE_BUILD_TYPE=Release -B ./build_release && cmake --build ./build_release --config RelWithDebInfo",
+            "command": "cmake -DCMAKE_CXX_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12 -DUSEARCH_BUILD_TEST_CPP=1 -DUSEARCH_BUILD_TEST_C=1 -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_USE_OPENMP=1 -DUSEARCH_USE_SIMSIMD=1 -DUSEARCH_USE_JEMALLOC=1 -DCMAKE_BUILD_TYPE=Release -B ./build_release && cmake --build ./build_release --config RelWithDebInfo",
             "args": [],
             "type": "shell",
             "problemMatcher": [
@@ -21,19 +21,19 @@
         },
         {
             "label": "MacOS Build Debug",
-            "command": "cmake -DCMAKE_C_COMPILER=/opt/homebrew/opt/llvm/bin/clang -DCMAKE_CXX_COMPILER=/opt/homebrew/opt/llvm/bin/clang++ -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_BUILD_TEST_C=1 -DCMAKE_BUILD_TYPE=Debug -B ./build_debug && cmake --build ./build_debug --config Debug",
+            "command": "cmake -DCMAKE_C_COMPILER=/opt/homebrew/opt/llvm/bin/clang -DCMAKE_CXX_COMPILER=/opt/homebrew/opt/llvm/bin/clang++ -DUSEARCH_BUILD_TEST_CPP=1 -DUSEARCH_BUILD_TEST_C=1 -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_USE_OPENMP=1 -DUSEARCH_USE_SIMSIMD=1 -DUSEARCH_USE_JEMALLOC=0 -DCMAKE_BUILD_TYPE=Debug -B ./build_debug && cmake --build ./build_debug --config Debug",
             "args": [],
             "type": "shell",
         },
         {
             "label": "MacOS Build Release",
-            "command": "cmake -DCMAKE_C_COMPILER=/opt/homebrew/opt/llvm/bin/clang -DCMAKE_CXX_COMPILER=/opt/homebrew/opt/llvm/bin/clang++ -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_BUILD_TEST_C=1 -DCMAKE_BUILD_TYPE=Release -B ./build_release && cmake --build ./build_release --config RelWithDebInfo",
+            "command": "cmake -DCMAKE_C_COMPILER=/opt/homebrew/opt/llvm/bin/clang -DCMAKE_CXX_COMPILER=/opt/homebrew/opt/llvm/bin/clang++ -DUSEARCH_BUILD_TEST_CPP=1 -DUSEARCH_BUILD_TEST_C=1 -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_USE_OPENMP=1 -DUSEARCH_USE_SIMSIMD=1 -DUSEARCH_USE_JEMALLOC=0 -DCMAKE_BUILD_TYPE=Release -B ./build_release && cmake --build ./build_release --config RelWithDebInfo",
             "args": [],
             "type": "shell"
         },
         {
             "label": "Windows Build Debug",
-            "command": "cmake -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_BUILD_TEST_C=1 -DCMAKE_BUILD_TYPE=Debug -B ./build_debug && cmake --build ./build_debug --config Debug",
+            "command": "cmake -DUSEARCH_BUILD_TEST_CPP=1 -DUSEARCH_BUILD_TEST_C=1 -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_USE_OPENMP=1 -DUSEARCH_USE_SIMSIMD=1 -DUSEARCH_USE_JEMALLOC=0 -DCMAKE_BUILD_TYPE=Debug -B ./build_debug && cmake --build ./build_debug --config Debug",
             "args": [],
             "type": "shell",
             "problemMatcher": [
@@ -51,7 +51,7 @@
         },
         {
             "label": "Windows Build Release",
-            "command": "cmake -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_BUILD_TEST_C=1 -DCMAKE_BUILD_TYPE=Release -B ./build_release && cmake --build ./build_release --config RelWithDebInfo",
+            "command": "cmake -DUSEARCH_BUILD_TEST_CPP=1 -DUSEARCH_BUILD_TEST_C=1 -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_USE_OPENMP=1 -DUSEARCH_USE_SIMSIMD=1 -DUSEARCH_USE_JEMALLOC=0 -DCMAKE_BUILD_TYPE=Release -B ./build_release && cmake --build ./build_release --config RelWithDebInfo",
             "args": [],
             "type": "shell",
             "problemMatcher": [
diff --git a/CITATION.cff b/CITATION.cff
index 0dd4ba45..3d3b4228 100644
--- a/CITATION.cff
+++ b/CITATION.cff
@@ -1,9 +1,9 @@
 cff-version: 1.2.0
 message: "If you use this software, please cite it as below."
 authors:
-- family-names: "Vardanian"
-  given-names: "Ash"
-  orcid: "https://orcid.org/0000-0002-4882-1815"
+  - family-names: "Vardanian"
+    given-names: "Ash"
+    orcid: "https://orcid.org/0000-0002-4882-1815"
 title: "USearch by Unum Cloud"
 version: 2.9.2
 doi: 10.5281/zenodo.7949416
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d058470a..01ce1613 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -5,10 +5,13 @@ project(
     usearch
     VERSION 2.7.2
     LANGUAGES C CXX
+    DESCRIPTION "Smaller & Faster Single-File Vector Search Engine from Unum"
+    HOMEPAGE_URL "https://github.com/unum-cloud/usearch"
 )
 
 # Determine if USearch is built as a subproject (using `add_subdirectory`) or if it is the main project
 set(USEARCH_IS_MAIN_PROJECT OFF)
+
 if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
     set(USEARCH_IS_MAIN_PROJECT ON)
 endif ()
@@ -31,6 +34,7 @@ option(USEARCH_BUILD_BENCH_CPP "Compile a native benchmark in C++" ${USEARCH_IS_
 option(USEARCH_BUILD_LIB_C "Compile a native library for the C 99 interface" OFF)
 option(USEARCH_BUILD_TEST_C "Compile a test for the C 99 interface" OFF)
 option(USEARCH_BUILD_WOLFRAM "Compile Wolfram Language bindings" OFF)
+option(USEARCH_BUILD_SQLITE "Compile separate SQLite extension" OFF)
 
 # Includes
 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
@@ -56,6 +60,7 @@ set(USEARCH_PKGCONFIG_INSTALL_DIR "${CMAKE_INSTALL_DATADIR}/pkgconfig")
 add_library(${USEARCH_TARGET_NAME} INTERFACE)
 add_library(${PROJECT_NAME}::${USEARCH_TARGET_NAME} ALIAS ${USEARCH_TARGET_NAME})
 set(USEARCH_INCLUDE_BUILD_DIR "${PROJECT_SOURCE_DIR}/include/")
+
 if (${CMAKE_VERSION} VERSION_LESS "3.8.0")
     target_compile_features(${USEARCH_TARGET_NAME} INTERFACE cxx_range_for)
 else ()
@@ -63,18 +68,11 @@ else ()
 endif ()
 
 # Core compilation settings affecting "index.hpp"
-target_compile_definitions(
-    ${USEARCH_TARGET_NAME} INTERFACE $<$<NOT:$<BOOL:${USEARCH_USE_OPENMP}>>:USEARCH_USE_OPENMP=0>
-)
+target_compile_definitions(${USEARCH_TARGET_NAME} INTERFACE "USEARCH_USE_OPENMP=$<BOOL:${USEARCH_USE_OPENMP}>")
 
 # Supplementary compilation settings affecting "index_plugins.hpp"
-target_compile_definitions(
-    ${USEARCH_TARGET_NAME} INTERFACE $<$<NOT:$<BOOL:${USEARCH_USE_FP16LIB}>>:USEARCH_USE_FP16LIB=1>
-)
-
-target_compile_definitions(
-    ${USEARCH_TARGET_NAME} INTERFACE $<$<NOT:$<BOOL:${USEARCH_USE_SIMSIMD}>>:USEARCH_USE_SIMSIMD=0>
-)
+target_compile_definitions(${USEARCH_TARGET_NAME} INTERFACE "USEARCH_USE_FP16LIB=$<BOOL:${USEARCH_USE_FP16LIB}>")
+target_compile_definitions(${USEARCH_TARGET_NAME} INTERFACE "USEARCH_USE_SIMSIMD=$<BOOL:${USEARCH_USE_SIMSIMD}>")
 
 target_include_directories(
     ${USEARCH_TARGET_NAME} ${USEARCH_SYSTEM_INCLUDE} INTERFACE $<BUILD_INTERFACE:${USEARCH_INCLUDE_BUILD_DIR}>
@@ -122,6 +120,7 @@ if (CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin")
     set(CMAKE_USE_PTHREADS_INIT 1)
     set(THREADS_PREFER_PTHREAD_FLAG ON)
 endif ()
+
 find_package(Threads REQUIRED)
 
 if (USEARCH_USE_OPENMP)
@@ -168,7 +167,6 @@ function (setup_target TARGET_NAME)
                     -fmax-errors=1
                     -pedantic
                     -fdiagnostics-color=always
-                    -ftime-report
         )
         target_link_options(
             ${TARGET_NAME}
@@ -206,7 +204,6 @@ function (setup_target TARGET_NAME)
                     # Don't complain if the for-loops were not vectorzied
                     -Wpass-failed=transform-warning
                     -fcolor-diagnostics
-                    -ftime-trace
         )
         target_link_options(
             ${TARGET_NAME}
@@ -246,11 +243,12 @@ function (setup_target TARGET_NAME)
         set_property(SOURCE bench.cpp PROPERTY LANGUAGE CUDA)
         set_target_properties(${TARGET_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)
         set_target_properties(${TARGET_NAME} PROPERTIES CUDA_ARCHITECTURES "86")
-
+        
     elseif (CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM")
         target_compile_options(${TARGET_NAME} PRIVATE -w -ferror-limit=1)
-
+        
     elseif (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
+        target_compile_options(${TARGET_NAME} PRIVATE /wd4068 /wd4996)
         target_compile_options(
             ${TARGET_NAME} PRIVATE $<$<CONFIG:DEBUG>:/DEBUG> $<$<CONFIG:RELEASE>:/O2> $<$<CONFIG:RELWITHDEBINFO>:/O2
                                    /DEBUG>
@@ -291,19 +289,17 @@ function (setup_target TARGET_NAME)
     # On Linux and MacOS our primary shared libraries for C are called `libusearch_c.so` and `libusearch_c.dylib`, while
     # on Windows the "lib" prefix might be missing by default, so let's ensure it's always there
     get_target_property(TARGET_TYPE ${TARGET_NAME} TYPE)
+
     if (TARGET_TYPE STREQUAL "SHARED_LIBRARY" OR TARGET_TYPE STREQUAL "STATIC_LIBRARY")
         set_target_properties(${TARGET_NAME} PROPERTIES PREFIX "lib")
     endif ()
 
     # Core compilation settings affecting "index.hpp"
-    target_compile_definitions(${TARGET_NAME} PRIVATE $<$<NOT:$<BOOL:${USEARCH_USE_OPENMP}>>:USEARCH_USE_OPENMP=0>)
+    target_compile_definitions(${TARGET_NAME} PRIVATE "USEARCH_USE_OPENMP=$<BOOL:${USEARCH_USE_OPENMP}>")
 
     # Supplementary compilation settings affecting "index_plugins.hpp"
-    target_compile_definitions(
-        ${TARGET_NAME} PRIVATE $<$<NOT:$<BOOL:${USEARCH_USE_FP16LIB}>>:USEARCH_USE_FP16LIB=1>
-    )
-
-    target_compile_definitions(${TARGET_NAME} PRIVATE $<$<NOT:$<BOOL:${USEARCH_USE_SIMSIMD}>>:USEARCH_USE_SIMSIMD=0>)
+    target_compile_definitions(${TARGET_NAME} PRIVATE "USEARCH_USE_FP16LIB=$<BOOL:${USEARCH_USE_FP16LIB}>")
+    target_compile_definitions(${TARGET_NAME} PRIVATE "USEARCH_USE_SIMSIMD=$<BOOL:${USEARCH_USE_SIMSIMD}>")
 
 endfunction ()
 
@@ -322,3 +318,7 @@ endif ()
 if (${USEARCH_BUILD_LIB_C} OR ${USEARCH_BUILD_TEST_C})
     add_subdirectory(c)
 endif ()
+
+if (${USEARCH_BUILD_SQLITE})
+    add_subdirectory(sqlite)
+endif ()
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index d094def6..87eb27cc 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -33,11 +33,19 @@ brew install libomp llvm # MacOS
 Using modern syntax, this is how you build and run the test suite:
 
 ```sh
-cmake -DUSEARCH_BUILD_TEST_CPP=1 -B ./build_debug
+cmake -DUSEARCH_BUILD_TEST_CPP=1 -DCMAKE_BUILD_TYPE=Debug -B ./build_debug
 cmake --build ./build_debug --config Debug
 ./build_debug/test_cpp
 ```
 
+If there build mode is not specified, the default is `Release`.
+
+```sh
+cmake -DUSEARCH_BUILD_TEST_CPP=1 -B ./build_release
+cmake --build ./build_release --config Debug
+./build_release/test_cpp
+```
+
 The CMakeLists.txt file has a number of options you can pass:
 
 - What to build:
@@ -45,28 +53,17 @@ The CMakeLists.txt file has a number of options you can pass:
   - `USEARCH_BUILD_BENCH_CPP` - build the C++ benchmark suite
   - `USEARCH_BUILD_LIB_C` - build the C library
   - `USEARCH_BUILD_TEST_C` - build the C test suite
+  - `USEARCH_BUILD_SQLITE` - build the SQLite extension ([no Windows](https://gist.github.com/zeljic/d8b542788b225b1bcb5fce169ee28c55))
 - Which dependencies to use:
   - `USEARCH_USE_OPENMP` - use OpenMP for parallelism
   - `USEARCH_USE_SIMSIMD` - use SimSIMD for vectorization
-  - `USEARCH_USE_JEMALLOC` - use Jemalloc for memory management
+  - `USEARCH_USE_JEMALLOC` - use JeMalloc for memory management
   - `USEARCH_USE_FP16LIB` - use software emulation for half-precision floating point
 
-Putting all of this together on Ubuntu and compiling the "release" version using the GCC 12 compiler:
+Putting all of this together, compiling all targets on most platforms should work with the following snippet:
 
 ```sh
-cmake \
-    -DCMAKE_BUILD_TYPE=Release \
-    -DCMAKE_C_COMPILER=gcc-12 \
-    -DCMAKE_CXX_COMPILER=g++-12 \
-    -DUSEARCH_USE_FP16LIB=1 \
-    -DUSEARCH_USE_OPENMP=1 \
-    -DUSEARCH_USE_SIMSIMD=1 \
-    -DUSEARCH_USE_JEMALLOC=1 \
-    -DUSEARCH_BUILD_TEST_CPP=1 \
-    -DUSEARCH_BUILD_BENCH_CPP=1 \
-    -DUSEARCH_BUILD_LIB_C=1 \
-    -DUSEARCH_BUILD_TEST_C=1 \
-    -B ./build_release
+cmake -DCMAKE_BUILD_TYPE=Release -DUSEARCH_USE_FP16LIB=1 -DUSEARCH_USE_OPENMP=1 -DUSEARCH_USE_SIMSIMD=1 -DUSEARCH_USE_JEMALLOC=1 -DUSEARCH_BUILD_TEST_CPP=1 -DUSEARCH_BUILD_BENCH_CPP=1 -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_BUILD_TEST_C=1 -DUSEARCH_BUILD_SQLITE=0 -B ./build_release
 
 cmake --build ./build_release --config Release
 ./build_release/test_cpp
@@ -111,17 +108,65 @@ I'd recommend putting the following breakpoints when debugging the code in GDB:
 - `__GI_exit` - to stop at exit points - the end of running any executable.
 - `__builtin_unreachable` - to catch all the places where the code is expected to be unreachable.
 
+### Cross Compilation
+
+Unlike GCC, LLVM handles cross compilation very easily.
+You just need to pass the right `TARGET_ARCH` and `BUILD_ARCH` to CMake.
+The [list includes](https://packages.ubuntu.com/search?keywords=crossbuild-essential&searchon=names):
+
+- `crossbuild-essential-amd64` for 64-bit x86
+- `crossbuild-essential-arm64` for 64-bit Arm
+- `crossbuild-essential-armhf` for 32-bit ARM hard-float
+- `crossbuild-essential-armel` for 32-bit ARM soft-float (emulates `float`)
+- `crossbuild-essential-riscv64` for RISC-V
+- `crossbuild-essential-powerpc` for PowerPC
+- `crossbuild-essential-s390x` for IBM Z
+- `crossbuild-essential-mips` for MIPS
+- `crossbuild-essential-ppc64el` for PowerPC 64-bit little-endian
+
+Here is an example for cross-compiling for Arm64 on an x86_64 machine:
+
+```sh
+sudo apt-get update
+sudo apt-get install -y clang lld make crossbuild-essential-arm64 crossbuild-essential-armhf
+export CC="clang"
+export CXX="clang++"
+export AR="llvm-ar"
+export NM="llvm-nm"
+export RANLIB="llvm-ranlib"
+export TARGET_ARCH="aarch64-linux-gnu" # Or "x86_64-linux-gnu"
+export BUILD_ARCH="arm64" # Or "amd64"
+
+cmake -DCMAKE_BUILD_TYPE=Release \
+    -DCMAKE_C_COMPILER_TARGET=${TARGET_ARCH} \
+    -DCMAKE_CXX_COMPILER_TARGET=${TARGET_ARCH} \
+    -DCMAKE_SYSTEM_NAME=Linux \
+    -DCMAKE_SYSTEM_PROCESSOR=${BUILD_ARCH} \
+    -B build_artifacts
+cmake --build build_artifacts --config Release
+```
+
 ## Python 3
 
 Python bindings are built using PyBind11 and are available on [PyPi](https://pypi.org/project/usearch/).
 The compilation settings are controlled by the `setup.py` and are independent from CMake used for C/C++ builds.
-Use PyTest to validate the build.
+To install USearch locally:
+
+```sh
+pip install -e .
+```
+
+For testing USearch uses PyTest, which is pre-configured in `pyproject.toml`.
+Following options are enabled:
 
 - The `-s` option will disable capturing the logs.
 - The `-x` option will exit after first failure to simplify debugging.
+- The `-p no:warnings` option will suppress and allow warnings.
 
 ```sh
-pip install -e . && pytest python/scripts/ -s -x
+pip install pytest pytest-repeat # for repeated fuzzy tests
+pytest # if you trust the default settings
+pytest python/scripts/ -s -x -p no:warnings # to overwrite the default settings
 ```
 
 Linting:
@@ -141,8 +186,6 @@ cibuildwheel
 cibuildwheel --platform linux                   # works on any OS and builds all Linux backends
 cibuildwheel --platform linux --archs x86_64    # 64-bit x86, the most common on desktop and servers
 cibuildwheel --platform linux --archs aarch64   # 64-bit Arm for mobile devices, Apple M-series, and AWS Graviton
-cibuildwheel --platform linux --archs i686      # 32-bit Linux
-cibuildwheel --platform linux --archs s390x     # emulating big-endian IBM Z
 cibuildwheel --platform macos                   # works only on MacOS
 cibuildwheel --platform windows                 # works only on Windows
 ```
@@ -163,11 +206,20 @@ python -m cibuildwheel --platform windows
 
 USearch provides NAPI bindings for NodeJS available on [NPM](https://www.npmjs.com/package/usearch).
 The compilation settings are controlled by the `binding.gyp` and are independent from CMake used for C/C++ builds.
+If you don't have NPM installed, first the Node Version Manager:
+
+```sh
+wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
+nvm install 20
+```
+
+Testing and benchmarking:
 
 ```sh
-npm install
-node --test ./javascript/usearch.test.js
-npm publish
+npm install -g typescript
+npm run build-js
+npm test
+npm run bench
 ```
 
 To compile for AWS Lambda you'd need to recompile the binding.
@@ -181,10 +233,12 @@ RUN yum install tar git python3 cmake gcc-c++ -y && yum groupinstall "Developmen
 # Assuming AWS Linux 2 uses old compilers:
 ENV USEARCH_USE_FP16LIB 1
 ENV DUSEARCH_USE_SIMSIMD 1
-ENV SIMSIMD_TARGET_X86_AVX2 1
-ENV SIMSIMD_TARGET_X86_AVX512 0
-ENV SIMSIMD_TARGET_ARM_NEON 1
-ENV SIMSIMD_TARGET_ARM_SVE 0
+ENV SIMSIMD_TARGET_HASWELL 1
+ENV SIMSIMD_TARGET_SKYLAKE 0
+ENV SIMSIMD_TARGET_ICE 0
+ENV SIMSIMD_TARGET_SAPPHIRE 0
+ENV SIMSIMD_TARGET_NEON 1
+ENV SIMSIMD_TARGET_SVE 0
 
 # For specific PR:
 # RUN npm install --build-from-source unum-cloud/usearch#pull/302/head
@@ -212,7 +266,7 @@ USearch provides Rust bindings available on [Crates.io](https://crates.io/crates
 The compilation settings are controlled by the `build.rs` and are independent from CMake used for C/C++ builds.
 
 ```sh
-cargo test -p usearch
+cargo test -p usearch -- --nocapture --test-threads=1
 cargo publish
 ```
 
diff --git a/README.md b/README.md
index 2cc5042b..afccb236 100644
--- a/README.md
+++ b/README.md
@@ -192,6 +192,44 @@ When compared to FAISS's `IndexFlatL2` in Google Colab, __[USearch may offer up
 - `faiss.IndexFlatL2`: __55.3 ms__.
 - `usearch.index.search`: __2.54 ms__.
 
+## User-Defined Functions
+
+While most vector search packages concentrate on just a few metrics - "Inner Product distance" and "Euclidean distance," USearch extends this list to include any user-defined metrics.
+This flexibility allows you to customize your search for various applications, from computing geospatial coordinates with the rare [Haversine][haversine] distance to creating custom metrics for composite embeddings from multiple AI models.
+
+![USearch: Vector Search Approaches](https://github.com/unum-cloud/usearch/blob/main/assets/usearch-approaches-white.png?raw=true)
+
+Unlike older approaches indexing high-dimensional spaces, like KD-Trees and Locality Sensitive Hashing, HNSW doesn't require vectors to be identical in length.
+They only have to be comparable.
+So you can apply it in [obscure][obscure] applications, like searching for similar sets or fuzzy text matching, using [GZip][gzip-similarity] as a distance function.
+
+> Read more about [JIT and UDF in USearch Python SDK](https://unum-cloud.github.io/usearch/python#user-defined-metrics-and-jit-in-python).
+
+[haversine]: https://ashvardanian.com/posts/abusing-vector-search#geo-spatial-indexing
+[obscure]: https://ashvardanian.com/posts/abusing-vector-search
+[gzip-similarity]: https://twitter.com/LukeGessler/status/1679211291292889100?s=20
+
+## Memory Efficiency, Downcasting, and Quantization
+
+Training a quantization model and dimension-reduction is a common approach to accelerate vector search.
+Those, however, are only sometimes reliable, can significantly affect the statistical properties of your data, and require regular adjustments if your distribution shifts.
+Instead, we have focused on high-precision arithmetic over low-precision downcasted vectors.
+The same index, and `add` and `search` operations will automatically down-cast or up-cast between `f64_t`, `f32_t`, `f16_t`, `i8_t`, and single-bit representations.
+You can use the following command to check, if hardware acceleration is enabled:
+
+```sh
+$ python -c 'from usearch.index import Index; print(Index(ndim=768, metric="cos", dtype="f16").hardware_acceleration)'
+> sapphire
+$ python -c 'from usearch.index import Index; print(Index(ndim=166, metric="tanimoto").hardware_acceleration)'
+> ice
+```
+
+Using smaller numeric types will save you RAM needed to store the vectors, but you can also compress the neighbors lists forming our proximity graphs.
+By default, 32-bit `uint32_t` is used to enumerate those, which is not enough if you need to address over 4 Billion entries.
+For such cases we provide a custom `uint40_t` type, that will still be 37.5% more space-efficient than the commonly used 8-byte integers, and will scale up to 1 Trillion entries.
+
+![USearch uint40_t support](https://github.com/unum-cloud/usearch/blob/main/assets/usearch-neighbor-types.png?raw=true)
+
 ## `Indexes` for Multi-Index Lookups
 
 For larger workloads targeting billions or even trillions of vectors, parallel multi-index lookups become invaluable.
@@ -264,43 +302,6 @@ pairs: dict = men.join(women, max_proposals=0, exact=False)
 
 > Read more in the post: [Combinatorial Stable Marriages for Semantic Search 💍](https://ashvardanian.com/posts/searching-stable-marriages)
 
-## User-Defined Functions
-
-While most vector search packages concentrate on just a few metrics - "Inner Product distance" and "Euclidean distance," USearch extends this list to include any user-defined metrics.
-This flexibility allows you to customize your search for various applications, from computing geospatial coordinates with the rare [Haversine][haversine] distance to creating custom metrics for composite embeddings from multiple AI models.
-
-![USearch: Vector Search Approaches](https://github.com/unum-cloud/usearch/blob/main/assets/usearch-approaches-white.png?raw=true)
-
-Unlike older approaches indexing high-dimensional spaces, like KD-Trees and Locality Sensitive Hashing, HNSW doesn't require vectors to be identical in length.
-They only have to be comparable.
-So you can apply it in [obscure][obscure] applications, like searching for similar sets or fuzzy text matching, using [GZip][gzip-similarity] as a distance function.
-
-> Read more about [JIT and UDF in USearch Python SDK](https://unum-cloud.github.io/usearch/python#user-defined-metrics-and-jit-in-python).
-
-[haversine]: https://ashvardanian.com/posts/abusing-vector-search#geo-spatial-indexing
-[obscure]: https://ashvardanian.com/posts/abusing-vector-search
-[gzip-similarity]: https://twitter.com/LukeGessler/status/1679211291292889100?s=20
-
-## Memory Efficiency, Downcasting, and Quantization
-
-Training a quantization model and dimension-reduction is a common approach to accelerate vector search.
-Those, however, are only sometimes reliable, can significantly affect the statistical properties of your data, and require regular adjustments if your distribution shifts.
-Instead, we have focused on high-precision arithmetic over low-precision downcasted vectors.
-The same index, and `add` and `search` operations will automatically down-cast or up-cast between `f64_t`, `f32_t`, `f16_t`, `i8_t`, and single-bit representations.
-You can use the following command to check, if hardware acceleration is enabled:
-
-```sh
-$ python -c 'from usearch.index import Index; print(Index(ndim=768, metric="cos", dtype="f16").hardware_acceleration)'
-> avx512+f16
-$ python -c 'from usearch.index import Index; print(Index(ndim=166, metric="tanimoto").hardware_acceleration)'
-> avx512+popcnt
-```
-
-Using smaller numeric types will save you RAM needed to store the vectors, but you can also compress the neighbors lists forming our proximity graphs.
-By default, 32-bit `uint32_t` is used to enumerate those, which is not enough if you need to address over 4 Billion entries.
-For such cases we provide a custom `uint40_t` type, that will still be 37.5% more space-efficient than the commonly used 8-byte integers, and will scale up to 1 Trillion entries.
-
-![USearch uint40_t support](https://github.com/unum-cloud/usearch/blob/main/assets/usearch-neighbor-types.png?raw=true)
 
 ## Functionality
 
diff --git a/binding.gyp b/binding.gyp
index bd26332e..229f7e95 100644
--- a/binding.gyp
+++ b/binding.gyp
@@ -24,8 +24,16 @@
             "xcode_settings": {
                 "GCC_ENABLE_CPP_EXCEPTIONS": "YES",
                 "CLANG_CXX_LIBRARY": "libc++",
-                "MACOSX_DEPLOYMENT_TARGET": "10.15",
-            },
+                "MACOSX_DEPLOYMENT_TARGET": "11.0",
+                "OTHER_CFLAGS": [
+                    "-arch arm64",
+                    "-arch x86_64"
+                ],
+                "OTHER_LDFLAGS": [
+                    "-arch arm64",
+                    "-arch x86_64" 
+                ]
+           },
             "msvs_settings": {
                 "VCCLCompilerTool": {
                     "ExceptionHandling": 1,
@@ -46,10 +54,12 @@
                             "USEARCH_USE_OPENMP=<!(echo ${USEARCH_USE_OPENMP:-0})",
                             "USEARCH_USE_SIMSIMD=<!(echo ${USEARCH_USE_SIMSIMD:-1})",
                             "USEARCH_USE_FP16LIB=<!(echo ${USEARCH_USE_FP16LIB:-1})",
-                            "SIMSIMD_TARGET_X86_AVX512=<!(echo ${SIMSIMD_TARGET_X86_AVX512:-1})",
-                            "SIMSIMD_TARGET_ARM_SVE=<!(echo ${SIMSIMD_TARGET_ARM_SVE:-1})",
-                            "SIMSIMD_TARGET_X86_AVX2=<!(echo ${SIMSIMD_TARGET_X86_AVX2:-1})",
-                            "SIMSIMD_TARGET_ARM_NEON=<!(echo ${SIMSIMD_TARGET_ARM_NEON:-1})",
+                            "SIMSIMD_TARGET_NEON=<!(echo ${SIMSIMD_TARGET_NEON:-1})",
+                            "SIMSIMD_TARGET_SVE=<!(echo ${SIMSIMD_TARGET_SVE:-1})",
+                            "SIMSIMD_TARGET_HASWELL=<!(echo ${SIMSIMD_TARGET_HASWELL:-1})",
+                            "SIMSIMD_TARGET_SKYLAKE=<!(echo ${SIMSIMD_TARGET_SKYLAKE:-1})",
+                            "SIMSIMD_TARGET_ICE=<!(echo ${SIMSIMD_TARGET_ICE:-1})",
+                            "SIMSIMD_TARGET_SAPPHIRE=<!(echo ${SIMSIMD_TARGET_SAPPHIRE:-1})",
                         ],
                     },
                 ],
@@ -60,10 +70,12 @@
                             "USEARCH_USE_OPENMP=<!(echo ${USEARCH_USE_OPENMP:-0})",
                             "USEARCH_USE_SIMSIMD=<!(echo ${USEARCH_USE_SIMSIMD:-0})",
                             "USEARCH_USE_FP16LIB=<!(echo ${USEARCH_USE_FP16LIB:-1})",
-                            "SIMSIMD_TARGET_X86_AVX512=<!(echo ${SIMSIMD_TARGET_X86_AVX512:-0})",
-                            "SIMSIMD_TARGET_ARM_SVE=<!(echo ${SIMSIMD_TARGET_ARM_SVE:-0})",
-                            "SIMSIMD_TARGET_X86_AVX2=<!(echo ${SIMSIMD_TARGET_X86_AVX2:-1})",
-                            "SIMSIMD_TARGET_ARM_NEON=<!(echo ${SIMSIMD_TARGET_ARM_NEON:-1})",
+                            "SIMSIMD_TARGET_NEON=<!(echo ${SIMSIMD_TARGET_NEON:-1})",
+                            "SIMSIMD_TARGET_SVE=<!(echo ${SIMSIMD_TARGET_SVE:-0})",
+                            "SIMSIMD_TARGET_HASWELL=<!(echo ${SIMSIMD_TARGET_HASWELL:-1})",
+                            "SIMSIMD_TARGET_SKYLAKE=<!(echo ${SIMSIMD_TARGET_SKYLAKE:-0})",
+                            "SIMSIMD_TARGET_ICE=<!(echo ${SIMSIMD_TARGET_ICE:-0})",
+                            "SIMSIMD_TARGET_SAPPHIRE=<!(echo ${SIMSIMD_TARGET_SAPPHIRE:-0})",
                         ],
                     },
                 ],
@@ -74,10 +86,12 @@
                             "USEARCH_USE_OPENMP=0",
                             "USEARCH_USE_SIMSIMD=0",
                             "USEARCH_USE_FP16LIB=1",
-                            "SIMSIMD_TARGET_X86_AVX512=0",
-                            "SIMSIMD_TARGET_ARM_SVE=0",
-                            "SIMSIMD_TARGET_X86_AVX2=0",
-                            "SIMSIMD_TARGET_ARM_NEON=0",
+                            "SIMSIMD_TARGET_SKYLAKE=0",
+                            "SIMSIMD_TARGET_ICE=0",
+                            "SIMSIMD_TARGET_SAPPHIRE=0",
+                            "SIMSIMD_TARGET_SVE=0",
+                            "SIMSIMD_TARGET_HASWELL=0",
+                            "SIMSIMD_TARGET_NEON=0",
                         ],
                     },
                 ],
diff --git a/build.rs b/build.rs
index f2592600..99569188 100644
--- a/build.rs
+++ b/build.rs
@@ -1,13 +1,72 @@
 fn main() {
-    cxx_build::bridge("rust/lib.rs")
+    let mut build = cxx_build::bridge("rust/lib.rs");
+
+    build
         .file("rust/lib.cpp")
-        .flag_if_supported("-std=c++11")
         .flag_if_supported("-Wno-unknown-pragmas")
+        .warnings(false)
         .include("include")
         .include("rust")
         .include("fp16/include")
-        .include("simsimd/include")
-        .compile("usearch");
+        .include("simsimd/include");
+
+    build
+        .define("USEARCH_USE_SIMSIMD", "1")
+        .define("SIMSIMD_DYNAMIC_DISPATCH", "1")
+        .define("USEARCH_USE_OPENMP", "0")
+        .define("USEARCH_USE_FP16LIB", "0");
+
+    // Conditional compilation depending on the target operating system.
+    if cfg!(target_os = "linux") {
+        build
+            .flag_if_supported("-std=c++17")
+            .flag_if_supported("-O3")
+            .flag_if_supported("-ffast-math")
+            .flag_if_supported("-fdiagnostics-color=always")
+            .flag_if_supported("-g1"); // Simplify debugging
+    } else if cfg!(target_os = "macos") {
+        build
+            .flag_if_supported("-mmacosx-version-min=10.15")
+            .flag_if_supported("-std=c++17")
+            .flag_if_supported("-O3")
+            .flag_if_supported("-ffast-math")
+            .flag_if_supported("-fcolor-diagnostics")
+            .flag_if_supported("-g1"); // Simplify debugging
+    } else if cfg!(target_os = "windows") {
+        build
+            .flag_if_supported("/std:c++17")
+            .flag_if_supported("/O2")
+            .flag_if_supported("/fp:fast")
+            .flag_if_supported("/W1"); // Reduce warnings verbosity
+    }
+
+    if build.try_compile("usearch").is_err() {
+        print!("cargo:warning=Failed to compile with all SIMD backends...");
+
+        let target_arch = std::env::var("CARGO_CFG_TARGET_ARCH").unwrap_or_default();
+        let flags_to_try = match target_arch.as_str() {
+            "arm" | "aarch64" => vec!["SIMSIMD_TARGET_NEON", "SIMSIMD_TARGET_SVE"],
+            _ => vec![
+                "SIMSIMD_TARGET_SAPPHIRE",
+                "SIMSIMD_TARGET_ICE",
+                "SIMSIMD_TARGET_SKYLAKE",
+                "SIMSIMD_TARGET_HASWELL",
+            ],
+        };
+
+        for flag in flags_to_try.iter() {
+            build.define(flag, "0");
+            if build.try_compile("usearch").is_ok() {
+                break;
+            }
+
+            // Print the failed configuration
+            println!(
+                "cargo:warning=Failed to compile after disabling {}, trying next configuration...",
+                flag
+            );
+        }
+    }
 
     println!("cargo:rerun-if-changed=rust/lib.rs");
     println!("cargo:rerun-if-changed=rust/lib.cpp");
diff --git a/c/CMakeLists.txt b/c/CMakeLists.txt
index 709ddc51..8a07fcbc 100644
--- a/c/CMakeLists.txt
+++ b/c/CMakeLists.txt
@@ -15,8 +15,10 @@ if (USEARCH_BUILD_LIB_C)
     # Set the compile options for the static library
     if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
         target_compile_options(usearch_static_c PRIVATE -static-libstdc++)
+        target_link_options(usearch_static_c PRIVATE -static-libstdc++)
     elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
         target_compile_options(usearch_static_c PRIVATE -static)
+        target_link_options(usearch_static_c PRIVATE -static)
     endif ()
 
     setup_target(usearch_c)
diff --git a/c/lib.cpp b/c/lib.cpp
index 0642a22f..a35acaa6 100644
--- a/c/lib.cpp
+++ b/c/lib.cpp
@@ -119,6 +119,10 @@ USEARCH_EXPORT usearch_index_t usearch_init(usearch_init_options_t* options, use
                                            reinterpret_cast<std::uintptr_t>(options->metric), //
                                            metric_punned_signature_t::array_array_k,          //
                                            metric_kind, scalar_kind);
+    if (metric.missing()) {
+        *error = "Unknown metric kind!";
+        return NULL;
+    }
 
     index_dense_t index = index_dense_t::make(metric, config);
     index_dense_t* result_ptr = new index_dense_t(std::move(index));
diff --git a/conanfile.py b/conanfile.py
index 130a7c77..dd11dd1e 100644
--- a/conanfile.py
+++ b/conanfile.py
@@ -7,7 +7,7 @@
 class USearchConan(ConanFile):
 
     name = "usearch"
-    version = '2.9.2'
+    version = "2.9.2"
     license = "Apache-2.0"
     description = "Smaller & Faster Single-File Vector Search Engine from Unum"
     homepage = "https://github.com/unum-cloud/usearch"
diff --git a/cpp/bench.cpp b/cpp/bench.cpp
index 4b3efe60..fbf70f90 100644
--- a/cpp/bench.cpp
+++ b/cpp/bench.cpp
@@ -42,8 +42,6 @@
 #include <omp.h> // `omp_set_num_threads()`
 #endif
 
-#include <simsimd/simsimd.h>
-
 #include <usearch/index_dense.hpp>
 
 using namespace unum::usearch;
@@ -615,4 +613,4 @@ int main(int argc, char** argv) {
         run_punned<index_dense_gt<default_key_t, std::uint32_t>>(dataset, args, config, limits);
 
     return 0;
-}
\ No newline at end of file
+}
diff --git a/docs/benchmarks.md b/docs/benchmarks.md
index b14f7724..aabe10d2 100644
--- a/docs/benchmarks.md
+++ b/docs/benchmarks.md
@@ -55,29 +55,25 @@ Also worth noting, 8-bit quantization results in almost no quantization loss and
 
 Within this repository you will find two commonly used utilities:
 
-- `cpp/bench.cpp` the produces the `bench` binary for broad USearch benchmarks.
+- `cpp/bench.cpp` the produces the `bench_cpp` binary for broad USearch benchmarks.
 - `python/bench.py` and `python/bench.ipynb` for interactive charts against FAISS.
 
 To achieve best highest results we suggest compiling locally for the target architecture.
 
 ```sh
-cmake -B ./build_release \
-    -DCMAKE_BUILD_TYPE=Release \
-    -DUSEARCH_USE_OPENMP=1 \
-    -DUSEARCH_USE_JEMALLOC=1 && \
-    make -C ./build_release -j
-
-./build_release/bench --help
+cmake -B ./build_release -USEARCH_BUILD_BENCH_CPP=1 -DUSEARCH_BUILD_TEST_C=1 -DUSEARCH_USE_OPENMP=1 -DUSEARCH_USE_SIMSIMD=1 
+cmake --build ./build_release --config Release -j
+./build_release/bench_cpp --help
 ```
 
 Which would print the following instructions.
 
 ```txt
 SYNOPSIS
-        ./build_release/bench [--vectors <path>] [--queries <path>] [--neighbors <path>] [-b] [-j
-                              <integer>] [-c <integer>] [--expansion-add <integer>]
-                              [--expansion-search <integer>] [--native|--f16quant|--i8quant]
-                              [--ip|--l2sq|--cos|--haversine] [-h]
+        ./build_release/bench_cpp [--vectors <path>] [--queries <path>] [--neighbors <path>] [-b] [-j
+                                  <integer>] [-c <integer>] [--expansion-add <integer>]
+                                  [--expansion-search <integer>] [--native|--f16quant|--i8quant]
+                                  [--ip|--l2sq|--cos|--haversine] [-h]
 
 OPTIONS
         --vectors <path>
@@ -106,7 +102,7 @@ OPTIONS
         --f16quant  Enable `f16_t` quantization
         --i8quant   Enable `int8_t` quantization
         --ip        Choose Inner Product metric
-        --l2sq        Choose L2 Euclidean metric
+        --l2sq      Choose L2 Euclidean metric
         --cos       Choose Angular metric
         --haversine Choose Haversine metric
         -h, --help  Print this help information on this tool and exit
@@ -115,12 +111,12 @@ OPTIONS
 Here is an example of running the C++ benchmark:
 
 ```sh
-./build_release/bench \
+./build_release/bench_cpp \
     --vectors datasets/wiki_1M/base.1M.fbin \
     --queries datasets/wiki_1M/query.public.100K.fbin \
     --neighbors datasets/wiki_1M/groundtruth.public.100K.ibin
 
-./build_release/bench \
+./build_release/bench_cpp \
     --vectors datasets/t2i_1B/base.1B.fbin \
     --queries datasets/t2i_1B/query.public.100K.fbin \
     --neighbors datasets/t2i_1B/groundtruth.public.100K.ibin \
@@ -205,17 +201,17 @@ With `perf`:
 
 ```sh
 # Pass environment variables with `-E`, and `-d` for details
-sudo -E perf stat -d ./build_release/bench ...
-sudo -E perf mem -d ./build_release/bench ...
+sudo -E perf stat -d ./build_release/bench_cpp ...
+sudo -E perf mem -d ./build_release/bench_cpp ...
 # Sample on-CPU functions for the specified command, at 1 Kilo Hertz:
-sudo -E perf record -F 1000 ./build_release/bench ...
-perf record -d -e arm_spe// -- ./build_release/bench ..
+sudo -E perf record -F 1000 ./build_release/bench_cpp ...
+perf record -d -e arm_spe// -- ./build_release/bench_cpp ..
 ```
 
 ### Caches
 
 ```sh
-sudo perf stat -e 'faults,dTLB-loads,dTLB-load-misses,cache-misses,cache-references' ./build_release/bench ...
+sudo perf stat -e 'faults,dTLB-loads,dTLB-load-misses,cache-misses,cache-references' ./build_release/bench_cpp ...
 ```
 
 Typical output on a 1M vectors dataset is:
@@ -242,4 +238,3 @@ sudo sysctl -w vm.nr_hugepages=2048
 sudo reboot
 sudo cat /proc/sys/vm/nr_hugepages
 ```
-
diff --git a/golang/README.md b/golang/README.md
index 28c48020..df4ee33d 100644
--- a/golang/README.md
+++ b/golang/README.md
@@ -27,8 +27,8 @@ Download and unpack a zip archive from the latest release.
 Move the USearch library and the include file to their respective folders.
 
 ```sh
-wget https://github.com/unum-cloud/usearch/releases/download/<release_tag>/usearch_macOS_<arch>_<usearch_version>.zip
-unzip usearch_macOS_<arch>_<usearch_version>.zip
+wget https://github.com/unum-cloud/usearch/releases/download/<release_tag>/usearch_macos_<arch>_<usearch_version>.zip
+unzip usearch_macos_<arch>_<usearch_version>.zip
 sudo mv libusearch_c.so /usr/local/lib && sudo mv usearch.h /usr/local/include
 ```
 
diff --git a/include/usearch/index.hpp b/include/usearch/index.hpp
index 666e2340..98fb7ede 100644
--- a/include/usearch/index.hpp
+++ b/include/usearch/index.hpp
@@ -1414,7 +1414,9 @@ class input_file_t {
     }
 
     explicit operator bool() const noexcept { return file_; }
-    bool seek_to(std::size_t progress) noexcept { return std::fseek(file_, progress, SEEK_SET) == 0; }
+    bool seek_to(std::size_t progress) noexcept {
+        return std::fseek(file_, static_cast<long>(progress), SEEK_SET) == 0;
+    }
     bool seek_to_end() noexcept { return std::fseek(file_, 0L, SEEK_END) == 0; }
     bool infer_progress(std::size_t& progress) noexcept {
         long int result = std::ftell(file_);
diff --git a/include/usearch/index_plugins.hpp b/include/usearch/index_plugins.hpp
index 065795ef..b3ad5edf 100644
--- a/include/usearch/index_plugins.hpp
+++ b/include/usearch/index_plugins.hpp
@@ -45,27 +45,17 @@
 #endif
 
 #if USEARCH_USE_SIMSIMD
-
 // Propagate the `f16` settings
 #define SIMSIMD_NATIVE_F16 !USEARCH_USE_FP16LIB
-
-#if !defined(SIMSIMD_TARGET_X86_AVX512) && defined(USEARCH_DEFINED_LINUX)
-#define SIMSIMD_TARGET_X86_AVX512 1
-#endif
-
-#if !defined(SIMSIMD_TARGET_ARM_SVE) && defined(USEARCH_DEFINED_LINUX)
-#define SIMSIMD_TARGET_ARM_SVE 1
-#endif
-
-#if !defined(SIMSIMD_TARGET_X86_AVX2) && (defined(USEARCH_DEFINED_LINUX) || defined(USEARCH_DEFINED_APPLE))
-#define SIMSIMD_TARGET_X86_AVX2 1
-#endif
-
-#if !defined(SIMSIMD_TARGET_ARM_NEON) && (defined(USEARCH_DEFINED_LINUX) || defined(USEARCH_DEFINED_APPLE))
-#define SIMSIMD_TARGET_ARM_NEON 1
-#endif
-
+#define SIMSIMD_DYNAMIC_DISPATCH 0
+// No problem, if some of the functions are unused or undefined
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-function"
+#pragma warning(push)
+#pragma warning(disable : 4101)
 #include <simsimd/simsimd.h>
+#pragma warning(pop)
+#pragma GCC diagnostic pop
 #endif
 
 namespace unum {
@@ -128,23 +118,23 @@ enum class metric_kind_t : std::uint8_t {
 enum class scalar_kind_t : std::uint8_t {
     unknown_k = 0,
     // Custom:
-    b1x8_k,
-    u40_k,
-    uuid_k,
+    b1x8_k = 1,
+    u40_k = 2,
+    uuid_k = 3,
     // Common:
-    f64_k,
-    f32_k,
-    f16_k,
-    f8_k,
+    f64_k = 10,
+    f32_k = 11,
+    f16_k = 12,
+    f8_k = 13,
     // Common Integral:
-    u64_k,
-    u32_k,
-    u16_k,
-    u8_k,
-    i64_k,
-    i32_k,
-    i16_k,
-    i8_k,
+    u64_k = 14,
+    u32_k = 15,
+    u16_k = 16,
+    u8_k = 17,
+    i64_k = 20,
+    i32_k = 21,
+    i16_k = 22,
+    i8_k = 23,
 };
 
 enum class prefetching_kind_t {
@@ -343,7 +333,7 @@ class f16_bits_t {
     inline f16_bits_t(i8_converted_t) noexcept;
     inline f16_bits_t(bool v) noexcept : uint16_(f32_to_f16(v)) {}
     inline f16_bits_t(float v) noexcept : uint16_(f32_to_f16(v)) {}
-    inline f16_bits_t(double v) noexcept : uint16_(f32_to_f16(v)) {}
+    inline f16_bits_t(double v) noexcept : uint16_(f32_to_f16(static_cast<float>(v))) {}
 
     inline f16_bits_t operator+(f16_bits_t other) const noexcept { return {float(*this) + float(other)}; }
     inline f16_bits_t operator-(f16_bits_t other) const noexcept { return {float(*this) - float(other)}; }
@@ -496,13 +486,13 @@ class executor_openmp_t {
      *  @param threads_count The number of threads to be used for parallel execution.
      */
     executor_openmp_t(std::size_t threads_count = 0) noexcept {
-        omp_set_num_threads(threads_count ? threads_count : std::thread::hardware_concurrency());
+        omp_set_num_threads(static_cast<int>(threads_count ? threads_count : std::thread::hardware_concurrency()));
     }
 
     /**
      *  @return Maximum number of threads available to the executor.
      */
-    std::size_t size() const noexcept { return omp_get_num_threads(); }
+    std::size_t size() const noexcept { return omp_get_max_threads(); }
 
     /**
      *  @brief Executes tasks in bulk using the specified thread-aware function.
@@ -903,7 +893,17 @@ template <typename from_scalar_at> struct cast_gt<from_scalar_at, b1x8_t> {
         from_scalar_at const* typed_input = reinterpret_cast<from_scalar_at const*>(input);
         unsigned char* typed_output = reinterpret_cast<unsigned char*>(output);
         for (std::size_t i = 0; i != dim; ++i)
-            typed_output[i / CHAR_BIT] |= bool(typed_input[i]) ? (128 >> (i & (CHAR_BIT - 1))) : 0;
+            // Converting from scalar types to boolean isn't trivial and depends on the type.
+            // The most common case is to consider all positive values as `true` and all others as `false`.
+            //  - `bool(0.00001f)` converts to 1
+            //  - `bool(-0.00001f)` converts to 1
+            //  - `bool(0)` converts to 0
+            //  - `bool(-0)` converts to 0
+            //  - `bool(std::numeric_limits<float>::infinity())` converts to 1
+            //  - `bool(std::numeric_limits<float>::epsilon())` converts to 1
+            //  - `bool(std::numeric_limits<float>::signaling_NaN())` converts to 1
+            //  - `bool(std::numeric_limits<float>::denorm_min())` converts to 1
+            typed_output[i / CHAR_BIT] |= bool(typed_input[i] > 0) ? (128 >> (i & (CHAR_BIT - 1))) : 0;
         return true;
     }
 };
@@ -913,6 +913,8 @@ template <typename to_scalar_at> struct cast_gt<b1x8_t, to_scalar_at> {
         unsigned char const* typed_input = reinterpret_cast<unsigned char const*>(input);
         to_scalar_at* typed_output = reinterpret_cast<to_scalar_at*>(output);
         for (std::size_t i = 0; i != dim; ++i)
+            // We can't entirely reconstruct the original scalar type from a boolean.
+            // The simplest variant would be to map set bits to ones, and unset bits to zeros.
             typed_output[i] = bool(typed_input[i / CHAR_BIT] & (128 >> (i & (CHAR_BIT - 1))));
         return true;
     }
@@ -1202,7 +1204,9 @@ template <typename scalar_at = float, typename result_at = float> struct metric_
             return 0;
         result_t corr = dim * ab_sum - a_sum * b_sum;
         denom = std::sqrt(denom);
-        return -corr / denom;
+        // The normal Pearson correlation value is between -1 and 1, but we are looking for a distance.
+        // So instead of returning `corr / denom`, we return `1 - corr / denom`.
+        return 1 - corr / denom;
     }
 };
 
@@ -1254,7 +1258,9 @@ struct cos_i8_t {
             a2 += square(ai);
             b2 += square(bi);
         }
-        return (ab != 0) ? (1.f - ab / (std::sqrt(a2) * std::sqrt(b2))) : 0;
+        result_t a2f = std::sqrt(static_cast<result_t>(a2));
+        result_t b2f = std::sqrt(static_cast<result_t>(b2));
+        return (ab != 0) ? (1.f - ab / (a2f * b2f)) : 0;
     }
 };
 
@@ -1319,7 +1325,7 @@ enum class metric_punned_signature_t {
 /**
  *  @brief  Type-punned metric class, which unlike STL's `std::function` avoids any memory allocations.
  *          It also provides additional APIs to check, if SIMD hardware-acceleration is available.
- *          Wraps the `simsimd_metric_punned_t`.
+ *          Wraps the `simsimd_metric_punned_t` when available. The auto-vectorized backend otherwise.
  */
 class metric_punned_t {
   public:
@@ -1327,12 +1333,18 @@ class metric_punned_t {
     using result_t = distance_punned_t;
 
   private:
-    using punned_arg_t = std::size_t;
-    using punned_ptr_t = result_t (*)(std::size_t, std::size_t, std::size_t, std::size_t);
-
-    punned_ptr_t raw_ptr_ = nullptr;
-    punned_arg_t raw_arg3_ = 0;
-    punned_arg_t raw_arg4_ = 0;
+    /// In the generalized function API all the are arguments are pointer-sized.
+    using uptr_t = std::size_t;
+    /// Distance function that takes two arrays and returns a scalar.
+    using metric_array_array_t = result_t (*)(uptr_t, uptr_t);
+    /// Distance function that takes two arrays and their length and returns a scalar.
+    using metric_array_array_size_t = result_t (*)(uptr_t, uptr_t, uptr_t);
+    /// Distance function callback, like `metric_array_array_size_t`, but depends on member variables.
+    using metric_rounted_t = result_t (metric_punned_t::*)(uptr_t, uptr_t) const;
+
+    metric_rounted_t metric_routed_ = nullptr;
+    uptr_t metric_ptr_ = 0;
+    uptr_t metric_size_arg_ = 0;
 
     std::size_t dimensions_ = 0;
     metric_kind_t metric_kind_ = metric_kind_t::unknown_k;
@@ -1349,7 +1361,7 @@ class metric_punned_t {
      *  ! This is the only relevant function in the object. Everything else is just dynamic dispatch logic.
      */
     inline result_t operator()(byte_t const* a, byte_t const* b) const noexcept {
-        return raw_ptr_(reinterpret_cast<punned_arg_t>(a), reinterpret_cast<punned_arg_t>(b), raw_arg3_, raw_arg4_);
+        return (this->*metric_routed_)(reinterpret_cast<uptr_t>(a), reinterpret_cast<uptr_t>(b));
     }
 
     inline metric_punned_t() noexcept = default;
@@ -1359,18 +1371,18 @@ class metric_punned_t {
         std::size_t dimensions,                            //
         metric_kind_t metric_kind = metric_kind_t::l2sq_k, //
         scalar_kind_t scalar_kind = scalar_kind_t::f32_k) noexcept
-        : raw_arg3_(dimensions), raw_arg4_(dimensions), dimensions_(dimensions), metric_kind_(metric_kind),
-          scalar_kind_(scalar_kind) {
+        : metric_routed_(&metric_punned_t::invoke_array_array_size), metric_size_arg_(dimensions),
+          dimensions_(dimensions), metric_kind_(metric_kind), scalar_kind_(scalar_kind) {
 
 #if USEARCH_USE_SIMSIMD
         if (!configure_with_simsimd())
-            configure_with_auto_vectorized();
+            configure_with_autovec();
 #else
-        configure_with_auto_vectorized();
+        configure_with_autovec();
 #endif
 
         if (scalar_kind == scalar_kind_t::b1x8_k)
-            raw_arg3_ = raw_arg4_ = divide_round_up<CHAR_BIT>(dimensions_);
+            metric_size_arg_ = divide_round_up<CHAR_BIT>(dimensions_);
     }
 
     inline metric_punned_t(                                                 //
@@ -1378,28 +1390,43 @@ class metric_punned_t {
         std::uintptr_t metric_uintptr, metric_punned_signature_t signature, //
         metric_kind_t metric_kind,                                          //
         scalar_kind_t scalar_kind) noexcept
-        : raw_ptr_(reinterpret_cast<punned_ptr_t>(metric_uintptr)), dimensions_(dimensions), metric_kind_(metric_kind),
+        : metric_routed_(signature == metric_punned_signature_t::array_array_k
+                             ? &metric_punned_t::invoke_array_array
+                             : &metric_punned_t::invoke_array_array_size),
+          metric_ptr_(metric_uintptr), metric_size_arg_(dimensions), dimensions_(dimensions), metric_kind_(metric_kind),
           scalar_kind_(scalar_kind) {
 
-        // We don't need to explicitly parse signature, as all of them are compatible.
-        (void)signature;
+        if (scalar_kind == scalar_kind_t::b1x8_k)
+            metric_size_arg_ = divide_round_up<CHAR_BIT>(dimensions_);
     }
 
     inline std::size_t dimensions() const noexcept { return dimensions_; }
     inline metric_kind_t metric_kind() const noexcept { return metric_kind_; }
     inline scalar_kind_t scalar_kind() const noexcept { return scalar_kind_; }
+    inline explicit operator bool() const noexcept { return metric_routed_ && metric_ptr_; }
+
+    /**
+     *  @brief  Checks fi we've failed to initialized the metric with provided arguments.
+     *
+     *  It's different from `operator bool()` when it comes to explicitly uninitialized metrics.
+     *  It's a common case, where a NULL state is created only to be overwritten later, when
+     *  we recover an old index state from a file or a network.
+     */
+    inline bool missing() const noexcept { return !bool(*this) && metric_kind_ != metric_kind_t::unknown_k; }
 
     inline char const* isa_name() const noexcept {
+        if (!*this)
+            return "uninitialized";
+
 #if USEARCH_USE_SIMSIMD
         switch (isa_kind_) {
         case simsimd_cap_serial_k: return "serial";
-        case simsimd_cap_arm_neon_k: return "neon";
-        case simsimd_cap_arm_sve_k: return "sve";
-        case simsimd_cap_x86_avx2_k: return "avx2";
-        case simsimd_cap_x86_avx512_k: return "avx512";
-        case simsimd_cap_x86_avx2fp16_k: return "avx2+f16";
-        case simsimd_cap_x86_avx512fp16_k: return "avx512+f16";
-        case simsimd_cap_x86_avx512vpopcntdq_k: return "avx512+popcnt";
+        case simsimd_cap_neon_k: return "neon";
+        case simsimd_cap_sve_k: return "sve";
+        case simsimd_cap_haswell_k: return "haswell";
+        case simsimd_cap_skylake_k: return "skylake";
+        case simsimd_cap_ice_k: return "ice";
+        case simsimd_cap_sapphire_k: return "sapphire";
         default: return "unknown";
         }
 #endif
@@ -1421,7 +1448,7 @@ class metric_punned_t {
         simsimd_datatype_t datatype = simsimd_datatype_unknown_k;
         simsimd_capability_t allowed = simsimd_cap_any_k;
         switch (metric_kind_) {
-        case metric_kind_t::ip_k: kind = simsimd_metric_ip_k; break;
+        case metric_kind_t::ip_k: kind = simsimd_metric_dot_k; break;
         case metric_kind_t::cos_k: kind = simsimd_metric_cos_k; break;
         case metric_kind_t::l2sq_k: kind = simsimd_metric_l2sq_k; break;
         case metric_kind_t::hamming_k: kind = simsimd_metric_hamming_k; break;
@@ -1443,7 +1470,10 @@ class metric_punned_t {
         if (simd_metric == nullptr)
             return false;
 
-        std::memcpy(&raw_ptr_, &simd_metric, sizeof(simd_metric));
+        std::memcpy(&metric_ptr_, &simd_metric, sizeof(simd_metric));
+        metric_routed_ = metric_kind_ == metric_kind_t::ip_k
+                             ? reinterpret_cast<metric_rounted_t>(&metric_punned_t::invoke_simsimd_reverse)
+                             : reinterpret_cast<metric_rounted_t>(&metric_punned_t::invoke_simsimd);
         isa_kind_ = simd_kind;
         return true;
     }
@@ -1451,91 +1481,103 @@ class metric_punned_t {
         static simsimd_capability_t static_capabilities = simsimd_capabilities();
         return configure_with_simsimd(static_capabilities);
     }
+    result_t invoke_simsimd(uptr_t a, uptr_t b) const noexcept {
+        simsimd_distance_t result;
+        // Here `reinterpret_cast` raises warning... we know what we are doing!
+        auto function_pointer = (simsimd_metric_punned_t)(metric_ptr_);
+        function_pointer(reinterpret_cast<void const*>(a), reinterpret_cast<void const*>(b), metric_size_arg_, &result);
+        return (result_t)result;
+    }
+    result_t invoke_simsimd_reverse(uptr_t a, uptr_t b) const noexcept { return 1 - invoke_simsimd(a, b); }
 #else
     bool configure_with_simsimd() noexcept { return false; }
 #endif
-
-    void configure_with_auto_vectorized() noexcept {
+    result_t invoke_array_array_size(uptr_t a, uptr_t b) const noexcept {
+        auto function_pointer = (metric_array_array_size_t)(metric_ptr_);
+        result_t result = function_pointer(a, b, metric_size_arg_);
+        return result;
+    }
+    result_t invoke_array_array(uptr_t a, uptr_t b) const noexcept {
+        auto function_pointer = (metric_array_array_t)(metric_ptr_);
+        result_t result = function_pointer(a, b);
+        return result;
+    }
+    void configure_with_autovec() noexcept {
         switch (metric_kind_) {
         case metric_kind_t::ip_k: {
             switch (scalar_kind_) {
-            case scalar_kind_t::f32_k: raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_ip_gt<f32_t>>; break;
-            case scalar_kind_t::f16_k: raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_ip_gt<f16_t, f32_t>>; break;
-            case scalar_kind_t::i8_k: raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_ip_gt<i8_t, f32_t>>; break;
-            case scalar_kind_t::f64_k: raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_ip_gt<f64_t>>; break;
-            default: raw_ptr_ = nullptr; break;
+            case scalar_kind_t::f32_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_ip_gt<f32_t>>; break;
+            case scalar_kind_t::f16_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_ip_gt<f16_t, f32_t>>; break;
+            case scalar_kind_t::i8_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_ip_gt<i8_t, f32_t>>; break;
+            case scalar_kind_t::f64_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_ip_gt<f64_t>>; break;
+            default: metric_ptr_ = 0; break;
             }
             break;
         }
         case metric_kind_t::cos_k: {
             switch (scalar_kind_) {
-            case scalar_kind_t::f32_k: raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_cos_gt<f32_t>>; break;
-            case scalar_kind_t::f16_k: raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_cos_gt<f16_t, f32_t>>; break;
-            case scalar_kind_t::i8_k: raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_cos_gt<i8_t, f32_t>>; break;
-            case scalar_kind_t::f64_k: raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_cos_gt<f64_t>>; break;
-            default: raw_ptr_ = nullptr; break;
+            case scalar_kind_t::f32_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_cos_gt<f32_t>>; break;
+            case scalar_kind_t::f16_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_cos_gt<f16_t, f32_t>>; break;
+            case scalar_kind_t::i8_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_cos_gt<i8_t, f32_t>>; break;
+            case scalar_kind_t::f64_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_cos_gt<f64_t>>; break;
+            default: metric_ptr_ = 0; break;
             }
             break;
         }
         case metric_kind_t::l2sq_k: {
             switch (scalar_kind_) {
-            case scalar_kind_t::f32_k: raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_l2sq_gt<f32_t>>; break;
-            case scalar_kind_t::f16_k: raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_l2sq_gt<f16_t, f32_t>>; break;
-            case scalar_kind_t::i8_k: raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_l2sq_gt<i8_t, f32_t>>; break;
-            case scalar_kind_t::f64_k: raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_l2sq_gt<f64_t>>; break;
-            default: raw_ptr_ = nullptr; break;
+            case scalar_kind_t::f32_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_l2sq_gt<f32_t>>; break;
+            case scalar_kind_t::f16_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_l2sq_gt<f16_t, f32_t>>; break;
+            case scalar_kind_t::i8_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_l2sq_gt<i8_t, f32_t>>; break;
+            case scalar_kind_t::f64_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_l2sq_gt<f64_t>>; break;
+            default: metric_ptr_ = 0; break;
             }
             break;
         }
         case metric_kind_t::pearson_k: {
             switch (scalar_kind_) {
-            case scalar_kind_t::i8_k: raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_pearson_gt<i8_t, f32_t>>; break;
-            case scalar_kind_t::f16_k:
-                raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_pearson_gt<f16_t, f32_t>>;
-                break;
-            case scalar_kind_t::f32_k: raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_pearson_gt<f32_t>>; break;
-            case scalar_kind_t::f64_k: raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_pearson_gt<f64_t>>; break;
-            default: raw_ptr_ = nullptr; break;
+            case scalar_kind_t::i8_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_pearson_gt<i8_t, f32_t>>; break;
+            case scalar_kind_t::f16_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_pearson_gt<f16_t, f32_t>>; break;
+            case scalar_kind_t::f32_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_pearson_gt<f32_t>>; break;
+            case scalar_kind_t::f64_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_pearson_gt<f64_t>>; break;
+            default: metric_ptr_ = 0; break;
             }
             break;
         }
         case metric_kind_t::haversine_k: {
             switch (scalar_kind_) {
             case scalar_kind_t::f16_k:
-                raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_haversine_gt<f16_t, f32_t>>;
+                metric_ptr_ = (uptr_t)&equidimensional_<metric_haversine_gt<f16_t, f32_t>>;
                 break;
-            case scalar_kind_t::f32_k: raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_haversine_gt<f32_t>>; break;
-            case scalar_kind_t::f64_k: raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_haversine_gt<f64_t>>; break;
-            default: raw_ptr_ = nullptr; break;
+            case scalar_kind_t::f32_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_haversine_gt<f32_t>>; break;
+            case scalar_kind_t::f64_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_haversine_gt<f64_t>>; break;
+            default: metric_ptr_ = 0; break;
             }
             break;
         }
         case metric_kind_t::divergence_k: {
             switch (scalar_kind_) {
             case scalar_kind_t::f16_k:
-                raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_divergence_gt<f16_t, f32_t>>;
+                metric_ptr_ = (uptr_t)&equidimensional_<metric_divergence_gt<f16_t, f32_t>>;
                 break;
-            case scalar_kind_t::f32_k: raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_divergence_gt<f32_t>>; break;
-            case scalar_kind_t::f64_k: raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_divergence_gt<f64_t>>; break;
-            default: raw_ptr_ = nullptr; break;
+            case scalar_kind_t::f32_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_divergence_gt<f32_t>>; break;
+            case scalar_kind_t::f64_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_divergence_gt<f64_t>>; break;
+            default: metric_ptr_ = 0; break;
             }
             break;
         }
         case metric_kind_t::jaccard_k: // Equivalent to Tanimoto
-        case metric_kind_t::tanimoto_k: raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_tanimoto_gt<b1x8_t>>; break;
-        case metric_kind_t::hamming_k: raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_hamming_gt<b1x8_t>>; break;
-        case metric_kind_t::sorensen_k: raw_ptr_ = (punned_ptr_t)&equidimensional_<metric_sorensen_gt<b1x8_t>>; break;
+        case metric_kind_t::tanimoto_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_tanimoto_gt<b1x8_t>>; break;
+        case metric_kind_t::hamming_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_hamming_gt<b1x8_t>>; break;
+        case metric_kind_t::sorensen_k: metric_ptr_ = (uptr_t)&equidimensional_<metric_sorensen_gt<b1x8_t>>; break;
         default: return;
         }
     }
 
     template <typename typed_at>
-    inline static result_t equidimensional_( //
-        punned_arg_t a, punned_arg_t b,      //
-        punned_arg_t a_dimensions, punned_arg_t b_dimensions) noexcept {
+    inline static result_t equidimensional_(uptr_t a, uptr_t b, uptr_t a_dimensions) noexcept {
         using scalar_t = typename typed_at::scalar_t;
-        (void)b_dimensions;
-        return typed_at{}((scalar_t const*)a, (scalar_t const*)b, a_dimensions);
+        return static_cast<result_t>(typed_at{}((scalar_t const*)a, (scalar_t const*)b, a_dimensions));
     }
 };
 
diff --git a/java/cloud/unum/usearch/cloud_unum_usearch_Index.cpp b/java/cloud/unum/usearch/cloud_unum_usearch_Index.cpp
index 34fccf7b..e760b81a 100644
--- a/java/cloud/unum/usearch/cloud_unum_usearch_Index.cpp
+++ b/java/cloud/unum/usearch/cloud_unum_usearch_Index.cpp
@@ -31,6 +31,13 @@ JNIEXPORT jlong JNICALL Java_cloud_unum_usearch_Index_c_1create( //
         index_dense_config_t config(static_cast<std::size_t>(connectivity), static_cast<std::size_t>(expansion_add),
                                     static_cast<std::size_t>(expansion_search));
         metric_punned_t metric(static_cast<std::size_t>(dimensions), metric_kind, quantization);
+        if (metric.missing()) {
+            jclass jc = (*env).FindClass("java/lang/Error");
+            if (jc)
+                (*env).ThrowNew(jc, "Failed to initialize the metric!");
+            goto cleanup;
+        }
+
         index_dense_t index = index_dense_t::make(metric, config);
         if (!index.reserve(static_cast<std::size_t>(capacity))) {
             jclass jc = (*env).FindClass("java/lang/Error");
@@ -47,6 +54,7 @@ JNIEXPORT jlong JNICALL Java_cloud_unum_usearch_Index_c_1create( //
             (*env).ThrowNew(jc, "Failed to initialize the vector index!");
     }
 
+cleanup:
     (*env).ReleaseStringUTFChars(metric, metric_cstr);
     (*env).ReleaseStringUTFChars(quantization, quantization_cstr);
     return result;
diff --git a/javascript/dist-package-cjs.json b/javascript/dist-package-cjs.json
new file mode 100644
index 00000000..6a0d2ef2
--- /dev/null
+++ b/javascript/dist-package-cjs.json
@@ -0,0 +1,3 @@
+{
+    "type": "commonjs"
+}
\ No newline at end of file
diff --git a/javascript/dist-package-esm.json b/javascript/dist-package-esm.json
new file mode 100644
index 00000000..96ae6e57
--- /dev/null
+++ b/javascript/dist-package-esm.json
@@ -0,0 +1,3 @@
+{
+    "type": "module"
+}
\ No newline at end of file
diff --git a/javascript/lib.cpp b/javascript/lib.cpp
index e20bd307..38856b3f 100644
--- a/javascript/lib.cpp
+++ b/javascript/lib.cpp
@@ -86,9 +86,13 @@ CompiledIndex::CompiledIndex(Napi::CallbackInfo const& ctx) : Napi::ObjectWrap<C
     bool multi = ctx[6].As<Napi::Boolean>().Value();
 
     metric_punned_t metric(dimensions, metric_kind, quantization);
+    if (metric.missing()) {
+        Napi::TypeError::New(ctx.Env(), "Failed to initialize the metric!").ThrowAsJavaScriptException();
+        return;
+    }
+
     index_dense_config_t config(connectivity, expansion_add, expansion_search);
     config.multi = multi;
-
     native_.reset(new index_dense_t(index_dense_t::make(metric, config)));
     if (!native_)
         Napi::Error::New(ctx.Env(), "Out of memory!").ThrowAsJavaScriptException();
@@ -289,6 +293,11 @@ Napi::Value exactSearch(Napi::CallbackInfo const& ctx) {
     }
 
     metric_punned_t metric(dimensions, metric_kind, quantization);
+    if (!metric) {
+        Napi::TypeError::New(env, "Failed to initialize the metric!").ThrowAsJavaScriptException();
+        return env.Null();
+    }
+
     executor_default_t executor;
     exact_search_t search;
 
diff --git a/javascript/node-gyp-build.d.ts b/javascript/node-gyp-build.d.ts
new file mode 100644
index 00000000..da3d75a5
--- /dev/null
+++ b/javascript/node-gyp-build.d.ts
@@ -0,0 +1,1 @@
+declare module "node-gyp-build";
diff --git a/javascript/tsconfig-base.json b/javascript/tsconfig-base.json
new file mode 100644
index 00000000..a3d95be5
--- /dev/null
+++ b/javascript/tsconfig-base.json
@@ -0,0 +1,25 @@
+{
+    "compileOnSave": false,
+    "exclude": ["node_modules", "dist"],
+    "include": ["node-gyp-build.d.ts", "usearch.ts"],
+    "compilerOptions": {
+        "allowJs": true,
+        "allowSyntheticDefaultImports": true,
+        "baseUrl": ".",
+        "declaration": true,
+        "esModuleInterop": true,
+        "inlineSourceMap": false,
+        "lib": ["esnext"],
+        "listEmittedFiles": false,
+        "listFiles": false,
+        "moduleResolution": "node",
+        "noFallthroughCasesInSwitch": true,
+        "pretty": true,
+        "resolveJsonModule": true,
+        "rootDir": ".",
+        "skipLibCheck": true,
+        "strict": true,
+        "traceResolution": false,
+        "types": ["node","./node-gyp-build.d.ts"]
+    }
+}
\ No newline at end of file
diff --git a/javascript/tsconfig-cjs.json b/javascript/tsconfig-cjs.json
new file mode 100644
index 00000000..13a7594b
--- /dev/null
+++ b/javascript/tsconfig-cjs.json
@@ -0,0 +1,8 @@
+{
+    "extends": "./tsconfig-base.json",
+    "compilerOptions": {
+        "module": "commonjs",
+        "outDir": "dist/cjs",
+        "target": "es2015"
+    }
+}
\ No newline at end of file
diff --git a/javascript/tsconfig-esm.json b/javascript/tsconfig-esm.json
new file mode 100644
index 00000000..d03b8cb8
--- /dev/null
+++ b/javascript/tsconfig-esm.json
@@ -0,0 +1,8 @@
+{
+    "extends": "./tsconfig-base.json",
+    "compilerOptions": {
+        "module": "esnext",
+        "outDir": "dist/esm",
+        "target": "esnext"
+    }
+}
\ No newline at end of file
diff --git a/javascript/usearch.js b/javascript/usearch.js
deleted file mode 100644
index a6bc59b7..00000000
--- a/javascript/usearch.js
+++ /dev/null
@@ -1,446 +0,0 @@
-const compiled = require('bindings')('usearch');
-
-/**
- * Enumeration representing the various metric kinds used to measure the distance between vectors in the index.
- * @enum {string}
- * @readonly
- */
-const MetricKind = {
-    Unknown: 'unknown',
-    Cos: 'cos',
-    IP: 'ip',
-    L2sq: 'l2sq',
-    Haversine: 'haversine',
-    Divergence: 'divergence',
-    Pearson: 'pearson',
-    Jaccard: 'jaccard',
-    Hamming: 'hamming',
-    Tanimoto: 'tanimoto',
-    Sorensen: 'sorensen'
-};
-
-/**
- * Enumeration representing the various scalar kinds used to define the type of scalar values in vectors.
- * @enum {string}
- * @readonly
- */
-const ScalarKind = {
-    Unknown: 'unknown',
-    F32: 'f32',
-    F64: 'f64',
-    F16: 'f16',
-    I8: 'i8',
-    B1: 'b1'
-};
-
-/**
- * Represents a set of search results.
- */
-class Matches {
-    /**
-     * Constructs a Matches object.
-     * 
-     * @param {BigUint64Array} keys - The keys of the nearest neighbors found.
-     * @param {Float32Array} distances - The distances of the nearest neighbors found.
-     */
-    constructor(keys, distances) {
-        this.keys = keys;
-        this.distances = distances;
-    }
-}
-
-/**
- * Represents a set of batched search results.
- */
-class BatchMatches {
-    /**
-     * Constructs a BatchMatches object.
-     * 
-     * @param {BigUint64Array} keys - The keys of the nearest neighbors found in the batch.
-     * @param {Float32Array} distances - The distances of the nearest neighbors found in the batch.
-     * @param {BigUint64Array} counts - The number of neighbors found for each query in the batch.
-     * @param {bigint} k - The limit for search results per query in the batch.
-     */
-    constructor(keys, distances, counts, k) {
-        this.keys = keys;
-        this.distances = distances;
-        this.counts = counts;
-        this.k = k;
-    }
-
-    /**
-     * Retrieves a Matches object at the specified index in the batch.
-     * 
-     * @param {number} i - The index at which to retrieve the Matches object.
-     * @returns {Matches} - A Matches object representing the search results at the specified index in the batch.
-     */
-    get(i) {
-        const index = Number(i) * Number(this.k);
-        const count = Number(this.counts[i]);
-        const keysSlice = this.keys.slice(index, index + count);
-        const distancesSlice = this.distances.slice(index, index + count);
-        return new Matches(keysSlice, distancesSlice);
-    }
-}
-
-function isOneKey(keys) {
-    return (!Number.isNaN(keys) && typeof keys === 'number') || typeof keys === 'bigint';
-}
-
-function normalizeKeys(keys) {
-    if (isOneKey(keys)) {
-        keys = BigUint64Array.of(BigInt(keys));
-    } else if (Array.isArray(keys)) {
-        keys = keys.map(key => {
-            if ((typeof key !== 'bigint' && typeof key !== 'number') || Number.isNaN(key))
-                throw new Error("All keys must be integers or bigints.");
-            return BigInt(key);
-        });
-        keys = BigUint64Array.from(keys);
-    } else if (!(keys instanceof BigUint64Array)) {
-        throw new Error("Keys must be a number, bigint, an array of numbers or bigints, or a BigUint64Array.");
-    }
-    return keys;
-}
-
-function isVector(vectors) {
-    return vectors instanceof Float32Array || vectors instanceof Float64Array || vectors instanceof Int8Array;
-}
-
-function normalizeVectors(vectors, dimensions, targetType = Float32Array) {
-    let flattenedVectors;
-    if (isVector(vectors)) {
-        flattenedVectors = (vectors.constructor === targetType) ? vectors : new targetType(vectors);
-    } else if (Array.isArray(vectors)) {
-        let totalLength = 0;
-        for (const vec of vectors) totalLength += vec.length;
-
-        flattenedVectors = new targetType(totalLength);
-        let offset = 0;
-        for (const vec of vectors) {
-            flattenedVectors.set(vec, offset);
-            offset += vec.length;
-        }
-    } else {
-        throw new Error("Vectors must be a TypedArray or an array of arrays.");
-    }
-
-    if (flattenedVectors.length % dimensions !== 0)
-        throw new Error("The size of the flattened vectors must be a multiple of the dimension of the vectors.");
-
-    return flattenedVectors;
-}
-
-
-class Index {
-
-    /**
-     * Constructs a new index.
-     * 
-     * @param {(number | {dimensions: number, metric: MetricKind = MetricKind.Cos, quantization: ScalarKind = ScalarKind.F32, connectivity: number = 0, expansion_add: number = 0, expansion_search: number = 0, multi: boolean = false})} dimensionsOrConfigs
-     * @param {MetricKind} [metric=MetricKind.Cos] - Optional, default is 'cos'.
-     * @param {ScalarKind} [quantization=ScalarKind.F32] - Optional, default is 'f32'.
-     * @param {number} [connectivity=0] - Optional, default is 0.
-     * @param {number} [expansion_add=0] - Optional, default is 0.
-     * @param {number} [expansion_search=0] - Optional, default is 0.
-     * @param {boolean} [multi=false] - Optional, default is false.
-     * @throws Will throw an error if any of the parameters are of incorrect type or invalid value.
-     */
-    constructor(dimensionsOrConfigs, metric = MetricKind.Cos, quantization = ScalarKind.F32, connectivity = 0, expansion_add = 0, expansion_search = 0, multi = false) {
-        let dimensions;
-        if (typeof dimensionsOrConfigs === 'object' && dimensionsOrConfigs !== null) {
-            // Parameters are provided as an object
-            ({ dimensions, metric = MetricKind.Cos, quantization = ScalarKind.F32, connectivity = 0, expansion_add = 0, expansion_search = 0, multi = false } = dimensionsOrConfigs);
-        } else if ((typeof dimensionsOrConfigs === 'number' && !Number.isNaN(dimensionsOrConfigs)) || typeof dimensionsOrConfigs === 'bigint') {
-            // Parameters are provided as individual arguments
-            dimensions = dimensionsOrConfigs;
-        } else {
-            throw new Error("Invalid arguments. Expected either individual arguments or a single object argument.");
-        }
-
-        if ((typeof dimensions !== 'bigint' && (!Number.isInteger(dimensions) || dimensions <= 0)) || 
-            (typeof connectivity !== 'bigint' && (!Number.isInteger(connectivity) || connectivity < 0)) ||
-            (typeof expansion_add !== 'bigint' && (!Number.isInteger(expansion_add) || expansion_add < 0)) ||
-            (typeof expansion_search !== 'bigint' && (!Number.isInteger(expansion_search) || expansion_search < 0))) {
-            throw new Error("`dimensions`, `connectivity`, `expansion_add`, and `expansion_search` must be non-negative integers, with `dimensions` being positive.");
-        }
-
-        if (typeof multi !== 'boolean') {
-            throw new Error("`multi` must be a boolean value.");
-        }
-
-        if (!Object.values(MetricKind).includes(metric)) {
-            throw new Error(`Invalid metric: ${metric}. It must be one of: ${Object.values(MetricKind).join(', ')}`);
-        }
-
-        if (!Object.values(ScalarKind).includes(quantization)) {
-            throw new Error(`Invalid quantization: ${quantization}. It must be one of: ${Object.values(ScalarKind).join(', ')}`);
-        }
-
-        this._compiledIndex = new compiled.CompiledIndex(dimensions, metric, quantization, connectivity, expansion_add, expansion_search, multi);
-    }
-
-    /**
-     * Add vectors to the index.
-     * 
-     * This method accepts vectors and their corresponding keys for indexing.
-     * Each key should correspond to a vector. If a single key is provided,
-     * it is broadcasted to match the number of provided vectors.
-     * 
-     * Vectors should be provided as a flat typed array representing a matrix
-     * where each row is a vector to be indexed. The matrix should have a size
-     * of n * d, where n is the number of vectors, and d is the dimensionality
-     * of the vectors.
-     * 
-     * Keys should be provided as a BigInt or an array-like object of BigInts
-     * representing the unique identifier for each vector.
-     * 
-     * @param {bigint|bigint[]|BigUint64Array} keys - Input identifiers for every vector.
-     *        If a single key is provided, it is associated with all provided vectors.
-     * @param {Float32Array|Float64Array|Int8Array} vectors - Input matrix representing vectors,
-     *        matrix of size n * d, where n is the number of vectors, and d is their dimensionality.
-     * @throws Will throw an error if the length of keys doesn't match the number of vectors
-     *         or if it's not a single key.
-     */
-    add(keys, vectors) {
-        let normalizedKeys = normalizeKeys(keys);
-        let normalizedVectors = normalizeVectors(vectors, this._compiledIndex.dimensions());
-        let countVectors = normalizedVectors.length / this._compiledIndex.dimensions();
-
-        // If a single key is provided but there are multiple vectors,
-        // broadcast the single key value to match the number of vectors
-        if (normalizedKeys.length === 1 && countVectors > 1) {
-            normalizedKeys = BigUint64Array.from({ length: countVectors }, () => normalizedKeys[0]);
-        } else if (normalizedKeys.length !== countVectors) {
-            throw new Error(`The length of keys (${normalizedKeys.length}) must match the number of vectors (${countVectors}) or be a single key.`);
-        }
-
-        // Call the compiled method
-        this._compiledIndex.add(normalizedKeys, normalizedVectors);
-    }
-
-    /**
-     * Perform a k-nearest neighbor search on the index.
-     * 
-     * This method accepts a matrix of query vectors and returns the closest vectors
-     * from the index for each query. The method returns an object containing the keys,
-     * distances, and counts of the matches found.
-     * 
-     * Vectors should be provided as a flat typed array representing a matrix where
-     * each row is a vector. The matrix should be of size n * d, where n is the
-     * number of query vectors, and d is their dimensionality.
-     * 
-     * The parameter `k` specifies the number of nearest neighbors to return for each
-     * query vector. If there are not enough results for a query, the result array is
-     * padded with -1s.
-     * 
-     * @param {Float32Array|Float64Array|Int8Array|Array<Array<number>>} vectors - Input matrix representing query vectors, can be a TypedArray or an array of arrays.
-     * @param {number} k - The number of nearest neighbors to search for each query vector.
-     * @return {Matches|BatchMatches} - Search results for one or more queries, containing keys, distances, and counts of the matches found.
-     * @throws Will throw an error if `k` is not a positive integer or if the size of the vectors is not a multiple of dimensions.
-     * @throws Will throw an error if `vectors` is not a valid input type (TypedArray or an array of arrays) or if its flattened size is not a multiple of dimensions.
-     */
-    search(vectors, k) {
-        if ((!Number.isNaN(k) && typeof k !== 'number') || k <= 0) {
-            throw new Error("`k` must be a positive integer representing the number of nearest neighbors to search for.");
-        }
-
-        const normalizedVectors = normalizeVectors(vectors, this._compiledIndex.dimensions());
-
-        // Call the compiled method and create Matches or BatchMatches object with the result
-        const result = this._compiledIndex.search(normalizedVectors, k);
-        const countInQueries = normalizedVectors.length / Number(this._compiledIndex.dimensions());
-        const batchMatches = new BatchMatches(result[0], result[1], result[2], k);
-
-        if (countInQueries === 1) {
-            return batchMatches.get(0);
-        } else {
-            return batchMatches;
-        }
-    }
-
-    /**
-     * Verifies the presence of one or more keys in the index.
-     * 
-     * This method accepts one or multiple keys as input and returns a boolean or 
-     * an array of booleans indicating whether each key is present in the index.
-     * 
-     * @param {bigint|bigint[]|BigUint64Array} keys - The identifier(s) of the vector(s) to be checked for presence in the index.
-     * @return {boolean|boolean[]} - Returns true if a single key is contained in the index, false otherwise. Returns an array of booleans corresponding to the presence of each key in the index when multiple keys are provided.
-     * @throws Will throw an error if keys are not integers.
-     */
-    contains(keys) {
-        let normalizedKeys = normalizeKeys(keys);
-        let normalizedResults = this._compiledIndex.contains(normalizedKeys);
-        if (isOneKey(keys))
-            return normalizedResults[0];
-        else
-            return normalizedResults;
-    }
-
-    /**
-     * Counts the number of times keys shows up in the index.
-     * 
-     * @param {bigint|bigint[]|BigUint64Array} keys - The identifier(s) of the vector(s) to be enumerated.
-     * @return {number|number[]} - Returns the number of vectors found when a single key is provided. Returns an array of big integers corresponding to the number of vectors found for each key when multiple keys are provided.
-     * @throws Will throw an error if keys are not integers.
-     */
-    count(keys) {
-        let normalizedKeys = normalizeKeys(keys);
-        let normalizedResults = this._compiledIndex.count(normalizedKeys);
-        if (isOneKey(keys))
-            return normalizedResults[0];
-        else
-            return normalizedResults;
-    }
-
-    /**
-     * Removes one or multiple vectors from the index.
-     * 
-     * This method accepts one or multiple keys as input and removes the corresponding vectors from the index.
-     * It returns the number of vectors actually removed for each key provided.
-     * 
-     * @param {bigint|bigint[]|BigUint64Array} keys - The identifier(s) of the vector(s) to be removed.
-     * @return {number|number[]} - Returns the number of vectors deleted when a single key is provided. Returns an array of big integers corresponding to the number of vectors deleted for each key when multiple keys are provided.
-     * @throws Will throw an error if keys are not integers.
-     */
-    remove(keys) {
-        let normalizedKeys = normalizeKeys(keys);
-        let normalizedResults = this._compiledIndex.remove(normalizedKeys);
-        if (isOneKey(keys))
-            return normalizedResults[0];
-        else
-            return normalizedResults;
-    }
-
-    /**
-     * Returns the dimensionality of vectors.
-     * @return {number} The dimensionality of vectors.
-     */
-    dimensions() { return this._compiledIndex.dimensions() }
-
-    /**
-     * Returns connectivity.
-     * @return {number} The connectivity of index.
-     */
-    connectivity() { return this._compiledIndex.connectivity() }
-
-    /**
-     * Returns the number of vectors currently indexed.
-     * @return {number} The number of vectors currently indexed.
-     */
-    size() { return this._compiledIndex.size() }
-
-    /**
-     * Returns index capacity.
-     * @return {number} The capacity of index.
-     */
-    capacity() { return this._compiledIndex.capacity() }
-
-    /** 
-     * Write index to a file.
-     * @param {string} path File path to write.
-     * @throws Will throw an error if `path` is not a string.
-     */
-    save(path) {
-        if (typeof path !== 'string') throw new Error("`path` must be a string representing the file path to write.");
-        this._compiledIndex.save(path);
-    }
-
-    /** 
-     * Load index from a file.
-     * @param {string} path File path to read.
-     * @throws Will throw an error if `path` is not a string.
-     */
-    load(path) {
-        if (typeof path !== 'string') throw new Error("`path` must be a string representing the file path to read.");
-        this._compiledIndex.load(path);
-    }
-
-    /** 
-     * View index from a file, without loading into RAM.
-     * @param {string} path File path to read.
-     * @throws Will throw an error if `path` is not a string.
-     */
-    view(path) {
-        if (typeof path !== 'string') throw new Error("`path` must be a string representing the file path to read.");
-        this._compiledIndex.view(path);
-    }
-}
-
-/**
- * Performs an exact search on the given dataset to find the best matching vectors for each query.
- * 
- * @param {Float32Array|Float64Array|Int8Array|Array<Array<number>>} dataset - The dataset containing vectors to be searched. It can be a TypedArray or an array of arrays.
- * @param {Float32Array|Float64Array|Int8Array|Array<Array<number>>} queries - The queries containing vectors to search for in the dataset. It can be a TypedArray or an array of arrays.
- * @param {number} dimensions - The dimensionality of the vectors in both the dataset and the queries. It defines the number of elements in each vector.
- * @param {number} count - The number of nearest neighbors to return for each query. If the dataset contains fewer vectors than the specified count, the result will contain only the available vectors.
- * @param {MetricKind} metric - The distance metric to be used for the search.
- * @return {Matches|BatchMatches} - Returns a `Matches` or `BatchMatches` object containing the results of the search.
- * @throws Will throw an error if `dimensions` and `count` are not positive integers.
- * @throws Will throw an error if `metric` is not a valid MetricKind.
- * @throws Will throw an error if `dataset` and `queries` are not valid input types (TypedArray or an array of arrays).
- * @throws Will throw an error if the sizes of the flattened `dataset` and `queries` are not multiples of `dimensions`.
- * @throws Will throw an error if `count` is greater than the number of vectors in the `dataset`.
- * 
- * @example
- * const dataset = [[1.0, 2.0], [3.0, 4.0]]; // Two vectors: [1.0, 2.0] and [3.0, 4.0]
- * const queries = [[1.5, 2.5]]; // One vector: [1.5, 2.5]
- * const dimensions = 2; // The number of elements in each vector.
- * const count = 1; // The number of nearest neighbors to return for each query.
- * const metric = MetricKind.IP; // Using the Inner Product distance metric.
- * 
- * const result = exactSearch(dataset, queries, dimensions, count, metric);
- * // result might be: 
- * // {
- * //    keys: BigUint64Array [ 1n ],
- * //    distances: Float32Array [ some_value ],
- * // }
- */
-function exactSearch(dataset, queries, dimensions, count, metric) {
-
-    // Validate and normalize the dimensions and count
-    dimensions = Number(dimensions);
-    count = Number(count);
-    if (count <= 0 || dimensions <= 0) {
-        throw new Error("Dimensions and count must be positive integers.");
-    }
-
-    // Validate metric
-    if (!Object.values(MetricKind).includes(metric)) {
-        throw new Error(`Invalid metric: ${metric}. It must be one of: ${Object.values(MetricKind).join(', ')}`);
-    }
-
-    // Flatten and normalize dataset and queries if they are arrays of arrays
-    let targetType;
-    if (dataset instanceof Float64Array) targetType = Float64Array;
-    else if (dataset instanceof Int8Array) targetType = Int8Array;
-    else targetType = Float32Array; // default to Float32Array if dataset is not Float64Array or Int8Array
-
-    dataset = normalizeVectors(dataset, dimensions, targetType);
-    queries = normalizeVectors(queries, dimensions, targetType);
-    const countInDataset = dataset.length / dimensions;
-    const countInQueries = queries.length / dimensions;
-    if (count > countInDataset) {
-        throw new Error("Count must be equal or smaller than the number of vectors in the dataset.");
-    }
-
-    // Call the compiled function with the normalized input
-    const result = compiled.exactSearch(dataset, queries, dimensions, count, metric);
-
-    // Create and return a Matches or BatchMatches object with the result
-    if (countInQueries == 1) {
-        return new Matches(result[0], result[1]);
-    } else {
-        return new BatchMatches(result[0], result[1], result[2], count);
-    }
-}
-
-module.exports = {
-    Index,
-    MetricKind,
-    ScalarKind,
-    Matches,
-    BatchMatches,
-    exactSearch,
-};
diff --git a/javascript/usearch.ts b/javascript/usearch.ts
new file mode 100644
index 00000000..33f9f638
--- /dev/null
+++ b/javascript/usearch.ts
@@ -0,0 +1,640 @@
+import build from "node-gyp-build";
+import * as path from "node:path";
+import { existsSync } from "node:fs";
+import { getFileName, getRoot } from "bindings";
+
+const compiled: Compiled = build(getBuildDir(getDirName()));
+
+type Vector = Float32Array | Float64Array | Int8Array;
+type Matrix = Vector[];
+type VectorOrMatrix = Vector | Matrix;
+
+type CompiledSearchResult = [
+  keys: BigUint64Array,
+  distances: Float32Array,
+  counts: BigUint64Array
+];
+
+interface CompiledIndex {
+  add(keys: BigUint64Array, vectors: Vector): void;
+  search(vectors: VectorOrMatrix, k: number): CompiledSearchResult;
+  contains(keys: BigUint64Array): boolean[];
+  count(keys: BigUint64Array): number | number[];
+  remove(keys: BigUint64Array): number[];
+  dimensions(): number;
+  connectivity(): number;
+  size(): number;
+  capacity(): number;
+  save(path: string): void;
+  load(path: string): void;
+  view(path: string): void;
+}
+
+interface Compiled {
+  CompiledIndex: CompiledIndex;
+  exactSearch(
+    dataset: VectorOrMatrix,
+    queries: VectorOrMatrix,
+    dimensions: number,
+    count: number,
+    metric: MetricKind
+  ): CompiledSearchResult;
+}
+
+/**
+ * Enumeration representing the various metric kinds used to measure the distance between vectors in the index.
+ * @enum {string}
+ * @readonly
+ */
+export enum MetricKind {
+  Unknown = "unknown",
+  Cos = "cos",
+  IP = "ip",
+  L2sq = "l2sq",
+  Haversine = "haversine",
+  Divergence = "divergence",
+  Pearson = "pearson",
+  Jaccard = "jaccard",
+  Hamming = "hamming",
+  Tanimoto = "tanimoto",
+  Sorensen = "sorensen",
+}
+
+/**
+ * Enumeration representing the various scalar kinds used to define the type of scalar values in vectors.
+ * @enum {string}
+ * @readonly
+ */
+export enum ScalarKind {
+  Unknown = "unknown",
+  F32 = "f32",
+  F64 = "f64",
+  F16 = "f16",
+  I8 = "i8",
+  B1 = "b1",
+}
+
+/**
+ * Represents a set of search results.
+ */
+export class Matches {
+  /**
+   * Constructs a Matches object.
+   *
+   * @param {BigUint64Array} keys - The keys of the nearest neighbors found.
+   * @param {Float32Array} distances - The distances of the nearest neighbors found.
+   */
+  constructor(public keys: BigUint64Array, public distances: Float32Array) { }
+}
+
+/**
+ * Represents a set of batched search results.
+ */
+export class BatchMatches {
+  /**
+   * Constructs a BatchMatches object.
+   *
+   * @param {BigUint64Array} keys - The keys of the nearest neighbors found in the batch.
+   * @param {Float32Array} distances - The distances of the nearest neighbors found in the batch.
+   * @param {BigUint64Array} counts - The number of neighbors found for each query in the batch.
+   * @param {number} k - The limit for search results per query in the batch.
+   */
+  constructor(
+    public keys: BigUint64Array,
+    public distances: Float32Array,
+    public counts: BigUint64Array,
+    public k: number
+  ) { }
+
+  /**
+   * Retrieves a Matches object at the specified index in the batch.
+   *
+   * @param {number} i - The index at which to retrieve the Matches object.
+   * @returns {Matches} - A Matches object representing the search results at the specified index in the batch.
+   */
+  get(i: number): Matches {
+    const index = Number(i) * Number(this.k);
+    const count = Number(this.counts[i]);
+    const keysSlice = this.keys.slice(index, index + count);
+    const distancesSlice = this.distances.slice(index, index + count);
+    return new Matches(keysSlice, distancesSlice);
+  }
+}
+
+function isOneKey(keys: number | bigint | BigUint64Array | bigint[]): boolean {
+  return (
+    (!Number.isNaN(keys) && typeof keys === "number") ||
+    typeof keys === "bigint"
+  );
+}
+
+function normalizeKeys(keys: unknown): BigUint64Array {
+  if (keys instanceof BigUint64Array) {
+    return keys;
+  }
+  let normalizedKeys: BigUint64Array;
+  if (
+    (typeof keys === "number" && !Number.isNaN(keys)) ||
+    typeof keys === "bigint"
+  ) {
+    normalizedKeys = BigUint64Array.of(BigInt(keys));
+  } else if (Array.isArray(keys)) {
+    const bigintkeys = keys.map((key) => {
+      if (typeof key === "bigint") {
+        return key;
+      } else if (
+        typeof key === "number" &&
+        !Number.isNaN(key) &&
+        Number.isInteger(key) &&
+        key >= 0
+      ) {
+        return BigInt(key);
+      }
+      throw new Error("All keys must be positive integers or bigints.");
+    });
+    normalizedKeys = BigUint64Array.from(bigintkeys);
+  } else {
+    throw new Error(
+      "Keys must be a number, bigint, an array of numbers or bigints, or a BigUint64Array."
+    );
+  }
+  return normalizedKeys;
+}
+
+function isVector(vectors: unknown) {
+  return (
+    vectors instanceof Float32Array ||
+    vectors instanceof Float64Array ||
+    vectors instanceof Int8Array
+  );
+}
+
+function normalizeVectors(
+  vectors: VectorOrMatrix,
+  dimensions: number,
+  targetType: NumberArrayConstructor = Float32Array
+): Vector {
+  let flattenedVectors: Vector;
+  if (isVector(vectors)) {
+    flattenedVectors =
+      vectors.constructor === targetType
+        ? vectors
+        : new targetType(vectors as Vector);
+  } else if (Array.isArray(vectors)) {
+    let totalLength = 0;
+    for (const vec of vectors) totalLength += vec.length;
+
+    flattenedVectors = new targetType(totalLength);
+    let offset = 0;
+    for (const vec of vectors) {
+      flattenedVectors.set(vec, offset);
+      offset += vec.length;
+    }
+  } else {
+    throw new Error("Vectors must be a TypedArray or an array of arrays.");
+  }
+
+  if (flattenedVectors.length % dimensions !== 0)
+    throw new Error(
+      "The size of the flattened vectors must be a multiple of the dimension of the vectors."
+    );
+
+  return flattenedVectors;
+}
+
+export interface IndexCongif {
+  dimensions: number;
+  metric: MetricKind;
+  quantization: ScalarKind;
+  connectivity: number;
+  expansion_add: number;
+  expansion_search: number;
+  multi: boolean;
+}
+
+export class Index {
+  /**
+   * Constructs a new index.
+   *
+   * @param {(number | {dimensions: number, metric: MetricKind = MetricKind.Cos, quantization: ScalarKind = ScalarKind.F32, connectivity: number = 0, expansion_add: number = 0, expansion_search: number = 0, multi: boolean = false})} dimensionsOrConfigs
+   * @param {MetricKind} [metric=MetricKind.Cos] - Optional, default is 'cos'.
+   * @param {ScalarKind} [quantization=ScalarKind.F32] - Optional, default is 'f32'.
+   * @param {number} [connectivity=0] - Optional, default is 0.
+   * @param {number} [expansion_add=0] - Optional, default is 0.
+   * @param {number} [expansion_search=0] - Optional, default is 0.
+   * @param {boolean} [multi=false] - Optional, default is false.
+   * @throws Will throw an error if any of the parameters are of incorrect type or invalid value.
+   */
+  constructor(
+    dimensionsOrConfigs: number | bigint | IndexCongif,
+    metric: MetricKind = MetricKind.Cos,
+    quantization: ScalarKind = ScalarKind.F32,
+    connectivity: number = 0,
+    expansion_add: number = 0,
+    expansion_search: number = 0,
+    multi: boolean = false
+  ) {
+    let dimensions: number | bigint;
+    if (
+      (typeof dimensionsOrConfigs === "number" &&
+        !Number.isNaN(dimensionsOrConfigs)) ||
+      typeof dimensionsOrConfigs === "bigint"
+    ) {
+      // Parameters are provided as individual arguments
+      dimensions = dimensionsOrConfigs;
+    } else if (
+      typeof dimensionsOrConfigs === "object" &&
+      dimensionsOrConfigs !== null
+    ) {
+      // Parameters are provided as an object
+      ({
+        dimensions,
+        metric = MetricKind.Cos,
+        quantization = ScalarKind.F32,
+        connectivity = 0,
+        expansion_add = 0,
+        expansion_search = 0,
+        multi = false,
+      } = dimensionsOrConfigs);
+    } else {
+      throw new Error(
+        "Invalid arguments. Expected either individual arguments or a single object argument."
+      );
+    }
+
+    if (
+      (typeof dimensions !== 'bigint' && (!Number.isInteger(dimensions) || dimensions <= 0)) ||
+      (typeof connectivity !== 'bigint' && (!Number.isInteger(connectivity) || connectivity < 0)) ||
+      (typeof expansion_add !== 'bigint' && (!Number.isInteger(expansion_add) || expansion_add < 0)) ||
+      (typeof expansion_search !== 'bigint' && (!Number.isInteger(expansion_search) || expansion_search < 0))) {
+      throw new Error(
+        "`dimensions`, `connectivity`, `expansion_add`, and `expansion_search` must be non-negative integers, with `dimensions` being positive."
+      );
+    }
+
+    if (typeof multi !== "boolean") {
+      throw new Error("`multi` must be a boolean value.");
+    }
+
+    if (!Object.values(MetricKind).includes(metric)) {
+      throw new Error(
+        `Invalid metric: ${metric}. It must be one of: ${Object.values(
+          MetricKind
+        ).join(", ")}`
+      );
+    }
+
+    if (!Object.values(ScalarKind).includes(quantization)) {
+      throw new Error(
+        `Invalid quantization: ${quantization}. It must be one of: ${Object.values(
+          ScalarKind
+        ).join(", ")}`
+      );
+    }
+
+    // @ts-expect-error
+    this.#compiledIndex = new compiled.CompiledIndex(
+      dimensions,
+      metric,
+      quantization,
+      connectivity,
+      expansion_add,
+      expansion_search,
+      multi
+    );
+  }
+
+  #compiledIndex: CompiledIndex;
+
+  /**
+   * Add vectors to the index.
+   *
+   * This method accepts vectors and their corresponding keys for indexing.
+   * Each key should correspond to a vector. If a single key is provided,
+   * it is broadcasted to match the number of provided vectors.
+   *
+   * Vectors should be provided as a flat typed array representing a matrix
+   * where each row is a vector to be indexed. The matrix should have a size
+   * of n * d, where n is the number of vectors, and d is the dimensionality
+   * of the vectors.
+   *
+   * Keys should be provided as a BigInt or an array-like object of BigInts
+   * representing the unique identifier for each vector.
+   *
+   * @param {bigint|bigint[]|BigUint64Array} keys - Input identifiers for every vector.
+   *        If a single key is provided, it is associated with all provided vectors.
+   * @param {Float32Array|Float64Array|Int8Array} vectors - Input matrix representing vectors,
+   *        matrix of size n * d, where n is the number of vectors, and d is their dimensionality.
+   * @throws Will throw an error if the length of keys doesn't match the number of vectors
+   *         or if it's not a single key.
+   */
+  add(keys: bigint | bigint[] | BigUint64Array, vectors: Vector) {
+    let normalizedKeys = normalizeKeys(keys);
+    let normalizedVectors = normalizeVectors(
+      vectors,
+      this.#compiledIndex.dimensions()
+    );
+    let countVectors =
+      normalizedVectors.length / this.#compiledIndex.dimensions();
+
+    // If a single key is provided but there are multiple vectors,
+    // broadcast the single key value to match the number of vectors
+    if (normalizedKeys.length === 1 && countVectors > 1) {
+      normalizedKeys = BigUint64Array.from(
+        { length: countVectors },
+        () => normalizedKeys[0]
+      );
+    } else if (normalizedKeys.length !== countVectors) {
+      throw new Error(
+        `The length of keys (${normalizedKeys.length}) must match the number of vectors (${countVectors}) or be a single key.`
+      );
+    }
+
+    // Call the compiled method
+    this.#compiledIndex.add(normalizedKeys, normalizedVectors);
+  }
+
+  /**
+   * Perform a k-nearest neighbor search on the index.
+   *
+   * This method accepts a matrix of query vectors and returns the closest vectors
+   * from the index for each query. The method returns an object containing the keys,
+   * distances, and counts of the matches found.
+   *
+   * Vectors should be provided as a flat typed array representing a matrix where
+   * each row is a vector. The matrix should be of size n * d, where n is the
+   * number of query vectors, and d is their dimensionality.
+   *
+   * The parameter `k` specifies the number of nearest neighbors to return for each
+   * query vector. If there are not enough results for a query, the result array is
+   * padded with -1s.
+   *
+   * @param {Float32Array|Float64Array|Int8Array|Array<Array<number>>} vectors - Input matrix representing query vectors, can be a TypedArray or an array of TypedArray.
+   * @param {number} k - The number of nearest neighbors to search for each query vector.
+   * @return {Matches|BatchMatches} - Search results for one or more queries, containing keys, distances, and counts of the matches found.
+   * @throws Will throw an error if `k` is not a positive integer or if the size of the vectors is not a multiple of dimensions.
+   * @throws Will throw an error if `vectors` is not a valid input type (TypedArray or an array of TypedArray) or if its flattened size is not a multiple of dimensions.
+   */
+  search(vectors: VectorOrMatrix, k: number): Matches | BatchMatches {
+    if ((!Number.isNaN(k) && typeof k !== "number") || k <= 0) {
+      throw new Error(
+        "`k` must be a positive integer representing the number of nearest neighbors to search for."
+      );
+    }
+
+    const normalizedVectors = normalizeVectors(
+      vectors,
+      this.#compiledIndex.dimensions()
+    );
+
+    // Call the compiled method and create Matches or BatchMatches object with the result
+    const result = this.#compiledIndex.search(normalizedVectors, k);
+    const countInQueries =
+      normalizedVectors.length / Number(this.#compiledIndex.dimensions());
+    const batchMatches = new BatchMatches(...result, k);
+
+    if (countInQueries === 1) {
+      return batchMatches.get(0);
+    } else {
+      return batchMatches;
+    }
+  }
+
+  /**
+   * Verifies the presence of one or more keys in the index.
+   *
+   * This method accepts one or multiple keys as input and returns a boolean or
+   * an array of booleans indicating whether each key is present in the index.
+   *
+   * @param {bigint|bigint[]|BigUint64Array} keys - The identifier(s) of the vector(s) to be checked for presence in the index.
+   * @return {boolean|boolean[]} - Returns true if a single key is contained in the index, false otherwise. Returns an array of booleans corresponding to the presence of each key in the index when multiple keys are provided.
+   * @throws Will throw an error if keys are not integers.
+   */
+  contains(keys: bigint | bigint[] | BigUint64Array): boolean | boolean[] {
+    let normalizedKeys = normalizeKeys(keys);
+    let normalizedResults = this.#compiledIndex.contains(normalizedKeys);
+    if (isOneKey(keys)) return normalizedResults[0];
+    else return normalizedResults;
+  }
+
+  /**
+   * Counts the number of times keys shows up in the index.
+   *
+   * @param {bigint|bigint[]|BigUint64Array} keys - The identifier(s) of the vector(s) to be enumerated.
+   * @return {number|number[]} - Returns the number of vectors found when a single key is provided. Returns an array of big integers corresponding to the number of vectors found for each key when multiple keys are provided.
+   * @throws Will throw an error if keys are not integers.
+   */
+  count(keys: bigint | bigint[] | BigUint64Array): number | number[] {
+    let normalizedKeys = normalizeKeys(keys);
+    let normalizedResults = this.#compiledIndex.count(normalizedKeys);
+    if (isOneKey(keys)) return (normalizedResults as unknown as number[])[0];
+    else return normalizedResults;
+  }
+
+  /**
+   * Removes one or multiple vectors from the index.
+   *
+   * This method accepts one or multiple keys as input and removes the corresponding vectors from the index.
+   * It returns the number of vectors actually removed for each key provided.
+   *
+   * @param {bigint|bigint[]|BigUint64Array} keys - The identifier(s) of the vector(s) to be removed.
+   * @return {number|number[]} - Returns the number of vectors deleted when a single key is provided. Returns an array of big integers corresponding to the number of vectors deleted for each key when multiple keys are provided.
+   * @throws Will throw an error if keys are not integers.
+   */
+  remove(keys: bigint | bigint[] | BigUint64Array): number | number[] {
+    let normalizedKeys = normalizeKeys(keys);
+    let normalizedResults = this.#compiledIndex.remove(normalizedKeys);
+    if (isOneKey(keys)) return normalizedResults[0];
+    else return normalizedResults;
+  }
+
+  /**
+   * Returns the dimensionality of vectors.
+   * @return {number} The dimensionality of vectors.
+   */
+  dimensions(): number {
+    return this.#compiledIndex.dimensions();
+  }
+
+  /**
+   * Returns connectivity.
+   * @return {number} The connectivity of index.
+   */
+  connectivity(): number {
+    return this.#compiledIndex.connectivity();
+  }
+
+  /**
+   * Returns the number of vectors currently indexed.
+   * @return {number} The number of vectors currently indexed.
+   */
+  size(): number {
+    return this.#compiledIndex.size();
+  }
+
+  /**
+   * Returns index capacity.
+   * @return {number} The capacity of index.
+   */
+  capacity(): number {
+    return this.#compiledIndex.capacity();
+  }
+
+  /**
+   * Write index to a file.
+   * @param {string} path File path to write.
+   * @throws Will throw an error if `path` is not a string.
+   */
+  save(path: string) {
+    if (typeof path !== "string")
+      throw new Error(
+        "`path` must be a string representing the file path to write."
+      );
+    this.#compiledIndex.save(path);
+  }
+
+  /**
+   * Load index from a file.
+   * @param {string} path File path to read.
+   * @throws Will throw an error if `path` is not a string.
+   */
+  load(path: string) {
+    if (typeof path !== "string")
+      throw new Error(
+        "`path` must be a string representing the file path to read."
+      );
+    this.#compiledIndex.load(path);
+  }
+
+  /**
+   * View index from a file, without loading into RAM.
+   * @param {string} path File path to read.
+   * @throws Will throw an error if `path` is not a string.
+   */
+  view(path: string) {
+    if (typeof path !== "string")
+      throw new Error(
+        "`path` must be a string representing the file path to read."
+      );
+    this.#compiledIndex.view(path);
+  }
+}
+
+type NumberArrayConstructor =
+  | Float64ArrayConstructor
+  | Float32ArrayConstructor
+  | Int8ArrayConstructor;
+/**
+ * Performs an exact search on the given dataset to find the best matching vectors for each query.
+ *
+ * @param {Float32Array|Float64Array|Int8Array|Array<Array<number>>} dataset - The dataset containing vectors to be searched. It can be a TypedArray or an array of arrays.
+ * @param {Float32Array|Float64Array|Int8Array|Array<Array<number>>} queries - The queries containing vectors to search for in the dataset. It can be a TypedArray or an array of arrays.
+ * @param {number} dimensions - The dimensionality of the vectors in both the dataset and the queries. It defines the number of elements in each vector.
+ * @param {number} count - The number of nearest neighbors to return for each query. If the dataset contains fewer vectors than the specified count, the result will contain only the available vectors.
+ * @param {MetricKind} metric - The distance metric to be used for the search.
+ * @return {Matches|BatchMatches} - Returns a `Matches` or `BatchMatches` object containing the results of the search.
+ * @throws Will throw an error if `dimensions` and `count` are not positive integers.
+ * @throws Will throw an error if `metric` is not a valid MetricKind.
+ * @throws Will throw an error if `dataset` and `queries` are not valid input types (TypedArray or an array of arrays).
+ * @throws Will throw an error if the sizes of the flattened `dataset` and `queries` are not multiples of `dimensions`.
+ * @throws Will throw an error if `count` is greater than the number of vectors in the `dataset`.
+ *
+ * @example
+ * const dataset = [[1.0, 2.0], [3.0, 4.0]]; // Two vectors: [1.0, 2.0] and [3.0, 4.0]
+ * const queries = [[1.5, 2.5]]; // One vector: [1.5, 2.5]
+ * const dimensions = 2; // The number of elements in each vector.
+ * const count = 1; // The number of nearest neighbors to return for each query.
+ * const metric = MetricKind.IP; // Using the Inner Product distance metric.
+ *
+ * const result = exactSearch(dataset, queries, dimensions, count, metric);
+ * // result might be:
+ * // {
+ * //    keys: BigUint64Array [ 1n ],
+ * //    distances: Float32Array [ some_value ],
+ * // }
+ */
+function exactSearch(
+  dataset: VectorOrMatrix,
+  queries: VectorOrMatrix,
+  dimensions: number,
+  count: number,
+  metric: MetricKind
+): Matches | BatchMatches {
+  // Validate and normalize the dimensions and count
+  dimensions = Number(dimensions);
+  count = Number(count);
+  if (count <= 0 || dimensions <= 0) {
+    throw new Error("Dimensions and count must be positive integers.");
+  }
+
+  // Validate metric
+  if (!Object.values(MetricKind).includes(metric)) {
+    throw new Error(
+      `Invalid metric: ${metric}. It must be one of: ${Object.values(
+        MetricKind
+      ).join(", ")}`
+    );
+  }
+
+  // Flatten and normalize dataset and queries if they are arrays of arrays
+  let targetType: NumberArrayConstructor;
+  if (dataset instanceof Float64Array) targetType = Float64Array;
+  else if (dataset instanceof Int8Array) targetType = Int8Array;
+  else targetType = Float32Array; // default to Float32Array if dataset is not Float64Array or Int8Array
+
+  dataset = normalizeVectors(dataset, dimensions, targetType);
+  queries = normalizeVectors(queries, dimensions, targetType);
+  const countInDataset = dataset.length / dimensions;
+  const countInQueries = queries.length / dimensions;
+  if (count > countInDataset) {
+    throw new Error(
+      "Count must be equal or smaller than the number of vectors in the dataset."
+    );
+  }
+
+  // Call the compiled function with the normalized input
+  const result = compiled.exactSearch(
+    dataset,
+    queries,
+    dimensions,
+    count,
+    metric
+  );
+
+  // Create and return a Matches or BatchMatches object with the result
+  if (countInQueries == 1) {
+    return new Matches(result[0], result[1]);
+  } else {
+    return new BatchMatches(...result, count);
+  }
+}
+
+module.exports = {
+  Index,
+  MetricKind,
+  ScalarKind,
+  Matches,
+  BatchMatches,
+  exactSearch,
+};
+
+// utility functions to help find native builds
+
+function getBuildDir(dir: string) {
+  if (existsSync(path.join(dir, "build"))) return dir;
+  if (existsSync(path.join(dir, "prebuilds"))) return dir;
+  if (path.basename(dir) === ".next") {
+    // special case for next.js on custom node (not vercel)
+    const sideways = path.join(dir, "..", "node_modules", "usearch");
+    if (existsSync(sideways)) return getBuildDir(sideways);
+  }
+  if (dir === "/") throw new Error("Could not find native build for usearch");
+  return getBuildDir(path.join(dir, ".."));
+}
+
+function getDirName() {
+  try {
+    if (__dirname) return __dirname;
+  } catch (e) { }
+  return getRoot(getFileName());
+}
diff --git a/objc/USearchObjective.mm b/objc/USearchObjective.mm
index 2ac024b4..d336fc98 100644
--- a/objc/USearchObjective.mm
+++ b/objc/USearchObjective.mm
@@ -121,6 +121,12 @@ + (instancetype)make:(USearchMetric)metricKind dimensions:(UInt32)dimensions con
 
     index_config_t config(static_cast<std::size_t>(connectivity));
     metric_punned_t metric(dims, to_native_metric(metricKind), to_native_scalar(quantization));
+    if (metric.missing()) {
+        @throw [NSException exceptionWithName:@"Can't create an index"
+                                       reason:@"The metric is not supported"
+                                     userInfo:nil];
+    }
+
     shared_index_dense_t ptr = std::make_shared<index_dense_t>(index_dense_t::make(metric, config));
     return [[USearchIndex alloc] initWithIndex:ptr];
 }
diff --git a/package-lock.json b/package-lock.json
index 8ffa978e..3a95d8cc 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,43 +1,1381 @@
 {
     "name": "usearch",
-    "version": "2.8.14",
+    "version": "2.9.2",
     "lockfileVersion": 3,
     "requires": true,
     "packages": {
         "": {
             "name": "usearch",
-            "version": "2.8.14",
+            "version": "2.9.2",
             "hasInstallScript": true,
             "license": "Apache 2.0",
             "dependencies": {
-                "@types/node": "^20.4.5",
-                "bindings": "~1.2.1",
-                "node-addon-api": "^3.0.0"
+                "bindings": "^1.5.0",
+                "node-addon-api": "^3.0.0",
+                "node-gyp-build": "^4.8.0"
             },
             "devDependencies": {
-                "typescript": "^5.1.6"
+                "@types/bindings": "^1.5.5",
+                "@types/node": "^20.11.0",
+                "node-gyp": "^10.0.1",
+                "prebuildify": "^6.0.0",
+                "typescript": "^5.3.3"
             },
             "engines": {
                 "node": "~10 >=10.20 || >=12.17"
             }
         },
+        "node_modules/@isaacs/cliui": {
+            "version": "8.0.2",
+            "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+            "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+            "dev": true,
+            "dependencies": {
+                "string-width": "^5.1.2",
+                "string-width-cjs": "npm:string-width@^4.2.0",
+                "strip-ansi": "^7.0.1",
+                "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+                "wrap-ansi": "^8.1.0",
+                "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@npmcli/agent": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.0.tgz",
+            "integrity": "sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==",
+            "dev": true,
+            "dependencies": {
+                "agent-base": "^7.1.0",
+                "http-proxy-agent": "^7.0.0",
+                "https-proxy-agent": "^7.0.1",
+                "lru-cache": "^10.0.1",
+                "socks-proxy-agent": "^8.0.1"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/@npmcli/agent/node_modules/lru-cache": {
+            "version": "10.1.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
+            "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
+            "dev": true,
+            "engines": {
+                "node": "14 || >=16.14"
+            }
+        },
+        "node_modules/@npmcli/fs": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz",
+            "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==",
+            "dev": true,
+            "dependencies": {
+                "semver": "^7.3.5"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/@pkgjs/parseargs": {
+            "version": "0.11.0",
+            "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+            "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+            "dev": true,
+            "optional": true,
+            "engines": {
+                "node": ">=14"
+            }
+        },
+        "node_modules/@types/bindings": {
+            "version": "1.5.5",
+            "resolved": "https://registry.npmjs.org/@types/bindings/-/bindings-1.5.5.tgz",
+            "integrity": "sha512-y59PRZBTo2/HuN94qRjyJD+465vGoXMsqz9MMJDbtJL9oT5/B+tAL6c3k10epIinC2/BBkLqKzKC6keukl8wdQ==",
+            "dev": true,
+            "dependencies": {
+                "@types/node": "*"
+            }
+        },
         "node_modules/@types/node": {
-            "version": "20.10.6",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz",
-            "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==",
+            "version": "20.11.0",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.0.tgz",
+            "integrity": "sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==",
+            "dev": true,
+            "dependencies": {
+                "undici-types": "~5.26.4"
+            }
+        },
+        "node_modules/abbrev": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
+            "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
+            "dev": true,
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/agent-base": {
+            "version": "7.1.0",
+            "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
+            "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
+            "dev": true,
+            "dependencies": {
+                "debug": "^4.3.4"
+            },
+            "engines": {
+                "node": ">= 14"
+            }
+        },
+        "node_modules/aggregate-error": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+            "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+            "dev": true,
+            "dependencies": {
+                "clean-stack": "^2.0.0",
+                "indent-string": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/ansi-regex": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+            "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+            "dev": true,
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+            }
+        },
+        "node_modules/ansi-styles": {
+            "version": "6.2.1",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+            "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+            "dev": true,
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/balanced-match": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+            "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+            "dev": true
+        },
+        "node_modules/base64-js": {
+            "version": "1.5.1",
+            "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+            "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ]
+        },
+        "node_modules/bindings": {
+            "version": "1.5.0",
+            "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+            "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+            "dependencies": {
+                "file-uri-to-path": "1.0.0"
+            }
+        },
+        "node_modules/bl": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+            "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+            "dev": true,
+            "dependencies": {
+                "buffer": "^5.5.0",
+                "inherits": "^2.0.4",
+                "readable-stream": "^3.4.0"
+            }
+        },
+        "node_modules/brace-expansion": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+            "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+            "dev": true,
+            "dependencies": {
+                "balanced-match": "^1.0.0"
+            }
+        },
+        "node_modules/buffer": {
+            "version": "5.7.1",
+            "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+            "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ],
+            "dependencies": {
+                "base64-js": "^1.3.1",
+                "ieee754": "^1.1.13"
+            }
+        },
+        "node_modules/cacache": {
+            "version": "18.0.2",
+            "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.2.tgz",
+            "integrity": "sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==",
+            "dev": true,
+            "dependencies": {
+                "@npmcli/fs": "^3.1.0",
+                "fs-minipass": "^3.0.0",
+                "glob": "^10.2.2",
+                "lru-cache": "^10.0.1",
+                "minipass": "^7.0.3",
+                "minipass-collect": "^2.0.1",
+                "minipass-flush": "^1.0.5",
+                "minipass-pipeline": "^1.2.4",
+                "p-map": "^4.0.0",
+                "ssri": "^10.0.0",
+                "tar": "^6.1.11",
+                "unique-filename": "^3.0.0"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/cacache/node_modules/lru-cache": {
+            "version": "10.1.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
+            "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
+            "dev": true,
+            "engines": {
+                "node": "14 || >=16.14"
+            }
+        },
+        "node_modules/chownr": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+            "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+            "dev": true
+        },
+        "node_modules/clean-stack": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+            "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/cross-spawn": {
+            "version": "7.0.3",
+            "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+            "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+            "dev": true,
+            "dependencies": {
+                "path-key": "^3.1.0",
+                "shebang-command": "^2.0.0",
+                "which": "^2.0.1"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/cross-spawn/node_modules/isexe": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+            "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+            "dev": true
+        },
+        "node_modules/cross-spawn/node_modules/which": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+            "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+            "dev": true,
+            "dependencies": {
+                "isexe": "^2.0.0"
+            },
+            "bin": {
+                "node-which": "bin/node-which"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/debug": {
+            "version": "4.3.4",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+            "dev": true,
+            "dependencies": {
+                "ms": "2.1.2"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/eastasianwidth": {
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+            "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+            "dev": true
+        },
+        "node_modules/emoji-regex": {
+            "version": "9.2.2",
+            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+            "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+            "dev": true
+        },
+        "node_modules/encoding": {
+            "version": "0.1.13",
+            "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+            "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+            "dev": true,
+            "optional": true,
+            "dependencies": {
+                "iconv-lite": "^0.6.2"
+            }
+        },
+        "node_modules/end-of-stream": {
+            "version": "1.4.4",
+            "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+            "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+            "dev": true,
+            "dependencies": {
+                "once": "^1.4.0"
+            }
+        },
+        "node_modules/env-paths": {
+            "version": "2.2.1",
+            "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+            "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/err-code": {
+            "version": "2.0.3",
+            "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
+            "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
+            "dev": true
+        },
+        "node_modules/execspawn": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/execspawn/-/execspawn-1.0.1.tgz",
+            "integrity": "sha512-s2k06Jy9i8CUkYe0+DxRlvtkZoOkwwfhB+Xxo5HGUtrISVW2m98jO2tr67DGRFxZwkjQqloA3v/tNtjhBRBieg==",
+            "dev": true,
+            "dependencies": {
+                "util-extend": "^1.0.1"
+            }
+        },
+        "node_modules/exponential-backoff": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz",
+            "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==",
+            "dev": true
+        },
+        "node_modules/file-uri-to-path": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+            "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="
+        },
+        "node_modules/foreground-child": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+            "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+            "dev": true,
+            "dependencies": {
+                "cross-spawn": "^7.0.0",
+                "signal-exit": "^4.0.1"
+            },
+            "engines": {
+                "node": ">=14"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/fs-constants": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+            "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+            "dev": true
+        },
+        "node_modules/fs-minipass": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
+            "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==",
+            "dev": true,
+            "dependencies": {
+                "minipass": "^7.0.3"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/glob": {
+            "version": "10.3.10",
+            "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
+            "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
+            "dev": true,
+            "dependencies": {
+                "foreground-child": "^3.1.0",
+                "jackspeak": "^2.3.5",
+                "minimatch": "^9.0.1",
+                "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
+                "path-scurry": "^1.10.1"
+            },
+            "bin": {
+                "glob": "dist/esm/bin.mjs"
+            },
+            "engines": {
+                "node": ">=16 || 14 >=14.17"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/graceful-fs": {
+            "version": "4.2.11",
+            "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+            "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+            "dev": true
+        },
+        "node_modules/http-cache-semantics": {
+            "version": "4.1.1",
+            "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+            "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
+            "dev": true
+        },
+        "node_modules/http-proxy-agent": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz",
+            "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==",
+            "dev": true,
+            "dependencies": {
+                "agent-base": "^7.1.0",
+                "debug": "^4.3.4"
+            },
+            "engines": {
+                "node": ">= 14"
+            }
+        },
+        "node_modules/https-proxy-agent": {
+            "version": "7.0.2",
+            "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
+            "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
+            "dev": true,
+            "dependencies": {
+                "agent-base": "^7.0.2",
+                "debug": "4"
+            },
+            "engines": {
+                "node": ">= 14"
+            }
+        },
+        "node_modules/iconv-lite": {
+            "version": "0.6.3",
+            "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+            "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+            "dev": true,
+            "optional": true,
+            "dependencies": {
+                "safer-buffer": ">= 2.1.2 < 3.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/ieee754": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+            "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ]
+        },
+        "node_modules/imurmurhash": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+            "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.8.19"
+            }
+        },
+        "node_modules/indent-string": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+            "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/inherits": {
+            "version": "2.0.4",
+            "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+            "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+            "dev": true
+        },
+        "node_modules/ip": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
+            "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==",
+            "dev": true
+        },
+        "node_modules/is-fullwidth-code-point": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+            "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/is-lambda": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
+            "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==",
+            "dev": true
+        },
+        "node_modules/isexe": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
+            "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=16"
+            }
+        },
+        "node_modules/jackspeak": {
+            "version": "2.3.6",
+            "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
+            "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+            "dev": true,
+            "dependencies": {
+                "@isaacs/cliui": "^8.0.2"
+            },
+            "engines": {
+                "node": ">=14"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            },
+            "optionalDependencies": {
+                "@pkgjs/parseargs": "^0.11.0"
+            }
+        },
+        "node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dev": true,
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/make-fetch-happen": {
+            "version": "13.0.0",
+            "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz",
+            "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==",
+            "dev": true,
+            "dependencies": {
+                "@npmcli/agent": "^2.0.0",
+                "cacache": "^18.0.0",
+                "http-cache-semantics": "^4.1.1",
+                "is-lambda": "^1.0.1",
+                "minipass": "^7.0.2",
+                "minipass-fetch": "^3.0.0",
+                "minipass-flush": "^1.0.5",
+                "minipass-pipeline": "^1.2.4",
+                "negotiator": "^0.6.3",
+                "promise-retry": "^2.0.1",
+                "ssri": "^10.0.0"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/minimatch": {
+            "version": "9.0.3",
+            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+            "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+            "dev": true,
+            "dependencies": {
+                "brace-expansion": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=16 || 14 >=14.17"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/minimist": {
+            "version": "1.2.8",
+            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+            "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+            "dev": true,
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/minipass": {
+            "version": "7.0.4",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
+            "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=16 || 14 >=14.17"
+            }
+        },
+        "node_modules/minipass-collect": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz",
+            "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==",
+            "dev": true,
+            "dependencies": {
+                "minipass": "^7.0.3"
+            },
+            "engines": {
+                "node": ">=16 || 14 >=14.17"
+            }
+        },
+        "node_modules/minipass-fetch": {
+            "version": "3.0.4",
+            "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz",
+            "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==",
+            "dev": true,
+            "dependencies": {
+                "minipass": "^7.0.3",
+                "minipass-sized": "^1.0.3",
+                "minizlib": "^2.1.2"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            },
+            "optionalDependencies": {
+                "encoding": "^0.1.13"
+            }
+        },
+        "node_modules/minipass-flush": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+            "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+            "dev": true,
+            "dependencies": {
+                "minipass": "^3.0.0"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/minipass-flush/node_modules/minipass": {
+            "version": "3.3.6",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+            "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+            "dev": true,
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/minipass-pipeline": {
+            "version": "1.2.4",
+            "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+            "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+            "dev": true,
+            "dependencies": {
+                "minipass": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/minipass-pipeline/node_modules/minipass": {
+            "version": "3.3.6",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+            "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+            "dev": true,
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/minipass-sized": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
+            "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
+            "dev": true,
+            "dependencies": {
+                "minipass": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/minipass-sized/node_modules/minipass": {
+            "version": "3.3.6",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+            "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+            "dev": true,
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/minizlib": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+            "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+            "dev": true,
+            "dependencies": {
+                "minipass": "^3.0.0",
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/minizlib/node_modules/minipass": {
+            "version": "3.3.6",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+            "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+            "dev": true,
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/mkdirp": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+            "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+            "dev": true,
+            "bin": {
+                "mkdirp": "bin/cmd.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/mkdirp-classic": {
+            "version": "0.5.3",
+            "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+            "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
+            "dev": true
+        },
+        "node_modules/ms": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+            "dev": true
+        },
+        "node_modules/negotiator": {
+            "version": "0.6.3",
+            "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+            "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+            "dev": true,
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/node-abi": {
+            "version": "3.54.0",
+            "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.54.0.tgz",
+            "integrity": "sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==",
+            "dev": true,
+            "dependencies": {
+                "semver": "^7.3.5"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/node-addon-api": {
+            "version": "3.2.1",
+            "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz",
+            "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A=="
+        },
+        "node_modules/node-gyp": {
+            "version": "10.0.1",
+            "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.1.tgz",
+            "integrity": "sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==",
+            "dev": true,
+            "dependencies": {
+                "env-paths": "^2.2.0",
+                "exponential-backoff": "^3.1.1",
+                "glob": "^10.3.10",
+                "graceful-fs": "^4.2.6",
+                "make-fetch-happen": "^13.0.0",
+                "nopt": "^7.0.0",
+                "proc-log": "^3.0.0",
+                "semver": "^7.3.5",
+                "tar": "^6.1.2",
+                "which": "^4.0.0"
+            },
+            "bin": {
+                "node-gyp": "bin/node-gyp.js"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/node-gyp-build": {
+            "version": "4.8.0",
+            "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz",
+            "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==",
+            "bin": {
+                "node-gyp-build": "bin.js",
+                "node-gyp-build-optional": "optional.js",
+                "node-gyp-build-test": "build-test.js"
+            }
+        },
+        "node_modules/nopt": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz",
+            "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==",
+            "dev": true,
+            "dependencies": {
+                "abbrev": "^2.0.0"
+            },
+            "bin": {
+                "nopt": "bin/nopt.js"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/npm-run-path": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz",
+            "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==",
+            "dev": true,
             "dependencies": {
-                "undici-types": "~5.26.4"
+                "path-key": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
             }
         },
-        "node_modules/bindings": {
-            "version": "1.2.1",
-            "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz",
-            "integrity": "sha512-u4cBQNepWxYA55FunZSM7wMi55yQaN0otnhhilNoWHq0MfOfJeQx0v0mRRpolGOExPjZcl6FtB0BB8Xkb88F0g=="
+        "node_modules/once": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+            "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+            "dev": true,
+            "dependencies": {
+                "wrappy": "1"
+            }
         },
-        "node_modules/node-addon-api": {
-            "version": "3.2.1",
-            "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz",
-            "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A=="
+        "node_modules/p-map": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+            "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+            "dev": true,
+            "dependencies": {
+                "aggregate-error": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/path-key": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+            "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/path-scurry": {
+            "version": "1.10.1",
+            "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz",
+            "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==",
+            "dev": true,
+            "dependencies": {
+                "lru-cache": "^9.1.1 || ^10.0.0",
+                "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+            },
+            "engines": {
+                "node": ">=16 || 14 >=14.17"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/path-scurry/node_modules/lru-cache": {
+            "version": "10.1.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
+            "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
+            "dev": true,
+            "engines": {
+                "node": "14 || >=16.14"
+            }
+        },
+        "node_modules/prebuildify": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/prebuildify/-/prebuildify-6.0.0.tgz",
+            "integrity": "sha512-DEvK4C3tcimIp7Pzqbs036n9i6CTKGp1XVEpMnr4wV3enKU5sBogPP+lP3KZw7993i42bXnsd5eIxAXQ566Cqw==",
+            "dev": true,
+            "dependencies": {
+                "execspawn": "^1.0.1",
+                "minimist": "^1.2.5",
+                "mkdirp-classic": "^0.5.3",
+                "node-abi": "^3.3.0",
+                "npm-run-path": "^3.1.0",
+                "pump": "^3.0.0",
+                "tar-fs": "^2.1.0"
+            },
+            "bin": {
+                "prebuildify": "bin.js"
+            }
+        },
+        "node_modules/proc-log": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz",
+            "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==",
+            "dev": true,
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/promise-retry": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
+            "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
+            "dev": true,
+            "dependencies": {
+                "err-code": "^2.0.2",
+                "retry": "^0.12.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/pump": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+            "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+            "dev": true,
+            "dependencies": {
+                "end-of-stream": "^1.1.0",
+                "once": "^1.3.1"
+            }
+        },
+        "node_modules/readable-stream": {
+            "version": "3.6.2",
+            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+            "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+            "dev": true,
+            "dependencies": {
+                "inherits": "^2.0.3",
+                "string_decoder": "^1.1.1",
+                "util-deprecate": "^1.0.1"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/retry": {
+            "version": "0.12.0",
+            "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+            "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+            "dev": true,
+            "engines": {
+                "node": ">= 4"
+            }
+        },
+        "node_modules/safe-buffer": {
+            "version": "5.2.1",
+            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ]
+        },
+        "node_modules/safer-buffer": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+            "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+            "dev": true,
+            "optional": true
+        },
+        "node_modules/semver": {
+            "version": "7.5.4",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+            "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+            "dev": true,
+            "dependencies": {
+                "lru-cache": "^6.0.0"
+            },
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/shebang-command": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+            "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+            "dev": true,
+            "dependencies": {
+                "shebang-regex": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/shebang-regex": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+            "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/signal-exit": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+            "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+            "dev": true,
+            "engines": {
+                "node": ">=14"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/smart-buffer": {
+            "version": "4.2.0",
+            "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+            "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+            "dev": true,
+            "engines": {
+                "node": ">= 6.0.0",
+                "npm": ">= 3.0.0"
+            }
+        },
+        "node_modules/socks": {
+            "version": "2.7.1",
+            "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
+            "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
+            "dev": true,
+            "dependencies": {
+                "ip": "^2.0.0",
+                "smart-buffer": "^4.2.0"
+            },
+            "engines": {
+                "node": ">= 10.13.0",
+                "npm": ">= 3.0.0"
+            }
+        },
+        "node_modules/socks-proxy-agent": {
+            "version": "8.0.2",
+            "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz",
+            "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==",
+            "dev": true,
+            "dependencies": {
+                "agent-base": "^7.0.2",
+                "debug": "^4.3.4",
+                "socks": "^2.7.1"
+            },
+            "engines": {
+                "node": ">= 14"
+            }
+        },
+        "node_modules/ssri": {
+            "version": "10.0.5",
+            "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz",
+            "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==",
+            "dev": true,
+            "dependencies": {
+                "minipass": "^7.0.3"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/string_decoder": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+            "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+            "dev": true,
+            "dependencies": {
+                "safe-buffer": "~5.2.0"
+            }
+        },
+        "node_modules/string-width": {
+            "version": "5.1.2",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+            "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+            "dev": true,
+            "dependencies": {
+                "eastasianwidth": "^0.2.0",
+                "emoji-regex": "^9.2.2",
+                "strip-ansi": "^7.0.1"
+            },
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/string-width-cjs": {
+            "name": "string-width",
+            "version": "4.2.3",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+            "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+            "dev": true,
+            "dependencies": {
+                "emoji-regex": "^8.0.0",
+                "is-fullwidth-code-point": "^3.0.0",
+                "strip-ansi": "^6.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/string-width-cjs/node_modules/ansi-regex": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/string-width-cjs/node_modules/emoji-regex": {
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+            "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+            "dev": true
+        },
+        "node_modules/string-width-cjs/node_modules/strip-ansi": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+            "dev": true,
+            "dependencies": {
+                "ansi-regex": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/strip-ansi": {
+            "version": "7.1.0",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+            "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+            "dev": true,
+            "dependencies": {
+                "ansi-regex": "^6.0.1"
+            },
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+            }
+        },
+        "node_modules/strip-ansi-cjs": {
+            "name": "strip-ansi",
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+            "dev": true,
+            "dependencies": {
+                "ansi-regex": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/tar": {
+            "version": "6.2.0",
+            "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz",
+            "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==",
+            "dev": true,
+            "dependencies": {
+                "chownr": "^2.0.0",
+                "fs-minipass": "^2.0.0",
+                "minipass": "^5.0.0",
+                "minizlib": "^2.1.1",
+                "mkdirp": "^1.0.3",
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/tar-fs": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
+            "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
+            "dev": true,
+            "dependencies": {
+                "chownr": "^1.1.1",
+                "mkdirp-classic": "^0.5.2",
+                "pump": "^3.0.0",
+                "tar-stream": "^2.1.4"
+            }
+        },
+        "node_modules/tar-stream": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+            "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+            "dev": true,
+            "dependencies": {
+                "bl": "^4.0.3",
+                "end-of-stream": "^1.4.1",
+                "fs-constants": "^1.0.0",
+                "inherits": "^2.0.3",
+                "readable-stream": "^3.1.1"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/tar/node_modules/chownr": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+            "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/tar/node_modules/fs-minipass": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+            "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+            "dev": true,
+            "dependencies": {
+                "minipass": "^3.0.0"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": {
+            "version": "3.3.6",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+            "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+            "dev": true,
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/tar/node_modules/minipass": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+            "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
         },
         "node_modules/typescript": {
             "version": "5.3.3",
@@ -55,7 +1393,162 @@
         "node_modules/undici-types": {
             "version": "5.26.5",
             "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
-            "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
+            "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+            "dev": true
+        },
+        "node_modules/unique-filename": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz",
+            "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==",
+            "dev": true,
+            "dependencies": {
+                "unique-slug": "^4.0.0"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/unique-slug": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz",
+            "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==",
+            "dev": true,
+            "dependencies": {
+                "imurmurhash": "^0.1.4"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/util-deprecate": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+            "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+            "dev": true
+        },
+        "node_modules/util-extend": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz",
+            "integrity": "sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA==",
+            "dev": true
+        },
+        "node_modules/which": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
+            "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
+            "dev": true,
+            "dependencies": {
+                "isexe": "^3.1.1"
+            },
+            "bin": {
+                "node-which": "bin/which.js"
+            },
+            "engines": {
+                "node": "^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/wrap-ansi": {
+            "version": "8.1.0",
+            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+            "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^6.1.0",
+                "string-width": "^5.0.1",
+                "strip-ansi": "^7.0.1"
+            },
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+            }
+        },
+        "node_modules/wrap-ansi-cjs": {
+            "name": "wrap-ansi",
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+            "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.0.0",
+                "string-width": "^4.1.0",
+                "strip-ansi": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+            }
+        },
+        "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+            "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+            "dev": true
+        },
+        "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+            "version": "4.2.3",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+            "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+            "dev": true,
+            "dependencies": {
+                "emoji-regex": "^8.0.0",
+                "is-fullwidth-code-point": "^3.0.0",
+                "strip-ansi": "^6.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+            "dev": true,
+            "dependencies": {
+                "ansi-regex": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/wrappy": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+            "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+            "dev": true
+        },
+        "node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+            "dev": true
         }
     }
 }
diff --git a/package.json b/package.json
index 82f34840..55a40f71 100644
--- a/package.json
+++ b/package.json
@@ -13,37 +13,39 @@
         "url": "https://github.com/unum-cloud/usearch/issues",
         "email": "info@unum.cloud"
     },
-    "main": "javascript/usearch.js",
-    "gypfile": true,
     "engines": {
         "node": "~10 >=10.20 || >=12.17"
     },
+    "files": [
+        "javascript/dist",
+        "prebuilds"
+    ],
     "dependencies": {
-        "@types/node": "^20.4.5",
-        "bindings": "~1.2.1",
-        "node-addon-api": "^3.0.0"
+        "bindings": "^1.5.0",
+        "node-addon-api": "^3.0.0",
+        "node-gyp-build": "^4.8.0"
     },
     "scripts": {
         "test": "node --test ./javascript/usearch.test.js",
-        "install": "node-gyp rebuild",
-        "typegen": "npx tsc"
+        "install": "node-gyp-build",
+        "prebuild-single": "prebuildify --napi --strip",
+        "prebuild-arm64": "prebuildify --arch arm64 --napi --strip",
+        "prebuild-darwin-x64+arm64": "prebuildify --arch arm64+x64 --napi --strip",
+        "build-js": "rm -fr javascript/dist/* && tsc -p javascript/tsconfig-esm.json && tsc -p javascript/tsconfig-cjs.json && cp javascript/dist-package-esm.json javascript/dist/esm/package.json && cp javascript/dist-package-cjs.json javascript/dist/cjs/package.json"
     },
     "devDependencies": {
-        "typescript": "^5.1.6"
+        "@types/bindings": "^1.5.5",
+        "@types/node": "^20.11.0",
+        "node-gyp": "^10.0.1",
+        "prebuildify": "^6.0.0",
+        "typescript": "^5.3.3"
     },
+    "main": "javascript/dist/cjs/usearch.js",
+    "module": "javascript/dist/esm/usearch.js",
     "exports": {
         ".": {
-            "types": "./javascript/types/usearch.d.ts",
-            "require": "./javascript/usearch.js",
-            "import": "./javascript/usearch.js"
-        },
-        "./package.json": "./package.json"
-    },
-    "typesVersions": {
-      "*": {
-          "*": [
-              "./javascript/types/usearch.d.ts"
-          ]
-      }
-  }
-}
+            "import": "./javascript/dist/esm/usearch.js",
+            "require": "./javascript/dist/cjs/usearch.js"
+        }
+    }
+}
\ No newline at end of file
diff --git a/pyproject.toml b/pyproject.toml
index e03fb57c..c5e4b61a 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,10 +1,18 @@
+# This file configures wheels compilation for `cibuilwheel` for StringZilla CPython bindings.
+# On a good day it will produce:
+#   - `macos` wheels for x86_64, arm64, and universal2;
+#   - `windows` wheels for AMD64, and ARM64. But not x86.
+#   - `manylinux` and `musllinux` wheels for Linux on x86_64, aarch64. But not i686, ppc64le, s390x;
+#   * for CPython versions from 3.7 to 3.12.
+#   * for PyPy versions from 3.7 to 3.10.
+#   = meaning 7 platforms * 10 Python versions = 70 builds.
 [build-system]
 requires = ["setuptools>=42", "wheel", "cmake>=3.22", "pybind11", "numpy"]
 build-backend = "setuptools.build_meta"
 
 [tool.pytest.ini_options]
 minversion = "6.0"
-addopts = ["-ra", "--showlocals", "--strict-markers", "--strict-config"]
+addopts = "-ra --showlocals --strict-markers --strict-config -s -x -p no:warnings"
 xfail_strict = true
 filterwarnings = ["error"]
 
@@ -16,36 +24,62 @@ filterwarnings = ["error"]
 test-requires = []
 test-command = ""
 build-verbosity = 0
-skip = ["*musllinux*", "*i686*", "pp*", "cp36-*"]
+
+# Add "pp*" to skip PyPy builds, but they should work fine these days :)
+# https://cibuildwheel.readthedocs.io/en/stable/options/#build-skip
+# https://cibuildwheel.readthedocs.io/en/stable/#what-does-it-do
+skip = []
 
 [tool.cibuildwheel.linux]
+archs = ["x86_64", "aarch64"]
 before-build = [
     "rm -rf {project}/CMakeCache.txt {project}/build {project}/build_debug {project}/CMakeFiles.txt {project}/_deps {project}/.pytest_cache",
     "mkdir -p build/usearch",
     "git submodule update --init --recursive",
 ]
+repair-wheel-command = "auditwheel repair --lib-sdir . -w {dest_dir} {wheel}"
+
+# Use more recent images for the most popular SIMD-capable CPU architectures, to have access to newer compilers.
+# Otherwise, prepare yourself to all kinds of AVX-512 issues and other SIMD-related pain.
+# You can keep track of the most recent images on Quay:
+# - for `manylinux`: https://quay.io/search?q=manylinux
+# - for `musllinux`: https://quay.io/search?q=musllinux
 manylinux-x86_64-image = "manylinux_2_28"
 manylinux-aarch64-image = "manylinux_2_28"
+musllinux-x86_64-image = "musllinux_1_2"
+musllinux-aarch64-image = "musllinux_1_2"
 
-archs = ["x86_64", "aarch64"]
-before-all = ["yum install -y glibc-devel wget python3-devel"]
-repair-wheel-command = "auditwheel repair --lib-sdir . -w {dest_dir} {wheel}"
+# On CentOS we have to use `yum`.
+# The healthy version would be: `apt-get update && apt-get install -y libc6-dev wget python3-dev`.
+before-all = ["yum update -y && yum install -y glibc-devel wget python3-devel"]
+
+# With `musl` builds, we obviously don't need the `glibc` and can't use `yum`.
+# This may also be handy for using custom dependencies for different Python versions:
+# https://cibuildwheel.readthedocs.io/en/stable/options/#overrides
+[[tool.cibuildwheel.overrides]]
+select = "*-musllinux*"
+before-all = "apk add --update wget python3-dev"
 
 [tool.cibuildwheel.macos]
+archs = ["x86_64", "universal2", "arm64"]
 before-build = [
     "rm -rf {project}/CMakeCache.txt {project}/build {project}/build_debug {project}/CMakeFiles.txt {project}/_deps {project}/.pytest_cache",
     "mkdir -p build/usearch",
     "git submodule update --init --recursive",
 ]
-archs = ["x86_64", "universal2", "arm64"]
 repair-wheel-command = "delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v {wheel}"
 
 
 [tool.cibuildwheel.windows]
+archs = ["AMD64", "ARM64"]
 before-build = [
     "rd /s /q {project}\\CMakeCache.txt {project}\\build {project}\\build_debug {project}\\CMakeFiles.txt {project}\\_deps {project}\\.pytest_cache || echo Done",
     "md build\\usearch",
     "git submodule update --init --recursive",
 ]
-archs = ["x86", "AMD64"]
-skip = ["*win32*", "pp*", "cp36-*"]
+
+# Configuration options for the Black formatter:
+# https://black.readthedocs.io/en/latest/usage_and_configuration/the_basics.html#where-black-looks-for-the-file
+[tool.black]
+line-length = 120                  # Set line length to the same value as in `.clang-format` for modern wide screens
+target-version = ['py36', 'py312']
diff --git a/python/lib.cpp b/python/lib.cpp
index f20e30b0..17413cff 100644
--- a/python/lib.cpp
+++ b/python/lib.cpp
@@ -122,6 +122,9 @@ static dense_index_py_t make_index(             //
         metric_uintptr //
             ? metric_t(dimensions, metric_uintptr, metric_signature, metric_kind, scalar_kind)
             : metric_t(dimensions, metric_kind, scalar_kind);
+    if (metric.missing())
+        throw std::invalid_argument("Unsupported metric!");
+
     return index_dense_t::make(metric, config);
 }
 
@@ -485,6 +488,8 @@ static py::tuple search_many_brute_force(       //
         metric_uintptr //
             ? metric_t(dimensions, metric_uintptr, metric_signature, metric_kind, queries_kind)
             : metric_t(dimensions, metric_kind, queries_kind);
+    if (!metric)
+        throw std::invalid_argument("Unsupported metric!");
 
     py::array_t<dense_key_t> keys_py({static_cast<Py_ssize_t>(queries_count), static_cast<Py_ssize_t>(wanted)});
     py::array_t<distance_t> distances_py({static_cast<Py_ssize_t>(queries_count), static_cast<Py_ssize_t>(wanted)});
@@ -1098,6 +1103,8 @@ PYBIND11_MODULE(compiled, m) {
                 metric_uintptr //
                     ? metric_t(dimensions, metric_uintptr, metric_signature, metric_kind, scalar_kind)
                     : metric_t(dimensions, metric_kind, scalar_kind);
+            if (!metric)
+                throw std::invalid_argument("Unsupported metric kind!");
             index.change_metric(std::move(metric));
         },
         py::arg("metric_kind") = metric_kind_t::cos_k,                          //
@@ -1231,4 +1238,3 @@ PYBIND11_MODULE(compiled, m) {
         py::arg("progress") = nullptr                             //
     );
 }
-
diff --git a/python/scripts/bench.ipynb b/python/scripts/bench.ipynb
index 4305c212..3892b57d 100644
--- a/python/scripts/bench.ipynb
+++ b/python/scripts/bench.ipynb
@@ -2,48 +2,98 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 5,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('skylake', 'skylake', 'sapphire', 'ice', 'ice')"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
    "source": [
-    "!pip install faiss-cpu numba pandas plotly nbformat jinja2 kaleido tqdm scikit-learn scipy matplotlib"
+    "from usearch.index import Index\n",
+    "\n",
+    "f64_support = Index(ndim=256, metric=\"cos\", dtype=\"f64\").hardware_acceleration\n",
+    "f32_support = Index(ndim=256, metric=\"cos\", dtype=\"f32\").hardware_acceleration\n",
+    "f16_support = Index(ndim=256, metric=\"cos\", dtype=\"f16\").hardware_acceleration\n",
+    "i8_support = Index(ndim=256, metric=\"cos\", dtype=\"i8\").hardware_acceleration\n",
+    "b1_support = Index(ndim=256, metric=\"hamming\", dtype=\"b1\").hardware_acceleration\n",
+    "\n",
+    "f64_support, f32_support, f16_support, i8_support, b1_support"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": 1,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Requirement already satisfied: faiss-cpu in /home/ubuntu/miniconda3/lib/python3.11/site-packages (1.7.4)\n",
+      "Requirement already satisfied: numba in /home/ubuntu/miniconda3/lib/python3.11/site-packages (0.58.1)\n",
+      "Requirement already satisfied: pandas in /home/ubuntu/miniconda3/lib/python3.11/site-packages (2.2.1)\n",
+      "Requirement already satisfied: plotly in /home/ubuntu/miniconda3/lib/python3.11/site-packages (5.17.0)\n",
+      "Requirement already satisfied: nbformat in /home/ubuntu/miniconda3/lib/python3.11/site-packages (5.9.2)\n",
+      "Requirement already satisfied: jinja2 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (3.1.2)\n",
+      "Requirement already satisfied: kaleido in /home/ubuntu/miniconda3/lib/python3.11/site-packages (0.2.1)\n",
+      "Requirement already satisfied: tqdm in /home/ubuntu/miniconda3/lib/python3.11/site-packages (4.66.2)\n",
+      "Requirement already satisfied: scikit-learn in /home/ubuntu/miniconda3/lib/python3.11/site-packages (1.3.1)\n",
+      "Requirement already satisfied: scipy in /home/ubuntu/miniconda3/lib/python3.11/site-packages (1.12.0)\n",
+      "Requirement already satisfied: matplotlib in /home/ubuntu/miniconda3/lib/python3.11/site-packages (3.8.0)\n",
+      "Requirement already satisfied: llvmlite<0.42,>=0.41.0dev0 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from numba) (0.41.1)\n",
+      "Requirement already satisfied: numpy<1.27,>=1.22 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from numba) (1.26.4)\n",
+      "Requirement already satisfied: python-dateutil>=2.8.2 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from pandas) (2.9.0.post0)\n",
+      "Requirement already satisfied: pytz>=2020.1 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from pandas) (2024.1)\n",
+      "Requirement already satisfied: tzdata>=2022.7 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from pandas) (2024.1)\n",
+      "Requirement already satisfied: tenacity>=6.2.0 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from plotly) (8.2.3)\n",
+      "Requirement already satisfied: packaging in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from plotly) (23.2)\n",
+      "Requirement already satisfied: fastjsonschema in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from nbformat) (2.18.1)\n",
+      "Requirement already satisfied: jsonschema>=2.6 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from nbformat) (4.19.1)\n",
+      "Requirement already satisfied: jupyter-core in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from nbformat) (5.4.0)\n",
+      "Requirement already satisfied: traitlets>=5.1 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from nbformat) (5.11.2)\n",
+      "Requirement already satisfied: MarkupSafe>=2.0 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from jinja2) (2.1.3)\n",
+      "Requirement already satisfied: joblib>=1.1.1 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from scikit-learn) (1.2.0)\n",
+      "Requirement already satisfied: threadpoolctl>=2.0.0 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from scikit-learn) (3.2.0)\n",
+      "Requirement already satisfied: contourpy>=1.0.1 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from matplotlib) (1.1.1)\n",
+      "Requirement already satisfied: cycler>=0.10 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from matplotlib) (0.12.1)\n",
+      "Requirement already satisfied: fonttools>=4.22.0 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from matplotlib) (4.43.1)\n",
+      "Requirement already satisfied: kiwisolver>=1.0.1 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from matplotlib) (1.4.5)\n",
+      "Requirement already satisfied: pillow>=6.2.0 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from matplotlib) (10.1.0)\n",
+      "Requirement already satisfied: pyparsing>=2.3.1 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from matplotlib) (3.1.1)\n",
+      "Requirement already satisfied: attrs>=22.2.0 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from jsonschema>=2.6->nbformat) (23.2.0)\n",
+      "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from jsonschema>=2.6->nbformat) (2023.7.1)\n",
+      "Requirement already satisfied: referencing>=0.28.4 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from jsonschema>=2.6->nbformat) (0.30.2)\n",
+      "Requirement already satisfied: rpds-py>=0.7.1 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from jsonschema>=2.6->nbformat) (0.10.6)\n",
+      "Requirement already satisfied: six>=1.5 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from python-dateutil>=2.8.2->pandas) (1.16.0)\n",
+      "Requirement already satisfied: platformdirs>=2.5 in /home/ubuntu/miniconda3/lib/python3.11/site-packages (from jupyter-core->nbformat) (4.2.0)\n"
+     ]
+    }
+   ],
    "source": [
-    "from bench import *\n",
-    "import plotly.graph_objects as go"
+    "!pip install faiss-cpu numba pandas plotly nbformat jinja2 kaleido tqdm scikit-learn scipy matplotlib"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": 6,
    "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "('auto', 'auto', 'auto')"
-      ]
-     },
-     "execution_count": 6,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
-    "from usearch.index import Index\n",
-    "\n",
-    "Index(ndim=256, metric=\"cos\", dtype=\"f32\").hardware_acceleration, Index(ndim=256, metric=\"cos\", dtype=\"f16\").hardware_acceleration, Index(ndim=256, metric=\"cos\", dtype=\"i8\").hardware_acceleration"
+    "from bench import *\n",
+    "import plotly.graph_objects as go"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 7,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -79,7 +129,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 8,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -93,12 +143,32 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 9,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "ename": "RuntimeError",
+     "evalue": "Operation has been terminated",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[0;31mRuntimeError\u001b[0m                              Traceback (most recent call last)",
+      "Cell \u001b[0;32mIn[9], line 2\u001b[0m\n\u001b[1;32m      1\u001b[0m eval_default \u001b[38;5;241m=\u001b[39m Evaluation\u001b[38;5;241m.\u001b[39mfor_dataset(data)\n\u001b[0;32m----> 2\u001b[0m results_default \u001b[38;5;241m=\u001b[39m \u001b[43mbench_speed\u001b[49m\u001b[43m(\u001b[49m\u001b[43meval_default\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mjit\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m      3\u001b[0m results_default\n",
+      "File \u001b[0;32m~/USearch/python/scripts/bench.py:76\u001b[0m, in \u001b[0;36mbench_speed\u001b[0;34m(eval, connectivity, expansion_add, expansion_search, jit, train)\u001b[0m\n\u001b[1;32m     73\u001b[0m     \u001b[38;5;28;01mpass\u001b[39;00m\n\u001b[1;32m     75\u001b[0m \u001b[38;5;66;03m# Time to evaluate:\u001b[39;00m\n\u001b[0;32m---> 76\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[43m[\u001b[49m\u001b[38;5;28;43meval\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mindex\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mindex\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mindexes\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m     77\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m pd\u001b[38;5;241m.\u001b[39mDataFrame(\n\u001b[1;32m     78\u001b[0m     {\n\u001b[1;32m     79\u001b[0m         \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnames\u001b[39m\u001b[38;5;124m\"\u001b[39m: [i\u001b[38;5;241m.\u001b[39mpath \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m indexes],\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m     83\u001b[0m     }\n\u001b[1;32m     84\u001b[0m )\n",
+      "File \u001b[0;32m~/USearch/python/scripts/bench.py:76\u001b[0m, in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m     73\u001b[0m     \u001b[38;5;28;01mpass\u001b[39;00m\n\u001b[1;32m     75\u001b[0m \u001b[38;5;66;03m# Time to evaluate:\u001b[39;00m\n\u001b[0;32m---> 76\u001b[0m results \u001b[38;5;241m=\u001b[39m [\u001b[38;5;28;43meval\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mindex\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m index \u001b[38;5;129;01min\u001b[39;00m indexes]\n\u001b[1;32m     77\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m pd\u001b[38;5;241m.\u001b[39mDataFrame(\n\u001b[1;32m     78\u001b[0m     {\n\u001b[1;32m     79\u001b[0m         \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnames\u001b[39m\u001b[38;5;124m\"\u001b[39m: [i\u001b[38;5;241m.\u001b[39mpath \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m indexes],\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m     83\u001b[0m     }\n\u001b[1;32m     84\u001b[0m )\n",
+      "File \u001b[0;32m~/USearch/python/usearch/eval.py:448\u001b[0m, in \u001b[0;36mEvaluation.__call__\u001b[0;34m(self, index, post_clean)\u001b[0m\n\u001b[1;32m    446\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m    447\u001b[0m     \u001b[38;5;28;01mfor\u001b[39;00m task \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtasks:\n\u001b[0;32m--> 448\u001b[0m         task_result \u001b[38;5;241m=\u001b[39m task_result \u001b[38;5;241m+\u001b[39m \u001b[43mtask\u001b[49m\u001b[43m(\u001b[49m\u001b[43mindex\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    449\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m:\n\u001b[1;32m    450\u001b[0m     \u001b[38;5;28;01mpass\u001b[39;00m\n",
+      "File \u001b[0;32m~/USearch/python/usearch/eval.py:330\u001b[0m, in \u001b[0;36mAddTask.__call__\u001b[0;34m(self, index)\u001b[0m\n\u001b[1;32m    328\u001b[0m batch_size: \u001b[38;5;28mint\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mvectors\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m0\u001b[39m]\n\u001b[1;32m    329\u001b[0m old_size: \u001b[38;5;28mint\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlen\u001b[39m(index)\n\u001b[0;32m--> 330\u001b[0m dt, _ \u001b[38;5;241m=\u001b[39m \u001b[43mmeasure_seconds\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43;01mlambda\u001b[39;49;00m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mindex\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43madd\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkeys\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvectors\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    332\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(index) \u001b[38;5;241m==\u001b[39m old_size \u001b[38;5;241m+\u001b[39m batch_size\n\u001b[1;32m    333\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m TaskResult(\n\u001b[1;32m    334\u001b[0m     add_operations\u001b[38;5;241m=\u001b[39mbatch_size,\n\u001b[1;32m    335\u001b[0m     add_per_second\u001b[38;5;241m=\u001b[39mbatch_size \u001b[38;5;241m/\u001b[39m dt,\n\u001b[1;32m    336\u001b[0m )\n",
+      "File \u001b[0;32m~/USearch/python/usearch/eval.py:140\u001b[0m, in \u001b[0;36mmeasure_seconds\u001b[0;34m(f)\u001b[0m\n\u001b[1;32m    132\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Simple function profiling decorator.\u001b[39;00m\n\u001b[1;32m    133\u001b[0m \n\u001b[1;32m    134\u001b[0m \u001b[38;5;124;03m:param f: Function to be profiled\u001b[39;00m\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    137\u001b[0m \u001b[38;5;124;03m:rtype: Tuple[float, Any]\u001b[39;00m\n\u001b[1;32m    138\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m    139\u001b[0m a \u001b[38;5;241m=\u001b[39m time_ns()\n\u001b[0;32m--> 140\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mf\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    141\u001b[0m b \u001b[38;5;241m=\u001b[39m time_ns()\n\u001b[1;32m    142\u001b[0m c \u001b[38;5;241m=\u001b[39m b \u001b[38;5;241m-\u001b[39m a\n",
+      "File \u001b[0;32m~/USearch/python/usearch/eval.py:330\u001b[0m, in \u001b[0;36mAddTask.__call__.<locals>.<lambda>\u001b[0;34m()\u001b[0m\n\u001b[1;32m    328\u001b[0m batch_size: \u001b[38;5;28mint\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mvectors\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m0\u001b[39m]\n\u001b[1;32m    329\u001b[0m old_size: \u001b[38;5;28mint\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlen\u001b[39m(index)\n\u001b[0;32m--> 330\u001b[0m dt, _ \u001b[38;5;241m=\u001b[39m measure_seconds(\u001b[38;5;28;01mlambda\u001b[39;00m: \u001b[43mindex\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43madd\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkeys\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvectors\u001b[49m\u001b[43m)\u001b[49m)\n\u001b[1;32m    332\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(index) \u001b[38;5;241m==\u001b[39m old_size \u001b[38;5;241m+\u001b[39m batch_size\n\u001b[1;32m    333\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m TaskResult(\n\u001b[1;32m    334\u001b[0m     add_operations\u001b[38;5;241m=\u001b[39mbatch_size,\n\u001b[1;32m    335\u001b[0m     add_per_second\u001b[38;5;241m=\u001b[39mbatch_size \u001b[38;5;241m/\u001b[39m dt,\n\u001b[1;32m    336\u001b[0m )\n",
+      "File \u001b[0;32m~/USearch/python/usearch/index.py:659\u001b[0m, in \u001b[0;36mIndex.add\u001b[0;34m(self, keys, vectors, copy, threads, log, progress)\u001b[0m\n\u001b[1;32m    620\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21madd\u001b[39m(\n\u001b[1;32m    621\u001b[0m     \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m    622\u001b[0m     keys: KeyOrKeysLike,\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    628\u001b[0m     progress: Optional[ProgressCallback] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m    629\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Union[\u001b[38;5;28mint\u001b[39m, np\u001b[38;5;241m.\u001b[39mndarray]:\n\u001b[1;32m    630\u001b[0m \u001b[38;5;250m    \u001b[39m\u001b[38;5;124;03m\"\"\"Inserts one or move vectors into the index.\u001b[39;00m\n\u001b[1;32m    631\u001b[0m \n\u001b[1;32m    632\u001b[0m \u001b[38;5;124;03m    For maximal performance the `keys` and `vectors`\u001b[39;00m\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    657\u001b[0m \u001b[38;5;124;03m    :type: Union[int, np.ndarray]\u001b[39;00m\n\u001b[1;32m    658\u001b[0m \u001b[38;5;124;03m    \"\"\"\u001b[39;00m\n\u001b[0;32m--> 659\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_add_to_compiled\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m    660\u001b[0m \u001b[43m        \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_compiled\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    661\u001b[0m \u001b[43m        \u001b[49m\u001b[43mkeys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mkeys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    662\u001b[0m \u001b[43m        \u001b[49m\u001b[43mvectors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mvectors\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    663\u001b[0m \u001b[43m        \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    664\u001b[0m \u001b[43m        \u001b[49m\u001b[43mthreads\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mthreads\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    665\u001b[0m \u001b[43m        \u001b[49m\u001b[43mlog\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlog\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    666\u001b[0m \u001b[43m        \u001b[49m\u001b[43mprogress\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mprogress\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    667\u001b[0m \u001b[43m    \u001b[49m\u001b[43m)\u001b[49m\n",
+      "File \u001b[0;32m~/USearch/python/usearch/index.py:266\u001b[0m, in \u001b[0;36m_add_to_compiled\u001b[0;34m(compiled, keys, vectors, copy, threads, log, progress)\u001b[0m\n\u001b[1;32m    264\u001b[0m     pbar\u001b[38;5;241m.\u001b[39mclose()\n\u001b[1;32m    265\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 266\u001b[0m     \u001b[43mcompiled\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43madd_many\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkeys\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvectors\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mthreads\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mthreads\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mprogress\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mprogress\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    268\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m keys\n",
+      "\u001b[0;31mRuntimeError\u001b[0m: Operation has been terminated"
+     ]
+    }
+   ],
    "source": [
     "eval_default = Evaluation.for_dataset(data)\n",
-    "results_default = bench_speed(eval_default, jit=True)\n",
+    "results_default = bench_speed(eval_default)\n",
     "results_default"
    ]
   },
diff --git a/python/scripts/bench_exact.py b/python/scripts/bench_exact.py
index ac307c48..c1062d11 100644
--- a/python/scripts/bench_exact.py
+++ b/python/scripts/bench_exact.py
@@ -1,43 +1,75 @@
 from time import time
+from typing import Literal
 
-from usearch.index import search, MetricKind, ScalarKind
-from usearch.compiled import hardware_acceleration
-from faiss import knn, METRIC_L2
-import numpy as np
+from faiss import knn, METRIC_L2, METRIC_INNER_PRODUCT
 import fire
 
+from usearch.compiled import hardware_acceleration
+from usearch.eval import random_vectors
+
+# Supplemantary imports for CLI arguments normalization
+from usearch.index import (
+    ScalarKind,
+    MetricKind,
+    search,
+    _normalize_metric,
+    _normalize_dtype,
+)
+
+
+def format_duration(duration):
+    """Format duration in seconds to milliseconds, nicely formatted."""
+    return f"{duration * 1000:,.2f} ms"
+
+
+def calculate_throughput(duration, count):
+    """Calculate and return throughput as calls per second."""
+    if duration > 0:
+        return f"{count / duration:,.2f} calls/sec"
+    return "Inf calls/sec"
+
 
 def run(
     n: int = 10**5,
     q: int = 10,
     k: int = 100,
     ndim: int = 256,
-    half: bool = False,
+    dtype: Literal["b1", "i8", "f16", "f32", "f64"] = "f32",
+    metric: Literal["cos", "ip", "l2sq"] = "ip",
 ):
-    usearch_dtype = ScalarKind.F16 if half else ScalarKind.F32
+
+    metric: MetricKind = _normalize_metric(metric)
+    dtype: ScalarKind = _normalize_dtype(dtype, ndim=ndim, metric=metric)
     acceleration = hardware_acceleration(
-        dtype=usearch_dtype,
+        dtype=dtype,
         ndim=ndim,
-        metric_kind=MetricKind.L2sq,
+        metric_kind=metric,
     )
-    print("Hardware acceleration in USearch: ", acceleration)
+    print(f"Hardware acceleration in USearch: {acceleration}")
 
-    x = np.random.random((n, ndim))
-    x = x.astype(np.float16) if half else x.astype(np.float32)
+    x = random_vectors(n, ndim=ndim, dtype=dtype)
 
     start = time()
     _ = search(
         x,
         x[:q],
         k,
-        MetricKind.L2sq,
+        metric=metric,
         exact=True,
     ).keys
-    print("USearch: ", time() - start)
+    duration = time() - start
+    print(f"USearch: {format_duration(duration)} ({calculate_throughput(duration, q)})")
+
+    if metric not in [MetricKind.L2sq, MetricKind.IP]:
+        return
+    if dtype not in [ScalarKind.I8, ScalarKind.F16, ScalarKind.F32, ScalarKind.F64]:
+        return
 
     start = time()
-    _ = knn(x[:q], x, k, metric=METRIC_L2)[1]
-    print("FAISS:   ", time() - start)
+    faiss_metric = METRIC_L2 if metric == "l2sq" else METRIC_INNER_PRODUCT
+    _ = knn(x[:q], x, k, metric=faiss_metric)[1]
+    duration = time() - start
+    print(f"FAISS:   {format_duration(duration)} ({calculate_throughput(duration, q)})")
 
 
 if __name__ == "__main__":
diff --git a/python/scripts/index_faiss.py b/python/scripts/index_faiss.py
index 6dd42392..66b301ac 100644
--- a/python/scripts/index_faiss.py
+++ b/python/scripts/index_faiss.py
@@ -4,7 +4,7 @@
 import numpy as np
 from faiss import IndexHNSWFlat, IndexIVFPQ, read_index
 
-from usearch.index import Matches, BatchMatches
+from usearch.index import BatchMatches
 from usearch.index import (
     DEFAULT_CONNECTIVITY,
     DEFAULT_EXPANSION_ADD,
diff --git a/python/usearch/__init__.py b/python/usearch/__init__.py
index befac518..2da30e71 100644
--- a/python/usearch/__init__.py
+++ b/python/usearch/__init__.py
@@ -1,5 +1,11 @@
-import importlib
-import importlib.util
+import os
+import platform
+import tempfile
+import warnings
+import urllib.request
+from typing import Optional
+from urllib.error import HTTPError
+
 
 from usearch.compiled import (
     VERSION_MAJOR,
@@ -9,6 +15,108 @@
 
 __version__ = f"{VERSION_MAJOR}.{VERSION_MINOR}.{VERSION_PATCH}"
 
-# The same binary file (.so, .dll, or .dylib) that contains the pre-compiled
-# USearch code also contains the SQLite3 binding
-sqlite = importlib.util.find_spec("usearch.compiled").origin
+
+class BinaryManager:
+    def __init__(self, version: Optional[str] = None):
+        if version is None:
+            version = __version__
+        self.version = version
+
+    def sqlite_download_url(self) -> str:
+        """
+        Constructs a download URL for the `usearch_sqlite` binary based on the operating system, architecture, and version.
+
+        Args:
+            version (str): The version of the binary to download.
+
+        Returns:
+            A string representing the download URL.
+        """
+        version = self.version
+        base_url = "https://github.com/unum-cloud/usearch/releases/download"
+        os_map = {"Linux": "linux", "Windows": "windows", "Darwin": "macos"}
+        arch_map = {
+            "x86_64": "amd64" if platform.system() != "Darwin" else "x86_64",
+            "AMD64": "amd64",
+            "arm64": "arm64",
+            "aarch64": "arm64",
+            "x86": "x86",
+        }
+        os_part = os_map.get(platform.system(), "")
+        arch = platform.machine()
+        arch_part = arch_map.get(arch, "")
+        extension = {"Linux": "so", "Windows": "dll", "Darwin": "dylib"}.get(platform.system(), "")
+        filename = f"usearch_sqlite_{os_part}_{arch_part}_{version}.{extension}"
+        url = f"{base_url}/v{version}/{filename}"
+        return url
+
+    def download_binary(self, url: str, dest_folder: str) -> str:
+        """
+        Downloads a file from a given URL to a specified destination folder.
+
+        Args:
+            url (str): The URL to download the file from.
+            dest_folder (str): The folder where the file will be saved.
+
+        Returns:
+            The path to the downloaded file.
+        """
+        filename = url.split("/")[-1]
+        dest_path = os.path.join(dest_folder, filename)
+        urllib.request.urlretrieve(url, dest_path)
+        return dest_path
+
+    @property
+    def sqlite_found_or_downloaded(self) -> Optional[str]:
+        """
+        Attempts to locate the pre-installed `usearch_sqlite` binary.
+        If not found, downloads it from GitHub.
+
+        Returns:
+            The path to the binary if found or downloaded, otherwise None.
+        """
+        # Search local directories
+        local_dirs = ["build", "build_artifacts", "build_release", "build_debug"]
+        extensions = {"Linux": ".so", "Windows": ".dll", "Darwin": ".dylib"}
+        os_type = platform.system()
+        file_extension = extensions.get(os_type, "")
+
+        # Check local development directories first
+        for directory in local_dirs:
+            for root, _, files in os.walk(directory):
+                for file in files:
+                    if file.endswith(file_extension) and "usearch_sqlite" in file:
+                        return os.path.join(root, file)
+
+        # Check a temporary directory (assuming the binary might be downloaded from a GitHub release)
+        temp_dir = tempfile.gettempdir()
+        for root, _, files in os.walk(temp_dir):
+            for file in files:
+                if file.endswith(file_extension) and "usearch_sqlite" in file:
+                    return os.path.join(root, file)
+
+        # If not found locally, warn the user and download from GitHub
+        temp_dir = tempfile.gettempdir()
+        warnings.warn("Will download `usearch_sqlite` binary from GitHub.", UserWarning)
+
+        # If the download fails due to HTTPError (e.g., 404 Not Found), like a missing lib version
+        try:
+            binary_path = self.download_binary(self.sqlite_download_url(), temp_dir)
+        except HTTPError as e:
+            if e.code == 404:
+                warnings.warn(f"Download failed: {e.url} could not be found.", UserWarning)
+            else:
+                warnings.warn(f"Download failed with HTTP error: {e.code} {e.reason}", UserWarning)
+            return None
+
+        # Handle the case where binary_path does not exist after supposed successful download
+        if os.path.exists(binary_path):
+            return binary_path
+        else:
+            warnings.warn("Failed to download `usearch_sqlite` binary from GitHub.", UserWarning)
+            return None
+
+
+# Use the function to set the `sqlite` computed property
+binary_manager = BinaryManager()
+sqlite = binary_manager.sqlite_found_or_downloaded
diff --git a/python/usearch/client.py b/python/usearch/client.py
index 684e12a4..b8946b7e 100644
--- a/python/usearch/client.py
+++ b/python/usearch/client.py
@@ -16,23 +16,21 @@ def _vector_to_ascii(vector: np.ndarray) -> Optional[str]:
     # poking 60 and replacing with the 124.
     vector += 23
     vector[vector == 60] = 124
-    ascii = str(vector)
-    return ascii
+    ascii_vector = str(vector)
+    return ascii_vector
 
 
 class IndexClient:
-    def __init__(
-        self, uri: str = "127.0.0.1", port: int = 8545, use_http: bool = True
-    ) -> None:
+    def __init__(self, uri: str = "127.0.0.1", port: int = 8545, use_http: bool = True) -> None:
         self.client = Client(uri=uri, port=port, use_http=use_http)
 
     def add_one(self, key: int, vector: np.ndarray):
         assert isinstance(key, int)
         assert isinstance(vector, np.ndarray)
         vector = vector.flatten()
-        ascii = _vector_to_ascii(vector)
-        if ascii:
-            self.client.add_ascii(key=key, string=ascii)
+        ascii_vector = _vector_to_ascii(vector)
+        if ascii_vector:
+            self.client.add_ascii(key=key, string=ascii_vector)
         else:
             self.client.add_one(key=key, vectors=vector)
 
@@ -52,9 +50,9 @@ def add(self, keys: Union[np.ndarray, int], vectors: np.ndarray):
     def search_one(self, vector: np.ndarray, count: int) -> Matches:
         matches: List[dict] = []
         vector = vector.flatten()
-        ascii = _vector_to_ascii(vector)
-        if ascii:
-            matches = self.client.search_ascii(string=ascii, count=count)
+        ascii_vector = _vector_to_ascii(vector)
+        if ascii_vector:
+            matches = self.client.search_ascii(string=ascii_vector, count=count)
         else:
             matches = self.client.search_one(vector=vector, count=count)
 
@@ -73,9 +71,7 @@ def search_one(self, vector: np.ndarray, count: int) -> Matches:
 
     def search_many(self, vectors: np.ndarray, count: int) -> Matches:
         batch_size: int = vectors.shape[0]
-        list_of_matches: List[List[dict]] = self.client.search_many(
-            vectors=vectors, count=count
-        )
+        list_of_matches: List[List[dict]] = self.client.search_many(vectors=vectors, count=count)
 
         keys = np.array((batch_size, count), dtype=np.uint32)
         distances = np.array((batch_size, count), dtype=np.float32)
diff --git a/python/usearch/eval.py b/python/usearch/eval.py
index 93d6cd35..09b803d9 100644
--- a/python/usearch/eval.py
+++ b/python/usearch/eval.py
@@ -10,18 +10,21 @@
 from usearch.io import load_matrix
 from usearch.index import (
     Index,
-    Matches,
     BatchMatches,
+    ScalarKind,
     MetricKind,
     MetricKindBitwise,
     Key,
+    _normalize_metric,
+    _normalize_dtype,
+    _to_numpy_dtype,
 )
 
 
 def random_vectors(
     count: int,
     metric: MetricKind = MetricKind.IP,
-    dtype: np.generic = np.float32,
+    dtype: ScalarKind = ScalarKind.F32,
     ndim: Optional[int] = None,
     index: Optional[Index] = None,
 ) -> np.ndarray:
@@ -38,18 +41,22 @@ def random_vectors(
         dtype = index.numpy_dtype
         metric = index.metric
 
+    else:
+        metric: MetricKind = _normalize_metric(metric)
+        dtype: ScalarKind = _normalize_dtype(dtype, ndim=ndim, metric=metric)
+
     # Produce data
-    if metric in MetricKindBitwise:
+    if metric in MetricKindBitwise or dtype == ScalarKind.B1:
         bit_vectors = np.random.randint(2, size=(count, ndim))
         bit_vectors = np.packbits(bit_vectors, axis=1)
         return bit_vectors
 
     else:
         x = np.random.rand(count, ndim)
-        if dtype == np.int8:
+        if _to_numpy_dtype(dtype) == np.int8:
             x = (x * 100).astype(np.int8)
         else:
-            x = x.astype(dtype)
+            x = x.astype(_to_numpy_dtype(dtype))
             if metric == MetricKind.IP:
                 return x / np.linalg.norm(x, axis=1, keepdims=True)
         return x
@@ -80,9 +87,7 @@ class SearchStats:
 
     @property
     def mean_efficiency(self) -> float:
-        return 1 - float(self.computed_distances) / (
-            self.count_queries * self.index_size
-        )
+        return 1 - float(self.computed_distances) / (self.count_queries * self.index_size)
 
     @property
     def mean_recall(self) -> float:
@@ -116,12 +121,14 @@ def self_recall(index: Index, sample: Union[float, int] = 1.0, **kwargs) -> Sear
             sample = int(ceil(len(keys) * sample))
         keys = np.random.choice(keys, sample)
 
-    queries = index.get(keys, index.dtype)
-    matches = index.search(queries, **kwargs)
+    if "vectors" in kwargs:
+        vectors = kwargs.pop("vectors")
+    else:
+        vectors = index.get(keys, index.dtype)
+
+    matches = index.search(vectors, **kwargs)
     count_matches: int = (
-        matches.count_matches(keys)
-        if isinstance(matches, BatchMatches)
-        else int(matches.keys[0] == keys[0])
+        matches.count_matches(keys) if isinstance(matches, BatchMatches) else int(matches.keys[0] == keys[0])
     )
     return SearchStats(
         index_size=len(index),
@@ -186,9 +193,7 @@ def ndcg(relevances: np.ndarray, k: Optional[int] = None) -> np.ndarray:
     return dcg(relevances, k) / best_dcg
 
 
-def relevance(
-    expected: np.ndarray, predicted: np.ndarray, k: Optional[int] = None
-) -> np.ndarray:
+def relevance(expected: np.ndarray, predicted: np.ndarray, k: Optional[int] = None) -> np.ndarray:
     """Calculate relevance scores. Binary relevance scores
 
     :param expected: ground-truth keys
@@ -211,6 +216,10 @@ class Dataset:
     def crop_neighbors(self, k: int):
         self.neighbors = self.neighbors[:, k]
 
+    @property
+    def ndim(self):
+        return self.vectors.shape[1]
+
     @staticmethod
     def build(
         vectors: Optional[str] = None,
@@ -243,11 +252,7 @@ def build(
 
             d.vectors = load_matrix(vectors)
             ndim = d.vectors.shape[1]
-            count = (
-                min(d.vectors.shape[0], count)
-                if count is not None
-                else d.vectors.shape[0]
-            )
+            count = min(d.vectors.shape[0], count) if count is not None else d.vectors.shape[0]
             d.vectors = d.vectors[:count, :]
             d.keys = np.arange(count, dtype=Key)
 
@@ -308,9 +313,7 @@ def __add__(self, other: TaskResult):
         result = TaskResult()
         if self.add_operations and other.add_operations:
             result.add_operations = self.add_operations + other.add_operations
-            result.add_per_second = result.add_operations / (
-                self.add_seconds + other.add_seconds
-            )
+            result.add_per_second = result.add_operations / (self.add_seconds + other.add_seconds)
         else:
             base = self if self.add_operations else other
             result.add_operations = base.add_operations
@@ -319,12 +322,9 @@ def __add__(self, other: TaskResult):
         if self.search_operations and other.search_operations:
             result.search_operations = self.search_operations + other.search_operations
             result.recall_at_one = (
-                self.recall_at_one * self.search_operations
-                + other.recall_at_one * other.search_operations
+                self.recall_at_one * self.search_operations + other.recall_at_one * other.search_operations
             ) / (self.search_operations + other.search_operations)
-            result.search_per_second = result.search_operations / (
-                self.search_seconds + other.search_seconds
-            )
+            result.search_per_second = result.search_operations / (self.search_seconds + other.search_seconds)
         else:
             base = self if self.search_operations else other
             result.search_operations = base.search_operations
@@ -407,9 +407,7 @@ class SearchTask:
     neighbors: np.ndarray
 
     def __call__(self, index: Index) -> TaskResult:
-        dt, results = measure_seconds(
-            lambda: index.search(self.queries, self.neighbors.shape[1])
-        )
+        dt, results = measure_seconds(lambda: index.search(self.queries, self.neighbors.shape[1]))
 
         return TaskResult(
             search_per_second=self.queries.shape[0] / dt,
@@ -435,9 +433,7 @@ class Evaluation:
     ndim: int
 
     @staticmethod
-    def for_dataset(
-        dataset: Dataset, batch_size: int = 0, clusters: int = 1
-    ) -> Evaluation:
+    def for_dataset(dataset: Dataset, batch_size: int = 0, clusters: int = 1) -> Evaluation:
         tasks = []
         add = AddTask(vectors=dataset.vectors, keys=dataset.keys)
         search = SearchTask(queries=dataset.queries, neighbors=dataset.neighbors)
@@ -474,3 +470,43 @@ def __call__(self, index: Index, post_clean: bool = True) -> dict:
             **index.specs,
             **asdict(task_result),
         }
+
+
+if __name__ == "__main__":
+    import argparse
+
+    # Initialize the argument parser
+    parser = argparse.ArgumentParser(description="Evaluate vector search index for speed and accuracy.")
+
+    # Define expected arguments
+    parser.add_argument("--vectors", type=str, required=False, help="Path to the file containing the vectors.")
+    parser.add_argument("--queries", type=str, required=False, help="Path to the file containing the query vectors.")
+    parser.add_argument("--neighbors", type=str, required=False, help="Path to the file with neighbor arrays.")
+    parser.add_argument("--dtype", type=str, required=False, help="Quantization type for internal storage.")
+    parser.add_argument("--metric", type=str, required=False, help="Distance function.")
+    parser.add_argument("--count", type=int, help="Number of vectors to use.")
+    parser.add_argument("--ndim", type=int, help="Number of dimensions for the vectors.")
+    parser.add_argument("--batch_size", type=int, default=0, help="Batch size for indexing and searching.")
+    parser.add_argument("--clusters", type=int, default=1, help="Number of clusters for indexing.")
+
+    # Parse arguments from the command line
+    args = parser.parse_args()
+
+    # Load or generate dataset
+    dataset = Dataset.build(
+        vectors=args.vectors,
+        queries=args.queries,
+        neighbors=args.neighbors,
+        count=args.count,
+        ndim=args.ndim,
+    )
+
+    # Prepare the evaluation
+    evaluation = Evaluation.for_dataset(dataset, batch_size=args.batch_size, clusters=args.clusters)
+    index = Index(ndim=dataset.ndim, dtype=args.dtype, metric=args.metric)
+
+    # Perform the evaluation
+    results = evaluation(index)
+
+    # Print the evaluation results
+    print("Evaluation results:", results)
diff --git a/python/usearch/index.py b/python/usearch/index.py
index f3e26f56..2323501b 100644
--- a/python/usearch/index.py
+++ b/python/usearch/index.py
@@ -78,9 +78,7 @@ class CompiledMetric(NamedTuple):
 ProgressCallback = Callable[[int, int], bool]
 
 
-def _match_signature(
-    func: Callable[[Any], Any], arg_types: List[type], ret_type: type
-) -> bool:
+def _match_signature(func: Callable[[Any], Any], arg_types: List[type], ret_type: type) -> bool:
     assert callable(func), "Not callable"
     sig = signature(func)
     param_types = [param.annotation for param in sig.parameters.values()]
@@ -174,9 +172,7 @@ def _search_in_compiled(
     #
     assert isinstance(vectors, np.ndarray), "Expects a NumPy array"
     assert vectors.ndim == 1 or vectors.ndim == 2, "Expects a matrix or vector"
-    assert not progress or _match_signature(
-        progress, [int, int], bool
-    ), "Invalid callback"
+    assert not progress or _match_signature(progress, [int, int], bool), "Invalid callback"
 
     if vectors.ndim == 1:
         vectors = vectors.reshape(1, len(vectors))
@@ -220,9 +216,7 @@ def _add_to_compiled(
 ) -> Union[int, np.ndarray]:
     #
     assert isinstance(vectors, np.ndarray), "Expects a NumPy array"
-    assert not progress or _match_signature(
-        progress, [int, int], bool
-    ), "Invalid callback"
+    assert not progress or _match_signature(progress, [int, int], bool), "Invalid callback"
     assert vectors.ndim == 1 or vectors.ndim == 2, "Expects a matrix or vector"
     if vectors.ndim == 1:
         vectors = vectors.reshape(1, len(vectors))
@@ -307,7 +301,7 @@ def to_list(self) -> List[tuple]:
         Convert matches to the list of tuples which contain matches' indices and distances to them.
         """
 
-        return [(int(l), float(d)) for l, d in zip(self.keys, self.distances)]
+        return [(int(key), float(distance)) for key, distance in zip(self.keys, self.distances)]
 
     def __repr__(self) -> str:
         return f"usearch.Matches({len(self)})"
@@ -468,7 +462,7 @@ class Index:
 
     def __init__(
         self,
-        *,
+        *,  # All arguments must be named
         ndim: int = 0,
         metric: MetricLike = MetricKind.Cos,
         dtype: Optional[DTypeLike] = None,
@@ -555,9 +549,7 @@ def __init__(
             self._metric_pointer = metric.pointer
             self._metric_signature = metric.signature
         else:
-            raise ValueError(
-                "The `metric` must be a `CompiledMetric` or a `MetricKind`"
-            )
+            raise ValueError("The `metric` must be a `CompiledMetric` or a `MetricKind`")
 
         # Validate, that the right scalar type is defined
         dtype = _normalize_dtype(dtype, ndim, self._metric_kind)
@@ -761,16 +753,10 @@ def cast(result):
             keys = keys.astype(Key)
 
         results = self._compiled.get_many(keys, dtype)
-        results = (
-            cast(results)
-            if isinstance(results, np.ndarray)
-            else [cast(result) for result in results]
-        )
+        results = cast(results) if isinstance(results, np.ndarray) else [cast(result) for result in results]
         return results[0] if is_one else results
 
-    def __getitem__(
-        self, keys: KeyOrKeysLike
-    ) -> Union[np.ndarray, Tuple[np.ndarray, np.ndarray]]:
+    def __getitem__(self, keys: KeyOrKeysLike) -> Union[np.ndarray, Tuple[np.ndarray, np.ndarray]]:
         """Looks up one or more keys from the `Index`, retrieving corresponding vectors.
 
         Returns `None`, if one key is requested, and its not present.
@@ -897,9 +883,7 @@ def metric(self, metric: MetricLike):
             metric_pointer = metric.pointer
             metric_signature = metric.signature
         else:
-            raise ValueError(
-                "The `metric` must be a `CompiledMetric` or a `MetricKind`"
-            )
+            raise ValueError("The `metric` must be a `CompiledMetric` or a `MetricKind`")
 
         return self._compiled.change_metric(
             metric_kind=metric_kind,
@@ -944,9 +928,7 @@ def save(
         path_or_buffer: Union[str, os.PathLike, NoneType] = None,
         progress: Optional[ProgressCallback] = None,
     ) -> Optional[bytes]:
-        assert not progress or _match_signature(
-            progress, [int, int], bool
-        ), "Invalid callback signature"
+        assert not progress or _match_signature(progress, [int, int], bool), "Invalid callback signature"
 
         path_or_buffer = path_or_buffer if path_or_buffer else self.path
         if path_or_buffer is None:
@@ -959,9 +941,7 @@ def load(
         path_or_buffer: Union[str, os.PathLike, bytes, NoneType] = None,
         progress: Optional[ProgressCallback] = None,
     ):
-        assert not progress or _match_signature(
-            progress, [int, int], bool
-        ), "Invalid callback signature"
+        assert not progress or _match_signature(progress, [int, int], bool), "Invalid callback signature"
 
         path_or_buffer = path_or_buffer if path_or_buffer else self.path
         if path_or_buffer is None:
@@ -982,9 +962,7 @@ def view(
         path_or_buffer: Union[str, os.PathLike, bytes, bytearray, NoneType] = None,
         progress: Optional[ProgressCallback] = None,
     ):
-        assert not progress or _match_signature(
-            progress, [int, int], bool
-        ), "Invalid callback signature"
+        assert not progress or _match_signature(progress, [int, int], bool), "Invalid callback signature"
 
         path_or_buffer = path_or_buffer if path_or_buffer else self.path
         if path_or_buffer is None:
@@ -1045,9 +1023,7 @@ def join(
         :return: Mapping from keys of `self` to keys of `other`
         :rtype: Dict[Key, Key]
         """
-        assert not progress or _match_signature(
-            progress, [int, int], bool
-        ), "Invalid callback signature"
+        assert not progress or _match_signature(progress, [int, int], bool), "Invalid callback signature"
 
         return self._compiled.join(
             other=other._compiled,
@@ -1084,9 +1060,7 @@ def cluster(
         :return: Matches for one or more queries
         :rtype: Union[Matches, BatchMatches]
         """
-        assert not progress or _match_signature(
-            progress, [int, int], bool
-        ), "Invalid callback signature"
+        assert not progress or _match_signature(progress, [int, int], bool), "Invalid callback signature"
 
         if min_count is None:
             min_count = 0
@@ -1119,9 +1093,7 @@ def cluster(
         batch_matches = BatchMatches(*results)
         return Clustering(self, batch_matches, keys)
 
-    def pairwise_distance(
-        self, left: KeyOrKeysLike, right: KeyOrKeysLike
-    ) -> Union[np.ndarray, float]:
+    def pairwise_distance(self, left: KeyOrKeysLike, right: KeyOrKeysLike) -> Union[np.ndarray, float]:
         assert isinstance(left, Iterable) == isinstance(right, Iterable)
 
         if not isinstance(left, Iterable):
@@ -1234,12 +1206,10 @@ def __repr__(self) -> str:
             self.hardware_acceleration,
         )
 
-    def _repr_pretty_(self, printer, cycle) -> str:
+    def __repr_pretty__(self) -> str:
         if not hasattr(self, "_compiled"):
             return "usearch.Index(failed)"
-        level_stats = [
-            f"--- {i}. {self.level_stats(i).nodes:,} nodes" for i in range(self.nlevels)
-        ]
+        level_stats = [f"--- {i}. {self.level_stats(i).nodes:,} nodes" for i in range(self.nlevels)]
         lines = "\n".join(
             [
                 "usearch.Index",
@@ -1249,7 +1219,7 @@ def _repr_pretty_(self, printer, cycle) -> str:
                 f"-- metric: {self.metric_kind}",
                 f"-- multi: {self.multi}",
                 f"-- connectivity: {self.connectivity}",
-                f"-- expansion on addition:{self.expansion_add} candidates",
+                f"-- expansion on addition :{self.expansion_add} candidates",
                 f"-- expansion on search: {self.expansion_search} candidates",
                 "- binary",
                 f"-- uses OpenMP: {USES_OPENMP}",
@@ -1263,7 +1233,10 @@ def _repr_pretty_(self, printer, cycle) -> str:
                 *level_stats,
             ]
         )
-        printer.text(lines)
+        return lines
+
+    def _repr_pretty_(self, printer, cycle):
+        printer.text(self.__repr_pretty__())
 
 
 class Indexes:
@@ -1349,9 +1322,7 @@ def search(
     :return: Matches for one or more queries
     :rtype: Union[Matches, BatchMatches]
     """
-    assert not progress or _match_signature(
-        progress, [int, int], bool
-    ), "Invalid callback signature"
+    assert not progress or _match_signature(progress, [int, int], bool), "Invalid callback signature"
     assert dataset.ndim == 2, "Dataset must be a matrix, with a vector in each row"
 
     if not exact:
diff --git a/python/usearch/numba.py b/python/usearch/numba.py
index 5885501d..3c1a4e61 100644
--- a/python/usearch/numba.py
+++ b/python/usearch/numba.py
@@ -27,21 +27,10 @@ def jit(
 
     from numba import cfunc, types, carray
 
-    signature_i8args = types.float32(
-        types.CPointer(types.int8), types.CPointer(types.int8)
-    )
-
-    signature_f16args = types.float32(
-        types.CPointer(types.float16), types.CPointer(types.float16)
-    )
-
-    signature_f32args = types.float32(
-        types.CPointer(types.float32), types.CPointer(types.float32)
-    )
-
-    signature_f64args = types.float32(
-        types.CPointer(types.float64), types.CPointer(types.float64)
-    )
+    signature_i8args = types.float32(types.CPointer(types.int8), types.CPointer(types.int8))
+    signature_f16args = types.float32(types.CPointer(types.float16), types.CPointer(types.float16))
+    signature_f32args = types.float32(types.CPointer(types.float32), types.CPointer(types.float32))
+    signature_f64args = types.float32(types.CPointer(types.float64), types.CPointer(types.float64))
 
     numba_supported_types = (
         ScalarKind.I8,
diff --git a/python/usearch/server.py b/python/usearch/server.py
index 5f53b90e..8f93ff6a 100644
--- a/python/usearch/server.py
+++ b/python/usearch/server.py
@@ -100,9 +100,7 @@ def search_ascii(string: str, count: int):
     parser = argparse.ArgumentParser()
     parser.add_argument("-v", "--verbose", help="log server activity")
     parser.add_argument("--ndim", type=int, help="dimensionality of the vectors")
-    parser.add_argument(
-        "--immutable", type=bool, default=False, help="the index can not be updated"
-    )
+    parser.add_argument("--immutable", type=bool, default=False, help="the index can not be updated")
 
     parser.add_argument(
         "--metric",
@@ -118,12 +116,8 @@ def search_ascii(string: str, count: int):
         default=8545,
         help="port to open for client connections",
     )
-    parser.add_argument(
-        "-j", "--threads", type=int, default=1, help="number of CPU threads to use"
-    )
-    parser.add_argument(
-        "--path", type=str, default="index.usearch", help="where to store the index"
-    )
+    parser.add_argument("-j", "--threads", type=int, default=1, help="number of CPU threads to use")
+    parser.add_argument("--path", type=str, default="index.usearch", help="where to store the index")
 
     args = parser.parse_args()
     assert args.ndim is not None, "Define the number of dimensions!"
diff --git a/rust/lib.cpp b/rust/lib.cpp
index 0dcb237f..f43477f7 100644
--- a/rust/lib.cpp
+++ b/rust/lib.cpp
@@ -79,6 +79,7 @@ void NativeIndex::view(rust::Str path) const {
 
 void NativeIndex::reset() const { index_->reset(); }
 size_t NativeIndex::memory_usage() const { return index_->memory_usage(); }
+char const* NativeIndex::hardware_acceleration() const { return index_->metric().isa_name(); }
 
 void NativeIndex::save_to_buffer(rust::Slice<uint8_t> buffer) const {
     index_->save(memory_mapped_file_t((byte_t*)buffer.data(), buffer.size())).error.raise();
@@ -130,6 +131,8 @@ std::unique_ptr<NativeIndex> new_native_index(IndexOptions const& options) {
     metric_kind_t metric_kind = rust_to_cpp_metric(options.metric);
     scalar_kind_t scalar_kind = rust_to_cpp_scalar(options.quantization);
     metric_punned_t metric(options.dimensions, metric_kind, scalar_kind);
+    if (metric.missing())
+        throw std::invalid_argument("Unsupported metric or scalar type");
     index_dense_config_t config(options.connectivity, options.expansion_add, options.expansion_search);
     config.multi = options.multi;
     return wrap(index_t::make(metric, config));
diff --git a/rust/lib.hpp b/rust/lib.hpp
index e65edcc2..eca7d06c 100644
--- a/rust/lib.hpp
+++ b/rust/lib.hpp
@@ -57,6 +57,7 @@ class NativeIndex {
     void view(rust::Str path) const;
     void reset() const;
     size_t memory_usage() const;
+    char const* hardware_acceleration() const;
 
     void save_to_buffer(rust::Slice<uint8_t> buffer) const;
     void load_from_buffer(rust::Slice<uint8_t const> buffer) const;
diff --git a/rust/lib.rs b/rust/lib.rs
index b05ee839..9c4607e5 100644
--- a/rust/lib.rs
+++ b/rust/lib.rs
@@ -85,6 +85,7 @@ pub mod ffi {
         pub fn view(self: &NativeIndex, path: &str) -> Result<()>;
         pub fn reset(self: &NativeIndex) -> Result<()>;
         pub fn memory_usage(self: &NativeIndex) -> usize;
+        pub fn hardware_acceleration(self: &NativeIndex) -> *const c_char;
 
         pub fn save_to_buffer(self: &NativeIndex, buffer: &mut [u8]) -> Result<()>;
         pub fn load_from_buffer(self: &NativeIndex, buffer: &[u8]) -> Result<()>;
@@ -202,6 +203,15 @@ impl Index {
         self.inner.change_expansion_search(n)
     }
 
+    /// Retrieves the hardware acceleration information.
+    pub fn hardware_acceleration(&self) -> String {
+        use core::ffi::CStr;
+        unsafe {
+            let c_str = CStr::from_ptr(self.inner.hardware_acceleration());
+            c_str.to_string_lossy().into_owned()
+        }
+    }
+
     /// Performs k-Approximate Nearest Neighbors (kANN) Search for closest vectors to the provided query.
     ///
     /// # Arguments
@@ -438,6 +448,81 @@ mod tests {
     use crate::new_index;
     use crate::Index;
 
+    use std::env;
+
+    #[test]
+    fn print_specs() {
+        print!("--------------------------------------------------\n");
+        println!("OS: {}", env::consts::OS);
+        println!(
+            "Rust version: {}",
+            env::var("RUST_VERSION").unwrap_or_else(|_| "unknown".into())
+        );
+
+        // Create indexes with different configurations
+        let f64_index = Index::new(&IndexOptions {
+            dimensions: 256,
+            metric: MetricKind::Cos,
+            quantization: ScalarKind::F64,
+            ..Default::default()
+        })
+        .unwrap();
+
+        let f32_index = Index::new(&IndexOptions {
+            dimensions: 256,
+            metric: MetricKind::Cos,
+            quantization: ScalarKind::F32,
+            ..Default::default()
+        })
+        .unwrap();
+
+        let f16_index = Index::new(&IndexOptions {
+            dimensions: 256,
+            metric: MetricKind::Cos,
+            quantization: ScalarKind::F16,
+            ..Default::default()
+        })
+        .unwrap();
+
+        let i8_index = Index::new(&IndexOptions {
+            dimensions: 256,
+            metric: MetricKind::Cos,
+            quantization: ScalarKind::I8,
+            ..Default::default()
+        })
+        .unwrap();
+
+        let b1_index = Index::new(&IndexOptions {
+            dimensions: 256,
+            metric: MetricKind::Hamming,
+            quantization: ScalarKind::B1,
+            ..Default::default()
+        })
+        .unwrap();
+
+        println!(
+            "f64 hardware acceleration: {}",
+            f64_index.hardware_acceleration()
+        );
+        println!(
+            "f32 hardware acceleration: {}",
+            f32_index.hardware_acceleration()
+        );
+        println!(
+            "f16 hardware acceleration: {}",
+            f16_index.hardware_acceleration()
+        );
+        println!(
+            "i8 hardware acceleration: {}",
+            i8_index.hardware_acceleration()
+        );
+        println!(
+            "b1 hardware acceleration: {}",
+            b1_index.hardware_acceleration()
+        );
+        print!("--------------------------------------------------\n");
+    }
+
     #[test]
     fn test_add_get_vector() {
         let mut options = IndexOptions::default();
@@ -494,17 +579,17 @@ mod tests {
         let mut found_slice = [0.0 as f32; 4];
         assert_eq!(index.get(id1, &mut found_slice).unwrap(), 1);
         assert!(index.remove(id1).is_ok());
-    
+
         assert!(index.add(id2, &second).is_ok());
         let mut found_slice = [0.0 as f32; 4];
         assert_eq!(index.get(id2, &mut found_slice).unwrap(), 1);
         assert!(index.remove(id2).is_ok());
-        
+
         assert!(index.add(id3, &second).is_ok());
         let mut found_slice = [0.0 as f32; 4];
         assert_eq!(index.get(id3, &mut found_slice).unwrap(), 1);
         assert!(index.remove(id3).is_ok());
-                
+
         assert!(index.add(id4, &second).is_ok());
         let mut found_slice = [0.0 as f32; 4];
         assert_eq!(index.get(id4, &mut found_slice).unwrap(), 1);
@@ -532,6 +617,7 @@ mod tests {
         let first: [f32; 5] = [0.2, 0.1, 0.2, 0.1, 0.3];
         let second: [f32; 5] = [0.3, 0.2, 0.4, 0.0, 0.1];
 
+        print!("--------------------------------------------------\n");
         println!(
             "before add, memory_usage: {} \
             cap: {} \
@@ -566,6 +652,7 @@ mod tests {
         let results = index.search(&first, 10).unwrap();
         println!("{:?}", results);
         assert_eq!(results.keys.len(), 2);
+        print!("--------------------------------------------------\n");
 
         // Validate serialization
         assert!(index.save("index.rust.usearch").is_ok());
diff --git a/setup.py b/setup.py
index 3301b8f7..d70b3ff7 100644
--- a/setup.py
+++ b/setup.py
@@ -1,6 +1,7 @@
 import os
 import sys
 import subprocess
+import platform
 from setuptools import setup
 
 from pybind11.setup_helpers import Pybind11Extension
@@ -23,6 +24,7 @@ def get_bool_env_w_name(name: str, preference: bool) -> tuple:
 is_linux: bool = sys.platform == "linux"
 is_macos: bool = sys.platform == "darwin"
 is_windows: bool = sys.platform == "win32"
+machine: str = platform.machine().lower()
 
 
 is_gcc = False
@@ -38,7 +40,7 @@ def get_bool_env_w_name(name: str, preference: bool) -> tuple:
             pass
 
 
-prefer_simsimd: bool = is_linux or is_macos
+prefer_simsimd: bool = True
 prefer_fp16lib: bool = True
 prefer_openmp: bool = is_linux and is_gcc
 
@@ -69,10 +71,12 @@ def get_bool_env_w_name(name: str, preference: bool) -> tuple:
     if use_simsimd:
         macros_args.extend(
             [
-                get_bool_env_w_name("SIMSIMD_TARGET_X86_AVX512", True),
-                get_bool_env_w_name("SIMSIMD_TARGET_ARM_SVE", True),
-                get_bool_env_w_name("SIMSIMD_TARGET_X86_AVX2", True),
-                get_bool_env_w_name("SIMSIMD_TARGET_ARM_NEON", True),
+                get_bool_env_w_name("SIMSIMD_TARGET_NEON", True),
+                get_bool_env_w_name("SIMSIMD_TARGET_SVE", True),
+                get_bool_env_w_name("SIMSIMD_TARGET_HASWELL", True),
+                get_bool_env_w_name("SIMSIMD_TARGET_SKYLAKE", True),
+                get_bool_env_w_name("SIMSIMD_TARGET_ICE", True),
+                get_bool_env_w_name("SIMSIMD_TARGET_SAPPHIRE", True),
             ]
         )
 
@@ -103,35 +107,34 @@ def get_bool_env_w_name(name: str, preference: bool) -> tuple:
     if use_simsimd:
         macros_args.extend(
             [
-                get_bool_env_w_name("SIMSIMD_TARGET_X86_AVX512", False),
-                get_bool_env_w_name("SIMSIMD_TARGET_ARM_SVE", False),
-                get_bool_env_w_name("SIMSIMD_TARGET_X86_AVX2", True),
-                get_bool_env_w_name("SIMSIMD_TARGET_ARM_NEON", True),
+                get_bool_env_w_name("SIMSIMD_TARGET_NEON", True),
+                get_bool_env_w_name("SIMSIMD_TARGET_SVE", False),
+                get_bool_env_w_name("SIMSIMD_TARGET_HASWELL", True),
+                get_bool_env_w_name("SIMSIMD_TARGET_SKYLAKE", False),
+                get_bool_env_w_name("SIMSIMD_TARGET_ICE", False),
+                get_bool_env_w_name("SIMSIMD_TARGET_SAPPHIRE", False),
             ]
         )
 
+
 if is_windows:
     compile_args.append("/std:c++17")
     compile_args.append("/O2")
     compile_args.append("/fp:fast")  # Enable fast math for MSVC
     compile_args.append("/W1")  # Reduce warnings verbosity
 
-    # We don't actually want to use any SimSIMD stuff,
-    # as GCC attributes aren't compatible with MSVC
     if use_simsimd:
         macros_args.extend(
             [
-                get_bool_env_w_name("SIMSIMD_TARGET_X86_AVX512", False),
-                get_bool_env_w_name("SIMSIMD_TARGET_ARM_SVE", False),
-                get_bool_env_w_name("SIMSIMD_TARGET_X86_AVX2", False),
-                get_bool_env_w_name("SIMSIMD_TARGET_ARM_NEON", False),
+                get_bool_env_w_name("SIMSIMD_TARGET_NEON", True),
+                get_bool_env_w_name("SIMSIMD_TARGET_SVE", False),
+                get_bool_env_w_name("SIMSIMD_TARGET_HASWELL", True),
+                get_bool_env_w_name("SIMSIMD_TARGET_SKYLAKE", True),
+                get_bool_env_w_name("SIMSIMD_TARGET_ICE", True),
+                get_bool_env_w_name("SIMSIMD_TARGET_SAPPHIRE", False),
             ]
         )
 
-if is_linux or is_macos:
-    sources.append("sqlite/lib.cpp")
-    link_args.append("-lsqlite3")
-
 ext_modules = [
     Pybind11Extension(
         "usearch.compiled",
@@ -146,7 +149,7 @@ def get_bool_env_w_name(name: str, preference: bool) -> tuple:
 __lib_name__ = "usearch"
 
 this_directory = os.path.abspath(os.path.dirname(__file__))
-with open(os.path.join(this_directory, "README.md")) as f:
+with open(os.path.join(this_directory, "README.md"), encoding="utf-8") as f:
     long_description = f.read()
 
 # Depending on the macros, adjust the include directories
diff --git a/simsimd b/simsimd
index 02665027..127ead1d 160000
--- a/simsimd
+++ b/simsimd
@@ -1,1 +1,1 @@
-Subproject commit 02665027985a578bd91514011c31a0bbe302304d
+Subproject commit 127ead1da7c39957b30a50dd85e74814edb022d6
diff --git a/sqlite/CMakeLists.txt b/sqlite/CMakeLists.txt
new file mode 100644
index 00000000..026f848a
--- /dev/null
+++ b/sqlite/CMakeLists.txt
@@ -0,0 +1,35 @@
+# This article discusses a better way to allow building either static or shared libraries:
+# https://alexreinking.com/blog/building-a-dual-shared-and-static-library-with-cmake.html
+if (USEARCH_BUILD_SQLITE)
+
+    add_library(usearch_sqlite SHARED lib.cpp)
+
+    # One option is to use the FindSQLite3.cmake module and locate the pre-installed version of SQLite, that however
+    # breaks cross-compilation, so we use the FetchContent module to get the "amalgamation" version of SQLite.
+    # https://sqlite.org/amalgamation.html
+    #
+    # find_package(SQLite3 REQUIRED) target_link_libraries(usearch_sqlite PRIVATE SQLite::SQLite3)
+    # target_include_directories(usearch_sqlite PRIVATE ${SQLite3_INCLUDE_DIRS})
+    include(FetchContent)
+    if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.24")
+        FetchContent_Declare(
+            sqlite3 URL https://sqlite.org/2024/sqlite-amalgamation-3450200.zip DOWNLOAD_EXTRACT_TIMESTAMP TRUE
+        )
+    else ()
+        FetchContent_Declare(sqlite3 URL https://sqlite.org/2024/sqlite-amalgamation-3450200.zip)
+    endif ()
+    FetchContent_MakeAvailable(sqlite3)
+    add_library(sqlite3_shared SHARED ${sqlite3_SOURCE_DIR}/sqlite3.c)
+    target_include_directories(sqlite3_shared PUBLIC ${sqlite3_SOURCE_DIR})
+    set_target_properties(sqlite3_shared PROPERTIES OUTPUT_NAME "sqlite3")
+    set(SQLite3_INCLUDE_DIR ${sqlite3_SOURCE_DIR})
+    set(SQLite3_LIBRARY $<TARGET_FILE:sqlite3_shared>)
+    target_link_libraries(usearch_sqlite PRIVATE sqlite3_shared)
+
+    target_include_directories(usearch_sqlite PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../stringzilla/include)
+    if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+        target_compile_options(usearch_sqlite PRIVATE -Wno-vla -Wno-unused-function -Wno-cast-function-type)
+    endif ()
+    setup_target(usearch_sqlite)
+
+endif ()
diff --git a/sqlite/README.md b/sqlite/README.md
index 32cac3b6..a74d105c 100644
--- a/sqlite/README.md
+++ b/sqlite/README.md
@@ -142,7 +142,7 @@ FROM binary_vectors AS bv;
 
 #### Dense Vectors
 
-Distance functions for desnse vectors can be used on both BLOBs and JSONs.
+Distance functions for dense vectors can be used on both BLOBs and JSONs.
 Every name is structured as `distance_<metric>_<type>`, where 
 
 - `<metric>` is the name of the metric, like `cosine`, `inner`, `sqeuclidean`, and `divergence`,
@@ -175,4 +175,4 @@ When dealing with geographical or other spherical coordinates, you can use:
 
 ---
 
-Feel free to contribute more examples to this file 🤗
\ No newline at end of file
+Feel free to contribute more examples to this file 🤗
diff --git a/sqlite/lib.cpp b/sqlite/lib.cpp
index 239b5bff..e6196a28 100644
--- a/sqlite/lib.cpp
+++ b/sqlite/lib.cpp
@@ -26,6 +26,8 @@ namespace sz = ashvardanian::stringzilla;
 using metric_t = metric_punned_t;
 using distance_t = distance_punned_t;
 
+constexpr std::size_t max_dimensions_k = 4096;
+
 template <scalar_kind_t scalar_kind_ak> struct parsed_scalar_kind_gt {
     using type = f32_t;
     static constexpr scalar_kind_t kind = scalar_kind_t::f32_k;
@@ -93,10 +95,16 @@ static void sqlite_dense(sqlite3_context* context, int argc, sqlite3_value** arg
         // if (bytes2 && vec2[bytes2 - 1] == ']')
         //     --bytes2;
 
-        // Allocate vectors on stack and parse strings into them
-        using scalar_t = typename parsed_scalar_kind_gt<scalar_kind_ak>::type;
+        // Can we allocate enough space on the stack?
         size_t dimensions = commas1 + 1;
-        scalar_t parsed1[dimensions], parsed2[dimensions];
+        if (dimensions > max_dimensions_k) {
+            sqlite3_result_error(context, "Number of scalar values exceeds maximum allowed dimensions", -1);
+            return;
+        }
+
+        // Parse the strings
+        using scalar_t = typename parsed_scalar_kind_gt<scalar_kind_ak>::type;
+        scalar_t parsed1[max_dimensions_k], parsed2[max_dimensions_k];
         for (size_t i = 0; i != dimensions; ++i) {
             // Skip whitespace
             while (bytes1 && vec1[0] == ' ')
@@ -149,22 +157,28 @@ static void sqlite_dense(sqlite3_context* context, int argc, sqlite3_value** arg
     // Less efficient, yet still common case is to have many scalar columns
     else if (argc % 2 == 0) {
 
-        // Allocate vectors on stack and parse floating-point values into them
-        using scalar_t = typename parsed_scalar_kind_gt<scalar_kind_ak>::type;
+        // Can we allocate enough space on the stack?
         size_t dimensions = argc / 2;
-        scalar_t parsed1[dimensions], parsed2[dimensions];
+        if (dimensions > max_dimensions_k) {
+            sqlite3_result_error(context, "Number of scalar values exceeds maximum allowed dimensions", -1);
+            return;
+        }
+
+        // Parse the strings
+        using scalar_t = typename parsed_scalar_kind_gt<scalar_kind_ak>::type;
+        scalar_t parsed1[max_dimensions_k], parsed2[max_dimensions_k];
         for (size_t i = 0; i != dimensions; ++i) {
             switch (sqlite3_value_type(argv[i])) {
-            case SQLITE_FLOAT: parsed1[i] = sqlite3_value_double(argv[i]); break;
-            case SQLITE_INTEGER: parsed1[i] = sqlite3_value_int(argv[i]); break;
+            case SQLITE_FLOAT: parsed1[i] = static_cast<scalar_t>(sqlite3_value_double(argv[i])); break;
+            case SQLITE_INTEGER: parsed1[i] = static_cast<scalar_t>(sqlite3_value_int(argv[i])); break;
             case SQLITE_NULL: parsed1[i] = 0; break;
             default:
                 sqlite3_result_error(context, "Scalar columns may only contain 32-bit integers, floats, or NULLs.", -1);
                 return;
             }
             switch (sqlite3_value_type(argv[dimensions + i])) {
-            case SQLITE_FLOAT: parsed2[i] = sqlite3_value_double(argv[dimensions + i]); break;
-            case SQLITE_INTEGER: parsed2[i] = sqlite3_value_int(argv[dimensions + i]); break;
+            case SQLITE_FLOAT: parsed2[i] = static_cast<scalar_t>(sqlite3_value_double(argv[dimensions + i])); break;
+            case SQLITE_INTEGER: parsed2[i] = static_cast<scalar_t>(sqlite3_value_int(argv[dimensions + i])); break;
             case SQLITE_NULL: parsed2[i] = 0; break;
             default:
                 sqlite3_result_error(context, "Scalar columns may only contain 32-bit integers, floats, or NULLs.", -1);
@@ -252,14 +266,12 @@ static void sqlite_strings(sqlite3_context* context, int argc, sqlite3_value** a
     sqlite3_result_int64(context, (std::int64_t)result);
 }
 
-extern "C" SZ_DYNAMIC int sqlite3_compiled_init( //
-    sqlite3* db,                                 //
-    char** error_message,                        //
-    sqlite3_api_routines const* api) {
+int init_sqlite(sqlite3* db, char** error_message, sqlite3_api_routines const* api) {
     SQLITE_EXTENSION_INIT2(api)
 
     int flags = SQLITE_UTF8 | SQLITE_DETERMINISTIC | SQLITE_INNOCUOUS;
     int num_params = -1; // Any number will be accepted
+    (void)error_message; // Unused
 
     // String similarity metrics
     sqlite3_create_function(db, "distance_levenshtein_bytes", num_params, flags, NULL,
@@ -322,4 +334,26 @@ extern "C" SZ_DYNAMIC int sqlite3_compiled_init( //
     return SQLITE_OK;
 }
 
+#ifndef USEARCH_EXPORT
+#if defined(_WIN32) && !defined(__MINGW32__)
+#define USEARCH_EXPORT __declspec(dllexport)
+#else
+#define USEARCH_EXPORT __attribute__((visibility("default")))
+#endif
+#endif
+
+extern "C" USEARCH_EXPORT int sqlite3_usearchsqlite_init( //
+    sqlite3* db,                                          //
+    char** error_message,                                 //
+    sqlite3_api_routines const* api) {
+    return init_sqlite(db, error_message, api);
+}
+
+extern "C" USEARCH_EXPORT int sqlite3_usearch_sqlite_init( //
+    sqlite3* db,                                           //
+    char** error_message,                                  //
+    sqlite3_api_routines const* api) {
+    return init_sqlite(db, error_message, api);
+}
+
 #include "../stringzilla/c/lib.c"
\ No newline at end of file
diff --git a/stringzilla b/stringzilla
index 662b66e9..c2848c1b 160000
--- a/stringzilla
+++ b/stringzilla
@@ -1,1 +1,1 @@
-Subproject commit 662b66e97eb3bee017e3aae167d6121cb8ab156e
+Subproject commit c2848c1ba777c541af2903501f3d6344d711638b
diff --git a/tsconfig.json b/tsconfig.json
deleted file mode 100644
index f48dae3d..00000000
--- a/tsconfig.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-  // Change this to match your project
-  "include": ["javascript/usearch.js"],
-  "compilerOptions": {
-    // Tells TypeScript to read JS files, as
-    // normally they are ignored as source files
-    "allowJs": true,
-    // Generate d.ts files
-    "declaration": true,
-    // This compiler run should
-    // only output d.ts files
-    "emitDeclarationOnly": true,
-    // Types should go into this directory.
-    // Removing this would place the .d.ts files
-    // next to the .js files
-    "outDir": "javascript/types",
-    // go to js file when using IDE functions like
-    // "Go to Definition" in VSCode
-    "declarationMap": true
-  }
-}
diff --git a/wasmer.toml b/wasmer.toml
index 78fe3fc7..21a08de8 100644
--- a/wasmer.toml
+++ b/wasmer.toml
@@ -1,12 +1,12 @@
 [package]
-name="unum/usearch"
-version="2.9.2"
-description="Smaller & Faster Single-File Vector Search Engine from Unum"
-license="Apache-2.0"
-readme="README.md"
-repository="https://github.com/unum-cloud/usearch"
-homepage="https://unum-cloud.github.io/usearch/javascript"
+name = "unum/usearch"
+version = "2.9.2"
+description = "Smaller & Faster Single-File Vector Search Engine from Unum"
+license = "Apache-2.0"
+readme = "README.md"
+repository = "https://github.com/unum-cloud/usearch"
+homepage = "https://unum-cloud.github.io/usearch/javascript"
 
 [[module]]
-name="index"
-source="build/wasm/index.wasm"
+name = "index"
+source = "build/wasm/index.wasm"


Test patch:
diff --git a/cpp/test.cpp b/cpp/test.cpp
index aa9b0c56..2bfdcaf3 100644
--- a/cpp/test.cpp
+++ b/cpp/test.cpp
@@ -166,17 +166,18 @@ void test_cosine(std::size_t collection_size, std::size_t dimensions) {
     using member_cref_t = typename index_typed_t::member_cref_t;
     using member_citerator_t = typename index_typed_t::member_citerator_t;
 
-    std::vector<std::vector<scalar_at>> matrix(collection_size);
-    for (std::vector<scalar_at>& vector : matrix) {
+    using vector_of_vectors_t = std::vector<std::vector<scalar_at>>;
+    vector_of_vectors_t vector_of_vectors(collection_size);
+    for (auto& vector : vector_of_vectors) {
         vector.resize(dimensions);
         std::generate(vector.begin(), vector.end(), [=] { return float(std::rand()) / float(INT_MAX); });
     }
 
     struct metric_t {
-        std::vector<std::vector<scalar_at>> const* matrix_ptr;
-        std::size_t dimensions;
+        vector_of_vectors_t const* vector_of_vectors_ptr = nullptr;
+        std::size_t dimensions = 0;
 
-        scalar_t const* row(std::size_t i) const noexcept { return (*matrix_ptr)[i].data(); }
+        scalar_t const* row(std::size_t i) const noexcept { return (*vector_of_vectors_ptr)[i].data(); }
 
         float operator()(member_cref_t const& a, member_cref_t const& b) const {
             return metric_cos_gt<scalar_t>{}(row(get_slot(b)), row(get_slot(a)), dimensions);
@@ -195,10 +196,10 @@ void test_cosine(std::size_t collection_size, std::size_t dimensions) {
     // Template:
     for (std::size_t connectivity : {3, 13, 50}) {
         std::printf("- templates with connectivity %zu \n", connectivity);
-        metric_t metric{&matrix, dimensions};
+        metric_t metric{&vector_of_vectors, dimensions};
         index_config_t config(connectivity);
         index_typed_t index_typed(config);
-        test_cosine<false>(index_typed, matrix, metric);
+        test_cosine<false>(index_typed, vector_of_vectors, metric);
     }
 
     // Type-punned:
@@ -217,7 +218,7 @@ void test_cosine(std::size_t collection_size, std::size_t dimensions) {
                 // move assignment
                 index = std::move(index_tmp2);
             }
-            test_cosine<true>(index, matrix);
+            test_cosine<true>(index, vector_of_vectors);
         }
     }
 }
diff --git a/javascript/usearch.test.js b/javascript/usearch.test.js
index c86e9f18..d3673508 100644
--- a/javascript/usearch.test.js
+++ b/javascript/usearch.test.js
@@ -1,6 +1,16 @@
 const test = require('node:test');
 const assert = require('node:assert');
-const usearch = require('./usearch.js');
+const usearch = require('./dist/cjs/usearch.js');
+
+function assertAlmostEqual(actual, expected, tolerance = 1e-6) {
+    const lowerBound = expected - tolerance;
+    const upperBound = expected + tolerance;
+    assert(
+        actual >= lowerBound && actual <= upperBound,
+        `Expected ${actual} to be almost equal to ${expected}`
+    );
+}
+
 
 test('Single-entry operations', () => {
     const index = new usearch.Index(2, 'l2sq');
@@ -38,7 +48,7 @@ test('Batch operations', () => {
 
 test("Expected results", () => {
     var index = new usearch.Index({
-        metric: "cos",
+        metric: "l2sq",
         connectivity: 16,
         dimensions: 3,
     });
@@ -47,7 +57,7 @@ test("Expected results", () => {
 
     assert.equal(index.size(), 1);
     assert.deepEqual(results.keys, new BigUint64Array([42n]));
-    assert.deepEqual(results.distances, new Float32Array([0]));
+    assertAlmostEqual(results.distances[0], new Float32Array([0]));
 });
 
 
@@ -62,7 +72,7 @@ test('Operations with invalid values', () => {
         indexBatch.add(keys, vectors);
         throw new Error('indexBatch.add should have thrown an error.');
     } catch (err) {
-        assert.equal(err.message, 'All keys must be integers or bigints.');
+        assert.equal(err.message, 'All keys must be positive integers or bigints.');
     }
 
     try {
diff --git a/python/scripts/test_distances.py b/python/scripts/test_distances.py
new file mode 100644
index 00000000..5569739d
--- /dev/null
+++ b/python/scripts/test_distances.py
@@ -0,0 +1,89 @@
+import pytest
+import numpy as np
+
+from usearch.eval import random_vectors
+from usearch.index import search
+
+from usearch.index import (
+    Index,
+    MetricKind,
+    ScalarKind,
+)
+
+
+@pytest.mark.parametrize(
+    "metric",
+    [
+        MetricKind.Cos,
+        MetricKind.L2sq,
+        MetricKind.Divergence,
+        MetricKind.Pearson,
+    ],
+)
+@pytest.mark.parametrize(
+    "quantization",
+    [
+        ScalarKind.F32,
+        ScalarKind.F16,
+        ScalarKind.I8,
+    ],
+)
+@pytest.mark.parametrize(
+    "dtype",
+    [
+        np.float32,
+        np.float64,
+        np.float16,
+        np.int8,
+    ],
+)
+def test_distances_continuous(metric, quantization, dtype):
+    ndim = 1024
+    try:
+        index = Index(ndim=ndim, metric=metric, dtype=quantization)
+        vectors = random_vectors(count=2, ndim=ndim, dtype=dtype)
+        keys = np.arange(2)
+        index.add(keys, vectors)
+    except ValueError:
+        pytest.skip(f"Unsupported metric `{metric}`, quantization `{quantization}`, dtype `{dtype}`")
+        return
+
+    rtol = 1e-2
+    atol = 1e-2
+
+    distance_itself_first = index.pairwise_distance([0], [0])
+    distance_itself_second = index.pairwise_distance([1], [1])
+    distance_different = index.pairwise_distance([0], [1])
+
+    assert not np.allclose(distance_different, 0)
+    assert np.allclose(distance_itself_first, 0, rtol=rtol, atol=atol) and np.allclose(
+        distance_itself_second, 0, rtol=rtol, atol=atol
+    )
+
+
+@pytest.mark.parametrize(
+    "metric",
+    [
+        MetricKind.Hamming,
+        MetricKind.Tanimoto,
+        MetricKind.Sorensen,
+    ],
+)
+def test_distances_sparse(metric):
+    ndim = 1024
+    index = Index(ndim=ndim, metric=metric, dtype=ScalarKind.B1)
+    vectors = random_vectors(count=2, ndim=ndim, dtype=ScalarKind.B1)
+    keys = np.arange(2)
+    index.add(keys, vectors)
+
+    rtol = 1e-2
+    atol = 1e-2
+
+    distance_itself_first = index.pairwise_distance([0], [0])
+    distance_itself_second = index.pairwise_distance([1], [1])
+    distance_different = index.pairwise_distance([0], [1])
+
+    assert not np.allclose(distance_different, 0)
+    assert np.allclose(distance_itself_first, 0, rtol=rtol, atol=atol) and np.allclose(
+        distance_itself_second, 0, rtol=rtol, atol=atol
+    )
diff --git a/python/scripts/test_index.py b/python/scripts/test_index.py
index 6988bbd8..c2d8c3f4 100644
--- a/python/scripts/test_index.py
+++ b/python/scripts/test_index.py
@@ -3,7 +3,6 @@
 import pytest
 import numpy as np
 
-from usearch.io import load_matrix, save_matrix
 from usearch.eval import random_vectors, self_recall, SearchStats
 from usearch.index import search
 
@@ -46,9 +45,7 @@
 @pytest.mark.parametrize("batch_size", [1, 7, 1024])
 @pytest.mark.parametrize("quantization", [ScalarKind.F32, ScalarKind.I8])
 @pytest.mark.parametrize("dtype", [np.float32, np.float64, np.float16])
-def test_index_initialization_and_addition(
-    ndim, metric, quantization, dtype, batch_size
-):
+def test_index_initialization_and_addition(ndim, metric, quantization, dtype, batch_size):
     index = Index(ndim=ndim, metric=metric, dtype=quantization, multi=False)
     keys = np.arange(batch_size)
     vectors = random_vectors(count=batch_size, ndim=ndim, dtype=dtype)
@@ -115,7 +112,6 @@ def test_index_self_recall(ndim: int, batch_size: int):
     """
     Test self-recall evaluation scripts.
     """
-    original = np.random.rand(batch_size, ndim)
     index = Index(ndim=ndim, multi=False)
     keys = np.arange(batch_size)
     vectors = random_vectors(count=batch_size, ndim=ndim)
@@ -197,9 +193,7 @@ def test_index_save_load_restore_copy(ndim, quantization, batch_size):
     copied_index = index.copy()
     assert len(copied_index) == len(index)
     if batch_size > 0:
-        assert np.allclose(
-            np.vstack(copied_index.get(keys)), np.vstack(index.get(keys))
-        )
+        assert np.allclose(np.vstack(copied_index.get(keys)), np.vstack(index.get(keys)))
 
     # Perform the same operations in RAM, without touching the filesystem
     serialized_index = index.save()
@@ -210,9 +204,7 @@ def test_index_save_load_restore_copy(ndim, quantization, batch_size):
     assert len(deserialized_index) == len(index)
     assert set(np.array(deserialized_index.keys)) == set(np.array(index.keys))
     if batch_size > 0:
-        assert np.allclose(
-            np.vstack(deserialized_index.get(keys)), np.vstack(index.get(keys))
-        )
+        assert np.allclose(np.vstack(deserialized_index.get(keys)), np.vstack(index.get(keys)))
 
     deserialized_index.reset()
     index.reset()
diff --git a/python/scripts/test_jit.py b/python/scripts/test_jit.py
index c98aa392..b4041c34 100644
--- a/python/scripts/test_jit.py
+++ b/python/scripts/test_jit.py
@@ -20,6 +20,7 @@ def test_index_numba(ndim: int, batch_size: int):
     try:
         from numba import cfunc, types, carray
     except ImportError:
+        pytest.skip("Numba is not installed.")
         return
 
     # Showcases how to use Numba to JIT-compile similarity measures for USearch.
@@ -33,12 +34,6 @@ def test_index_numba(ndim: int, batch_size: int):
         types.CPointer(types.float32),
         types.uint64,
     )
-    signature_four_args = types.float32(
-        types.CPointer(types.float32),
-        types.uint64,
-        types.CPointer(types.float32),
-        types.uint64,
-    )
 
     @cfunc(signature_two_args)
     def python_inner_product_two_args(a, b):
@@ -72,16 +67,20 @@ def python_inner_product_three_args(a, b, ndim):
             kind=MetricKind.IP,
             signature=signature,
         )
-        index = Index(ndim=ndim, metric=metric)
+        index = Index(ndim=ndim, metric=metric, dtype=np.float32)
 
         keys = np.arange(batch_size)
         vectors = random_vectors(count=batch_size, ndim=ndim)
 
         index.add(keys, vectors)
-        matches = index.search(vectors, 10)
+        matches = index.search(vectors, 10, exact=True)
         assert len(matches) == batch_size
 
+        matches_keys = [match[0].key for match in matches] if batch_size > 1 else [matches[0].key]
+        assert all(matches_keys[i] == keys[i] for i in range(batch_size)), f"Received {matches_keys}"
+
 
+# Just one size for Cppyy to avoid redefining kernels in the global namespace
 @pytest.mark.parametrize("ndim", dimensions[-1:])
 @pytest.mark.parametrize("batch_size", batch_sizes[-1:])
 def test_index_cppyy(ndim: int, batch_size: int):
@@ -89,6 +88,7 @@ def test_index_cppyy(ndim: int, batch_size: int):
         import cppyy
         import cppyy.ll
     except ImportError:
+        pytest.skip("cppyy is not installed.")
         return
 
     cppyy.cppdef(
@@ -107,13 +107,6 @@ def test_index_cppyy(ndim: int, batch_size: int):
             result += a[i] * b[i];
         return 1 - result;
     }
-    
-    float inner_product_four_args(float *a, size_t an, float *b, size_t) {
-        float result = 0;
-        for (size_t i = 0; i != an; ++i)
-            result += a[i] * b[i];
-        return 1 - result;
-    }
     """.replace(
             "ndim", str(ndim)
         )
@@ -122,12 +115,10 @@ def test_index_cppyy(ndim: int, batch_size: int):
     functions = [
         cppyy.gbl.inner_product_two_args,
         cppyy.gbl.inner_product_three_args,
-        # cppyy.gbl.inner_product_four_args,
     ]
     signatures = [
         MetricSignature.ArrayArray,
         MetricSignature.ArrayArraySize,
-        # MetricSignature.ArraySizeArraySize,
     ]
     for function, signature in zip(functions, signatures):
         metric = CompiledMetric(
@@ -135,15 +126,18 @@ def test_index_cppyy(ndim: int, batch_size: int):
             kind=MetricKind.IP,
             signature=signature,
         )
-        index = Index(ndim=ndim, metric=metric)
+        index = Index(ndim=ndim, metric=metric, dtype=np.float32)
 
         keys = np.arange(batch_size)
-        vectors = random_vectors(count=batch_size, ndim=ndim)
+        vectors = random_vectors(count=batch_size, ndim=ndim, dtype=np.float32)
 
         index.add(keys, vectors)
-        matches = index.search(vectors, 10)
+        matches = index.search(vectors, 10, exact=True)
         assert len(matches) == batch_size
 
+        matches_keys = [match[0].key for match in matches] if batch_size > 1 else [matches[0].key]
+        assert all(matches_keys[i] == keys[i] for i in range(batch_size)), f"Received {matches_keys}"
+
 
 @pytest.mark.parametrize("ndim", [8])
 @pytest.mark.parametrize("batch_size", batch_sizes)
@@ -173,14 +167,13 @@ def test_index_peachpy(ndim: int, batch_size: int):
             RETURN,
         )
     except ImportError:
+        pytest.skip("PeachPy is not installed.")
         return
 
     a = Argument(ptr(const_float_), name="a")
     b = Argument(ptr(const_float_), name="b")
 
-    with Function(
-        "InnerProduct", (a, b), float_, target=uarch.default + isa.avx + isa.avx2
-    ) as asm_function:
+    with Function("InnerProduct", (a, b), float_, target=uarch.default + isa.avx + isa.avx2) as asm_function:
         # Request two 64-bit general-purpose registers for addresses
         reg_a, reg_b = GeneralPurposeRegister64(), GeneralPurposeRegister64()
         LOAD.ARGUMENT(reg_a, a)
@@ -220,12 +213,14 @@ def test_index_peachpy(ndim: int, batch_size: int):
         kind=MetricKind.IP,
         signature=MetricSignature.ArrayArray,
     )
-    index = Index(ndim=ndim, metric=metric)
+    index = Index(ndim=ndim, metric=metric, dtype=np.float32)
 
     keys = np.arange(batch_size)
     vectors = random_vectors(count=batch_size, ndim=ndim)
 
     index.add(keys, vectors)
-    matches, distances, count = index.search(vectors, 10)
-    assert matches.shape[0] == distances.shape[0]
-    assert count.shape[0] == batch_size
+    matches = index.search(vectors, 10, exact=True)
+    assert len(matches) == batch_size
+
+    matches_keys = [match[0].key for match in matches] if batch_size > 1 else [matches[0].key]
+    assert all(matches_keys[i] == keys[i] for i in range(batch_size)), f"Received {matches_keys}"
diff --git a/python/scripts/test_sqlite.py b/python/scripts/test_sqlite.py
index faf147d1..8ecb5dcc 100644
--- a/python/scripts/test_sqlite.py
+++ b/python/scripts/test_sqlite.py
@@ -8,8 +8,10 @@
 
 import usearch
 
-if sys.platform != "linux":
-    pytest.skip(reason="Requires Linux to run", allow_module_level=True)
+
+found_sqlite_path = usearch.sqlite
+if found_sqlite_path is None:
+    pytest.skip(reason="Can't find an SQLite installation", allow_module_level=True)
 
 
 batch_sizes = [1, 3, 20]
@@ -19,9 +21,16 @@
 def test_sqlite_minimal_json_cosine_vector_search():
     """Minimal test for searching JSON vectors in an SQLite database."""
     conn = sqlite3.connect(":memory:")
-    conn.enable_load_extension(True)  # Not available on MacOS with default build
-    conn.load_extension(usearch.sqlite)
 
+    # Loading extensions isn't supported in some SQLite builds,
+    # including the default one on MacOS
+    try:
+        conn.enable_load_extension(True)
+    except AttributeError:
+        pytest.skip("SQLite extensions are not available on this platform")
+        return
+
+    conn.load_extension(usearch.sqlite)
     cursor = conn.cursor()
 
     # Create a table with a JSON column for vectors
@@ -54,18 +63,23 @@ def test_sqlite_minimal_json_cosine_vector_search():
 def test_sqlite_minimal_text_search():
     """Minimal test for Unicode strings in an SQLite database."""
     conn = sqlite3.connect(":memory:")
-    conn.enable_load_extension(True)  # Not available on MacOS with default build
-    conn.load_extension(usearch.sqlite)
 
+    # Loading extensions isn't supported in some SQLite builds,
+    # including the default one on MacOS
+    try:
+        conn.enable_load_extension(True)
+    except AttributeError:
+        pytest.skip("SQLite extensions are not available on this platform")
+        return
+
+    conn.load_extension(usearch.sqlite)
     cursor = conn.cursor()
 
     # Create a table with a TEXT column for strings
     str42 = "école"  # 6 codepoints (runes), 7 bytes
     str43 = "école"  # 5 codepoints (runes), 6 bytes
     str44 = "écolé"  # 5 codepoints (runes), 7 bytes
-    assert (
-        str42 != str43
-    ), "etter 'é' as a single character vs 'e' + '´' are not the same"
+    assert str42 != str43, "etter 'é' as a single character vs 'e' + '´' are not the same"
 
     # Inject the different strings into the table
     cursor.executescript(
@@ -105,9 +119,16 @@ def test_sqlite_blob_bits_vector_search():
     """Minimal test for searching binary vectors in an SQLite database."""
 
     conn = sqlite3.connect(":memory:")
-    conn.enable_load_extension(True)
-    conn.load_extension(usearch.sqlite)
 
+    # Loading extensions isn't supported in some SQLite builds,
+    # including the default one on MacOS
+    try:
+        conn.enable_load_extension(True)
+    except AttributeError:
+        pytest.skip("SQLite extensions are not available on this platform")
+        return
+
+    conn.load_extension(usearch.sqlite)
     cursor = conn.cursor()
 
     # Create a table with a BLOB column for binary vectors
@@ -161,9 +182,16 @@ def test_sqlite_distances_in_high_dimensions(num_vectors: int, ndim: int):
     """
 
     conn = sqlite3.connect(":memory:")
-    conn.enable_load_extension(True)
-    conn.load_extension(usearch.sqlite)
 
+    # Loading extensions isn't supported in some SQLite builds,
+    # including the default one on MacOS
+    try:
+        conn.enable_load_extension(True)
+    except AttributeError:
+        pytest.skip("SQLite extensions are not available on this platform")
+        return
+
+    conn.load_extension(usearch.sqlite)
     cursor = conn.cursor()
 
     # Create a table with additional columns for f32 and f16 BLOBs
@@ -230,9 +258,16 @@ def test_sqlite_distances_in_low_dimensions(num_vectors: int):
 
     # Setup SQLite connection and enable extensions
     conn = sqlite3.connect(":memory:")
-    conn.enable_load_extension(True)
-    conn.load_extension(usearch.sqlite)
 
+    # Loading extensions isn't supported in some SQLite builds,
+    # including the default one on MacOS
+    try:
+        conn.enable_load_extension(True)
+    except AttributeError:
+        pytest.skip("SQLite extensions are not available on this platform")
+        return
+
+    conn.load_extension(usearch.sqlite)
     cursor = conn.cursor()
 
     # Create a table for storing vectors and their descriptions
@@ -280,12 +315,8 @@ def test_sqlite_distances_in_low_dimensions(num_vectors: int):
 
     # Validate the results of the distance computations
     for id1, id2, similarity_f32, similarity_f16, haversine_meters in cursor.fetchall():
-        assert (
-            0 <= similarity_f32 <= 1
-        ), "Cosine similarity (f32) must be between 0 and 1"
-        assert (
-            0 <= similarity_f16 <= 1
-        ), "Cosine similarity (f16) must be between 0 and 1"
+        assert 0 <= similarity_f32 <= 1, "Cosine similarity (f32) must be between 0 and 1"
+        assert 0 <= similarity_f16 <= 1, "Cosine similarity (f16) must be between 0 and 1"
         assert haversine_meters >= 0, "Haversine distance must be non-negative"
 
     # Clean up