Skip to main content

HawDB

Website License Release Rust

HawDB is an AI-native embedded database for agents. It keeps the facts an agent reasons over — entities, relationships, documents, and events — in one crash-safe process, returns them as bounded context, and gives each agent its own durable branch to work in.

  • Context layer. Graph structure, relational rows, lexical search, and vector search share one engine. A retrieval request takes search candidates, filters them, walks the authorized graph, reranks with a typed score, and hydrates the result from the canonical snapshot. See Context, in one pipeline.
  • Built for agent workloads. Agents talk to the database through parameterized Cypher and SQL. Every read has an explicit row and payload budget, and an over-budget request fails instead of returning a silently truncated answer. A read transaction pins one published snapshot, so a multi-step plan sees one consistent state.
  • Branches for agents. A copy-on-write branch costs metadata and an empty WAL, not a copy of the data. An agent can try a plan, write intermediate facts, or run a long task on its own branch without disturbing main or other agents. See Branches for agents.

HawDB is written in Rust and licensed under Apache-2.0. It is built for Nowledge Mem, currently in nightly integration. The library is the product: any host that needs a durable context layer opens it the same way.

The site and in-browser playground are at hawdb.ai. Their source is nowledge-co/hawdb-website.

For synchronous SQL materialized views, see the materialized view guide.

Install

HawDB is a Rust library. Published releases are on crates.io. The repository pins Rust 1.97.1.

[dependencies]
hawdb = "0.25"

To follow the repository tip instead of a release:

hawdb = { git = "https://github.com/nowledge-co/hawdb" }

Or build the default library from a checkout:

cargo build --locked -p hawdb

The default build includes full-text search, vector search, graph analytics, background maintenance, and the Tokio adapter. A capability left out of the build cannot be turned back on at runtime. See Build.

Python bindings live in-tree and are distributed as hawdb on PyPI. See Python.

Open a database

Database::open creates or recovers a durable project directory. One process owns that directory. Inside the process, reads and writes are transactional.

use hawdb::{Database, Value};
use std::collections::BTreeMap;

fn main() -> hawdb::Result<()> {
    let mut db = Database::open("./knowledge")?;

    let mut note = BTreeMap::new();
    note.insert("title".into(), Value::String("Graph foundations".into()));

    let mut tx = db.begin_transaction()?;
    tx.query_with_params(
        "CREATE (:Note {title: $title})-[:MENTIONS]->(:Entity {name: 'context layer'})",
        &note,
    )?;
    tx.commit()?;

    let found = db.query(
        "MATCH (note:Note)-[:MENTIONS]->(entity:Entity)
         RETURN note.title AS title, entity.name AS name
         ORDER BY title",
    )?;
    println!("{:?}", found.rows.get(0, "title"));
    Ok(())
}

The same program is examples/open_database.rs. The relationship is created in that statement together with both endpoints.

Database::new opens an in-memory database with the same query API. Parameterized statements are the application interface. EXPLAIN returns the physical plan chosen by the Cascades-style optimizer.

Relational facts use PostgreSQL-dialect SQL on the same handle:

db.query_sql(
    "CREATE TABLE events (
        stream_id TEXT NOT NULL,
        sequence BIGINT NOT NULL,
        payload BYTEA NOT NULL,
        PRIMARY KEY (stream_id, sequence)
    ) WITH (
        storage_mode = 'strict_append',
        partition_key = 'stream_id',
        order_key = 'sequence'
    )",
)?;

Strict-append tables accept parameterized INSERT only. Reads name the partition, walk the order key, and set LIMIT. Generated commit_sequence keys are assigned at the durable commit boundary. The contract is in docs/specs/QUERY_FIRST_PUBLIC_API_SPEC.md.

Context, in one pipeline

Search hits enter the pipeline as candidates.

Database::retrieve_knowledge and DatabaseReadTransaction::retrieve_knowledge run one fixed pipeline against a pinned graph snapshot:

  1. search_candidate — lexical or vector hits from the published search projection
  2. metadata_filter — relevance predicates on projection metadata
  3. authorized_graph_expand — neighborhood expansion that rechecks scope on canonical nodes
  4. rerank — Max, a weighted sum, or a host-supplied ScoringSpec
  5. top_k — truncate before any output entity is built
  6. canonical_hydration — load identity, properties, and graph context from the snapshot

A projection epoch is reported beside the graph commit epoch. A stale search hit that no longer matches canonical identity is dropped and counted. Missing score features are reported on the candidate; they are never treated as zero. The whole request fails if it exceeds the query memory budget or the result payload budget. Partial context is not returned.

ScoringSpec is a weighted sum of features, each optionally decayed. Features are the search score, the graph-seed score, hop distance, a numeric node property, and a timestamp aged against the request clock. Changing weights does not invalidate a cached plan.

The stage order, snapshot binding, and fail-closed budgets are specified in docs/specs/KNOWLEDGE_RETRIEVAL_PIPELINE_SPEC.md and modeled in docs/tla/HawDBKnowledgeRetrievalPipeline.tla.

host process
│
├─ Cypher ────────────── canonical graph   (WAL, MVCC, checkpoints)
├─ PostgreSQL SQL ────── canonical rows    (tables, strict-append logs)
│
└─ retrieve_knowledge
     search projection ──► filter ──► authorized expand
                                      │
                                      ▼
                              rerank ──► top-k ──► hydrate from the snapshot

Branches for agents

An agent often needs its own copy of the world: to explore a plan, stage facts it is not yet sure of, or run a long task while the user and other agents keep reading main. A HawDB branch is that copy.

  • Cheap to create. A new branch shares the parent's sealed durable root and writes only catalog metadata and an empty branch-local WAL. It does not scan, import, or copy the parent's data, so creation cost does not grow with the database.
  • Fully writable and isolated. Cypher and SQL reads, writes, and branch-local schema changes run on the selected branch exactly as on main. A branch can itself be branched.
  • Named for agents. Omitting the name generates agent/<branch-uuid>; the agent/ prefix is reserved for these generated names. Every branch also has a stable UUID that is never reused.
  • Safe to retry. Creation carries a request key, so a retry after a lost response returns the same branch instead of a duplicate. Dropping a branch requires its UUID and metadata revision, so a delayed request cannot delete a newer branch that reused the name.
  • Durable until dropped. Branches survive handle closure, process crashes, and restarts. There is no TTL; an idle branch keeps its data until it is explicitly dropped.

Branch lifecycle and selection are SQL statements on the same handle:

CREATE BRANCH FROM main AT REVISION $1 REQUEST KEY $2;  -- returns branch_id, metadata_revision, ...
USE BRANCH ID $1;
SHOW CURRENT BRANCH;
SHOW BRANCHES LIMIT 10;
DROP BRANCH ID $1 AT REVISION $2;

AT REVISION is the source branch's committed epoch (Database::commit_epoch). Branches do not merge: lineage records where a branch came from, and the host writes the results it wants to keep back to the target branch. The durability, identity, and reclamation contract is docs/specs/BRANCHING_STORAGE_SPEC.md.

What the engine stores

Surface Role
Canonical graph Nodes, relationships, properties, schema, and adjacency. Cypher reads and mutations. Crash recovery replays the WAL onto this state.
Canonical rows PostgreSQL-dialect tables on the same snapshot and commit boundary, including strict-append event logs.
Lexical projection Rebuildable full-text index. Published as its own generation and caught up from the graph.
Vector projection Raw embeddings stay canonical. Default approximate queries traverse a persistent, filter-aware DiskANN (Vamana) graph; a checksummed RaBitQ artifact (search_rabitq.<generation>.hawdb) supplies 1-bit or 4-bit candidates. Exact queries stay exact, and final ranking reads the raw vectors.
Analytics projection Immutable CSR/CSC graphs for PageRank and Louvain, invoked with CALL project_graph, CALL page_rank, and CALL louvain. Rebuildable derived state.

Lexical, vector, and analytics data are projections. Identity and authorization live on the canonical snapshot, and retrieval rebinds to that snapshot before it returns rows.

Vector search is native Rust, and the portable scalar kernel is the correctness reference. Exact raw-vector arithmetic selects AVX2 or NEON at runtime when the CPU supports it and keeps the scalar summation order, so scores are bit-identical. The RaBitQ candidate scorer selects AVX2 automatically; NEON is used only when requested explicitly, and a NEON request fails closed off Arm. Segment scans are opt-in under a caller-supplied concurrency limit and memory budget. HawDB does not start a global vector-search thread pool. The RaBitQ encoding, recovery, and readiness contract is docs/specs/RABITQ_VECTOR_PROJECTION_SPEC.md. The DiskANN graph, filter semantics, and memory preflight are in docs/specs/FILTERED_DISKANN_SPEC.md.

Query languages

Application graph work is parameterized Cypher: MATCH, OPTIONAL MATCH, WHERE, WITH, UNWIND, RETURN, ORDER BY, SKIP, LIMIT, CREATE, MERGE, SET, DELETE, DETACH DELETE, and explicit BEGIN / COMMIT / ROLLBACK. The same statements run through Database, DatabaseTransaction, and DatabaseReadTransaction.

Within those clauses:

  • Variable-length relationship patterns match as trails in every direction: a path never reuses a relationship.
  • shortestPath(...), allShortestPaths(...), and the ANY SHORTEST / ALL SHORTEST selectors run a bounded bidirectional search between bound endpoints. An unbounded search is capped at 256 hops and fails rather than report no path. See docs/SHORTEST_PATH_EXECUTION.md.
  • count, sum, min, max, avg, and collect accept a scalar-expression argument, with optional DISTINCT.
  • List comprehensions, size, head, last, tail, reverse, range, indexing, slicing, and three-valued IN are supported. docs/CYPHER_LIST_FUNCTIONS.md lists their semantics and the remaining differences from openCypher.

Application relational work is PostgreSQL-dialect SQL through query_sql and query_sql_with_params. Idempotent ingestion uses INSERT ... ON CONFLICT (...) DO NOTHING RETURNING .... Provisional row counts are available before commit; commit_with_result recomputes them at the durable boundary. The SQL/PGQ binder in hawdb-sql (CREATE PROPERTY GRAPH, GRAPH_TABLE) is specified in docs/specs/POSTGRES_SQL_PGQ_SPEC.md.

Database::sql_session() runs parameterized SQL with native rows and mutation counts, and session.transaction(|transaction| ...) makes several statements atomic. A statement failure aborts the whole callback, even if its error is caught. See the SQL session contract for examples, result provenance, and the supported PostgreSQL subset.

Both languages go through one Cascades-style optimizer. Plans are fingerprinted, cached when the statement shape allows it, and explainable. Costing, join enumeration, and predicate pushdown are separate rule families over a shared memo.

Typed Rust APIs are reserved for kernel boundaries: transactions, recovery, projections, import, bounded retrieval, admission, and readiness. Release builds do not expose application-specific CRUD facades.

Durability and admission

A database directory has one writer lease, held by one process. Opening the same path twice, or from another process, fails immediately. Threads in the owning process share the handle. Read transactions observe a published snapshot.

The default durability policy syncs the WAL on every commit. SyncOnCheckpoint defers that flush, and group commit can batch it. Checkpoints then write an immutable generation, and manifest.hawdb is the only pointer to that generation. Recovery replays a committed prefix and drops a torn tail. The file format is HawDB's own: ordered immutable segments, a demand-paged descriptor tree, and copy-on-write pages, described in docs/STORAGE.md.

Every read carries an explicit row budget and payload budget. Planning, execution, search builds, and background maintenance take admission permits from a local QoS scheduler. Background work — schema, indexes, projection catch-up, compaction — runs only when the host enables it and the scheduler admits it. Exceeding a budget fails the request.

Two deployment profiles select defaults: SharedHost for a desktop or server process, and MobileEmbedded for a phone-style process. The profile does not change the file format or query semantics. The runtime contract is docs/specs/EMBEDDED_RUNTIME_SPEC.md.

Optional OpenTelemetry metrics are host-injected. HawDB records low-cardinality counters through a supplied meter. It does not install a global provider, open an OTLP endpoint, or export query text, parameters, document identifiers, or database paths.

Result budget errors

When selected read results exceed a row or payload limit, HawDB returns HawDBError::ReadBudgetExceeded(ReadBudgetError). The cause retains ReadBudgetResource::Rows or ReadBudgetResource::PayloadBytes, the selected limit, and the existing diagnostic message. Hosts can classify the resource without parsing diagnostic text. Bounded snapshots preserve this cause for cumulative result limits, and branch SQL rejects budget failures before publishing a create or delete operation.

The error's display text and execution-category reports remain compatible. Rust consumers with exhaustive HawDBError matches must handle the additional variant. Execution-memory admission, invalid configuration, cancellation, deadline, append-storage, and MutationLimits/DML RETURNING admission failures retain their separate error contracts. Limits, read authority, and persistent formats are unchanged.

Build

cargo build --locked -p hawdb

A minimal library keeps canonical graph storage, WAL recovery, transactions, parameterized Cypher, and incremental base indexes:

cargo build --locked -p hawdb --no-default-features

Add capabilities explicitly when the host is constrained:

cargo build --locked -p hawdb --no-default-features \
  --features full-text-search,vector-search

Cargo features

Feature Default What it compiles
full-text-search yes Lexical indexing and search, gated again by the runtime capability matrix.
vector-search yes Scalar vector search and the bounded 1-bit or 4-bit RaBitQ candidate projection. Final ranking reads canonical raw vectors.
graph-analytics yes Bounded graph projection and analytics operators.
background-maintenance yes QoS-admitted background schema, index, projection, and maintenance work.
tokio-runtime yes Owned or borrowed Tokio adapter. The synchronous facade is still available when this feature is off.
acl no Access-control types. The host still supplies fresh policy and enables the capability at runtime. The feature alone is not an authorization boundary.
opentelemetry no Host-injected metrics adapter. Nightly, non-production monitoring builds only.
qualification no Offline qualification ingress. Not a serving capability.
loom-tests no Loom concurrency-model tests. Not an application capability.

Build-time features are an upper bound. A capability omitted from the binary fails at runtime with HawDBError::CapabilityUnavailable.

Production packages use an explicit allowlist. --all-features pulls in opentelemetry and test-only features, so it is for CI compile coverage and is not a production artifact.

cargo build --locked --release -p hawdb --no-default-features \
  --features background-maintenance,full-text-search,graph-analytics,vector-search

A nightly monitoring build adds the metrics adapter and Tokio integration. The host owns the OpenTelemetry SDK, exporter, credentials, and shutdown:

cargo build --locked --release -p hawdb \
  --features opentelemetry,tokio-runtime

Measured dependency footprints are in docs/COMPOSITION_BASELINE.md.

Host-owned memory allocator

HawDB does not install or bundle a custom allocator. The final host binary or WASM cdylib chooses its Rust allocator with #[global_allocator], and HawDB's Rust allocations and Zstd context workspaces use that choice. Without host injection, Rust's target default applies. Mem's server selects mimalloc; embedding HawDB in that binary reuses the existing selection. See the allocator contract for native and WASM examples, ownership boundaries, and verification commands.

Bazel

bazel build //:hawdb
bazel test --test_output=errors //...

//:hawdb_graph_text matches cargo build -p hawdb --no-default-features --features full-text-search: graph and SQL plus full-text search, without vector search. Bazel uses a hermetic JDK 21, so JAVA_HOME is unnecessary for the TLA+ rules. On macOS the repository keeps Rust proc-macros unstripped to avoid a Mach-O alignment bug in the pinned 1.97.1 toolchain.

The experimental in-memory browser build is documented in docs/WASM.md. The public playground is built from nowledge-co/hawdb-website.

Fuzzing

make mvcc-fuzz
make shiro-fuzz
make fuzz-help
make fuzz-test

make mvcc-fuzz runs the standalone MVCC CLI locally for about 30 seconds; make shiro-fuzz continuously runs SQL/Cypher multi-oracle checks until Ctrl+C. Override MVCC_SECONDS, MVCC_SEED, SHIRO_SECONDS and SHIRO_SEED as needed. make fuzz runs all native campaigns and writes JSON reports under target/fuzz-logs/. make fuzz-test runs the deterministic regression and CLI contracts through Bazel. Campaign details are in tools/shiro/README.md.

Python

The Python package is a thin binding over the same embedded engine. Install a published release with python -m pip install hawdb (CPython 3.11+), then import hawdb. Native wheels and a source distribution are built from each published GitHub Release; see the Python release workflow.

import hawdb

db = hawdb.open("./knowledge")
db.execute("CREATE (s:Stock {code: $code})", {"code": "603122"})

result = db.execute("MATCH (s:Stock) RETURN s.code")
print(result.columns)     # ['s.code']
print(result.fetchall())  # [{'s.code': '603122'}]

db.execute_sql("SELECT 1")
db.close()

Build and test instructions are in bindings/python/README.md.

Production hosts

Link HawDB as a library. Production read routing, migration gates, and readiness checks use the typed Rust API. They do not shell out to the hawdb binary.

The binary's compatibility commands compare an external previous engine or a shadow process. They run only when HAWDB_ENABLE_COMPATIBILITY_TOOLS=1 is set, and only against copied data in isolated CI or release validation.

Verification

Storage publication, MVCC validation, lock fairness, append assignment, and the knowledge-retrieval stage machine have executable TLA+ models under docs/tla. CI checks them with a pinned TLA+ Tools jar, each over a bounded state space.

Alongside the models, the repository keeps differential fuzzing, crash-recovery evidence, search-generation qualification, and resource-profile gates. Those suites are separate from cargo test because they need different features, platforms, or runtime budgets.

Documentation

Read this For
docs/ARCHITECTURE.md Crate layout, query pipeline, and engine boundaries
docs/specs/QUERY_FIRST_PUBLIC_API_SPEC.md The release-facing API
docs/specs/KNOWLEDGE_RETRIEVAL_PIPELINE_SPEC.md Retrieval stages, scoring, and budgets
docs/specs/EMBEDDED_RUNTIME_SPEC.md Concurrency, durability, resources, telemetry
docs/STORAGE.md On-disk generations, WAL, and checkpoints
docs/ALLOCATORS.md Host-owned global allocator contract
docs/FILE_DESCRIPTOR_CAPACITY.md Descriptor capacity, pins, internal progress and Windows probe isolation
docs/specs/README.md Index of normative contracts
docs/WASM.md In-tree experimental browser runtime
hawdb.ai Public site and playground. Source: hawdb-website
CONTRIBUTING.md Issues, pull requests, and validation expectations

Scope

HawDB is a single-process embedded engine.

  • One database directory, one writer lease, one process.
  • Cypher covers the statements listed above. That is the executed surface, and it is smaller than the whole of openCypher.
  • Search and analytics artifacts are rebuilt from canonical state.
  • Branches live inside one project directory. There is no branch merge, point-in-time source selection, remote replication, or automatic expiry.
  • Multi-process writers, distributed replication, and a standalone database server are outside this release. Design notes for later storage work live with the specs and are not serving features.

Contributing

Issues and pull requests follow CONTRIBUTING.md. Architecture constraints for changes, including changes written with an assistant, are in AGENTS.md. Open work is tracked in TODO.md.

License

Apache License 2.0. See LICENSE.

Source files carry the standard Apache-2.0 header. Check or repair them with hawkeye and licenserc.toml:

hawkeye check
hawkeye format

Metadata

Release files for hawdb 0.25.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for hawdb 0.25.0
File Size Uploaded Provenance Actions
hawdb-0.25.0.tar.gz 11.6 MB With provenance Details for hawdb-0.25.0.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for hawdb 0.25.0
File Actions
hawdb-0.25.0-cp311-abi3-win_amd64.whl CPython 3.11 abi3 Windows x86-64 Details for hawdb-0.25.0-cp311-abi3-win_amd64.whl
hawdb-0.25.0-cp311-abi3-manylinux_2_28_x86_64.whl CPython 3.11 abi3 Linux glibc 2.28+ x86-64 Details for hawdb-0.25.0-cp311-abi3-manylinux_2_28_x86_64.whl
hawdb-0.25.0-cp311-abi3-manylinux_2_28_aarch64.whl CPython 3.11 abi3 Linux glibc 2.28+ ARM64 Details for hawdb-0.25.0-cp311-abi3-manylinux_2_28_aarch64.whl
hawdb-0.25.0-cp311-abi3-macosx_11_0_arm64.whl CPython 3.11 abi3 macOS 11.0+ ARM64 Details for hawdb-0.25.0-cp311-abi3-macosx_11_0_arm64.whl
hawdb-0.25.0-cp311-abi3-macosx_10_12_x86_64.whl CPython 3.11 abi3 macOS 10.12+ x86-64 Details for hawdb-0.25.0-cp311-abi3-macosx_10_12_x86_64.whl

Total release size: 78.5 MB

Release files / hawdb-0.25.0.tar.gz

Download URL hawdb-0.25.0.tar.gz
Size 11.6 MB
Tags Source
SHA-256 checksum
How to use checksums
4438c1d19cec7c10032050ca65f3ecffc30e6fd0329666fce3b851fcae936a6f
BLAKE2b-256 checksum
How to use checksums
e464470efed3589c0546f2100078f2e9940cc0b9655f495dc1f6f270d1c4e676
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.

Transparency log

Release files / hawdb-0.25.0-cp311-abi3-win_amd64.whl

Download URL hawdb-0.25.0-cp311-abi3-win_amd64.whl
Size 13.5 MB
Tags CPython 3.11 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
33f49363e365a5cb6e7016da30e957555de21e938d27fa64fea0551dd8f8c8b6
BLAKE2b-256 checksum
How to use checksums
c06a2a36fc8ec1198c67c8defef9f4954edb112b9f870ac3de06efb8d79f3fdf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.

Transparency log

Release files / hawdb-0.25.0-cp311-abi3-manylinux_2_28_x86_64.whl

Download URL hawdb-0.25.0-cp311-abi3-manylinux_2_28_x86_64.whl
Size 14.3 MB
Tags CPython 3.11 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
84ad68ac8e9963ee3e1e2a53db32e2e108fce20f51d5263aaf9dbfb6dc12bfe5
BLAKE2b-256 checksum
How to use checksums
e9035e45f0b702baf58b22e52ef5ebef06808fa54dac514d4fb44b67e4aac13d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.

Transparency log

Release files / hawdb-0.25.0-cp311-abi3-manylinux_2_28_aarch64.whl

Download URL hawdb-0.25.0-cp311-abi3-manylinux_2_28_aarch64.whl
Size 13.5 MB
Tags CPython 3.11 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
8c7e74000808210f8a5416cf92c52a361be37c71eab287e619f5ed19716f21fd
BLAKE2b-256 checksum
How to use checksums
6a21431376ae18ea11d59d698e503501cf716c93641a681f1ca1fea7d9d3fc9d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.

Transparency log

Release files / hawdb-0.25.0-cp311-abi3-macosx_11_0_arm64.whl

Download URL hawdb-0.25.0-cp311-abi3-macosx_11_0_arm64.whl
Size 12.1 MB
Tags CPython 3.11 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
90d21ed3d4f7d593b7ea48097a6a0fb8824f547d3d30b91d9e9a4a4c0232934f
BLAKE2b-256 checksum
How to use checksums
b84e042a701940f24e51a1696b12c50363bc93089213a57a83f93f07eebba8ce
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.

Transparency log

Release files / hawdb-0.25.0-cp311-abi3-macosx_10_12_x86_64.whl

Download URL hawdb-0.25.0-cp311-abi3-macosx_10_12_x86_64.whl
Size 13.5 MB
Tags CPython 3.11 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
822eec7b5e364598dbe6cf74901faf60fc8f34aafa7b6e234192a5327b43417f
BLAKE2b-256 checksum
How to use checksums
f65cbcb9c5eaeb79ca110dac5e8e568fbfe928a070e8f02272a6bfadeebfbc89
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.

Transparency log

Security for hawdb 0.25.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 6 files in this release have been uploaded with provenance metadata.

Select from 6 files

Attestation for hawdb-0.25.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page