Skip to main content

A fast Connect-4 Solver for Python & C++

Project description

BitBully: A fast and perfect-playing Connect-4 Agent for Python 3 & C/C++

bitbully-logo-full


GitHub Repo stars GitHub forks Python Python Python Docs pre-commit PyPI - Version PyPI - Downloads PyPI - License Coveralls Wheels Doxygen Doxygen Buy Me a Coffee

BitBully is a high-performance Connect-4 solver built using C++ and Python bindings, leveraging advanced algorithms and optimized bitwise operations. It provides tools for solving and analyzing Connect-4 games efficiently, designed for both developers and researchers.

Table of Contents


Features

  • Fast Solver: Implements MTD(f) and null-window search algorithms for Connect-4.
  • Bitboard Representation: Efficiently manages board states using bitwise operations.
  • Advanced Features: Includes transposition tables, threat detection, and move prioritization.
  • Python Bindings: Exposes core functionality through the bitbully_core Python module using pybind11.
  • Cross-Platform: Build and run on Linux, Windows, and macOS.
  • Open-Source: Fully accessible codebase for learning and contribution.

Installation

Prerequisites

  • Python: Version 3.10 or higher, PyPy 3.10 or higher

Build and Install

From PyPI (Recommended)

The easiest way to install the BitBully package is via PyPI:

pip install bitbully

This will automatically download and install the pre-built package, including the Python bindings.


Python API Docs

Please refer to the docs here: https://markusthill.github.io/BitBully/.

The docs for the opening databases can be found here: https://markusthill.github.io/bitbully-databases/


Usage

Start with a simple Widget on Colab

Open In Colab

BitBully Lib (recommended)

tbd

BitBully Core (advanced)

Use the BitBullyCore and BoardCore classes directly in Python:

BoardCore Examples

The low-level BoardCore API gives you full control over Connect-4 positions: you can play moves, generate random boards, mirror positions, and query win conditions or hashes.

Create and Print a Board
import bitbully.bitbully_core as bbc

board = bbc.BoardCore()
print(board)          # Human-readable 7x6 board
print(board.movesLeft())   # 42 on an empty board
print(board.countTokens()) # 0 on an empty board

Play Moves and Check for Winning Positions
import bitbully.bitbully_core as bbc

board = bbc.BoardCore()

# Play a small sequence of moves (columns 0–6)
for col in [3, 2, 3, 2, 3, 4, 3]:
    assert board.play(col)

print(board)

# Check if the side to move has an immediate winning move
print(board.canWin())      # False
print(board.hasWin())      # True, since the last move created 4-in-a-row

You can also check if a specific column is a winning move:

board = bbc.BoardCore()
board.setBoard([3, 3, 3, 3, 2, 2, 4, 4])

print(board.canWin())  # True
print(board.canWin(1))  # True  – playing in column 1 wins
print(board.canWin(3))  # False – no win in column 3

Set a Board from a Move List or Array
import bitbully.bitbully_core as bbc

board = bbc.BoardCore()

# From a move sequence (recommended)
assert board.setBoard([0, 1, 2, 3, 3, 2, 1, 0])

# Convert to 7x6 array (columns × rows)
array = board.toArray()
print(len(array), len(array[0]))  # 7 x 6

# From a 7x6 array of tokens (1 = Yellow, 2 = Red)
array_board = [[0 for _ in range(6)] for _ in range(7)]
array_board[3][0] = 1  # Yellow in center column bottom row
b2 = bbc.BoardCore()
assert b2.setBoard(array_board)

Generate Random Boards
import bitbully.bitbully_core as bbc

board, moves = bbc.BoardCore.randomBoard(10, True)

print(board)   # Random, valid board
print(moves)   # List of 10 column indices
print(board.canWin())  # Usually False for random boards in this setup

Mirroring Boards and Symmetry
import bitbully.bitbully_core as bbc

board = bbc.BoardCore()
board.setBoard([0, 1, 2])      # Left side

mirrored = board.mirror()      # Mirror around center column
print(board)
print(mirrored)

# Double-mirroring returns the original position
assert board == mirrored.mirror()

Hashing, Equality, and Copies
import bitbully.bitbully_core as bbc

b1 = bbc.BoardCore()
b2 = bbc.BoardCore()

moves = [0, 1, 2, 3]
for m in moves:
    b1.play(m)
    b2.play(m)

assert b1 == b2
assert b1.hash() == b2.hash()
assert b1.uid() == b2.uid()

# Copying a board
b3 = b1.copy()           # or bbc.BoardCore(b1)
assert b3 == b1

b3.play(4)               # Modify the copy
assert b3 != b1
assert b3.hash() != b1.hash()

These examples are based on the internal test suite and show typical ways of interacting with BoardCore programmatically.

BitBullyCore: Connect-4 Solver Examples

The BitBullyCore module provides a high-performance Connect-4 solver written in C++ and exposed to Python. You can evaluate positions, score all legal moves, or run the full MTD(f) search.


Solve a Position with MTD(f)
import bitbully.bitbully_core as bbc

# Construct a position: alternate moves into the center column
board = bbc.BoardCore()
for _ in range(6):
    board.play(3)  # Column 3

solver = bbc.BitBullyCore()
score = solver.mtdf(board, first_guess=0)

print("Best score:", score)

mtdf returns an integer score from the perspective of the side to move (positive = winning, negative = losing).


Score All Moves in a Position

scoreMoves(board) returns a list of 7 integers: the evaluated score for playing in each column (0–6). Illegal moves (full columns) are still included in the list.

import bitbully.bitbully_core as bbc

board = bbc.BoardCore()
board.setBoard([3, 4, 1, 1, 0, 2, 2, 2])

solver = bbc.BitBullyCore()
scores = solver.scoreMoves(board)

print("Move scores:", scores)
# Example output:
# [-3, -3, 1, -4, 3, -2, -2]

Using the Solver in a Loop (Move Selection)
import bitbully.bitbully_core as bbc
import time

board = bbc.BoardCore()
solver = bbc.BitBullyCore()

for move in [3, 4, 1, 1, 0, 2, 2, 2]:  # Example opening
    board.play(move)

start = time.perf_counter()
scores = solver.scoreMoves(board)
best_move = max(range(7), key=lambda c: scores[c])
print(f"Time: {round(time.perf_counter() - start, 2)} seconds!")
print("Scores:", scores)
print("Best move suggestion:", best_move)
# best move is into column 4

Further Examples using the BitBully Solver

You can initialize a board using an array with shape (7, 6) (columns first) and solve it:

from bitbully import bitbully_core

# Define a Connect-4 board as an array (7 columns x 6 rows)
# You may also define the board using a numpy array if numpy is installed
# 0 = Empty, 1 = Yellow, 2 = Red
# Here, the left column represents the bottom row of the board
board_array = [
    [0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0],
    [1, 2, 1, 2, 1, 0],
    [0, 0, 0, 0, 0, 0],
    [2, 1, 2, 0, 0, 0],
    [0, 0, 0, 0, 0, 0]
]

# Convert the array to the BoardCore board
board = bitbully_core.BoardCore()
assert board.setBoard(board_array), "Invalid board!"

print(board)

# Solve the position
solver = bitbully_core.BitBullyCore()
score = solver.mtdf(board, first_guess=0)
print(f"Best score for the current board: {score}") # expected score: 1

Run the Bitbully solver with an opening book (here: 12-ply opening book with winning distances):

from bitbully import bitbully_core as bbc
import bitbully_databases as bbd
import importlib.resources

db_path = bbd.BitBullyDatabases.get_database_path("12-ply-dist")
bitbully = bbc.BitBullyCore(db_path)
b = bbc.BoardCore()  # Empty board
bitbully.scoreMoves(b)  # expected result: [-2, -1, 0, 1, 0, -1, -2]

Further Usage Examples for BitBully Core

Create all Positions with (up to) n tokens starting from Board b:

from bitbully import bitbully_core as bbc

b = bbc.BoardCore()  # empty board
board_list_3ply = b.allPositions(3, True)  # All positions with exactly 3 tokens
len(board_list_3ply)  # should be 238 according to https://oeis.org/A212693

Opening Book Examples

BitBully Databases provide fast lookup tables (opening books) for Connect-4, allowing you to query evaluated positions, check if a board is known, and retrieve win/loss/distance values.

Load an Opening Book
import bitbully_databases as bbd
import bitbully.bitbully_core as bbc

# Load the 8-ply opening book (no distances)
db_path = bbd.BitBullyDatabases.get_database_path("8-ply")
book = bbc.OpeningBookCore(db_path, is_8ply=True, with_distances=False)

print(book.getBookSize())  # e.g., 34515
print(book.getNPly())      # -> 8

Accessing Entries

Each entry consists of (key, value) where:

  • key is the Huffman-encoded board state
  • value is the evaluation (win/loss/draw or distance)
k, v = book.getEntry(0)
print(k, v)

Evaluating a Board Position
import bitbully.bitbully_core as bbc

board = bbc.BoardCore()
board.setBoard([2, 3, 3, 3, 3, 3, 5, 5])  # Sequence of column moves

value = book.getBoardValue(board)
print("Evaluation:", value)

Check Whether a Position Is in the Opening Book

The books only contain one variant for mirror-symmetric positions:

board = bbc.BoardCore()
board.setBoard([1, 3, 4, 3, 4, 4, 3, 3])

print(book.isInBook(board))              # e.g., False
print(book.isInBook(board.mirror()))     # e.g., True, checks symmetric position

Advanced Build and Install

Prerequisites

  • Python: Version 3.10 or higher
  • CMake: Version 3.15 or higher
  • C++ Compiler: A compiler supporting C++-17 (e.g., GCC, Clang, MSVC)
  • Python Development Headers: Required for building the Python bindings

From Source

  1. Clone the repository:

    git clone https://github.com/MarkusThill/BitBully.git
    cd BitBully
    git submodule update --init --recursive # – Initialize and update submodules.
    
  2. Build and install the Python package:

    pip install .
    

Building Static Library with CMake

  1. Create a build directory and configure the project:

    mkdir build && cd build
    cmake .. -DCMAKE_BUILD_TYPE=Release
    
  2. Build the a static library:

    cmake --build . --target cppBitBully
    

Contributing & Development

Whether you're fixing a bug, optimizing performance, or extending BitBully with new features, contributions are highly appreciated. The full development guide provides everything you need to work on the project efficiently:

📘 Complete Development Documentation https://markusthill.github.io/BitBully/develop/

It covers all essential workflows, including:

  • Repository setup: cloning, submodules, virtual environments
  • Development environment: installing dev dependencies, using editable mode
  • Code quality tools: ruff, mypy/pyrefly, clang-format, pre-commit, commitizen
  • Building the project: local wheels, CMake, cibuildwheel, sdist
  • Testing: running pytest, filtering tests, coverage, CI integration
  • Release workflow: semantic versioning, version bumping, tagging, PyPI/TestPyPI publishing
  • Debugging & tooling: GDB, Doxygen, mkdocs, stub generation for pybind11
  • Platform notes: Debian/Linux setup, gcov matching, MSVC quirks
  • Cheatsheets: Git, submodules, CMake, Docker, Ruby/Jekyll, npm, environment management

If you're contributing code, please:

  1. Follow the coding standards and formatting tools (ruff, mypy, clang-format).
  2. Install and run pre-commit hooks before committing.
  3. Write or update tests for all behavioral changes.
  4. Use Commitizen for semantic commit messages and versioning.
  5. Open an issue or discussion for major changes.

Pull requests are welcome — thank you for helping improve BitBully! 🚀


License

This project is licensed under the AGPL-3.0 license.


Contact

If you have any questions or feedback, feel free to reach out:


Acknowledgments

Many of the concepts and techniques used in this project are inspired by the outstanding Connect-4 solvers developed by Pascal Pons and John Tromp. Their work has been invaluable in shaping this effort:


Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bitbully-0.0.69.tar.gz (8.1 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

bitbully-0.0.69-pp311-pypy311_pp73-win_amd64.whl (465.4 kB view details)

Uploaded PyPyWindows x86-64

bitbully-0.0.69-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (341.7 kB view details)

Uploaded PyPymanylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

bitbully-0.0.69-pp311-pypy311_pp73-macosx_11_0_arm64.whl (237.7 kB view details)

Uploaded PyPymacOS 11.0+ ARM64

bitbully-0.0.69-pp310-pypy310_pp73-win_amd64.whl (463.9 kB view details)

Uploaded PyPyWindows x86-64

bitbully-0.0.69-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (340.3 kB view details)

Uploaded PyPymanylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

bitbully-0.0.69-pp310-pypy310_pp73-macosx_11_0_arm64.whl (236.5 kB view details)

Uploaded PyPymacOS 11.0+ ARM64

bitbully-0.0.69-cp313-cp313-win_amd64.whl (466.8 kB view details)

Uploaded CPython 3.13Windows x86-64

bitbully-0.0.69-cp313-cp313-musllinux_1_2_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

bitbully-0.0.69-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (344.0 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

bitbully-0.0.69-cp313-cp313-macosx_11_0_arm64.whl (238.2 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

bitbully-0.0.69-cp312-cp312-win_amd64.whl (466.8 kB view details)

Uploaded CPython 3.12Windows x86-64

bitbully-0.0.69-cp312-cp312-musllinux_1_2_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

bitbully-0.0.69-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (344.3 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

bitbully-0.0.69-cp312-cp312-macosx_11_0_arm64.whl (238.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

bitbully-0.0.69-cp311-cp311-win_amd64.whl (465.9 kB view details)

Uploaded CPython 3.11Windows x86-64

bitbully-0.0.69-cp311-cp311-musllinux_1_2_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

bitbully-0.0.69-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (341.8 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

bitbully-0.0.69-cp311-cp311-macosx_11_0_arm64.whl (237.5 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

bitbully-0.0.69-cp310-cp310-win_amd64.whl (464.7 kB view details)

Uploaded CPython 3.10Windows x86-64

bitbully-0.0.69-cp310-cp310-musllinux_1_2_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

bitbully-0.0.69-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (340.4 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

bitbully-0.0.69-cp310-cp310-macosx_11_0_arm64.whl (236.4 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file bitbully-0.0.69.tar.gz.

File metadata

  • Download URL: bitbully-0.0.69.tar.gz
  • Upload date:
  • Size: 8.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for bitbully-0.0.69.tar.gz
Algorithm Hash digest
SHA256 09f46be0ff73ada2e94f226e27ef176ccf4ca98d6116cc2eef7d00ffd26ac7a5
MD5 954d1e6cd8d6b72ef9fdb07324fb822c
BLAKE2b-256 c5f0f0ed3b6e7d489c7a96a1b4eef1487e68405024f013181e2e94ae46605365

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69.tar.gz:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.69-pp311-pypy311_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.69-pp311-pypy311_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 04608ae788accc6748c07824d10cffe0400018f4563abdc1e508893bb77eb015
MD5 bd7bcd3ba7ca08fe5a734e01c6827dff
BLAKE2b-256 c238f0f05659efca8e1d9720f732fc94294ee194bf5b5a78d62fef2135496cd6

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69-pp311-pypy311_pp73-win_amd64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.69-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.69-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 37d6788e5f7fcdc0a72720e54c461a5b6e05ec530bb6b480adc750e7eace9332
MD5 ef753367506e85a3cbfd34ceaf6f453a
BLAKE2b-256 c7b3c821aecc9621fd093d5f4182df6aff9669c13322a96f5604e77ada8d5be6

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.69-pp311-pypy311_pp73-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.69-pp311-pypy311_pp73-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 31f83068fed07c8e178b06e5d39742fd292cb14c378dccf988e787220730ba37
MD5 fd853b136b2d5cdf15c050164846d462
BLAKE2b-256 7ec93cd7951679a4f7648c8874c89c02ebdb2f35a06eafc7d33bf5527309b683

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69-pp311-pypy311_pp73-macosx_11_0_arm64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.69-pp310-pypy310_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.69-pp310-pypy310_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 d616ab2f1ba3e055ea3b34b557ecf6a4768b223b91a185f2143007d22324acdb
MD5 39b1f92832bb1cf3498b4a8e6ad58d8c
BLAKE2b-256 53721acbc952eb30d9ebb9d29a3e69c30e016d00330df9da0fd64196203ff5f1

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69-pp310-pypy310_pp73-win_amd64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.69-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.69-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4e3da88beaa3714fcf74cc3430d534363d33758bef03e799908181a7d8e9ff4e
MD5 770072b3b9d62a8a74bf9bf16eda9c97
BLAKE2b-256 7a63fc6b889ecd32ba3a018513847e03b933fb45a3378d4ac3c8f1d977af38a3

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.69-pp310-pypy310_pp73-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.69-pp310-pypy310_pp73-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dc81aa9fb4f2c82e7becbb6ed7d62922b9f6008a7128eae769ed3a6603d80531
MD5 8dddd02d7d9069f681f5c271298e3a4b
BLAKE2b-256 5d63880756367c98f3ee4201653d6f28fb44bd13d69e191e73edede6270b8691

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69-pp310-pypy310_pp73-macosx_11_0_arm64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.69-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: bitbully-0.0.69-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 466.8 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for bitbully-0.0.69-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 1fcc3b5ab6a6a2b1ff615da8b485b5d61542197fc4a844bbd1067ef848b7f4a5
MD5 562e48433eac16f37640c7864ae278e6
BLAKE2b-256 349cc588dd2a4f390d5651c7114b834a90bd6a4561f750102d16123138e34179

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69-cp313-cp313-win_amd64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.69-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.69-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6b40973db41c57ea4c7a4b35d08fcb78255304a10dde171ee384b5608a494333
MD5 fa8767978cff6b38c154421c8fc4076f
BLAKE2b-256 30ffe86692171a573e49477cf1a6866ef72a1bf74e758297b80f23d382930bb9

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69-cp313-cp313-musllinux_1_2_x86_64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.69-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.69-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2bbd3e469fb232414ed2321e3b7f1022cb224fccd421912c7ad02134a5e059a6
MD5 72842b57e757f5e8771e9bc9a43a93e8
BLAKE2b-256 40506d5bbdd5aa7afe9dea5781d75bc24d98861335026732b5d8802348587a8a

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.69-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.69-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6ae45bf0e88a0ad8c4f0abc9217b67b83a4128f49524cd60903f38410275f0b9
MD5 7d56b6133f935285c8413451d774c333
BLAKE2b-256 e8a0f33b19797807be43f68c048216d65974b7e7cfc351c3c56b44e7a4ec43f6

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.69-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: bitbully-0.0.69-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 466.8 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for bitbully-0.0.69-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 7e6c1d73e64dffbb6939f5566414e7a1564d6a8389128c821f4ffbf010b24a53
MD5 c5d1a35d9d336a1722a15b7dfcd7aae6
BLAKE2b-256 cf1e91dbf8ae5f2d05b9fbcdef36eb86ceee5eba68d8ce6c68e77ed7385214d3

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69-cp312-cp312-win_amd64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.69-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.69-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3b232db3daf48c51f849203a4d627a5a54b1f3cd4b7fdaff4e069864e91b7c93
MD5 77b5b6e27f4305320bdc43c3594ba496
BLAKE2b-256 736a46aab351f47ec3793e1acb1bd3885f01671d202bff6b47d3d6c5b2038693

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69-cp312-cp312-musllinux_1_2_x86_64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.69-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.69-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 453ac929dfd8187c87edc4002c6e4a582a8d2880b874942c2af9a8718587af68
MD5 528a185474567d73e265c9f9e09037c2
BLAKE2b-256 48fd9a40968592d841e8cad3dffa00f3274290100c32b1d58094349c7d63f2d3

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.69-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.69-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 779ed12d2eb3273ef267318fdfdc8a7ae45c9ba5ae6cd23aa7fbae2b5f61363e
MD5 58d2383c542eaed691516f6e13161ceb
BLAKE2b-256 5bd57b4035addc6ecff6686348777eccb35692b164df68f606cc111acc4fd802

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.69-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: bitbully-0.0.69-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 465.9 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for bitbully-0.0.69-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 9aa5d949e88fd98a75bb35c0efd8d1e82052545cb3a6c496b03e942091b829f7
MD5 b94076469b1430367b3f10db601beaf0
BLAKE2b-256 3104e6d092244c0e5c4697c42e696e5cae3dfdb884d64f4833c066da238298ce

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69-cp311-cp311-win_amd64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.69-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.69-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 60a1b0f5a21163fce45329ae7413f824bff20f0c6a41a9fd07740c4c7556ec61
MD5 d398d7e8ce106eb098fa624ed764e356
BLAKE2b-256 96065bd5bd6215d85747bfdad949f93c780169b92a07e66f5516fee9aef368c6

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69-cp311-cp311-musllinux_1_2_x86_64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.69-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.69-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6d1172e5c147e572baaf7a0d817879cc0e1825588f3254464224fb7313d5104c
MD5 a205411c4f9f61046d0681e057357a7f
BLAKE2b-256 1826e9154ce202950e075caad718e0f4b9d0d80daf2681d3f353ccf3e39550ce

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.69-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.69-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ed319a5af08dee18bad4658cb363b32297882d5ec3bd1662c09f0f51b94d0dd8
MD5 d307ff53a17b0821de6afe65775b4ac0
BLAKE2b-256 25f24949a336ff33495d50d6476e3bb1e5f28d6521b006de7f04d785738f3275

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.69-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: bitbully-0.0.69-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 464.7 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for bitbully-0.0.69-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 ea7e01633a10a80b9d6cef1f799c9595b7c261e3a61ac2280f74f79dc3a9bce2
MD5 5cc56bcf2b25dc6d0932e580850cd269
BLAKE2b-256 28e8c692ff5715a70583fbcc761746b80150bbded77186ea351e975185ac638b

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69-cp310-cp310-win_amd64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.69-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.69-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ba995d0ce95075a987e668bd41379424bab40f6ddb72a1c350e2df667fa567bc
MD5 7f9993e303f1f7da271fd979535fd73a
BLAKE2b-256 91d31d76b0596857e156a4379a3a149f21d38dcec4c7f21e6c80276bd775cb6e

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69-cp310-cp310-musllinux_1_2_x86_64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.69-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.69-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5eec3fc8f1acfba31073b8893a140f3c1301d8d55130bb1b83acb70a1d49d433
MD5 5403373daaaabb889e5f25d1777f0d9e
BLAKE2b-256 e6928faac92ae16d81ed4f961b73926cfcd3d9c2eb92fb789ee2ec493e595c81

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbully-0.0.69-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bitbully-0.0.69-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0f128a38b0afd8de99f965f686ee086b7f06192b36a025da72ef6ca0a43aba92
MD5 056af93ba1eaff6eb9d6638f11659d8e
BLAKE2b-256 97fc28bc47ef0a3ce5db2fd68cb038cc8c6fa6bb3dd25646ea7013505b281609

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbully-0.0.69-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: wheels.yml on MarkusThill/BitBully

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page