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
Metadata
Release files for sentinel-processor 0.2.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 | Provenance | |
|---|---|---|---|---|
| sentinel_processor-0.2.0.tar.gz | 183.4 kB | With provenance | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| sentinel_processor-0.2.0-cp312-cp312-win_amd64.whl | CPython 3.12 | CPython 3.12 | Windows x86-64 | Details |
| sentinel_processor-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.12 | CPython 3.12 | Linux glibc 2.17+ x86-64 | Details |
| sentinel_processor-0.2.0-cp312-cp312-macosx_11_0_arm64.whl | CPython 3.12 | CPython 3.12 | macOS 11.0+ ARM64 | Details |
| sentinel_processor-0.2.0-cp311-cp311-win_amd64.whl | CPython 3.11 | CPython 3.11 | Windows x86-64 | Details |
| sentinel_processor-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.11 | CPython 3.11 | Linux glibc 2.17+ x86-64 | Details |
| sentinel_processor-0.2.0-cp311-cp311-macosx_11_0_arm64.whl | CPython 3.11 | CPython 3.11 | macOS 11.0+ ARM64 | Details |
Total release size: 23.3 MB
Release files / sentinel_processor-0.2.0.tar.gz
| Download URL | sentinel_processor-0.2.0.tar.gz |
|---|---|
| Size | 183.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3ad67dc4ee17a7e3955e5665989d4408ceced1e8b115193ef4793d4a947ea760
|
|
BLAKE2b-256 checksum How to use checksums |
020edaeac8d425af6abe5cb7c214a0c5cef6c3c18736ce9f46ffcbf2ed1a96dc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 12, 2026.
Transparency logRelease files / sentinel_processor-0.2.0-cp312-cp312-win_amd64.whl
| Download URL | sentinel_processor-0.2.0-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 10.2 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
670fe3037368e8e5c16f5bf60c243cb2380412f2fe79297789cd960f79a782c9
|
|
BLAKE2b-256 checksum How to use checksums |
18a073859f18c0305fcc11dc941bfb4fbb88ebe7fe86ae4afb0e089f0a6aff4c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 12, 2026.
Transparency logRelease files / sentinel_processor-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | sentinel_processor-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.12 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
cf761f2a02fd27574f39888c7508bd8034f07ca76717c5af570fe151a7e99460
|
|
BLAKE2b-256 checksum How to use checksums |
2a865479fcb63b2a1b9d4e596548627d1ff755d68d30100f4d344fb1e5021686
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 12, 2026.
Transparency logRelease files / sentinel_processor-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | sentinel_processor-0.2.0-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 133.6 kB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
82edba2b9db22a02634d2612a0c3257715e914b19067577c7ba2490913a4e05b
|
|
BLAKE2b-256 checksum How to use checksums |
ac4b67e262f90d186842046b6fd4249cd0fc4b31f30cdcbc114deebf30e4598d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 12, 2026.
Transparency logRelease files / sentinel_processor-0.2.0-cp311-cp311-win_amd64.whl
| Download URL | sentinel_processor-0.2.0-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 10.2 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
5fd561405df8b237488d7af2d128f5d7b06b4ee808fa22d0a440c8845dae6d14
|
|
BLAKE2b-256 checksum How to use checksums |
68c71920c8ab02754dd89a38478483af543751028431701be87b4033f88713bd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 12, 2026.
Transparency logRelease files / sentinel_processor-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | sentinel_processor-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
f22b49febb9fec1a4d76091db9849129e2a2c74254b5637782e439f22959b9b1
|
|
BLAKE2b-256 checksum How to use checksums |
00746a87fa69c0181e8f7a81cd77f1e0a43260cc593ae17a37b9ef98cf8106a5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 12, 2026.
Transparency logRelease files / sentinel_processor-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | sentinel_processor-0.2.0-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 133.6 kB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
3669cf25491ac8502255bc600147630a8dc9e2aec0fc7421aadc33159b2c0dcc
|
|
BLAKE2b-256 checksum How to use checksums |
fbb25b63f6bdeda7e7358c3e40e379d02b6afc330f470da4b08c46d450110bfb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 12, 2026.
Transparency logSecurity for sentinel-processor 0.2.0
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.
Full provenance
All 7 files in this release have been uploaded with provenance metadata.
Attestation for sentinel_processor-0.2.0.tar.gz
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 Jun 12, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.