Anubis/TEQC-style code multipath estimation for every pseudorange observable in a RINEX file — per-code MP linear combinations, arc-wise ambiguity debiasing, interval-aware cycle-slip detection, and SNR series export. Built for continuous station monitoring on long time series of 1 s or 30 s data, following the methodology of Hunegnaw & Teferle (Sensors 2022).
Part of the GeoVeil suite together with geoveil-cn0 (CN0 signal quality and threat detection).
Live demo: batch.geoveil-rinex.eu — the GeoVeil batch dashboard runs this library in production: per-code MP RMS, cycle-slip counts, SNR-residual wavelet spectra, Fresnel zone maps, and long-term multipath trend monitoring on daily 30 s station data.
Website: miluta7.github.io/geoveil-mp
What's new in 1.0
- SNR wavelet analysis in Rust. Morlet continuous wavelet transform of detrended SNR per satellite, 95 % red-noise significance, and band power in period bands matched to the sampling interval.
- First Fresnel zone mapping. Zone semi-axes and specular-point distance for every track cell, for any antenna height and carrier (Hunegnaw & Teferle 2022, eq. 6).
- Same numbers, about 20x faster than the numpy reference that runs on the GeoVeil platform. Satellites run in parallel and the GIL is released.
- License: PolyForm Noncommercial 1.0.0 with attribution. Versions up to 0.2.1 remain MIT. See License.
Installation
pip install geoveil-mp
Pre-built wheels for Linux, Windows, and macOS — no Rust toolchain required.
# Rust
[dependencies]
geoveil_mp = "0.2"
Quick Start
import geoveil_mp as gm
obs = gm.read_rinex_obs("BOR100POL_R_20240010000_01D_30S_MO.rnx")
print(obs.num_epochs, obs.num_satellites, obs.interval) # 2880 104 30.0
analyzer = gm.MultipathAnalyzer(obs, elevation_cutoff=10.0, systems=["G", "R", "E", "C"])
results = analyzer.analyze()
# One statistics row per signal code: GPSM1C, GPSM2W, GALM8X, GLOM1P, BDSM2I, ...
for s in sorted(results.statistics, key=lambda s: s.signal):
print(f"{s.signal} rms={s.rms:.3f} m n={s.count} slips={s.cycle_slips}")
# Cycle slips, counted per carrier-phase signal
print(results.cycle_slip_counts) # {'GPSL1C': 210, 'GPSL2W': 168, ...}
# Attach precise elevations from SP3 (recomputes elevation-weighted RMS)
sp3 = gm.read_sp3("COD0MGXFIN_20240010000_01D_05M_ORB.SP3")
computed, failed = results.compute_elevations(sp3, obs.approx_position)
# SNR time series per satellite and S-code (for SNR-residual multipath analysis)
for series in obs.get_snr_series("G07"):
print(series.code, len(series), series.values[:3])
What it computes
Per-code multipath combinations
For every pseudorange code observable P_k (C1C, C1X, C2W, C2X, C5X, ...), the ionosphere-free, geometry-free multipath combination is formed with two carrier phases:
MP_k = P_k − (1 + 2/(α−1))·Φ_i + (2/(α−1))·Φ_j α = (f_i / f_j)²
Φ_i— phase on the code's own band;Φ_j— phase on a partner band chosen from a deterministic per-system priority list- GLONASS FDMA frequencies use the per-satellite channel numbers from the RINEX header
- The phase-ambiguity bias is removed per continuous arc: whole-arc mean for short arcs, centered moving average (default 1500 s) for long ones
- Arcs reset at data gaps, cycle slips, and MP jumps — slips never smear into the RMS
Signals are named in the convention used by GNSS monitoring literature: GPSM1C, GPSM2W, GLOM1P, GALM8X, BDSM2I.
Cycle-slip detection
Three detectors, thresholds that scale with the sampling interval (|Δ| > base + rate·dt):
| Method | Test | Default threshold |
|---|---|---|
| Geometry-free | ΔGF per phase code vs. reference band | 0.10 m + 0.003·dt |
| Code-phase | Δ(Φ − P) per code | 5.0 m + 0.10·dt |
| LLI | RINEX loss-of-lock flags (phase only) | — |
At 30 s sampling this detects single-cycle L1 slips (GF signature ≈ 0.29 m vs. threshold 0.19 m) — rate-based thresholds tuned for 1 s data cannot. Slips are attributed and counted per signal code (GPSL2W, GLOL1C, ...).
SNR series export
RinexObsData.get_snr_series(satellite, code=None) returns per-S-code time series (unix-second timestamps, dB-Hz values) — the input for SNR-residual multipath analysis (polynomial detrending, wavelet spectra) without re-parsing the file.
SNR wavelets and Fresnel zones (1.0)
w = gm.analyze_snr_wavelets(obs) # all satellites, in parallel
w["bands"] # [[60, 120], [120, 300], [300, 900], [900, 1800]] at 30 s
w["band_power"]["R02"]["power"] # binned scale-averaged power, one series per band
r = w["residuals"]["R02"] # detrended linear-amplitude SNR
s = gm.scalogram(r["t"], r["v"], w["interval"]) # power, periods, significance, coi
a, b, dist = gm.fresnel_zone(15.0, 2.0) # 2 m antenna, 15 deg, GPS L1 -> (4.896, 1.267, 7.464) m
zones = gm.fresnel_map([("G05", azimuths, elevations)], antenna_height=2.0)
- SNR is converted from dB-Hz to linear amplitude, split into arcs at gaps, and detrended per arc with the polynomial (order 2 to 9) that leaves the smallest residual RMS
- Morlet CWT follows the Torrence & Compo (1998) FFT formulation; significance is tested against a lag-1 red-noise background
- Period bands adapt to the interval because the article's 1 s bands are unreachable at 30 s sampling
- Fresnel footprints are sampled once per 10° × 10° azimuth/elevation cell above the elevation cutoff
Results on real data
24 h of BOR1 (EPN, Poland) 30 s multi-GNSS RINEX 3, default settings:
| Constellation | Best signal | RMS | Worst signal | RMS |
|---|---|---|---|---|
| Galileo | E5 AltBOC (M8X) | 0.165 m | E5b (M7X) | 0.395 m |
| GPS | L2C (M2X) | 0.312 m | L1 C/A (M1C) | 0.342 m |
| BeiDou | B2I (M7I) | 0.295 m | B3I (M6I) | 0.354 m |
| GLONASS | L2 P (M2P) | 0.318 m | L1 C/A (M1C) | 0.566 m |
The ranking (Galileo AltBOC best, GLONASS C/A worst) reproduces published station-monitoring results. Parsing the file takes ~0.4 s; the full 15-signal analysis with slip detection ~1.4 s (306 k estimates).
Analyzer options
gm.MultipathAnalyzer(
obs,
elevation_cutoff=10.0, # degrees; applied when elevations are known
systems=["G", "R", "E", "C"], # G R E C J S I
bias_window_seconds=1500.0, # moving-average window; None = whole-arc mean
min_arc_seconds=300.0, # drop shorter arcs
arc_gap_factor=5.0, # arc break at gap > factor × interval
include_codes=["C1C", "GC5X"],# restrict codes ("C1C" any system, "GC5X" GPS only)
exclude_codes=[],
max_epochs=None, # uniform decimation guard for huge files
detect_cycle_slips=True,
ion_delta_base=0.10, ion_delta_rate=0.003, # GF slip threshold (m, m/s)
cp_delta_base=5.0, cp_delta_rate=0.10, # code-phase slip threshold
)
API surface
| Object | Key members |
|---|---|
RinexObsData |
num_epochs, num_satellites, interval, marker_name, approx_position, satellites(), observation_types(sys), glonass_fcn(), snr_codes(sat), get_snr_series(sat, code=None) |
MultipathAnalyzer |
analyze() → AnalysisResults |
AnalysisResults |
estimates, statistics, cycle_slips, cycle_slip_counts, total_estimates(), total_cycle_slips(), compute_elevations(sp3, receiver) |
MultipathEstimate |
satellite, system, signal ("C1C"), epoch, mp_value, elevation, azimuth, snr |
MultipathStats |
signal ("GPSM1C"), system, code, count, rms, weighted_rms, mean, std_dev, min, max, cycle_slips |
CycleSlip |
satellite, epoch, signal, system, magnitude, threshold, method ("gf", "code_phase", "lli") |
SnrSeries |
satellite, system, code, times, values, epochs_iso() |
Sp3Data |
satellites(), get_position(sat, epoch), num_epochs, interval |
| Wavelets & Fresnel (1.0) | analyze_snr_wavelets(obs, satellites=None, interval=None, bands=None), scalogram, morlet_cwt, band_power, red_noise_significance, period_bands, detrend_arc, split_arcs, fresnel_zone, fresnel_map, GPS_L1_WAVELENGTH |
| Functions | read_rinex_obs, read_rinex_obs_bytes, read_sp3, calculate_azel, compute_elevation, get_frequency, get_wavelength, version |
Supported input: RINEX v2 / v3 / v4 observation files, SP3-c/d orbits, broadcast ephemerides (Keplerian + GLONASS RK4).
Pipeline
flowchart LR
A[RINEX v2/v3/v4] --> B[Parse<br/>code + phase + SNR]
B --> C[Per-code combos<br/>deterministic phase pairing]
B --> D[Cycle-slip detection<br/>GF · code-phase · LLI]
D --> E[Arc splitting]
C --> E
E --> F[Ambiguity debiasing<br/>mean / moving average]
F --> G[Per-signal statistics<br/>RMS · weighted RMS]
H[SP3 orbits] -.-> I[Elevations / azimuths]
I -.-> G
B --> J[SNR detrend<br/>per arc]
J --> K[Morlet CWT<br/>band power · significance]
I -.-> L[First Fresnel zones]
CLI
geoveil-mp analyze --obs station.rnx --sp3 orbits.sp3 --elevation 10 --output results/
geoveil-mp info --obs station.rnx
References
- Hunegnaw, A.; Teferle, F.N. Evaluation of the Multipath Environment Using Electromagnetic-Absorbing Materials at Continuous GNSS Stations. Sensors 2022, 22, 3384.
- Estey, L.H.; Meertens, C.M. TEQC: The Multi-Purpose Toolkit for GPS/GLONASS Data. GPS Solutions 1999, 3, 42–49.
- Václavovic, P.; Douša, J. G-Nut/Anubis: Open-Source Tool for Multi-GNSS Data Monitoring. IAG Symposia 2016, 143.
License
PolyForm Noncommercial 1.0.0 with an attribution term — see LICENSE.
Free for research, education, personal and other non-commercial use, provided you credit the author and cite the library (see Citation below). Commercial use requires a separate license — contact miluta.flueras@cartografie.ro.
Author
Miluta Dulea-Flueras — miluta.flueras@cartografie.ro
Citation
@software{geoveil_mp,
author = {Dulea-Flueras, Miluta},
title = {geoveil-mp: GNSS Code Multipath Analysis Library},
year = {2026},
version = {1.0.0},
url = {https://github.com/miluta7/geoveil-mp},
license = {PolyForm-Noncommercial-1.0.0}
}
Metadata
Release files for geoveil-mp 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| geoveil_mp-1.0.0.tar.gz | 637.7 kB | Details |
Built distributions (wheels)
Total release size: 8.3 MB
Release files / geoveil_mp-1.0.0.tar.gz
| Download URL | geoveil_mp-1.0.0.tar.gz |
|---|---|
| Size | 637.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ec71a90e50e42dddc494c1e440347f90e3ed8a038b933d3e03f8e8154aa39947
|
|
BLAKE2b-256 checksum How to use checksums |
ab30b49cfe365f7b417bc4ebbf76d2d369e1dacbb97504c2479f7602e19812d9
|
| 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 Sep 29, 2026.
Transparency logRelease files / geoveil_mp-1.0.0-cp312-cp312-win_amd64.whl
| Download URL | geoveil_mp-1.0.0-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 617.3 kB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
6a5ca41aab6b6f7f4385680d15afdca7f9845c0ab6122df9a849a15c103e2e1b
|
|
BLAKE2b-256 checksum How to use checksums |
4b5586b07b9a3128f32258590263fc5ffd28256b60cf56d2d5c7c3f1169312b2
|
| 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 Sep 29, 2026.
Transparency logRelease files / geoveil_mp-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | geoveil_mp-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 679.0 kB |
| Tags | CPython 3.12 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
7cef7aad40c142eee7557fd168ef3d41086a7ffe149e1cf1c8258b679e652186
|
|
BLAKE2b-256 checksum How to use checksums |
e8b9b8405ab8ef9386a5126ee978026e3828c2a20d965cc0dacd2b438cab5335
|
| 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 Sep 29, 2026.
Transparency logRelease files / geoveil_mp-1.0.0-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | geoveil_mp-1.0.0-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 624.3 kB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
3b0d5084d24b72a966ea0d00913e2bc0e589d8477e20b12d52e672f4a4f218a1
|
|
BLAKE2b-256 checksum How to use checksums |
423fbf1283c0fc163de6ac59355d003f2035813c2600b6c2521a822bb0d48cb3
|
| 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 Sep 29, 2026.
Transparency logRelease files / geoveil_mp-1.0.0-cp311-cp311-win_amd64.whl
| Download URL | geoveil_mp-1.0.0-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 616.2 kB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
249af5710aeb9d749102a55adb64edbb5675cf24672b5ad690063bad11a81ed6
|
|
BLAKE2b-256 checksum How to use checksums |
40ef4bace45eb20dfeed99a0dff81d880ce85015cd2e6fa512b058444bbd9493
|
| 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 Sep 29, 2026.
Transparency logRelease files / geoveil_mp-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | geoveil_mp-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 677.5 kB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
3358227cd69b8b0c5ba4c7a4e7894d25edb8cd22a6fe00509f70102d82baac23
|
|
BLAKE2b-256 checksum How to use checksums |
f304c9c891d89f804d538f9f5cd620a5f1eaa744f4af06549868486f70d57902
|
| 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 Sep 29, 2026.
Transparency logRelease files / geoveil_mp-1.0.0-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | geoveil_mp-1.0.0-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 624.6 kB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
d602cc82ddd87b7b6215855f85e0d1cf64804e4b4f1bdb64c7f4d49f164351da
|
|
BLAKE2b-256 checksum How to use checksums |
71100c3fe0d9b8627914c5a2caae8388deedd7b2e80478baefcfbd2c517cbdba
|
| 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 Sep 29, 2026.
Transparency logRelease files / geoveil_mp-1.0.0-cp310-cp310-win_amd64.whl
| Download URL | geoveil_mp-1.0.0-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 616.3 kB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
9f233c2404468f99b0e04388fb89f4f31b53e92a85232e4bc9c916625e5ae52c
|
|
BLAKE2b-256 checksum How to use checksums |
57fd2b6e9a95cf774d5cc58724291d6ad8a5485a0de12722077b6c28d5c5f2d4
|
| 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 Sep 29, 2026.
Transparency logRelease files / geoveil_mp-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | geoveil_mp-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 677.8 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
6d5c5422bdbd717010e6103df0783a310de566a54ca18cd18f97782eb4c7988a
|
|
BLAKE2b-256 checksum How to use checksums |
666f92e4608fddbaca7a4605bbe18ea793b15eb11dad0ff6e5cf3e266d682507
|
| 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 Sep 29, 2026.
Transparency logRelease files / geoveil_mp-1.0.0-cp310-cp310-macosx_11_0_arm64.whl
| Download URL | geoveil_mp-1.0.0-cp310-cp310-macosx_11_0_arm64.whl |
|---|---|
| Size | 624.7 kB |
| Tags | CPython 3.10 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
a84690f5be5fbb67ebec859ae479e34fc654a069c1f450a9fbd72c39aad2dca5
|
|
BLAKE2b-256 checksum How to use checksums |
01fef59b7cf43df10b54a0196e742096fa4a76d6656566e150e5c043dfdc23c8
|
| 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 Sep 29, 2026.
Transparency logRelease files / geoveil_mp-1.0.0-cp39-cp39-win_amd64.whl
| Download URL | geoveil_mp-1.0.0-cp39-cp39-win_amd64.whl |
|---|---|
| Size | 617.3 kB |
| Tags | CPython 3.9 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
edce0fa63ccff3a62dd4a060568e7aa1a7a4b16b72be7f632984d3995182aa64
|
|
BLAKE2b-256 checksum How to use checksums |
e32f3996a0cdd310aeabfbed286cfced1c4d5ad89ffdee5063bd73f6289b91a1
|
| 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 Sep 29, 2026.
Transparency logRelease files / geoveil_mp-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | geoveil_mp-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 678.6 kB |
| Tags | CPython 3.9 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
d4316c2c67dcf8602380e473a59fe49410557b4975abf9860056b93692ef8eb6
|
|
BLAKE2b-256 checksum How to use checksums |
e48448e2a26da77a8769469bcf4666e83ac09f227c407972c51e50a6b4593c59
|
| 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 Sep 29, 2026.
Transparency logRelease files / geoveil_mp-1.0.0-cp39-cp39-macosx_11_0_arm64.whl
| Download URL | geoveil_mp-1.0.0-cp39-cp39-macosx_11_0_arm64.whl |
|---|---|
| Size | 625.6 kB |
| Tags | CPython 3.9 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
aded8986fadb3bfbad6ac61d439982d511a055b0478f70579f27f26e4cb94e7d
|
|
BLAKE2b-256 checksum How to use checksums |
8cbe15710b11cf9002c4877e50726c7bd5623cc248fbcf61de34a8bba6a1faee
|
| 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 Sep 29, 2026.
Transparency log