Skip to main content

Modular state estimation building blocks — UKF, IMM, and multi-sensor fusion in C++ with Python bindings

Project description

quakfilter

QUAternion C++ Kalman Filter — a high-performance Unscented Kalman Filter library in C++ with Python bindings, designed for real-time 6-DoF rigid body pose tracking.

pip install quakfilter
import numpy as np
from quak import UKF, RigidBodyCVModel

model = RigidBodyCVModel()
x0 = np.zeros(16); x0[9] = 1.0  # identity quaternion
ukf = UKF(model, Q=np.eye(15)*0.01, R=np.eye(6)*0.001, P0=np.eye(15)*0.1, x0=x0)

ukf.predict(dt=0.01)
ukf.correct(measurement)  # 7D: [px, py, pz, qw, qx, qy, qz]

Features

  • Manifold-aware UKF — proper quaternion handling via boxPlus/boxMinus operations and Markley's quaternion mean
  • 16D state / 15D error-state — position, velocity, acceleration, unit quaternion orientation, angular velocity
  • Multiple motion models — Constant Velocity (CV), Helical, Constant Turn-Rate-and-Velocity (CTRV), Constant Acceleration (CA), Singer maneuvering target
  • IMM Estimator — Interacting Multiple Model with Markov switching, log-likelihood model probabilities, single-model fast path
  • TrackPool — Multi-object IMM pool with UUID handles, active/suspended partitioning, OpenMP-parallel predict, selective correct
  • Temporal state layerpredictTo(timestamp) for absolute-time sync, getSnapshotAt(t) for non-mutating previews, StateEstimate output containers, per-track timestamps
  • Multi-sensor fusion — PoseSensor, VelocitySensor, ProjectiveBBoxSensor with correct(z, sensor) overload
  • Projective model — Camera-based 2D bounding box tracking via 3D→2D projection (composable with any dynamics model)
  • Sigma point schemes — Symmetric (2n) and Merwe Scaled (2n+1) with scaled_sigma_points flag
  • Python bindings — Zero-copy interop via nanobind + Eigen
  • Numerical stability — SVD/LDLT selection, log-space likelihoods, covariance symmetrization, eigenvalue regularization

State Vector Layout

Index:  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
Field: px py pz vx vy vz ax ay az qw qx qy qz wx wy wz
       ├─ pos ─┤  ├─ vel ─┤  ├─ acc ─┤  ├── quat ──┤  ├ω─┤
       └────────────────── 16D state ───────────────────────┘
       └────────────────── 15D error (tangent) ─────────────┘

Quick Start

Build & Install

# Prerequisites: Python 3.10+, CMake 3.15+, OpenMP, Eigen3 (auto-fetched if missing)
pip install .

Python Usage

import numpy as np
from quak import UKF, RigidBodyCVModel, RigidBodyCTRVModel

# Choose a motion model
model = RigidBodyCVModel()  # or RigidBodyCTRVModel, RigidBodyCAModel, etc.

x0 = np.zeros(16)
x0[9] = 1.0  # identity quaternion [qw]

P0 = np.eye(15) * 0.1
Q  = np.eye(15) * 0.01
R  = np.eye(6)  * 0.001

ukf = UKF(model, Q, R, P0, x0)

# Predict-correct loop
ukf.predict(dt=0.01)
ukf.correct(measurement)  # 7D: [px, py, pz, qw, qx, qy, qz]

state = ukf.state       # 16D state estimate
P     = ukf.covariance  # 15×15 error covariance

Multi-Sensor Fusion

from quak import PoseSensor, VelocitySensor

pose_sensor = PoseSensor(R_pose)
vel_sensor  = VelocitySensor(R_vel)

ukf.predict(dt=0.01)
ukf.correct(z_pose, sensor=pose_sensor)
ukf.correct(z_vel, sensor=vel_sensor)

IMM Usage

from quak import IMMEstimator, RigidBodyCVModel, RigidBodyCTRVModel

cv   = RigidBodyCVModel()
ctrv = RigidBodyCTRVModel()

imm = IMMEstimator([cv, ctrv], [Q_cv, Q_ctrv], R, P0, x0)

imm.predict(dt=0.01)
imm.correct(measurement)

probabilities = imm.model_probabilities  # [p_cv, p_ctrv]

TrackPool Usage

from quak import TrackPool, TimeMode, RigidBodyCVModel, RigidBodyCTRVModel

pool = TrackPool([RigidBodyCVModel(), RigidBodyCTRVModel()],
                 [Q_cv, Q_ctrv], R, P0)

pool.add("track_0", initial_state, time=0.0)  # every add requires a timestamp
pool.predict(dt=0.01)                         # all tracks in parallel
pool.correct(["track_0"], z)                  # selective update
pool.suspend("track_0")                       # skip from predict
pool.resume("track_0")                        # re-activate
pool.remove("track_0")                        # delete track

Temporal Operations

# Absolute-time mode: sync all tracks to a wall-clock timestamp
pool.add("track_a", state_a, time=100.0)
pool.add("track_b", state_b, time=102.0)
pool.predict_to(105.0)  # A gets dt=5, B gets dt=3

# Non-mutating preview at a future time
snapshot = pool.get_snapshot_at(106.0)  # list of StateEstimate
for est in snapshot:
    print(est.track_id, est.state[:3], est.timestamp)

Architecture

csrc/include/quak/
├── models.hpp          UKFModel / SystemModel / MeasurementModel base classes
├── models_impl.hpp     CV, Helical, CTRV, CA, Singer motion models
├── projective_model.hpp  Projective bounding box measurement model
├── manifolds.hpp       Euclidean + Quaternion manifold operations
├── ukf.hpp             Core UKF (predict/correct, LDLT+SVD, workspaces)
├── imm.hpp             IMM estimator (Markov switching, log-likelihood)
└── track_pool.hpp      Multi-object IMM pool (TrackPool)
csrc/bindings.cpp       nanobind Python bindings

Coding Style

This project follows the Vistralis C++ Coding Style:

  • Allman braces, 4-space indent, 100-char line limit
  • camelCase methods, mCamelCase members, PascalCase classes
  • No abbreviationsmeasurement not meas, stateSize not stateSz
  • Numerical stability — LDLT/SVD solvers, log-space likelihoods, eigenvalue regularization
  • Formatting: clang-format (C++), ruff (Python)

Documentation

Topic Link
System Architecture docs/architecture.md
UKF Reference docs/ukf-reference.md
Q/R Tuning Guide docs/tuning.md
Tutorials & Examples docs/tutorials.md
Coding Style docs/coding-style.md

License

Apache-2.0 — see LICENSE for details.

Copyright (c) 2026 Vistralis Labs. All rights reserved.

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

quakfilter-0.1.0.tar.gz (99.2 kB view details)

Uploaded Source

Built Distributions

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

quakfilter-0.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.5 MB view details)

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

quakfilter-0.1.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.5 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

quakfilter-0.1.0-cp314-cp314-macosx_14_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.14macOS 14.0+ ARM64

quakfilter-0.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.5 MB view details)

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

quakfilter-0.1.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

quakfilter-0.1.0-cp313-cp313-macosx_14_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

quakfilter-0.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.5 MB view details)

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

quakfilter-0.1.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

quakfilter-0.1.0-cp312-cp312-macosx_14_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

quakfilter-0.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.5 MB view details)

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

quakfilter-0.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

quakfilter-0.1.0-cp311-cp311-macosx_14_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

quakfilter-0.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.5 MB view details)

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

quakfilter-0.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

quakfilter-0.1.0-cp310-cp310-macosx_14_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.10macOS 14.0+ ARM64

File details

Details for the file quakfilter-0.1.0.tar.gz.

File metadata

  • Download URL: quakfilter-0.1.0.tar.gz
  • Upload date:
  • Size: 99.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for quakfilter-0.1.0.tar.gz
Algorithm Hash digest
SHA256 df4f551fb46f620dc3b0552cffc08248e753af18018f9bfc9a78f8afa9b02af0
MD5 3dcef8651d16f9b65691fa8ab9b7c71f
BLAKE2b-256 13e35944c82444b82c6b1f181cb84b9bf1e5864d9d21ab9710fc5b61113ed295

See more details on using hashes here.

Provenance

The following attestation bundles were made for quakfilter-0.1.0.tar.gz:

Publisher: release.yml on vistralis/quakfilter

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

File details

Details for the file quakfilter-0.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for quakfilter-0.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6d031e0cf7c3717eb1b7ccb01b047a02c2d7b5e117e496236617764d557a2140
MD5 e5f182ae25e5d78e6c8a5c8db76cc8c8
BLAKE2b-256 a318a4343b3b1234891d711ef212e13803629763e1fa71c91289a8e08a5dc48b

See more details on using hashes here.

Provenance

The following attestation bundles were made for quakfilter-0.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on vistralis/quakfilter

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

File details

Details for the file quakfilter-0.1.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for quakfilter-0.1.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a342db2b92b3d19f0198faa9fa3e221c24fc6d1a3c4746de1f6dc7d3e48d96ad
MD5 498054b2ffd1d109202ffa2097b8dbd9
BLAKE2b-256 ba0a32ccb55744c42f82bf943345a68bafaa14a286230165a32acdc781f03f47

See more details on using hashes here.

Provenance

The following attestation bundles were made for quakfilter-0.1.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl:

Publisher: release.yml on vistralis/quakfilter

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

File details

Details for the file quakfilter-0.1.0-cp314-cp314-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for quakfilter-0.1.0-cp314-cp314-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 34eecae70e6c4cde7842345f64d4d1cd4b7880251370138b3998538d8b6c97f1
MD5 49181a0806ee3ceaa3e4268a5f67154a
BLAKE2b-256 90b2eb4d153032a481655636cc2d72045729e3ee69e34d75727a93ed2edcb511

See more details on using hashes here.

Provenance

The following attestation bundles were made for quakfilter-0.1.0-cp314-cp314-macosx_14_0_arm64.whl:

Publisher: release.yml on vistralis/quakfilter

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

File details

Details for the file quakfilter-0.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for quakfilter-0.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ae85a9e1b22162bf72209112c9b1bc5e49ec6d9455dafbf608d03f1f1fbe0abe
MD5 f8d4623536bd95b985ea9a360812a2f7
BLAKE2b-256 723f3978597ba2fd3b2805b9d840b5bb3cfa4dd3fa1c685f6d77acc334df4c84

See more details on using hashes here.

Provenance

The following attestation bundles were made for quakfilter-0.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on vistralis/quakfilter

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

File details

Details for the file quakfilter-0.1.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for quakfilter-0.1.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 864a0a7303bc863d93ba39c2cce67dc4f47b66eac63a6ebf8344ff09e8da0253
MD5 d5060aaad1ace295718c7601f7918a51
BLAKE2b-256 fa9a467cbb54f1d6e0b35ebaf45ab58b792f09d51200d3af4e083610a3f10362

See more details on using hashes here.

Provenance

The following attestation bundles were made for quakfilter-0.1.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl:

Publisher: release.yml on vistralis/quakfilter

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

File details

Details for the file quakfilter-0.1.0-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for quakfilter-0.1.0-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 43c93a2b7df0dd7d67ca83d865fd6b651e660c20ac47cb351c3647b31c48b800
MD5 f608ff1eecc7523fb2ab296aa51e9239
BLAKE2b-256 444e48a95ed446856788ac92ee92b7b444cbba7b44e1ebd2e91d56de5511743f

See more details on using hashes here.

Provenance

The following attestation bundles were made for quakfilter-0.1.0-cp313-cp313-macosx_14_0_arm64.whl:

Publisher: release.yml on vistralis/quakfilter

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

File details

Details for the file quakfilter-0.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for quakfilter-0.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 aafc7ffb4d37c35a370919187e4bb84a0ee1d0dea26951ae269b968e72d6693f
MD5 efe99f65661402a733eb6371ff2134ba
BLAKE2b-256 ad0f90ea8e2a50cb23205a6c6e0904668be7289df9cae4feaedfe4b6c879f5d8

See more details on using hashes here.

Provenance

The following attestation bundles were made for quakfilter-0.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on vistralis/quakfilter

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

File details

Details for the file quakfilter-0.1.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for quakfilter-0.1.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 7347b2b9217c6ea652b59e68aaede7bebae7cff5114b39c9db728fc48d1334bd
MD5 844f91f81e76d350278b0a49f49d2c9c
BLAKE2b-256 1541f11a2f326ca63f25819b3f540f97c64ac9655bc2360db9d464433ed7b54b

See more details on using hashes here.

Provenance

The following attestation bundles were made for quakfilter-0.1.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl:

Publisher: release.yml on vistralis/quakfilter

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

File details

Details for the file quakfilter-0.1.0-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for quakfilter-0.1.0-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 0659e270b05064bd60dfcbdedb9e8026ef9159f7f82da479b04202506f76ccc7
MD5 72d7995b16b3044ea6a25bf2b62db337
BLAKE2b-256 c5528659b3e631de883e0c0f87d2cf89887db5fcd2e80719bea00622d94b060f

See more details on using hashes here.

Provenance

The following attestation bundles were made for quakfilter-0.1.0-cp312-cp312-macosx_14_0_arm64.whl:

Publisher: release.yml on vistralis/quakfilter

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

File details

Details for the file quakfilter-0.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for quakfilter-0.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2daa48e7baff0c01a77f6aa243404621e1c267dfda758e5446210913fed7f4ae
MD5 868d615435d8ebfca457731cf1168dff
BLAKE2b-256 e7da833747a79eebd8e47ecef9079442b3a7d85ac2db8ae3370ca44f4a953bd0

See more details on using hashes here.

Provenance

The following attestation bundles were made for quakfilter-0.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on vistralis/quakfilter

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

File details

Details for the file quakfilter-0.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for quakfilter-0.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f643b8162e9ef6cb01ff8bd8a72463c1271c1adb1fc2b35f20766bd92c6b8b9d
MD5 076bcb6c477aba65b0f8c3bf299399bc
BLAKE2b-256 352b542172f7c9a57ba97a03111251b97c2833628c1d0058acb144243de6bb26

See more details on using hashes here.

Provenance

The following attestation bundles were made for quakfilter-0.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl:

Publisher: release.yml on vistralis/quakfilter

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

File details

Details for the file quakfilter-0.1.0-cp311-cp311-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for quakfilter-0.1.0-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 3088f60abaa7a0f050e8e7f42cf0646de63f2306728278d35a136d3309a46b00
MD5 7fd4889aa2d48192798fd825101b5b5f
BLAKE2b-256 5aaf162d6bdfc5fe9e793796b94ace54e1a38143aa6dc16ef5d60154efb5a884

See more details on using hashes here.

Provenance

The following attestation bundles were made for quakfilter-0.1.0-cp311-cp311-macosx_14_0_arm64.whl:

Publisher: release.yml on vistralis/quakfilter

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

File details

Details for the file quakfilter-0.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for quakfilter-0.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c8444d376e95985d8ef11aaafb737d3bf9a29c8f560937af67d5cfe658f19406
MD5 d4ead4a479fbbaea31a24585c22a853e
BLAKE2b-256 9a381fa19c5a6a4675ee3b2fc5ad2e3d4115910ab7f7fd8b71e7ab7c0602c73d

See more details on using hashes here.

Provenance

The following attestation bundles were made for quakfilter-0.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on vistralis/quakfilter

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

File details

Details for the file quakfilter-0.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for quakfilter-0.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ad92720cda53a5ab5f685883bc7530200b1aa21653ef5cd764a5a713147fdbee
MD5 6b51464f8dc6274937f60c4c0e0106b9
BLAKE2b-256 9230f8dfaf05a9a4ba012e2552ca149d58a6f45dd4bd0626466e7d937fea0478

See more details on using hashes here.

Provenance

The following attestation bundles were made for quakfilter-0.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl:

Publisher: release.yml on vistralis/quakfilter

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

File details

Details for the file quakfilter-0.1.0-cp310-cp310-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for quakfilter-0.1.0-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 b8ef16db7f7148f942bc111b6178e8b5f0bdfe9d92b5b228d3c6548a11854f4f
MD5 12ef80525585b98d9b867eee1c705c07
BLAKE2b-256 6dafc9c45c2c4fbcd5ce3a77ba9fe398a9d56d495c9bcc23fb3d4dcd80630e25

See more details on using hashes here.

Provenance

The following attestation bundles were made for quakfilter-0.1.0-cp310-cp310-macosx_14_0_arm64.whl:

Publisher: release.yml on vistralis/quakfilter

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