Skip to main content

brinicle is a C++ vector index engine (ANN library) optimized for disk-first, low-RAM similarity search.

Project description

Version 0.0.8 Python 3.12.x Apache-2.0 License

brinicle

brinicle is a disk-first HNSW retrieval engine for vector search, structured item search, hybrid search, and autocomplete. It gives you a simple Python API for building search over embeddings, product catalogs, structured records, and query suggestions without running a heavy search database.

On 1.2 Million Amazon products, brinicle achieved 0.773ms p99 latency and 1,731 MB peak search memory, the lowest among brinicle, Meilisearch, OpenSearch, Typesense, and Weaviate. It also achieved the best Hit@1 and nDCG@10 in that benchmark.

pip install brinicle
import numpy as np
import brinicle

D = 384
n = 1000

X = np.random.randn(n, D).astype(np.float32)
q = np.random.randn(D).astype(np.float32)

engine = brinicle.VectorEngine("vector_index", dim=D)

engine.init(mode="build")

for i in range(n):
    engine.ingest(str(i), X[i])

engine.finalize()

print(engine.search(q, k=10))
["42", "318", "7", "901", "114", "68", "529", "203", "771", "16"]

Benchmark

brinicle has two public benchmark suites:

  • Vector search benchmark: compares brinicle with Chroma, Weaviate, Milvus, Qdrant, FAISS, and hnswlib on vector search workloads.
  • Hybrid search benchmark: compares brinicle with Meilisearch, OpenSearch, Typesense, and Weaviate on hybrid product search over Amazon ESCI and WANDS.

In a 256MB RAM / 1 CPU container using MNIST 60K vectors:

System Outcome
brinicle PASS
chroma PASS
qdrant OOMKilled
weaviate OOMKilled
milvus OOMKilled

On SIFT 1M vectors, using the same in-process deployment model as FAISS and hnswlib:

System Build (s) Recall@10 Avg latency (ms) QPS
faiss 237.282 0.96999 0.092 10857.43
hnswlib 241.301 0.96364 0.093 10711.86
brinicle 243.75 0.96989 0.103 9730.65

In this benchmark suite, brinicle stays close to FAISS and hnswlib latency while using a disk-backed index design.

Memory usage comparison


Install

Install from PyPI:

pip install brinicle

Or build from source:

git clone https://github.com/bicardinal/brinicle.git
cd brinicle
pip install -e .

Engines

brinicle exposes three high-level engines with the same lifecycle:

engine.init(...)
engine.ingest(...)
engine.finalize()
engine.search(...)
Engine Use case Input
VectorEngine Raw ANN vector search float32 vectors
ItemSearchEngine Lexical, semantic, and hybrid item search title, category, subcategory, attributes, optional vectors
AutocompleteEngine Query/title suggestions suggestion text

All engines support the same operational model:

Operation VectorEngine ItemSearchEngine AutocompleteEngine
Build Yes Yes Yes
Insert Yes Yes Yes
Upsert Yes Yes Yes
Delete Yes Yes Yes
Search Yes Yes Yes
Batch search Yes Yes Yes
Search with distance Yes Yes Yes
Compact rebuild Yes Yes Yes
Graph optimization Yes Yes Yes

Features

  • Disk-first HNSW search
  • Low-RAM indexing and querying
  • Streaming-first ingest: one vector, item, or suggestion at a time
  • Raw vector search through VectorEngine
  • Structured item search through ItemSearchEngine
  • Lexical, semantic, and hybrid item search through one HNSW index
  • Alpha-controlled item search: lexical-only, semantic-only, or hybrid
  • Autocomplete and query suggestion search through AutocompleteEngine
  • Insert, upsert, delete, compact rebuild, and graph optimization
  • Simple Python API backed by a C++ search core

Core lifecycle

brinicle uses the same lifecycle across all engines.

Build a new index:

engine.init(mode="build")

for record in records:
    engine.ingest(...)

engine.finalize()

Insert new records into an existing index:

engine.init(mode="insert")

for record in new_records:
    engine.ingest(...)

engine.finalize()

Upsert records by external id:

engine.init(mode="upsert")

for record in updated_records:
    engine.ingest(...)

engine.finalize()

Search after the index is finalized:

results = engine.search(query, k=10)

Delete records by external id:

deleted_count, not_found = engine.delete_items(
    ["id1", "id2", "missing-id"],
    return_not_found=True,
)

Compact and rebuild the index when needed:

if engine.needs_rebuild():
    engine.rebuild_compact()

Optimize graph layout:

engine.optimize_graph()

Vector search

Use VectorEngine for vector search.

import numpy as np
import brinicle

D = 384
n = 1000

X = np.random.randn(n, D).astype(np.float32)
q = np.random.randn(D).astype(np.float32)

engine = brinicle.VectorEngine(
    "vector_index",
    dim=D,
)

engine.init(mode="build")

for i in range(n):
    engine.ingest(str(i), X[i])

engine.finalize()

results = engine.search(q, k=10)

print(results)

search(...) returns external ids:

["42", "318", "7", "901", "114", "68", "529", "203", "771", "16"]

To return distances too:

results = engine.search_with_distance(q, k=10)

print(results)

Example output:

[
    ("42", 0.1842),
    ("318", 0.2075),
    ("7", 0.2198),
]

To run batch search:

Q = np.random.randn(32, D).astype(np.float32)

results = engine.search_batch(
    Q,
    k=10,
    n_jobs=4,
)

print(results)

Vector insert

Use insert mode to add new vectors to an existing index.

Y = np.random.randn(5, D).astype(np.float32)

engine.init(mode="insert")

for i in range(5):
    engine.ingest(f"new-{i}", Y[i])

engine.finalize()

print(engine.search(q, k=10))

Vector upsert

Use upsert mode to replace existing records or insert them if they do not exist.

Y = np.random.randn(5, D).astype(np.float32)

engine.init(mode="upsert")

for i in range(5):
    engine.ingest(str(i), Y[i])

engine.finalize()

print(engine.search(q, k=10))

Vector delete

Delete records by external id:

deleted_count, not_found = engine.delete_items(
    ["1", "4", "missing"],
    return_not_found=True,
)

print(deleted_count)
print(not_found)

Vector rebuild and optimize

After many inserts, upserts, or deletes, the index may need a compact rebuild.

if engine.needs_rebuild():
    engine.rebuild_compact(
        M=48,
        ef_construction=1024,
        ef_search=512,
        build_n_threads=4,
    )

You can also optimize the graph:

engine.optimize_graph()

Vector configuration

VectorEngine exposes common HNSW parameters:

engine = brinicle.VectorEngine(
    "vector_index",
    dim=384,
    M=48,
    ef_construction=1024,
    ef_search=512,
    delta_ratio=0.1,
)
Parameter Meaning
dim Vector dimensionality
M Maximum graph degree used by HNSW
ef_construction Construction-time search width
ef_search Query-time search width
build_n_threads Build n threads, higher, faster build
delta_ratio Delta segment ratio before rebuild is recommended

Item search

Use ItemSearchEngine for catalog-like records with titles, metadata, and optional semantic vectors.

Each item can contain:

  • title
  • category
  • subcategory
  • attributes
  • an optional semantic vector

Only title is required.

ItemSearchEngine supports three practical modes:

Mode How to use it
Lexical-only item search Use structured fields only and set alpha=0.0
Semantic-only item search Provide vectors and set alpha=1.0
Hybrid item search Provide structured fields and vectors, then use 0.0 < alpha < 1.0

brinicle does not build separate lexical and vector indexes for item search. Structured lexical signals and optional semantic vectors are encoded into one numeric representation and searched through the same HNSW graph.


Lexical item search

Use lexical item search when you want structured catalog search without external embeddings.

import brinicle

engine = brinicle.ItemSearchEngine(
    "item_index",
    dim=96,
    alpha=0.0,  # lexical-only
)

engine.init(mode="build")

engine.ingest(
    external_id="p1",
    title="Apple iPhone 15 Pro Max 256GB Natural Titanium",
    category="Electronics",
    subcategory="Smartphones",
    attributes={
        "brand": "Apple",
        "storage": "256GB",
        "color": "Natural Titanium",
    },
)

engine.ingest(
    external_id="p2",
    title="Samsung Galaxy S24 Ultra 512GB Black",
    category="Electronics",
    subcategory="Smartphones",
    attributes={
        "brand": "Samsung",
        "storage": "512GB",
        "color": "Black",
    },
)

engine.finalize()

print(engine.search("iphone 15 pro max", k=10))

Example output:

["p1", "p2"]

You can also pass query-side metadata:

results = engine.search(
    "iphone 15 pro max",
    category="Electronics",
    subcategory="Smartphones",
    attributes={
        "brand": "Apple",
        "storage": "256GB",
    },
    k=10,
)

Hybrid item search

Use hybrid item search when you want exact structured signals and semantic similarity in the same retrieval path.

import numpy as np
import brinicle

VECTOR_DIM = 384

engine = brinicle.ItemSearchEngine(
    "hybrid_item_index",
    dim=96,
    vector_dim=VECTOR_DIM,
    alpha=0.95,  # mostly semantic, with lexical correction
    vector_normalized=True,
    M=48,
    ef_construction=1024,
    ef_search=512,
)

engine.init(mode="build")

engine.ingest(
    external_id="p1",
    title="Apple iPhone 15 Pro Max 256GB Natural Titanium",
    category="Electronics",
    subcategory="Smartphones",
    attributes={
        "brand": "Apple",
        "storage": "256GB",
        "color": "Natural Titanium",
    },
    vector=np.random.randn(VECTOR_DIM).astype("float32"),
    normalize=True,
)

engine.ingest(
    external_id="p2",
    title="Samsung Galaxy S24 Ultra 512GB Black",
    category="Electronics",
    subcategory="Smartphones",
    attributes={
        "brand": "Samsung",
        "storage": "512GB",
        "color": "Black",
    },
    vector=np.random.randn(VECTOR_DIM).astype("float32"),
    normalize=True,
)

engine.finalize()

query_vector = np.random.randn(VECTOR_DIM).astype("float32")

results = engine.search(
    "iphone 15 pro max",
    category="Electronics",
    subcategory="Smartphones",
    attributes={
        "brand": "Apple",
    },
    vector=query_vector,
    normalize=True,
    k=10,
)

print(results)

Item batch search

ItemSearchEngine.search_batch(...) runs multiple independent item searches.

For text-only batch search:

queries = [
    "iphone 15 pro max",
    "samsung s24 ultra",
    "wireless mouse",
]

results = engine.search_batch(
    queries,
    k=10,
    n_jobs=4,
)

For batch search with per-query metadata:

queries = [
    "iphone 15 pro max",
    "running shoes size 42",
    "wireless mouse",
]

categories = [
    "Electronics",
    "Fashion",
    "Electronics",
]

subcategories = [
    "Smartphones",
    "Shoes",
    "Computer Accessories",
]

attributes_list = [
    {"brand": "Apple", "storage": "256GB"},
    {"size": "42", "gender": "men"},
    {"connection": "wireless"},
]

results = engine.search_batch(
    queries,
    categories=categories,
    subcategories=subcategories,
    attributes_list=attributes_list,
    k=10,
    n_jobs=4,
)

For hybrid batch search, pass one vector per query:

vectors = np.random.randn(len(queries), VECTOR_DIM).astype("float32")

results = engine.search_batch(
    queries,
    categories=categories,
    subcategories=subcategories,
    attributes_list=attributes_list,
    vectors=vectors,
    normalize=True,
    k=10,
    n_jobs=4,
)

Item insert

Use insert mode to add new items to an existing index.

engine.init(mode="insert")

engine.ingest(
    external_id="p3",
    title="Google Pixel 8 Pro 256GB Bay",
    category="Electronics",
    subcategory="Smartphones",
    attributes={
        "brand": "Google",
        "storage": "256GB",
        "color": "Bay",
    },
)

engine.finalize()

Item upsert

Use upsert mode to replace existing items or insert them if they do not exist.

engine.init(mode="upsert")

engine.ingest(
    external_id="p1",
    title="Apple iPhone 15 Pro Max 512GB Natural Titanium",
    category="Electronics",
    subcategory="Smartphones",
    attributes={
        "brand": "Apple",
        "storage": "512GB",
        "color": "Natural Titanium",
    },
)

engine.finalize()

Item delete, rebuild, and optimize

Delete items by external id:

deleted_count, not_found = engine.delete_items(
    ["p1", "p9"],
    return_not_found=True,
)

Compact the index when needed:

if engine.needs_rebuild():
    engine.rebuild_compact(
        M=48,
        ef_construction=1024,
        ef_search=512,
        build_n_threads=4,
    )

Optimize graph layout:

engine.optimize_graph()

Understanding alpha

alpha controls the balance between semantic vector similarity and structured lexical matching.

alpha Behavior
0.0 lexical-only
0.5 balanced lexical + semantic
0.95 mostly semantic, with lexical correction
1.0 semantic-only

For semantic-only and hybrid search, pass vector_dim during engine construction and provide vectors during ingest(...) and search(...).

Choose alpha before building the index. In brinicle, alpha affects graph construction as well as search scoring; it is not only a query-time reranking parameter.


Autocomplete

Use AutocompleteEngine for low-RAM autocomplete and query suggestion search.

It can be used to index:

  • popular queries
  • item titles
  • category names
  • curated suggestions
import brinicle

ac = brinicle.AutocompleteEngine(
    "autocomplete_index",
    dim=48,
)

ac.init(mode="build")

ac.ingest("iphone 15 pro max", "iphone 15 pro max")
ac.ingest("iphone 15 case", "iphone 15 case")
ac.ingest("samsung s24 ultra", "samsung s24 ultra")

ac.finalize()

print(ac.search("iph", k=5))

Example output:

["iphone 15 pro max", "iphone 15 case"]

Autocomplete currently works best for prefix-aligned query and title suggestions.


Autocomplete batch search

queries = [
    "iph",
    "sams",
    "iphone ca",
]

results = ac.search_batch(
    queries,
    k=5,
    n_jobs=4,
)

print(results)

Autocomplete insert

Use insert mode to add suggestions to an existing autocomplete index.

ac.init(mode="insert")

ac.ingest("iphone 16 pro", "iphone 16 pro")
ac.ingest("iphone 16 pro case", "iphone 16 pro case")

ac.finalize()

Autocomplete upsert

Use upsert mode to replace existing suggestions or insert them if they do not exist.

ac.init(mode="upsert")

ac.ingest("iphone 15 pro max", "iphone 15 pro max 256gb")

ac.finalize()

Autocomplete delete, rebuild, and optimize

Delete suggestions by external id:

deleted_count, not_found = ac.delete_items(
    ["iphone 15 case", "missing-suggestion"],
    return_not_found=True,
)

Compact the index when needed:

if ac.needs_rebuild():
    ac.rebuild_compact(
        M=32,
        ef_construction=512,
        ef_search=128,
        build_n_threads=4,
    )

Optimize graph layout:

ac.optimize_graph()

Streaming-first ingest

brinicle ingests records one at a time, so the full dataset does not need to fit in memory.

engine.init(mode="build")

for item in stream_items():
    engine.ingest(...)

engine.finalize()

This applies to all engines:

  • VectorEngine
  • ItemSearchEngine
  • AutocompleteEngine

Configuration

brinicle exposes common HNSW parameters:

engine = brinicle.VectorEngine(
    "vector_index",
    dim=384,
    M=48,
    ef_construction=1024,
    ef_search=512,
    delta_ratio=0.1,
)
Parameter Meaning
M Maximum graph degree used by HNSW
ef_construction Construction-time search width
ef_search Query-time search width
delta_ratio Delta segment ratio before rebuild is recommended

ItemSearchEngine supports alpha-controlled lexical, semantic, and hybrid scoring.

engine = brinicle.ItemSearchEngine(
    "item_index",
    dim=96,
    vector_dim=384,
    alpha=0.95,
)

Advanced users can pass a custom LexicalConfig.

cfg = brinicle.LexicalConfig()

cfg.search_title_weight = 0.60
cfg.search_category_weight = 0.15
cfg.search_subcategory_weight = 0.15
cfg.search_attr_weight = 0.10

cfg.build_title_weight = 0.60
cfg.build_category_weight = 0.15
cfg.build_subcategory_weight = 0.15
cfg.build_attr_weight = 0.10

engine = brinicle.ItemSearchEngine(
    "item_index",
    dim=96,
    lexical_config=cfg,
)

AutocompleteEngine also supports its own scoring configuration.

cfg = brinicle.AutocompleteConfig()

cfg.search_position_decay = 0.5
cfg.search_length_penalty = 0.2

ac = brinicle.AutocompleteEngine(
    "autocomplete_index",
    dim=48,
    autocomplete_config=cfg,
)

Index files

For an index path such as:

engine = brinicle.VectorEngine("my_index", dim=128)

brinicle stores index files beside that base path:

my_index.main
my_index.delta
my_index.lock

Which engine should I use?

Use VectorEngine when you already have embeddings or numeric vectors.

Use ItemSearchEngine for catalog-like records with titles, metadata, and optional semantic vectors:

  • alpha=0.0 for lexical-only search
  • alpha=1.0 for semantic-only search
  • 0.0 < alpha < 1.0 for hybrid search

Use AutocompleteEngine for low-RAM query or title suggestions.


License

brinicle is licensed under the Apache License, Version 2.0.

See the LICENSE file.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

brinicle-0.0.8-cp314-cp314t-musllinux_1_2_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

brinicle-0.0.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

brinicle-0.0.8-cp314-cp314-musllinux_1_2_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

brinicle-0.0.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

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

brinicle-0.0.8-cp313-cp313-musllinux_1_2_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

brinicle-0.0.8-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

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

brinicle-0.0.8-cp312-cp312-musllinux_1_2_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

brinicle-0.0.8-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

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

brinicle-0.0.8-cp311-cp311-musllinux_1_2_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

brinicle-0.0.8-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

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

brinicle-0.0.8-cp310-cp310-musllinux_1_2_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

brinicle-0.0.8-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

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

File details

Details for the file brinicle-0.0.8-cp314-cp314t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for brinicle-0.0.8-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f6545cfec3bfe1098aab9dd1f7c9aef37101e1ddc1ecbe68b31f85d234898d3a
MD5 ec3190ea7bb5a7054f24550345132625
BLAKE2b-256 c686255593fe4b62d4bbec5a7f1aef258a9054d272992067f7fc975ec9ab7831

See more details on using hashes here.

File details

Details for the file brinicle-0.0.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for brinicle-0.0.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f4b1d498adf2f90dd7bf520fd3aab35c1a64ac1b62145e5b664c7c2bcae0b98e
MD5 2f74cec438b7b7b1aea962a33209cec4
BLAKE2b-256 a4ab0338e87a377fb3d84e5943cc8cbd45fadc872ae24810f4656b14a4c302d4

See more details on using hashes here.

File details

Details for the file brinicle-0.0.8-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for brinicle-0.0.8-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 61af265e301ab96d4a50e85376576272a04813eb1470181820daec31ebc0ec7c
MD5 d9376b066f2c9e0d2fda06e9d49e5eec
BLAKE2b-256 3fc93ad010299be855aadc491347cbf77791675141392644e920a92463bcb79a

See more details on using hashes here.

File details

Details for the file brinicle-0.0.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for brinicle-0.0.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c656f947723377dcff39d6044d3d8730574562d25f3a985e6b7948a814ce76f0
MD5 64c1b5afdd6ffd07e6e6cd7451c423d5
BLAKE2b-256 f2aeaad8d88bd2f8584d2a1a30d1c123544b938c485ea2d6d92265a6895a6372

See more details on using hashes here.

File details

Details for the file brinicle-0.0.8-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for brinicle-0.0.8-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a8b245fb7b4c03ec2d90e71c05b013b7db05da1d15f45c1abf41d146beb07232
MD5 b3fe0765eef04ae9a729c7afb328d6ec
BLAKE2b-256 d0ec2b250f2fa9116b93e27794e557b70edb7737a4f81771e3389d2af192f4fc

See more details on using hashes here.

File details

Details for the file brinicle-0.0.8-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for brinicle-0.0.8-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 76805f1f74b17413e6728a0aabf8f1bdb6c9bc67747709f22ec94822326c184e
MD5 52e9c21eb7cf16c32cbd6ea9ffe63cc7
BLAKE2b-256 34e0966ca9d5df4765b5335dccf6d94e8eb9607f12fbeb5378b045246dbc8f5f

See more details on using hashes here.

File details

Details for the file brinicle-0.0.8-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for brinicle-0.0.8-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 12f02cf967cf1f4c78e8185fef38d25650aadd8552a45ff35e8d939f00dd8783
MD5 b046102901206ad42d4387a3a627cd29
BLAKE2b-256 b11fc649742bd2028c9aaff52bae89c22f1af1cd87407f3ba1ebe608ba02a85d

See more details on using hashes here.

File details

Details for the file brinicle-0.0.8-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for brinicle-0.0.8-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b91796950584967df6c34dc07148fdbc69deec1ba116858cd138ec522b9933f5
MD5 8bcc162030e08b9323be62d6ed26a514
BLAKE2b-256 748856c064b90f11888bd12ff9b52096af185274d0032b768f5967e25132e4e4

See more details on using hashes here.

File details

Details for the file brinicle-0.0.8-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for brinicle-0.0.8-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3887bdf1febb06650221ac2862be42cd36211b93b1acbcb5ceb4725fdfca20eb
MD5 15c52cfd95bb81294b3bbda1cac891d2
BLAKE2b-256 bc944986d413d34a84245423d8b62a17cedf909b318000a12428e8d509be2ad2

See more details on using hashes here.

File details

Details for the file brinicle-0.0.8-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for brinicle-0.0.8-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 32a2442b5adbab84ca0c91b2f647c0860700e00c06b952615ccb9985fa5d183c
MD5 23b426608827e1e3e6048803959f36d2
BLAKE2b-256 9fd8c3129896e686f5de449e7c8c49af67a91711adad0a9067277ab7ae34fc6f

See more details on using hashes here.

File details

Details for the file brinicle-0.0.8-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for brinicle-0.0.8-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 37850363eef70008e25d335c96e8af7f1dc8bbe6d7e64baf302e0e523bdc5cf6
MD5 13a21b6273202dc8ee8251bb61436398
BLAKE2b-256 c559ae8c0d0db73b3fd3ae9e66ddbf79945c0b875e94d29e3e300e8583d69ab3

See more details on using hashes here.

File details

Details for the file brinicle-0.0.8-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for brinicle-0.0.8-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ce4fab8ce59244742765c772f0388c68536816c1dbd9ef0ada89f8f7b8729a30
MD5 5967122a5306439090d4091b7df8e7bd
BLAKE2b-256 94db97d87e679d9a45eae2f79d8f3a08fef7ec89620dd6d7109d2adb7f89593d

See more details on using hashes here.

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