sentinel-processor
Sentinel-2 L2A downloader and processing toolkit built on the Element84 STAC API.
Downloads spectral bands, quality layers, and visual overviews for any coordinate. Validation, spectral index computation, convolution filters, pansharpening, wavelet denoising, time-series stacking, and band covariance are all backed by compiled Fortran kernels — Python handles I/O and orchestration, Fortran handles the pixels.
Try it live: the full package walkthrough — download, indices, filters, time series, phenology, DL preprocessing — runs end-to-end in this Kaggle demo notebook.
Features
| Module | What it does |
|---|---|
| Downloader | STAC search → parallel band fetch → validation → save .tif / .nc |
| Validation | SCL cloud/snow analysis, radiometry check, dimension check (Fortran) |
| Indices | 10 spectral indices: NDVI, EVI, SAVI, NDWI, MNDWI, NDBI, NBR, NDSI, CIG, ARVI (Fortran) |
| Filters | 14 convolution and morphological filters: Gaussian, bilateral, Sobel, Laplacian, unsharp mask, median, erosion, dilation, top-hat, arbitrary kernel (Fortran) |
| Pansharpening | Gram-Schmidt, IHS, Wavelet — inject PAN detail into MS bands (Fortran) |
| Wavelet | Multi-level 2-D/3-D DWT with 6 orthogonal wavelets, BayesShrink denoising, batch multi-spectral processing, sub-band energy and statistics (Fortran) |
| Time series | Quality-filtered temporal stack builder with cloud/snow filtering, alignment, and save (Fortran validation + raster ops) |
| Gap filling | Fill cloud-masked holes in time stacks: linear, Savitzky-Golay, PCHIP, Holt ETS, Gaussian (Fortran) |
| Texture | GLCM texture features per pixel: energy, contrast, homogeneity — window, distance, and angle-configurable (Fortran) |
| Analysis | 14 per-pixel temporal statistics: coverage, gap stats, quantiles, IQR outlier mask, rolling mean/std/slope, z-score anomaly, Mann-Kendall trend test, Theil-Sen robust slope, BFAST structural break, OLS regression with R², phenology (SOS/EOS/peak), Pearson correlation (Fortran) |
| Covariance | Per-band covariance matrix — single-pass Kahan-compensated algorithm for PCA, feature reduction, and Mahalanobis anomaly detection (Fortran) |
| DL preprocessing | Per-band normalisation (min–max, z-score, SSL4EO-S12 / SeCo presets), dataset statistics with Welford aggregation, overlapping tile extraction and cosine-blended stitching (Fortran + Python) |
| Visualisation | Interactive Plotly figures: band heatmap, RGB composite, multi-panel grid, SCL mask, pixel/region time series with cloud markers |
Installation
pip install sentinel-processor
For NetCDF output:
pip install "sentinel-processor[netcdf]"
All optional extras:
pip install "sentinel-processor[all]"
Fortran libraries
The Fortran kernels must be compiled once before validation, indices, filters, pansharpening, wavelet, time-series alignment, and covariance are available. Without them the downloader still works; set validate=False and skip Fortran-dependent calls.
Linux / macOS
gfortran -O2 -shared -fPIC \
-o sentinel_processor/validation/fortran/libsentinel_validation.so \
sentinel_processor/validation/fortran/validation.f90
gfortran -O2 -shared -fPIC \
-o sentinel_processor/indices/fortran/libsentinel_indices.so \
sentinel_processor/indices/fortran/indices_mod.f90
gfortran -O2 -shared -fPIC \
-o sentinel_processor/processing/fortran/libsentinel_raster_ops.so \
sentinel_processor/processing/fortran/raster_ops.f90
gfortran -O2 -shared -fPIC \
-o sentinel_processor/processing/fortran/libsentinel_processing.so \
sentinel_processor/processing/fortran/pansharpening.f90
gfortran -O2 -shared -fPIC \
-o sentinel_processor/processing/fortran/libsentinel_timeseries.so \
sentinel_processor/processing/fortran/timeseries_mod.f90
gfortran -O2 -shared -fPIC \
-o sentinel_processor/filters/fortran/libsentinel_filters.so \
sentinel_processor/filters/fortran/filters.f90
gfortran -O2 -shared -fPIC \
-o sentinel_processor/analysis/fortran/libsentinel_stats.so \
sentinel_processor/analysis/fortran/sentinel_stats.f90
gfortran -O2 -shared -fPIC \
-o sentinel_processor/analysis/fortran/libband_covariance.so \
sentinel_processor/analysis/fortran/band_covariance.f90
gfortran -O2 -shared -fPIC \
-o sentinel_processor/texture/fortran/libsentinel_texture.so \
sentinel_processor/texture/fortran/texture_mod.f90
gfortran -O2 -shared -fPIC \
-o sentinel_processor/wavelet/fortran/libsentinel_wavelet.so \
sentinel_processor/wavelet/fortran/wavelet_mod.f90
gfortran -O2 -shared -fPIC \
-o sentinel_processor/dl/fortran/libsentinel_normalize.so \
sentinel_processor/dl/fortran/normalize_mod.f90
Windows (MSYS2 UCRT64 — do not use -static-libgfortran on GCC 16+)
gfortran -O2 -shared -o sentinel_processor\validation\fortran\libsentinel_validation.dll sentinel_processor\validation\fortran\validation.f90
gfortran -O2 -shared -o sentinel_processor\indices\fortran\libsentinel_indices.dll sentinel_processor\indices\fortran\indices_mod.f90
gfortran -O2 -shared -o sentinel_processor\processing\fortran\libsentinel_raster_ops.dll sentinel_processor\processing\fortran\raster_ops.f90
gfortran -O2 -shared -o sentinel_processor\processing\fortran\libsentinel_processing.dll sentinel_processor\processing\fortran\pansharpening.f90
gfortran -O2 -shared -o sentinel_processor\processing\fortran\libsentinel_timeseries.dll sentinel_processor\processing\fortran\timeseries_mod.f90
gfortran -O2 -shared -o sentinel_processor\filters\fortran\libsentinel_filters.dll sentinel_processor\filters\fortran\filters.f90
gfortran -O2 -shared -o sentinel_processor\analysis\fortran\libsentinel_stats.dll sentinel_processor\analysis\fortran\sentinel_stats.f90
gfortran -O2 -shared -o sentinel_processor\analysis\fortran\libband_covariance.dll sentinel_processor\analysis\fortran\band_covariance.f90
gfortran -O2 -shared -o sentinel_processor\texture\fortran\libsentinel_texture.dll sentinel_processor\texture\fortran\texture_mod.f90
gfortran -O2 -shared -o sentinel_processor\wavelet\fortran\libsentinel_wavelet.dll sentinel_processor\wavelet\fortran\wavelet_mod.f90
gfortran -O2 -shared -o sentinel_processor\dl\fortran\libsentinel_normalize.dll sentinel_processor\dl\fortran\normalize_mod.f90
After compiling on Windows, copy the MSYS2 runtime DLLs next to each .dll:
for %d in (validation indices processing filters analysis texture wavelet dl) do (
copy C:\msys64\ucrt64\bin\libgfortran-5.dll sentinel_processor\%d\fortran\
copy C:\msys64\ucrt64\bin\libgcc_s_seh-1.dll sentinel_processor\%d\fortran\
copy C:\msys64\ucrt64\bin\libwinpthread-1.dll sentinel_processor\%d\fortran\
)
Quick start
import sentinel_processor as sp
from sentinel_processor.indices.compute import compute_indices
from sentinel_processor.filters import apply_filter
from sentinel_processor.input.timeseries import stack_timeseries, TimeSeriesConfig
from sentinel_processor.visualisation.plot import plot_band, plot_rgb, plot_grid, plot_mask, plot_timeseries
from pathlib import Path
# 1. Download
results = sp.download_sentinel2(
[sp.LocationSpec(lat=47.56, lon=19.17, name="budapest")],
cfg=sp.DownloadConfig(
keep_items = 10,
save_report = True,
),
)
scene = "data/spectral/budapest_20260526T095725.nc"
vis = "data/visual/vis_budapest_20260526T095725.nc"
scl = "data/technical/scl_budapest_20260526T095725.nc"
# 2. Spectral indices
idx = compute_indices(scene, ["ndvi", "ndwi", "ndbi"])
# 3. Filters
import rioxarray
nir = rioxarray.open_rasterio(scene).sel(band="nir").squeeze().values
nir_smooth = apply_filter(nir, "bilateral", sigma_s=2.0, sigma_r=0.08)
nir_edges = apply_filter(nir, "sobel_magnitude")
nir_sharp = apply_filter(nir, "unsharp_mask", sigma=1.5, amount=1.2)
# 4. Wavelet denoising
import numpy as np
from sentinel_processor.wavelet._wavelet_bridge import (
dwt2d, idwt2d, threshold_coeffs,
bayes_denoise,
dwt2d_batch, idwt2d_batch,
dwt3d, idwt3d,
band_energy, band_stats,
)
# One-liner BayesShrink denoising
nir_f64 = nir.astype(np.float64)
nir_clean = bayes_denoise(nir_f64, levels=3, wavelet="db4")
# Manual control: forward DWT → inspect sub-bands → threshold → inverse
coeffs = dwt2d(nir_f64, levels=3, wavelet="sym4")
for lv in sorted(coeffs):
e = band_energy(coeffs[lv]["HH"])
s = band_stats(coeffs[lv]["HH"])
print(f"L{lv} HH energy={e:.2f} linf={s['linf']:.4f}")
thresholded = threshold_coeffs(coeffs, threshold=0.02, mode="soft")
nir_denoised = idwt2d(thresholded, wavelet="sym4")
# Batch denoising for a multi-spectral stack (n_bands, rows, cols)
ms = rioxarray.open_rasterio(scene).values.astype(np.float64) # (n_bands, rows, cols)
coeffs_list = dwt2d_batch(ms, levels=2, wavelet="db4")
recon_stack = idwt2d_batch(coeffs_list, wavelet="db4")
# 3-D DWT on a temporal cube (n_times, rows, cols)
result = stack_timeseries(
sources = sorted(Path("data/spectral").glob("budapest_*.nc")),
scl_dir = "data/technical",
cfg = TimeSeriesConfig(
max_cloud_fraction = 0.10,
min_confidence = 0.75,
save_dir = "data/stacks",
),
)
da = result.stack # xr.DataArray (time, band, y, x) float32
nir_idx = list(da.coords["band"].values).index("nir")
nir_cube = da.values[:, nir_idx].astype(np.float64) # (n_times, rows, cols)
# Apply separable 3-D DWT — spatial + temporal at once
# n_times must be a power of 2; pad if needed
coeffs_vol = dwt3d(nir_cube, levels=2, wavelet="haar")
nir_cube_back = idwt3d(coeffs_vol, wavelet="haar")
# 5. Gap filling
from sentinel_processor.processing._timeseries_bridge import interpolate_gaps
from sentinel_processor.analysis._sentinel_stats_bridge import (
time_window_stats, anomaly_zscore, mann_kendall,
phenology_metrics, save_phenology, NODATA,
)
arr = da.values.astype(np.float64)
mask = np.isfinite(arr).astype(np.int32)
filled = np.empty_like(arr)
for b in range(arr.shape[1]):
filled[:, b] = interpolate_gaps(arr[:, b], mask[:, b], method="pchip")
# 6. Temporal analysis
nir = filled[:, nir_idx]
dates = [s.timestamp for s in result.scenes]
mk = mann_kendall(nir, dates)
bg = time_window_stats(nir, dates, window_days=90)
z = anomaly_zscore(nir, dates, background=bg)
ri = list(da.coords["band"].values).index("red")
ndvi = (nir - filled[:, ri]) / (nir + filled[:, ri] + 1e-9) / 10_000.0
metrics = phenology_metrics(ndvi, dates)
save_phenology(metrics, "data/analysis/phenology", crs="EPSG:32633")
# 7. Per-band covariance → PCA
from sentinel_processor.analysis._band_covariance_bridge import band_covariance
scene_cube = filled[0] # (n_bands, rows, cols)
cov = band_covariance(scene_cube)
eigenvalues, eigenvectors = np.linalg.eigh(cov)
# 8. Visualise
plot_rgb(vis).show()
plot_band(idx["ndvi"], colorscale="RdYlGn").show()
plot_mask(scl).show()
plot_grid([
{"file": scene, "band": "nir", "label": "NIR"},
{"file": idx["ndvi"], "label": "NDVI", "colorscale": "RdYlGn"},
{"file": idx["ndwi"], "label": "NDWI", "colorscale": "Blues"},
], ncols=3).show()
plot_timeseries(
stack=result.stack,
lon=19.17, lat=47.56,
bands=["ndvi", "evi"],
scl_path="data/technical/",
agg_bbox=0.002,
save_html="data/vis/timeseries.html",
).show()
Modules
| Module | Description | Docs |
|---|---|---|
sentinel_processor |
Download, STAC search, validation | DOWNLOADER.md |
sentinel_processor.indices |
Spectral index computation | INDICES.md |
sentinel_processor.filters |
Spatial filters | FILTERS.md |
sentinel_processor.wavelet |
Wavelet DWT, denoising, sub-band analysis | WAVELET.md |
sentinel_processor.processing |
Pansharpening, raster ops, gap filling | PANSHARPENING.md |
sentinel_processor.input.timeseries |
Time-series stacking | TIMESERIES.md |
sentinel_processor.analysis |
Temporal stats, phenology, trends | ANALYSIS.md |
sentinel_processor.analysis (covariance) |
Band covariance, PCA support | COVARIANCE.md |
sentinel_processor.texture |
GLCM texture features | TEXTURE.md |
sentinel_processor.visualisation |
Plotly visualisation | VISUALISATION.md |
Code examples
Spectral indices
from sentinel_processor.indices.compute import compute_indices, list_indices
print(list_indices())
# ['arvi', 'cig', 'evi', 'mndwi', 'nbr', 'ndbi', 'ndsi', 'ndvi', 'ndwi', 'savi']
paths = compute_indices("data/spectral/scene.nc", ["ndvi", "evi", "ndwi"])
# paths == {'ndvi': Path('...'), 'evi': Path('...'), 'ndwi': Path('...')}
Filters
import numpy as np
from sentinel_processor.filters import apply_filter, apply_filter_da
import xarray as xr
band = np.random.rand(512, 512)
smooth = apply_filter(band, "gaussian", sigma=1.5)
clean = apply_filter(band, "median", radius=2)
edges = apply_filter(band, "sobel_magnitude")
sharp = apply_filter(band, "unsharp_mask", sigma=1.5, amount=1.2)
feats = apply_filter(band, "top_hat_white", radius=5)
custom = apply_filter(band, "convolve", kernel=np.ones((3, 3)) / 9)
# xarray DataArray — preserves CRS and coordinates
result_da = apply_filter_da(da, "bilateral", sigma_s=3.0, sigma_r=0.08)
# Multi-band (n_bands, rows, cols) — applied per band
ms = np.random.rand(4, 256, 256)
ms_smooth = apply_filter(ms, "gaussian", sigma=1.0)
Available: gaussian, bilateral, median, sobel_magnitude, sobel_direction, laplacian, unsharp_mask, erode, dilate, open, close, top_hat_white, top_hat_black, convolve.
Wavelet
import numpy as np
from sentinel_processor.wavelet._wavelet_bridge import (
dwt2d, idwt2d, threshold_coeffs,
estimate_sigma, bayes_threshold, bayes_denoise,
band_energy, band_stats,
dwt2d_batch, idwt2d_batch,
dwt3d, idwt3d,
)
band = np.random.rand(256, 256)
# --- BayesShrink denoising (one-liner) ---
denoised = bayes_denoise(band, levels=3, wavelet="db4")
# --- Manual pipeline ---
coeffs = dwt2d(band, levels=3, wavelet="sym4")
sigma_n = estimate_sigma(coeffs[1]["HH"]) # noise from finest HH sub-band
for lv in sorted(coeffs):
for key in ("LH", "HL", "HH"):
thr = bayes_threshold(coeffs[lv][key], sigma_n)
coeffs[lv][key] = np.sign(coeffs[lv][key]) * np.maximum(
np.abs(coeffs[lv][key]) - thr, 0.0
)
denoised = idwt2d(coeffs, wavelet="sym4")
# --- Sub-band statistics ---
e = band_energy(coeffs[1]["HH"])
s = band_stats(coeffs[2]["LH"]) # {'mean', 'var', 'l1', 'linf'}
# --- Multi-spectral batch ---
ms = np.random.rand(6, 256, 256) # (n_bands, rows, cols)
cl = dwt2d_batch(ms, levels=2, wavelet="db4") # list of dicts, one per band
ms_back = idwt2d_batch(cl, wavelet="db4") # (n_bands, rows, cols)
# --- 3-D (spatial + temporal) ---
cube = np.random.rand(8, 64, 64) # (n_times, rows, cols)
c3d = dwt3d(cube, levels=2, wavelet="haar")
back = idwt3d(c3d, wavelet="haar")
Supported wavelets: haar, db4, db6, coif1, sym4, sym6. All orthogonal — perfect reconstruction to float64 machine epsilon.
See docs/WAVELET.md for the full API reference and wavelet selection guide.
Pansharpening
import sentinel_processor as sp
results = sp.download_sentinel2(
[sp.LocationSpec(lat=47.56, lon=19.17, name="budapest")],
cfg=sp.DownloadConfig(
bands = sp.SpectralBands.RGB_NIR,
pansharpen_algorithm = "gram_schmidt", # "ihs" (RGB only) | "wavelet"
),
)
Validate an SCL file
from sentinel_processor import validate_file
report = validate_file(
"data/technical/scl_budapest_20260526T095725.tif",
max_cloud_threshold=0.30,
min_confidence=0.50,
)
print(report["passed"]) # True
print(report["cloud_ratio"]) # 0.04
print(report["confidence_score"]) # 1.0
Visualise
from sentinel_processor.visualisation.plot import (
plot_band, plot_rgb, plot_grid, plot_mask, plot_timeseries,
)
plot_band("data/spectral/scene.nc", band="nir", colorscale="Plasma").show()
plot_rgb("data/visual/vis_scene.nc").show()
plot_rgb("data/spectral/scene.nc", "nir", "red", "green").show() # false colour
plot_mask("data/technical/scl_scene.nc", bad_classes=[8, 9, 10]).show()
plot_grid([
{"file": "data/spectral/scene.nc", "band": "red", "label": "Red"},
{"file": "data/spectral/scene.nc", "band": "nir", "label": "NIR"},
{"file": "data/indices/scene_ndvi.tif", "label": "NDVI", "colorscale": "RdYlGn"},
], ncols=3).show()
# Time series — pixel or region, with optional cloud markers
plot_timeseries(
stack="data/stacks/budapest_stack.nc",
lon=19.17, lat=47.56,
bands=["ndvi", "evi"],
scl_path="data/technical/", # directory → per-scene cloud markers
agg_bbox=0.002, # ~200 m spatial average
save_html="data/vis/timeseries.html",
).show()
Output structure
<output_dir>/
├── spectral/
│ ├── <name>_<timestamp>.tif
│ ├── <name>_<timestamp>.nc ← requires [netcdf]
│ ├── <name>_<timestamp>_report.json ← if save_report=True
│ └── indices/
│ └── indices_<name>_<timestamp>_<index>.tif
├── technical/
│ ├── scl_<name>_<timestamp>.tif/.nc
│ ├── aot_<name>_<timestamp>.tif/.nc
│ └── wvp_<name>_<timestamp>.tif/.nc
├── visual/
│ └── vis_<name>_<timestamp>.tif/.nc
└── stacks/ ← written by stack_timeseries
└── <name>_stack.nc / <name>_stack_<timestamp>.tif
analysis_output/ ← written by analysis functions
├── coverage.tif · max_gap.tif · slope_*.tif · r2_*.tif
├── mk_trend_*.tif · pearson_*.tif
└── phenology/
└── sos_doy.tif · eos_doy.tif · peak_doy.tif · peak_val.tif
Band presets
| Preset | Bands |
|---|---|
SpectralBands.RGB |
blue, green, red |
SpectralBands.RGB_NIR |
blue, green, red, NIR |
SpectralBands.VEGETATION |
red, NIR, rededge 1-2-3 |
SpectralBands.AGRICULTURE |
blue, green, red, NIR, rededge1, SWIR1, SWIR2 |
SpectralBands.ALL_10M |
blue, green, red, NIR |
SpectralBands.ALL_20M |
rededge 1-3, NIR narrow, SWIR 1-2 |
SpectralBands.ALL |
all 10 m + 20 m bands |
TechnicalLayers.SCL |
Scene Classification Layer |
TechnicalLayers.ALL |
SCL + AOT + WVP |
Custom list: DownloadConfig(bands=["red", "nir", "swir16"])
Project layout
sentinel_processor/
├── __init__.py
├── config.py
├── analysis/
│ ├── __init__.py
│ ├── _sentinel_stats_bridge.py
│ ├── _band_covariance_bridge.py
│ └── fortran/
│ ├── sentinel_stats.f90
│ └── band_covariance.f90
├── filters/
│ ├── __init__.py
│ ├── _filters_bridge.py
│ ├── compute.py
│ └── fortran/filters.f90
├── indices/
│ ├── __init__.py
│ ├── _indices_bridge.py
│ ├── compute.py
│ └── fortran/indices_mod.f90
├── input/
│ ├── __init__.py
│ ├── downloader.py
│ └── timeseries.py
├── texture/
│ ├── __init__.py
│ ├── texture.py
│ ├── _texture_bridge.py
│ └── fortran/texture_mod.f90
├── processing/
│ ├── __init__.py
│ ├── _fortran_bridge.py
│ ├── _raster_ops_bridge.py
│ ├── _timeseries_bridge.py
│ └── fortran/pansharpening.f90 · raster_ops.f90 · timeseries_mod.f90
├── utils/
│ ├── __init__.py
│ └── data_utils.py
├── validation/
│ ├── __init__.py
│ ├── _fortran_bridge.py
│ └── fortran/validation.f90
├── visualisation/
│ ├── __init__.py
│ └── plot.py
└── wavelet/ ← NEW
├── __init__.py
├── _wavelet_bridge.py
└── fortran/
└── wavelet_mod.f90
└── dl/ ← NEW
├── __init__.py
├── _normalize_bridge.py
├── normalize.py
├── presets.py
├── tiling.py
└── fortran/
└── normalize_mod.f90
tests/
├── conftest.py
├── test_analysis.py
├── test_band_covariance.py
├── test_validation.py
├── test_indices.py
├── test_filters.py
├── test_processing.py
├── test_texture.py
├── test_timeseries.py
├── test_timeseries_bridge.py
├── test_visualisation.py
└── test_wavelet.py ← NEW
└── test_dl.py ← NEW
docs/
├── ANALYSIS.md
├── COVARIANCE.md
├── DOWNLOADER.md
├── FILTERS.md
├── INDICES.md
├── PANSHARPENING.md
├── RASTER_OPS.md
├── TEXTURE.md
├── TIMESERIES.md
├── VALIDATION.md
├── VISUALISATION.md
├── WAVELET.md ← NEW
└── ML.md ← NEW
Development
git clone https://github.com/niki8885/sentinel-processor
cd sentinel-processor
pip install -e ".[dev,netcdf]"
pytest tests/ -v
Run only fast unit tests (no I/O, no Fortran required):
pytest tests/ -m "not integration and not fortran" -v
See CONTRIBUTING.md for full contribution guidelines.
Requirements
- Python ≥ 3.11
pystac-client,rioxarray,xarray,numpy,rasterio,plotlynetCDF4orh5netcdffor.ncoutput (optional)gfortran≥ 9 to build the Fortran kernels
Maintainer
Nikita Manaenkov — nick.maanenkov@gmail.com · @niki8885
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 sentinel_processor-0.2.0.tar.gz.
File metadata
- Download URL: sentinel_processor-0.2.0.tar.gz
- Upload date:
- Size: 183.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3ad67dc4ee17a7e3955e5665989d4408ceced1e8b115193ef4793d4a947ea760
|
|
| MD5 |
f0ab3158775af2207cf4ce6a08924e5a
|
|
| BLAKE2b-256 |
020edaeac8d425af6abe5cb7c214a0c5cef6c3c18736ce9f46ffcbf2ed1a96dc
|
Provenance
The following attestation bundles were made for sentinel_processor-0.2.0.tar.gz:
Publisher:
build_wheels.yml on niki8885/sentinel_processor_project
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sentinel_processor-0.2.0.tar.gz -
Subject digest:
3ad67dc4ee17a7e3955e5665989d4408ceced1e8b115193ef4793d4a947ea760 - Sigstore transparency entry: 1803666147
- Sigstore integration time:
-
Permalink:
niki8885/sentinel_processor_project@fcce251bbac9c25019aec0092294ea7884a995ea -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/niki8885
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build_wheels.yml@fcce251bbac9c25019aec0092294ea7884a995ea -
Trigger Event:
push
-
Statement type:
File details
Details for the file sentinel_processor-0.2.0-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: sentinel_processor-0.2.0-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 10.2 MB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
670fe3037368e8e5c16f5bf60c243cb2380412f2fe79297789cd960f79a782c9
|
|
| MD5 |
17ed5464313e0b18bfa98d7f1560b093
|
|
| BLAKE2b-256 |
18a073859f18c0305fcc11dc941bfb4fbb88ebe7fe86ae4afb0e089f0a6aff4c
|
Provenance
The following attestation bundles were made for sentinel_processor-0.2.0-cp312-cp312-win_amd64.whl:
Publisher:
build_wheels.yml on niki8885/sentinel_processor_project
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sentinel_processor-0.2.0-cp312-cp312-win_amd64.whl -
Subject digest:
670fe3037368e8e5c16f5bf60c243cb2380412f2fe79297789cd960f79a782c9 - Sigstore transparency entry: 1803667335
- Sigstore integration time:
-
Permalink:
niki8885/sentinel_processor_project@fcce251bbac9c25019aec0092294ea7884a995ea -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/niki8885
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build_wheels.yml@fcce251bbac9c25019aec0092294ea7884a995ea -
Trigger Event:
push
-
Statement type:
File details
Details for the file sentinel_processor-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: sentinel_processor-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cf761f2a02fd27574f39888c7508bd8034f07ca76717c5af570fe151a7e99460
|
|
| MD5 |
c41c666a5e9c2f5422a3e57f2b06a4f7
|
|
| BLAKE2b-256 |
2a865479fcb63b2a1b9d4e596548627d1ff755d68d30100f4d344fb1e5021686
|
Provenance
The following attestation bundles were made for sentinel_processor-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
build_wheels.yml on niki8885/sentinel_processor_project
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sentinel_processor-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
cf761f2a02fd27574f39888c7508bd8034f07ca76717c5af570fe151a7e99460 - Sigstore transparency entry: 1803667524
- Sigstore integration time:
-
Permalink:
niki8885/sentinel_processor_project@fcce251bbac9c25019aec0092294ea7884a995ea -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/niki8885
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build_wheels.yml@fcce251bbac9c25019aec0092294ea7884a995ea -
Trigger Event:
push
-
Statement type:
File details
Details for the file sentinel_processor-0.2.0-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: sentinel_processor-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 133.6 kB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
82edba2b9db22a02634d2612a0c3257715e914b19067577c7ba2490913a4e05b
|
|
| MD5 |
7e27e331c7e2932ca26fe073537cf796
|
|
| BLAKE2b-256 |
ac4b67e262f90d186842046b6fd4249cd0fc4b31f30cdcbc114deebf30e4598d
|
Provenance
The following attestation bundles were made for sentinel_processor-0.2.0-cp312-cp312-macosx_11_0_arm64.whl:
Publisher:
build_wheels.yml on niki8885/sentinel_processor_project
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sentinel_processor-0.2.0-cp312-cp312-macosx_11_0_arm64.whl -
Subject digest:
82edba2b9db22a02634d2612a0c3257715e914b19067577c7ba2490913a4e05b - Sigstore transparency entry: 1803666508
- Sigstore integration time:
-
Permalink:
niki8885/sentinel_processor_project@fcce251bbac9c25019aec0092294ea7884a995ea -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/niki8885
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build_wheels.yml@fcce251bbac9c25019aec0092294ea7884a995ea -
Trigger Event:
push
-
Statement type:
File details
Details for the file sentinel_processor-0.2.0-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: sentinel_processor-0.2.0-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 10.2 MB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5fd561405df8b237488d7af2d128f5d7b06b4ee808fa22d0a440c8845dae6d14
|
|
| MD5 |
a4efcc208e8185ebf809b7874f3ecae7
|
|
| BLAKE2b-256 |
68c71920c8ab02754dd89a38478483af543751028431701be87b4033f88713bd
|
Provenance
The following attestation bundles were made for sentinel_processor-0.2.0-cp311-cp311-win_amd64.whl:
Publisher:
build_wheels.yml on niki8885/sentinel_processor_project
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sentinel_processor-0.2.0-cp311-cp311-win_amd64.whl -
Subject digest:
5fd561405df8b237488d7af2d128f5d7b06b4ee808fa22d0a440c8845dae6d14 - Sigstore transparency entry: 1803667892
- Sigstore integration time:
-
Permalink:
niki8885/sentinel_processor_project@fcce251bbac9c25019aec0092294ea7884a995ea -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/niki8885
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build_wheels.yml@fcce251bbac9c25019aec0092294ea7884a995ea -
Trigger Event:
push
-
Statement type:
File details
Details for the file sentinel_processor-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: sentinel_processor-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.11, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f22b49febb9fec1a4d76091db9849129e2a2c74254b5637782e439f22959b9b1
|
|
| MD5 |
d57d9f0fc845056e2354a4bdbde082fe
|
|
| BLAKE2b-256 |
00746a87fa69c0181e8f7a81cd77f1e0a43260cc593ae17a37b9ef98cf8106a5
|
Provenance
The following attestation bundles were made for sentinel_processor-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
build_wheels.yml on niki8885/sentinel_processor_project
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sentinel_processor-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
f22b49febb9fec1a4d76091db9849129e2a2c74254b5637782e439f22959b9b1 - Sigstore transparency entry: 1803666766
- Sigstore integration time:
-
Permalink:
niki8885/sentinel_processor_project@fcce251bbac9c25019aec0092294ea7884a995ea -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/niki8885
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build_wheels.yml@fcce251bbac9c25019aec0092294ea7884a995ea -
Trigger Event:
push
-
Statement type:
File details
Details for the file sentinel_processor-0.2.0-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: sentinel_processor-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 133.6 kB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3669cf25491ac8502255bc600147630a8dc9e2aec0fc7421aadc33159b2c0dcc
|
|
| MD5 |
f6362b75efd59ec6ff5f60407c937662
|
|
| BLAKE2b-256 |
fbb25b63f6bdeda7e7358c3e40e379d02b6afc330f470da4b08c46d450110bfb
|
Provenance
The following attestation bundles were made for sentinel_processor-0.2.0-cp311-cp311-macosx_11_0_arm64.whl:
Publisher:
build_wheels.yml on niki8885/sentinel_processor_project
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sentinel_processor-0.2.0-cp311-cp311-macosx_11_0_arm64.whl -
Subject digest:
3669cf25491ac8502255bc600147630a8dc9e2aec0fc7421aadc33159b2c0dcc - Sigstore transparency entry: 1803667028
- Sigstore integration time:
-
Permalink:
niki8885/sentinel_processor_project@fcce251bbac9c25019aec0092294ea7884a995ea -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/niki8885
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build_wheels.yml@fcce251bbac9c25019aec0092294ea7884a995ea -
Trigger Event:
push
-
Statement type: