No project description provided
Project description
Duello
Virial Coefficient and Dissociation Constant Estimation for Rigid Macromolecules
Table of Contents
- Quick Start
- Installation
- Overview
- Commands
- Input Formats
- Tuning and Options
- Interaction Models
- Theory
- Examples
- Development
Quick Start
Install via pip:
pip install duello
Run a two-body scan between two lysozyme molecules, starting directly from a PDB file:
duello scan \
--mol1 4lzt.pdb \
--mol2 4lzt.pdb \
--rmin 24 --rmax 80 --dr 0.5 \
--molarity 0.05
This computes the potential of mean force w(R) and reports the second virial coefficient B2 and dissociation constant Kd.
The output is written to pmf.dat by default.
Duello automatically coarse-grains PDB/CIF structures using the Calvados 3 force field at pH 7.0. To override these defaults:
duello scan \
--mol1 4lzt.pdb --mol2 4lzt.pdb \
--rmin 24 --rmax 80 --dr 0.5 \
--molarity 0.05 \
--ph 4.5 --model calvados3 --cg multi
Installation
Binary packages are available through PyPI:
pip install duello
Alternatively, build from source with a Rust toolchain:
cargo install --git https://github.com/mlund/duello
Overview
Duello calculates the potential of mean force (PMF) between two rigid bodies by explicitly evaluating the partition function over inter-molecular orientations on a subdivided icosphere mesh.
For each mass center separation R, the angular partition function is:
$$ \mathcal{Z}(R) = \sum_{\mathbf{\Omega}} e^{-V(R,\mathbf{\Omega})/k_BT} $$
yielding the potential of mean force:
$$ w(R) = -k_BT \ln \mathcal{Z}(R) $$
and the thermally averaged energy:
$$ U(R) = \frac{\sum V(R,\mathbf{\Omega}) e^{-V(R,\mathbf{\Omega})/k_BT}} {\mathcal{Z}(R)} $$
where $V(R,\mathbf{\Omega})$ is the total inter-body interaction energy and $\mathbf{\Omega}$ represents the 5D angular space (two spherical coordinates per body plus a dihedral angle around the inter-molecular axis).
From w(R), duello derives the osmotic second virial coefficient B2 and, for net-attractive systems, the dissociation constant Kd. See Theory for the full expressions.
Commands
Duello provides three subcommands:
| Command | Purpose |
|---|---|
duello scan |
6D scan between two rigid bodies; computes w(R), B2, Kd |
duello atom-scan |
3D scan between a rigid body and a single atom type |
duello diffusion |
Rotational diffusion analysis from a saved 6D energy table |
duello scan -- Two-Body Scan
The primary command. Scans all inter-molecular orientations at each mass center separation to compute w(R), B2, and Kd.
From PDB/CIF (simplest):
duello scan \
--mol1 4lzt.pdb --mol2 4lzt.pdb \
--rmin 24 --rmax 80 --dr 0.5 \
--molarity 0.05
From pre-generated XYZ (full control):
duello scan \
--mol1 cppm-p18.xyz --mol2 cppm-p18.xyz \
--rmin 37 --rmax 50 --dr 0.5 \
--top topology.yaml \
--max-ndiv 3 \
--cutoff 30 \
--molarity 0.05 \
--temperature 298.15 \
--backend auto \
--grid "type=powerlaw2,size=200,shift=true"
Key Options
| Flag | Default | Description |
|---|---|---|
-1, --mol1 |
(required) | First structure (PDB, CIF, or XYZ) |
-2, --mol2 |
(required) | Second structure (PDB, CIF, or XYZ) |
--rmin, --rmax, --dr |
(required) | Radial scan range and step size (angstrom) |
-a, --top |
-- | Topology YAML (required for XYZ, auto-generated for PDB/CIF) |
-M, --molarity |
0.1 | 1:1 salt concentration (mol/L) |
-T, --temperature |
298.15 | Temperature (K) |
--cutoff |
30.0 | Short-range spline cutoff (angstrom) |
--sr-cutoff |
= --cutoff |
Fine-tuned SR potential range (angstrom) |
--max-ndiv |
3 | Icosphere subdivision level (see Angular Resolution) |
--gradient-threshold |
0.5 | Adaptive resolution threshold (1/rad) |
--backend |
auto | Compute backend: auto, gpu, simd, reference |
--grid |
(see below) | Spline grid settings (see Spline Grid) |
--pmf |
pmf.dat | Output PMF file |
--savetable |
-- | Save 6D binary table (.bin.gz for compression) |
--fixed-dielectric |
-- | Override dielectric constant |
PDB/CIF-only options:
| Flag | Default | Description |
|---|---|---|
--ph |
7.0 | pH for coarse-graining |
--model |
calvados3 | Force field model |
--cg |
single | Coarse-graining policy: single or multi |
--scale-hydrophobic |
-- | Hydrophobic scaling, e.g. lambda:1.2 or epsilon:0.8 |
--chain |
(all) | Keep only these chain IDs (repeatable: --chain A --chain B) |
duello atom-scan -- Atom Scan
Computes a 3D energy table (R, theta, phi) between a rigid body and a single test atom type. Useful for rigid body + mobile ion simulations where the full 6D scan is unnecessary.
duello atom-scan \
--mol1 4lzt.xyz \
--atom Na \
--rmin 2.0 --rmax 60 --dr 0.5 \
--top topology.yaml \
--molarity 0.02 \
--cutoff 150
The output is a flat binary table (Table3DFlat) with barycentric interpolation on the icosphere mesh.
| Flag | Default | Description |
|---|---|---|
--mol1 |
(required) | Rigid body structure |
--atom |
(required) | Atom type name (from topology) |
-o, --output |
atom_table.bin.gz | Output binary table |
--pmf |
pmf.dat | Output PMF file |
All other radial, topology, backend, and PDB/CIF flags are shared with duello scan.
duello diffusion -- Rotational Diffusion
Note: This subcommand is experimental. Output format and methods may change in future releases.
Estimates the normalized rotational diffusion coefficient D_r / D_r^0 from a previously saved 6D energy table, without re-scanning. Two methods are used:
- Zwanzig formula -- transport coefficient from energy landscape roughness
- Spectral gap -- slowest relaxation rate from sparse Lanczos eigendecomposition
duello diffusion table.bin.gz \
-T 300 \
-o diffusion.csv \
-j 4
The temperature can differ from the scan temperature since energies are stored in absolute units (kJ/mol).
| Flag | Default | Description |
|---|---|---|
<TABLE> |
(required) | Path to 6D binary table (.bin or .bin.gz) |
-T |
298.15 | Temperature (K) |
-o |
diffusion.csv | Output CSV |
-j |
0 (all cores) | Thread count (fewer = less memory) |
--cmin/--cmax |
-- | Concentration scan range (mol/L) |
--cn |
20 | Number of concentration points |
--cell-output |
cell_diffusion.csv | Output CSV for cell-model D(c) |
--export-matrices |
-- | Export generator matrices (Matrix Market) |
Output Columns
| Column | Description |
|---|---|
R |
Mass center separation (angstrom) |
D/D^0 |
Normalized rotational diffusion (Zwanzig, full 5D). 1 = free, 0 = locked |
D_A/D_A^0 |
Per-molecule-A Zwanzig (marginalized over B and dihedral) |
D_B/D_B^0 |
Per-molecule-B Zwanzig (marginalized over A and dihedral) |
D_w/D_w^0 |
Per-dihedral Zwanzig (marginalized over both molecules) |
separability |
D/D^0 / (D_A x D_B x D_w). 1 = independent, 0 = coupled |
lambda_k |
Eigenvalue magnitude of mode k |
f_Ak, f_Bk, f_wk |
Coordinate fractions for mode k (mol A / mol B / dihedral) |
n_active |
Number of finite-energy grid points at this R |
Interpretation: D/D^0 near 1 means nearly free rotation; values near 0 indicate a rugged energy landscape that locks orientations. The separability column reveals whether molecular rotations are independent or coupled. For homo-dimers, D_A ~ D_B by symmetry.
Input Formats
PDB / mmCIF (recommended)
Pass PDB or CIF files directly. Duello coarse-grains them on the fly using cgkitten, generating .xyz and _topology.yaml files alongside the input. Charges are computed using Monte Carlo titration.
If your PDB has missing atoms or residues, pre-process with pdbfixer:
pip install pdbfixer
pdbfixer 4lzt.pdb --add-atoms=all --add-residues
Pre-generated XYZ
For XYZ input, a topology file (--top) must be provided. You can generate XYZ and topology files from PDB using cgkitten:
cargo install cgkitten
cgkitten 4lzt.pdb convert --ph 7.0
Topology File
The topology is a YAML file defining atom properties and the pair potential. Example:
atoms:
- {name: ALA, charge: 0.0, mass: 71.07, σ: 5.04, ε: 0.8368, hydrophobicity: !Lambda 0.34}
- {name: LYS, charge: 1.0, mass: 128.17, σ: 6.36, ε: 0.8368, hydrophobicity: !Lambda 0.14}
# ... one entry per bead type
system:
energy:
nonbonded:
# Coulomb/Yukawa is always added automatically -- do NOT specify it here
default:
- !AshbaughHatch {mixing: arithmetic, cutoff: 20.0}
Each atom entry defines charge, mass, Lennard-Jones-like size (sigma) and well depth (epsilon), and model-specific properties.
The nonbonded section specifies the short-range pair potential; different potentials can be assigned to specific atom pairs if needed.
Warning: The electrostatic Coulomb/Yukawa term is always added automatically. Do not include it in the topology.
Tuning and Options
Angular Resolution
The --max-ndiv flag sets the icosphere subdivision level, controlling angular mesh density:
--max-ndiv |
Vertices | Approx. angular spacing |
|---|---|---|
| 0 | 12 | 1.0 rad |
| 1 | 42 | 0.55 rad |
| 2 | 92 | 0.37 rad |
| 3 (default) | 162 | 0.28 rad |
Higher levels give more accurate angular integration at the cost of more energy evaluations per radial slice.
Adaptive Resolution
Duello automatically classifies each radial slab into tiers based on the angular energy gradient:
| Tier | Description |
|---|---|
| Repulsive | All Boltzmann weights negligible; zero storage, returns infinity |
| Scalar | Nearly isotropic surface; collapsed to a single value |
| Nearest-vertex | Smooth surface; nearest-vertex lookup, no interpolation |
| Interpolated | Full barycentric interpolation on icosphere faces |
The --gradient-threshold flag (default: 0.5 1/rad) controls when resolution is reduced. A summary is printed after table generation.
Cutoff Settings
The --cutoff flag (default 30 angstrom) sets the spline range for short-range pair potentials in GPU/SIMD backends. Beyond this distance the spline returns zero.
It does not affect the analytical Coulomb/Yukawa evaluation, which has no cutoff.
Important rules:
--cutoffmust be >= the largest cutoff defined in the topology (otherwise the spline silently truncates the potential).- Setting
--cutoffmuch larger than needed wastes spline points but is otherwise harmless. - Use
--sr-cutoffto match the actual SR potential range for best accuracy (e.g.--sr-cutoff 20when AshbaughHatch has cutoff 20). - The
referencebackend ignores--cutoffand evaluates potentials with their native cutoffs.
Spline Grid
The --grid flag controls spline interpolation of short-range potentials (GPU/SIMD backends):
| Key | Values | Default | Description |
|---|---|---|---|
type |
powerlaw2, invr2 |
powerlaw2 |
Grid spacing (invr2 avoids sqrt in lookup) |
size |
integer | 200 |
Number of grid points |
shift |
true, false |
true |
Shift energy to zero at cutoff |
energy_cap |
float or none |
none |
Cap repulsive wall (kJ/mol) for f32 precision |
Example: --grid "type=invr2,size=1000,shift=false,energy_cap=50"
Compute Backends
Duello automatically selects the best available backend. Performance on the Calvados3 lysozyme benchmark (2.4M poses, 128 atoms/molecule, Apple M4):
| Backend | Description | Poses/ms | Speedup |
|---|---|---|---|
reference |
Exact potentials (validation) | 48 | 1.0x |
simd |
NEON (aarch64) / AVX2 (x86) | 131 | 2.7x |
gpu |
wgpu compute shaders | 1065 | 22x |
auto (default) selects GPU if available, otherwise SIMD.
GPU and SIMD backends use cubic Hermite splines for short-range potentials and evaluate Coulomb/Yukawa analytically.
Interaction Models
Each macromolecule is represented by a rigid constellation of beads with properties defined in the topology. The inter-molecular energy $V(R,\Omega)$ is the sum of all pairwise bead-bead interactions.
Provided examples use:
- Calvados 3: Screened Coulomb + AshbaughHatch
- CPPM: Screened Coulomb + WeeksChandlerAndersen
Many additional pair potentials are available through the interatomic library (LennardJones, HardSphere, etc.).
Different pair potentials can be assigned to specific atom pairs in the topology.
Theory
The osmotic second virial coefficient reports on two-body interactions:
$$ \begin{align} B_2 & = -\frac{1}{16\pi^2} \int_{\mathbf{\Omega}} \int_0^{\infty} \left ( e^{-V(R,\mathbf{\Omega})/k_BT} - 1 \right ) R^2 dR d\mathbf{\Omega}\ & = -2\pi \int_0^{\infty} \left ( e^{-w(R)/k_BT} -1 \right )R^2 dR \ & = B_2^{hs} -2\pi \int_{\sigma}^{\infty} \left ( e^{-w(R)/k_BT} -1 \right )R^2 dR\ \end{align} $$
where $B_2^{hs} = 2\pi\sigma^3/3$ is the hard-sphere contribution and $\sigma$ is the distance of closest approach where $w(R\lt \sigma)=\infty$.
For systems with net attractive interactions, the dissociation constant is estimated by:
$$ K_d^{-1} = 2 N_A\left (B_2^{hs} - B_2\right ) $$
The rotational diffusion coefficient is estimated via the Zwanzig formula:
$$ D_r / D_r^0 = \frac{1}{\langle e^{\beta U} \rangle \cdot \langle e^{-\beta U} \rangle} $$
where the averages are over the 5D angular grid.
Examples
Ready-to-run examples are provided in scripts/ and examples/:
| Path | Description |
|---|---|
scripts/cppm.sh |
Spherical, multipolar particles using the CPPM model |
scripts/calvados3.sh |
Two coarse-grained lysozyme molecules with Calvados 3 |
A Google Colab notebook is also available:
Development
Publishing to PyPI via Docker
Run on macOS, Linux (x86 and arm) to cover all architectures:
docker run --rm -v $(pwd):/io ghcr.io/pyo3/maturin:v1.11.5 publish -u __token__ -p PYPI_TOKEN
Local Maturin build
pip install ziglang pipx
pipx install maturin
maturin publish -u __token__ -p PYPI_TOKEN --target=x86_64-unknown-linux-gnu --zig
macOS targets can be built without --zig:
rustup target add x86_64-apple-darwin aarch64-apple-darwin
maturin publish -u __token__ -p PYPI_TOKEN --target=aarch64-apple-darwin
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
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file duello-0.4.0.tar.gz.
File metadata
- Download URL: duello-0.4.0.tar.gz
- Upload date:
- Size: 1.2 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
44d7a507ed63d6c65ea3bc9ce416366938e3d536839167350e03b6f9f0dc6a44
|
|
| MD5 |
e7e31b65cdb8aa4b6305070f73d70e3a
|
|
| BLAKE2b-256 |
575660d4f25232c2d489d1997e9cafc8fb7778bf9d33055ac4c69a8232b79e30
|
Provenance
The following attestation bundles were made for duello-0.4.0.tar.gz:
Publisher:
pypi.yml on mlund/duello
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
duello-0.4.0.tar.gz -
Subject digest:
44d7a507ed63d6c65ea3bc9ce416366938e3d536839167350e03b6f9f0dc6a44 - Sigstore transparency entry: 1239395193
- Sigstore integration time:
-
Permalink:
mlund/duello@46b515125dfd0d181607d41ed43238d9f4553108 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/mlund
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@46b515125dfd0d181607d41ed43238d9f4553108 -
Trigger Event:
release
-
Statement type:
File details
Details for the file duello-0.4.0-py3-none-win_amd64.whl.
File metadata
- Download URL: duello-0.4.0-py3-none-win_amd64.whl
- Upload date:
- Size: 4.4 MB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2b036521b4357d2a6ad9fe45da5d11c980a696f0c2420fc22f6534ca187599a0
|
|
| MD5 |
5b6b93f40a203f15ad2d6fc2fd9e371d
|
|
| BLAKE2b-256 |
daf9fd8b6d69a6f5d2d6f3cc83611be4528336928b4c1e73f42bc6e84fd859d1
|
Provenance
The following attestation bundles were made for duello-0.4.0-py3-none-win_amd64.whl:
Publisher:
pypi.yml on mlund/duello
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
duello-0.4.0-py3-none-win_amd64.whl -
Subject digest:
2b036521b4357d2a6ad9fe45da5d11c980a696f0c2420fc22f6534ca187599a0 - Sigstore transparency entry: 1239395211
- Sigstore integration time:
-
Permalink:
mlund/duello@46b515125dfd0d181607d41ed43238d9f4553108 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/mlund
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@46b515125dfd0d181607d41ed43238d9f4553108 -
Trigger Event:
release
-
Statement type:
File details
Details for the file duello-0.4.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: duello-0.4.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 4.3 MB
- Tags: Python 3, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d8893135ce7d6d42c953bbe72d6bbe46f59f31fe8e4f134fa774bde9d9f85feb
|
|
| MD5 |
cfb59512467523275a383721fd670725
|
|
| BLAKE2b-256 |
0dbc9977c8ed2ed09acafe2ed9e72fe9bd767c0fddd20a79be0c390ce0a6d3c3
|
Provenance
The following attestation bundles were made for duello-0.4.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
pypi.yml on mlund/duello
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
duello-0.4.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
d8893135ce7d6d42c953bbe72d6bbe46f59f31fe8e4f134fa774bde9d9f85feb - Sigstore transparency entry: 1239395206
- Sigstore integration time:
-
Permalink:
mlund/duello@46b515125dfd0d181607d41ed43238d9f4553108 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/mlund
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@46b515125dfd0d181607d41ed43238d9f4553108 -
Trigger Event:
release
-
Statement type:
File details
Details for the file duello-0.4.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: duello-0.4.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 4.1 MB
- Tags: Python 3, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d827e4ff3eeafd24d368cd39def0dfaecbb2aee46dba8c669f9e39405d30666
|
|
| MD5 |
fa9d202c5ff31db7bc55c33ee3e76910
|
|
| BLAKE2b-256 |
c5a1c2eded06b416b30284591e60fcff330290d46fa6775d6a0384ec44774bfe
|
Provenance
The following attestation bundles were made for duello-0.4.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:
Publisher:
pypi.yml on mlund/duello
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
duello-0.4.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
4d827e4ff3eeafd24d368cd39def0dfaecbb2aee46dba8c669f9e39405d30666 - Sigstore transparency entry: 1239395196
- Sigstore integration time:
-
Permalink:
mlund/duello@46b515125dfd0d181607d41ed43238d9f4553108 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/mlund
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@46b515125dfd0d181607d41ed43238d9f4553108 -
Trigger Event:
release
-
Statement type:
File details
Details for the file duello-0.4.0-py3-none-macosx_11_0_arm64.whl.
File metadata
- Download URL: duello-0.4.0-py3-none-macosx_11_0_arm64.whl
- Upload date:
- Size: 3.6 MB
- Tags: Python 3, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f80f52e70e9bdaa64f01507ea8ab931dce9d464964a275e2e4160d060a101c7c
|
|
| MD5 |
e7085ff7838ac7466bc7a9e6674e459f
|
|
| BLAKE2b-256 |
5f91d794c50a9f95084c7efba690850e2a5e4fbf3c56f657552390571e6b53b6
|
Provenance
The following attestation bundles were made for duello-0.4.0-py3-none-macosx_11_0_arm64.whl:
Publisher:
pypi.yml on mlund/duello
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
duello-0.4.0-py3-none-macosx_11_0_arm64.whl -
Subject digest:
f80f52e70e9bdaa64f01507ea8ab931dce9d464964a275e2e4160d060a101c7c - Sigstore transparency entry: 1239395201
- Sigstore integration time:
-
Permalink:
mlund/duello@46b515125dfd0d181607d41ed43238d9f4553108 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/mlund
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@46b515125dfd0d181607d41ed43238d9f4553108 -
Trigger Event:
release
-
Statement type:
File details
Details for the file duello-0.4.0-py3-none-macosx_10_12_x86_64.whl.
File metadata
- Download URL: duello-0.4.0-py3-none-macosx_10_12_x86_64.whl
- Upload date:
- Size: 3.8 MB
- Tags: Python 3, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0f8518554a6ca3a51f56498c7498837647cc555649d121b4241915d05e31f376
|
|
| MD5 |
2d82cb2b89653cf0e5d172e95cdd8d74
|
|
| BLAKE2b-256 |
a5ba740a14d14860c39741732dd58f9db9d5da4f12e8b03c4112b38c3c4d2358
|
Provenance
The following attestation bundles were made for duello-0.4.0-py3-none-macosx_10_12_x86_64.whl:
Publisher:
pypi.yml on mlund/duello
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
duello-0.4.0-py3-none-macosx_10_12_x86_64.whl -
Subject digest:
0f8518554a6ca3a51f56498c7498837647cc555649d121b4241915d05e31f376 - Sigstore transparency entry: 1239395204
- Sigstore integration time:
-
Permalink:
mlund/duello@46b515125dfd0d181607d41ed43238d9f4553108 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/mlund
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@46b515125dfd0d181607d41ed43238d9f4553108 -
Trigger Event:
release
-
Statement type: