Skip to main content

BSMScanner

bsm-scanner is a framework for fast parameter scans of Beyond-the-Standard-Model physics models. You describe a model in YAML -- parameters, constants, derived quantities, matrices, observables, theory checks, likelihoods -- and the framework compiles it into a dependency graph, evaluates it in a compiled C++ core, and drives a parameter scan over it.

It is built around a sharp split:

  • Python owns model definition, validation, graph construction, scan orchestration, and result loading.
  • C++ owns hot-loop point evaluation, typed caching, matrix algebra, diagonalization, and likelihood accumulation.
  • Optional Fortran for isolated numerical kernels or external scanner bridges.

Your model lives in your own directory, not inside the framework. You write YAML, optionally import the reusable physics blocks the package ships (shared constants, neutrino/quark observable definitions, oscillation data tables), and run.

Installation

pip install bsm-scanner

While the package is only published to TestPyPI (a real PyPI release is not out yet), dependencies have to come from the real index instead, since TestPyPI does not mirror them:

pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ bsm-scanner

CI publishes prebuilt wheels via cibuildwheel for:

Platform Architecture Python
macOS arm64 (Apple Silicon) 3.10 - 3.13
Linux x86_64, glibc >= 2.28 (manylinux_2_28) 3.10 - 3.13

On a matching machine, installation needs nothing beyond pip. Eigen3 -- the only native dependency besides pybind11 -- is header-only, so it is only needed while building the C++ extension, not at install or runtime; nothing links against it once compiled. The Linux wheels are also passed through auditwheel repair as part of the build, which fails the build outright (rather than shipping a broken wheel) if the compiled extension ends up depending on any shared library outside the manylinux_2_28 baseline. So on either platform above, there is nothing to separately install for Eigen3, CMake, or a C++ compiler.

Outside that matrix -- Windows, Linux aarch64, macOS x86_64 (Intel), musllinux (Alpine), or a Python version other than 3.10-3.13 -- pip install silently falls back to building from the source distribution instead, which needs everything in Prerequisites below already installed on your machine, and will fail with a CMake not found or Eigen3 was not found error otherwise.

From source

Clone the repository, install the Prerequisites below, then see Build.

Quickstart

Start from a working template rather than an empty file:

pip install bsm-scanner
bsm-scanner new-model mymodel
bsm-scanner run --model mymodel/model.yaml --run-dir mymodel/runs/first

That creates a small, complete, runnable model you can edit. It runs immediately, so you always have a working baseline to modify.

Model syntax

A model is one or more YAML files under a schema with a fixed set of top-level sections -- parameters, constants, functions, derived_scalars, derived_complex, matrices, diagonalizations, observables, theory_checks, likelihoods, outputs, and scan. A trimmed real example (trimmed from the original single-file benchmarks/manuscript_models/minimal_bl/model.yaml, a gauged B-L benchmark):

metadata:
  name: minimal_bl_gauge
  version: 0.1.0

parameters:
- {name: gBL, value_type: real, scan: true, lower: 0.001, upper: 1.0, default: 0.1, prior: log}
- {name: vBL, value_type: real, scan: true, lower: 1000.0, upper: 100000.0, default: 70000.0, prior: log}

constants:
- {name: v_sm, value: 246.22}

derived_scalars:
- {name: MZp, value_type: real, expression: "2.0*gBL*vBL"}

observables:
- {name: MZprime, value_type: real, expression: MZp}

theory_checks:
- {name: positive_masses, condition: "MZp > 0", fatal: true, message: MZp must be positive.}

likelihoods:
- {name: lep_contact_bound, kind: hard_cut, observable: MZprime, lower: 7000.0, upper: 1.0e9}

outputs:
  save: [MZprime]

scan:
  engine: serial_random
  save_every: 100
  seed: 11064462
  settings: {objective: nll, max_evaluations: 2000}

The Python layer validates these sections, resolves dependencies, rejects cycles, expands reusable analytic functions, and lowers the active subgraph into a compact plan that the C++ core evaluates point by point. Matrices carry metadata (type, role, diagonalize: true) that triggers automatic diagonalization -- see docs/matrix_diagonalization.md and docs/core_model_split.md.

Reusable physics blocks

The framework ships a library of model-independent building blocks -- constants, neutrino/quark observable definitions, oscillation data tables. Reference them with the core: prefix, which resolves to wherever the package is installed, so your model works no matter which directory it lives in:

imports:
  - core:constants/physics_constants.yaml
  - core:neutrino/observables_common.yaml
  - core:neutrino/observables_normal.yaml
  - my_parameters.yaml       # your own files stay relative
  - my_matrices.yaml
bsm-scanner core list                                    # every shipped block
bsm-scanner core show core:quark/quark_mass_ratios.yaml   # what a block defines
bsm-scanner core path                                     # where they live

See docs/authoring_models.md for the full authoring guide, including what each shipped block provides and the division between what belongs in the reusable core versus in your own model.

Python API

from pathlib import Path

from bsm_scanner import compile_model, load_model, run_scan

model = load_model("models/minimal_bl/model.yaml")
compiled = compile_model(model, build_backend=True)
results = run_scan(model, compiled, run_directory=Path("runs/minimal_bl_example"))
print(results.summary)

The example launcher uses the same path:

python examples/minimal_bl/run_scan.py --run-dir examples/minimal_bl/runs/example_scan

Core Concepts

  • ModelDefinition: validated user-facing representation of a model.
  • ModelGraph: named dependency graph over parameters, derived quantities, matrices, diagonalizations, observables, theory checks, likelihoods, and outputs.
  • CompiledModelSpec: Python-lowered plan that contains bytecode-like expression programs plus typed node metadata.
  • CompiledModel: immutable C++ evaluation object safe to reuse across many scan points and threads.
  • PointResult: structured result for one point, including outputs, likelihood terms, total likelihood, flags, and invalid-point diagnostics.

Prerequisites

These are only needed for a from-source build -- i.e. cloning this repository, or installing on a platform/Python version outside the prebuilt-wheel matrix above.

  • Python >= 3.10

  • A C++20 compiler (tested with GCC >= 11 and Apple Clang)

  • CMake >= 3.20

  • Eigen3 >= 3.4 -- a system dependency, not vendored. Install it first:

    brew install eigen              # macOS
    sudo apt-get install libeigen3-dev   # Debian/Ubuntu
    conda install -c conda-forge eigen   # conda
    

    CMakeLists.txt also looks under /usr/include, /usr/local/include, and /opt/homebrew/include directly, or you can point it at a specific install with -DEigen3_DIR=/path/to/eigen/share/eigen3/cmake.

Build

Python packaging is driven by scikit-build-core, with CMake building the C++ extension. The root build discovers plugin sources under src/plugins/*.cpp automatically and includes any plugin-local CMake fragments under cmake/plugins/*.cmake, so new backend integrations do not require editing the framework CMakeLists.txt.

pip install -e .

To configure without the optional Diver or Fortran layers:

cmake -S . -B build
cmake --build build -j

To build the native Diver bridge:

CMAKE_ARGS="-DBSM_SCANNER_BUILD_DIVER=ON -DBSM_SCANNER_DIVER_ROOT=/path/to/Diver" \
pip install -e .[dev]

To enable the SciPy differential-evolution reference backend:

python -m pip install -e '.[de]'

Command Line

The installable package exposes a small CLI:

bsm-scanner --help
bsm-scanner --version
python -m bsm_scanner --help
bsm-scanner new-model mymodel
bsm-scanner core list

A lightweight installed smoke example is available without any model file:

bsm-scanner run --example quadratic --run-dir runs/quadratic-smoke

Full physics scans use model-local YAML files, for example:

bsm-scanner run --model models/scotogenic_ma/model_no.yaml --run-dir runs/scotogenic-no

Models that request the external diver engine still require a Diver-enabled native build.

Available scan engines:

  • serial_random
  • diver
  • de_scipy
  • adaptive_diver
  • basin_scan

de_scipy is a reference backend built on scipy.optimize.differential_evolution. It exists to validate the framework's DE engine contract and to provide a comparison baseline.

adaptive_diver is the native model-agnostic adaptive Differential Evolution engine. It uses the same evaluator/objective pipeline as the other engines, supports final-population diagnostics, and can optionally refine elite points with SciPy local minimizers.

basin_scan explores broadly first, clusters the surviving valid points, builds a focused sub-box around each cluster, and runs adaptive_diver inside each box. It is the strongest strategy on benchmarks with a sparse, clustered valid region (see docs/published_benchmark_validation.md), and the weakest on benchmarks where the valid region is a broad, degenerate plateau -- engine choice should follow the shape of the likelihood, not a fixed default.

An optional statistics layer can also post-process completed scan outputs into plot-ready CSV and JSON artifacts. It is configured through a top-level statistics: block, writes under run_directory/statistics, and intentionally does not generate plots inside the framework.

scan.settings is reserved for actual runner controls such as maxgen, population_size, and objective. Unknown keys are rejected instead of being silently echoed into metadata.

Core Reusable YAML

The core tree is for framework-owned YAML that is still declarative rather than hardcoded into the evaluator. It centralizes:

  • shared physics constants
  • ordering-aware neutrino observable blocks
  • CKM observable and construction blocks
  • core/common observable wiring that depends only on declared matrix roles and automatic diagonalization

Models are expected to keep their own:

  • parameters
  • analytic matrix definitions
  • scan settings
  • likelihood blocks and dataset choices
  • plugins or custom likelihood terms when they are genuinely model-specific

models/scotogenic_ma is a full-scale example of this split, and benchmarks/manuscript_models/minimal_bl the simplest single-file case. See docs/core_model_split.md for the full rationale.

Remote Sync And Build

To sync this workspace to a remote build host and build it there, set the destination first:

export REMOTE_HOST=user@host
export REMOTE_DIR=/path/on/remote/BSMScanner

./scripts/sync_to_remote.sh
./scripts/build_on_remote.sh

Both variables are required; the scripts exit with a message if either is unset.

Benchmark Models

models/ holds the tutorial models. Six were reviewed against their source papers and corrected (each directory has a CHANGES.md listing every fix with its source, a tests/ directory, and a run_best_fit.py); the seventh is the original benchmark, not yet reviewed:

  • scotogenic_ma -- radiative (one-loop) neutrino mass with dark matter; corrected
  • minimal_bl -- gauged U(1)_B-L with a seesaw and a Z'; corrected
  • two_higgs_doublet -- Type II two-Higgs-doublet model; corrected
  • smeft_wilson -- SMEFT, Warsaw basis, 9 Wilson coefficients; corrected
  • zprime_simplified -- Z' simplified dark matter (LHC DM Forum benchmark); corrected
  • leptoquark_brw -- S1 scalar leptoquark (flavour anomalies); replaces the original BRW proxy
  • alp_effective -- axion-like-particle effective couplings (original benchmark)

Some corrected models use external HEPData tables that are not redistributed here. For minimal_bl, zprime_simplified and leptoquark_brw, model.yaml runs without that constraint and model_with_*.yaml adds it once the tables are placed in data/ (see each data/README.md); two more constraints are marked INTERIM or PENDING in their CHANGES.md. Shared references are in models/references.bib.

benchmarks/manuscript_models/ keeps the seven original benchmark models used by the companion methodology study (four scan engines at matched budget), unchanged, so that study and tests/test_published_benchmark_validation.py remain reproducible. Runnable examples are under examples/<name>/; see docs/published_benchmark_validation.md for what the original benchmarks validate formula-by-formula versus what is a simplified analytic proxy.

Tutorial notebooks (one per model, pre-executed) are under notebooks/ -- see notebooks/README.md.

Repository Layout

BSMScanner/
├── CMakeLists.txt
├── pyproject.toml
├── CHANGELOG.md
├── README.md
├── docs/                    # one file per subsystem -- see Documentation below
├── core/                    # reusable, model-independent YAML (core: prefix)
│   ├── constants/
│   └── neutrino/
├── examples/                # small runnable end-to-end examples, one per model
│   └── <name>/
│       ├── model.yaml
│       └── run_scan.py
├── models/                  # tutorial models (see Benchmark Models)
│   └── <name>/
│       ├── model.yaml
│       ├── parameters.yaml
│       ├── constraints/
│       ├── outputs.yaml
│       ├── CHANGES.md       # corrected models: every fix with its source
│       ├── tests/           # validation against independent re-implementations
│       └── run_best_fit.py
├── benchmarks/
│   └── manuscript_models/   # the original seven benchmark models (methodology study)
├── fortran/
│   └── kernels/
├── include/
│   └── bsm/core/            # C++ evaluation core headers
├── python/
│   └── bsm_scanner/         # Python package: api, compiler, model, scan
├── src/
│   ├── constraints.cpp
│   ├── evaluator.cpp
│   ├── plugins/             # backend plugins, auto-discovered at build time
│   └── scan/
├── notebooks/                # pre-executed tutorial notebooks
│   └── README.md
└── tests/                    # pytest suite
    └── fixtures/

Documentation

Metadata

Release files for bsm-scanner 0.2.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 bsm-scanner 0.2.0
File Size Uploaded
bsm_scanner-0.2.0.tar.gz 10.6 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for bsm-scanner 0.2.0
File
bsm_scanner-0.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
bsm_scanner-0.2.0-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
bsm_scanner-0.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
bsm_scanner-0.2.0-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
bsm_scanner-0.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
bsm_scanner-0.2.0-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
bsm_scanner-0.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
bsm_scanner-0.2.0-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details

Total release size: 15.0 MB

Release files / bsm_scanner-0.2.0.tar.gz

Download URL bsm_scanner-0.2.0.tar.gz
Size 10.6 MB
Tags Source
SHA-256 checksum
How to use checksums
54b21a56b589e44d67ab097c4ade30b69953a20f697bd11a8939e02d981ef450
BLAKE2b-256 checksum
How to use checksums
8d46b261f4cfe3b139d61292806f9afec78416d84f685cab6778cd0e0b8e0241
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 6, 2026.

Transparency log

Release files / bsm_scanner-0.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL bsm_scanner-0.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 647.1 kB
Tags CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
93f6889a173b999fef14d827e3210391cee5752658003b9ec78bcf971285d4f0
BLAKE2b-256 checksum
How to use checksums
9264b5c45d6283c943353d3df2e230dd8525cf7ae90c809ed0651c7e180267bb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 6, 2026.

Transparency log

Release files / bsm_scanner-0.2.0-cp313-cp313-macosx_11_0_arm64.whl

Download URL bsm_scanner-0.2.0-cp313-cp313-macosx_11_0_arm64.whl
Size 466.4 kB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
eb993f3241db749044775196d6acfd2e7cf2bb48a3245d14a9f40ac59b14fc4b
BLAKE2b-256 checksum
How to use checksums
9bf4b8dc94452f5103e6fce57b0a5cb163cf1fa76042854bcef1a7f391e61ff9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 6, 2026.

Transparency log

Release files / bsm_scanner-0.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL bsm_scanner-0.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 647.0 kB
Tags CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
0e4310d137881992abcb928e559eeabd776bfaf11a196aeb96abf04da716a0fd
BLAKE2b-256 checksum
How to use checksums
7429f0bf6221a17f143586becfaafa280019a4f12c5e3f5747449c8c659ab937
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 6, 2026.

Transparency log

Release files / bsm_scanner-0.2.0-cp312-cp312-macosx_11_0_arm64.whl

Download URL bsm_scanner-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
Size 466.4 kB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
8b66b7efec1d2e52fca8258fa04ce58d15386dbd4ac557cb6f5f692669878b70
BLAKE2b-256 checksum
How to use checksums
f60d58a35ae19d7089dd78e452b63dff81f497272b90cf5d8972d47b3ad8e100
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 6, 2026.

Transparency log

Release files / bsm_scanner-0.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL bsm_scanner-0.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 643.2 kB
Tags CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
cf71063090c882d076c71d5b398498c0548059b03e77ff4aef750db99cf55fa5
BLAKE2b-256 checksum
How to use checksums
20b320bf54a3c6500a8f25c1b16b9b4d03c22c972e597dcd4f4f05dce97e558e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 6, 2026.

Transparency log

Release files / bsm_scanner-0.2.0-cp311-cp311-macosx_11_0_arm64.whl

Download URL bsm_scanner-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
Size 464.7 kB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
062bf817db6362a400794337294ea3a56f76c87d05a89576dc8f4c01eb677b6f
BLAKE2b-256 checksum
How to use checksums
2ece5f2420d9e277f87b317f038994ddbde4ac226d2522a09ac3884b22ec06e1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 6, 2026.

Transparency log

Release files / bsm_scanner-0.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL bsm_scanner-0.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 642.4 kB
Tags CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
e29cae3d66da49671da07578d68ec29cf4c985d316da815eeca162a0928b58ef
BLAKE2b-256 checksum
How to use checksums
34a836b022cfd928463ce671fef3b7603bb11d58770b8e580b9310f89950c41f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 6, 2026.

Transparency log

Release files / bsm_scanner-0.2.0-cp310-cp310-macosx_11_0_arm64.whl

Download URL bsm_scanner-0.2.0-cp310-cp310-macosx_11_0_arm64.whl
Size 463.3 kB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
1a26deee7b096c66213ca172378280a0b91bdf50048fe9e0832868a8bef49e6e
BLAKE2b-256 checksum
How to use checksums
3ae0955a06a491dcb3ff2f69891b9ae265bb2f95f4f6e3bc7859773c63a84308
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 6, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.0 This release

9 release files

0.1.8

9 release files

0.1.7

9 release files

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