medrs
High-performance medical imaging I/O and processing library for Rust and Python.
Overview
medrs is designed for throughput-critical medical imaging workflows, particularly deep learning pipelines that process large 3D volumes. It provides:
- Fast NIfTI I/O: Memory-mapped reading, crop-first loading (read sub-volumes without loading entire files)
- Transform Pipeline: Lazy evaluation that fuses consecutive axis-aligned resamples and trailing intensity operations (z-normalize, scaling, clamping) into a single pass, with portable SIMD acceleration
- Mixed Precision: Native f16/bf16 support for 50% storage savings
- Volumetric Compression: Optional
.jvolcodec (vendored from jvol-rust) for lossy wavelet compression of floating-point volumes - Random Augmentation: Reproducible, GPU-friendly augmentations for ML training
- Python Bindings: Zero-copy numpy views, direct PyTorch/JAX tensor creation, GIL released around heavy operations
- MONAI Integration: Drop-in replacements for MONAI transforms
Why medrs?
medrs memory-maps uncompressed .nii files, so opening a volume and materializing it to a numpy array is comparable to nibabel (which also memory-maps) and roughly 10-25x faster than MONAI and TorchIO, whose default loaders eagerly read the data and build a tensor. For gzipped .nii.gz, load time is bounded by the decompressor; medrs is competitive with nibabel and MONAI, and the parallel Mgzip format is the fast path for compressed data. All numbers below are reproducible with the scripts in benchmarks/ (see "Reproducing benchmarks").
Single File Loading
Load plus full materialization to a numpy array (median of repeated runs, so every library does the same work). Multiples are relative to medrs.
| Volume | Format | medrs | nibabel | MONAI | TorchIO | SimpleITK |
|---|---|---|---|---|---|---|
| 128³ | .nii | 1.3 ms | 1.4x | 14x | 9x | 4x |
| 256³ | .nii | 17 ms | 1.4x | 23x | 13x | 4x |
| 128³ | .nii.gz | 82 ms | 0.6x | 1.2x | 0.2x | 0.3x |
| 256³ | .nii.gz | 370 ms | 1.8x | 2.5x | 0.5x | 0.1x |
Measured on Apple Silicon with benchmarks/bench_load_comparison.py (float32, structured data). For uncompressed volumes medrs and nibabel both memory-map, so they are close; the large multiples are against loaders that materialize eagerly. For gzipped volumes SimpleITK and TorchIO decompress faster than medrs's single-threaded path, which is why medrs also offers the parallel Mgzip format.
Compressed Storage
Optional lossy .jvol (wavelet codec, see the Compression Formats section) gives large storage and bandwidth savings on floating-point volumes. Measured on a 256³ float32 volume:
| Format | Size | vs raw | Decode |
|---|---|---|---|
| raw .nii | 67 MB | 1x | fastest (mmap) |
| .nii.gz | 61 MB | 1.1x | baseline |
| jvol q80 | 3.1 MB | 22x smaller | about gzip speed |
| jvol q60 | 0.1-3 MB | 20-600x smaller | about gzip speed |
jvol decode is roughly gzip speed, so its benefit is storage and bandwidth, not decode CPU. Mixed-precision bf16/f16 saves a fixed 50% of f32 with no codec.
Training Throughput (FastLoader)
The FastLoader prefetches patches across parallel worker threads with the GIL released. On 64³ random crops from gzipped volumes it delivers roughly 4x the throughput of a naive sequential load-and-crop loop (measured: 191 vs 49 patches/sec, 4 workers). Run your own with python benchmarks/bench_fastloader.py.
Key Advantages
- Crop-First Loading: Read only the cropped region from disk instead of loading the full volume, which matters most as volume size grows relative to patch size
- FastLoader: Parallel patch prefetching with the GIL released, roughly 4x a naive sequential loader
- Mixed Precision: Save in bf16/f16 for 50% smaller files, or lossy
.jvolfor 20-600x smaller - MONAI Drop-in: Replace MONAI I/O transforms with one import change
- Zero-Copy: Direct tensor creation without intermediate numpy allocations
Reproducing benchmarks
The numbers above are illustrative snapshots; benchmarks/results/ is not checked into the repo (it's regenerated, not reproducible from git history alone). Regenerate them on your own hardware with:
pip install -e ".[examples]"
# Individual suites
python benchmarks/bench_medrs.py
python benchmarks/bench_nibabel.py
python benchmarks/bench_monai.py
python benchmarks/bench_torchio.py
python benchmarks/bench_mgzip.py
python benchmarks/bench_fastloader.py
# Or via cargo for the Rust-side microbenchmarks
cargo bench
# Plots and a combined comparison report
python benchmarks/compare_all.py
python benchmarks/plot_results.py
See benchmarks/BENCHMARK_PLAN.md for the full benchmark matrix (libraries, volume sizes, dtypes, formats).
Installation
Python
pip install medrs
Rust
[dependencies]
medrs = "0.1"
Development
git clone https://github.com/liamchalcroft/med-rs.git
cd med-rs
pip install -e ".[dev]"
maturin develop --features python
Quick Start
Python:
import medrs
import torch
# Load a NIfTI image
img = medrs.load("brain.nii.gz")
print(f"Shape: {img.shape}, Spacing: {img.spacing}")
# Method chaining for transforms
processed = img.resample([1.0, 1.0, 1.0]).z_normalize().clamp(-1, 1)
processed.save("output.nii.gz")
# Load directly to PyTorch tensor (most efficient)
tensor = medrs.load_to_torch("brain.nii.gz", dtype=torch.float16, device="cuda")
For training pipelines that repeatedly access the same files, use load_cached() for
faster subsequent loads (caches decompressed data for .nii.gz files).
Rust:
use medrs::nifti;
use medrs::transforms::{resample_to_spacing, Interpolation};
fn main() -> medrs::Result<()> {
let img = nifti::load("brain.nii.gz")?;
println!("Shape: {:?}, Spacing: {:?}", img.shape(), img.spacing());
let resampled = resample_to_spacing(&img, [1.0, 1.0, 1.0], Interpolation::Trilinear)?;
nifti::save(&resampled, "output.nii.gz")?;
Ok(())
}
Transform Pipeline
Build composable transform pipelines with lazy evaluation and automatic optimization:
Python:
import medrs
# Create a reusable pipeline
pipeline = medrs.TransformPipeline()
pipeline.z_normalize()
pipeline.clamp(-1.0, 1.0)
pipeline.resample_to_shape([64, 64, 64])
# Apply to multiple images
for path in image_paths:
img = medrs.load(path)
processed = pipeline.apply(img)
Rust:
use medrs::pipeline::compose::TransformPipeline;
let pipeline = TransformPipeline::new()
.z_normalize()
.clamp(-1.0, 1.0)
.resample_to_shape([64, 64, 64]);
let processed = pipeline.apply(&img);
Random Augmentation
Reproducible augmentations for ML training with optional seeding:
Python:
import medrs
img = medrs.load("brain.nii.gz")
# Individual augmentations
flipped = medrs.random_flip(img, axes=[0, 1, 2], prob=0.5, seed=42)
noisy = medrs.random_gaussian_noise(img, std=0.1, seed=42)
scaled = medrs.random_intensity_scale(img, scale_range=0.1, seed=42)
shifted = medrs.random_intensity_shift(img, shift_range=0.1, seed=42)
rotated = medrs.random_rotate_90(img, axes=(0, 1), seed=42)
gamma = medrs.random_gamma(img, gamma_range=(0.7, 1.5), seed=42)
# Combined augmentation (flip + noise + scale + shift)
augmented = medrs.random_augment(img, seed=42)
Rust:
use medrs::transforms::{random_flip, random_gaussian_noise, random_augment};
// Individual augmentations
let flipped = random_flip(&img, &[0, 1, 2], Some(0.5), Some(42))?;
let noisy = random_gaussian_noise(&img, Some(0.1), Some(42))?;
// Combined augmentation
let augmented = random_augment(&img, Some(42))?;
Mgzip: Parallel Compressed Loading
For .nii.gz files, medrs supports the Mgzip (multi-member gzip) format for parallel decompression. Mgzip files are backwards-compatible with standard gzip; at 8 threads, decompression is 2-3x faster than medrs's own single-threaded libdeflate baseline. Single-threaded Mgzip is slightly slower than that baseline (channel and buffer overhead dominate below 2-3 threads), so it only pays off once you have a few cores to spare.
Performance (256³ volume)
| Method | Time | vs nibabel |
|---|---|---|
| nibabel | 173ms | 1× |
| medrs.load() | 126ms | 1.4× |
| medrs.load_mgzip(8 threads) | 47ms | 3.7× |
Usage
import medrs
# Convert existing .nii.gz to Mgzip format (one-time)
medrs.convert_to_mgzip("brain.nii.gz", "brain.mgz.nii.gz", num_threads=8)
# Load with parallel decompression
img = medrs.load_mgzip("brain.mgz.nii.gz", num_threads=8)
# Save directly in Mgzip format
medrs.save_mgzip(img, "output.mgz.nii.gz", num_threads=8)
# Check if file is Mgzip format
if medrs.is_mgzip("file.nii.gz"):
img = medrs.load_mgzip("file.nii.gz")
Batch Conversion CLI
Convert entire datasets with the included CLI tool:
# Convert all .nii.gz files in a directory (recursive)
python -m medrs.cli convert-mgzip data/*.nii.gz -r -w 8 -v
# Options:
# -r, --recursive Search subdirectories
# -w, --workers N Parallel conversion threads (default: CPU count)
# -v, --verbose Show progress
# --suffix .mgz Output suffix (default: replaces .nii.gz with .mgz.nii.gz)
When to Use Mgzip
- Large compressed datasets (100+ files, 256³+ volumes)
- Multi-core systems (4+ cores)
- Repeated access (training pipelines that load same files across epochs)
Mgzip files are ~1% larger than standard gzip but provide significant speedups. Standard gzip readers (nibabel, etc.) can still read Mgzip files.
Crop-First Loading
Load only the data you need - essential for training pipelines:
import medrs
import torch
# Load a 64^3 patch starting at position (32, 32, 32)
patch = medrs.load_cropped("volume.nii", [32, 32, 32], [64, 64, 64])
# Load with resampling and reorientation in one step
patch = medrs.load_resampled(
"volume.nii",
output_shape=[64, 64, 64],
target_spacing=[1.0, 1.0, 1.0],
target_orientation="RAS"
)
# Load directly to GPU tensor
tensor = medrs.load_cropped_to_torch(
"volume.nii",
output_shape=[64, 64, 64],
target_spacing=[1.0, 1.0, 1.0],
dtype=torch.float16,
device="cuda"
)
Training Data Loaders
TrainingDataLoader
LRU-cached patch extraction with prefetching:
import medrs
loader = medrs.TrainingDataLoader(
volumes=["vol1.nii", "vol2.nii", "vol3.nii"],
patch_size=[64, 64, 64],
patches_per_volume=4,
patch_overlap=[0, 0, 0],
randomize=True,
cache_size=1000
)
for patch in loader:
tensor = patch.to_torch()
FastLoader
Parallel prefetching loader for large .nii.gz datasets (100k+ files):
import glob
import medrs
loader = medrs.FastLoader(
volumes=glob.glob("data/*.nii.gz"),
patch_shape=[64, 64, 64],
prefetch=16,
workers=4,
shuffle=True,
seed=42
)
for patch in loader:
tensor = patch.to_torch()
Available Transforms
Intensity Transforms
z_normalize()/z_normalization()- Zero mean, unit variancerescale()/rescale_intensity()- Scale to [min, max] rangeclamp()- Clamp values to range
Spatial Transforms
resample()- Resample to target spacing (alsoTransformPipeline.resample_to_spacing(); the Rust API exposes the same function asresample_to_spacing)resample_to_shape()- Resample to target shapereorient()- Reorient to standard orientation (RAS, LPS, etc.)crop_or_pad()- Crop or pad to target shapeflip()- Flip along specified axes
Random Augmentation
random_flip()- Random axis flippingrandom_gaussian_noise()- Additive Gaussian noiserandom_intensity_scale()- Random intensity scalingrandom_intensity_shift()- Random intensity offsetrandom_rotate_90()- Random 90-degree rotationsrandom_gamma()- Random gamma correctionrandom_augment()- Combined augmentation pipeline
Performance
medrs uses several optimization strategies:
- SIMD: Hot loops use portable SIMD (
wide::f32x8), which lowers to two SSE registers on the x86-64 baseline and a single AVX2 register only when built with-C target-feature=+avx2or-C target-cpu=native(seemake build-native; the distributed wheels use the SSE2 baseline) - Parallel Processing: Rayon-based parallelism for large volumes
- Lazy Evaluation: Transform pipelines fuse consecutive axis-aligned resamples and trailing intensity operations into a single pass before execution
- Memory Mapping: Large files are memory-mapped to avoid full loads
- Parallel Decompression: Mgzip format enables multi-threaded gzip decompression
Compression Formats
| Format | Type | Best for |
|---|---|---|
.nii |
Uncompressed | Fastest load (memory-mapped), byte-exact crop-first reads |
.nii.gz |
gzip | Standard interchange; use load_mgzip/Mgzip for parallel decode |
.jvol |
Wavelet + Rice coding (optional jvol feature) |
Storage- and bandwidth-bound workflows on floating-point volumes |
.jvol is an optional volumetric codec, vendored from jvol-rust by Fernando Pérez-García (MIT licensed; see Credits). It supports two modes:
- Lossy (
quality=1..100): wavelet compression tuned for floating-point intensity volumes, typically 10x to 500x smaller than the source depending on quality. This is the mode.jvolis designed for. - Lossless: exact round-trip, but only roughly gzip-parity in file size, and decode is more CPU-intensive than gzip or Mgzip. Prefer
.nii.gz/.nii.mgzwhen load speed matters more than storage.
Lossy encoding is rejected outright for integer/label data (medrs returns an error) since wavelet quantization would silently corrupt segmentation values; use lossless mode for labels.
import medrs
img = medrs.load("brain.nii.gz")
# Lossy, tuned for floating-point intensity volumes
medrs.save_jvol(img, "brain.jvol", quality=60)
# Lossless (required for label/segmentation volumes)
medrs.save_jvol(seg, "seg.jvol", lossless=True)
# .jvol loads transparently through the normal load() entry point
restored = medrs.load("brain.jvol")
# Convert an existing file directly
medrs.convert_to_jvol("brain.nii.gz", "brain.jvol", quality=60)
use medrs::jvol::{self, JvolOptions};
let img = medrs::nifti::load("brain.nii.gz")?;
jvol::save(&img, "brain.jvol", JvolOptions::lossy(60))?;
let restored = jvol::load("brain.jvol")?;
Build with the jvol cargo feature (cargo build --features jvol); the python feature enables it automatically, so the published Python wheel includes .jvol support. See docs/guides/compression.rst for the full format writeup.
Examples
See the examples/ directory for:
basic/- Loading, transforms, and savingintegrations/- PyTorch, MONAI, JAX integrationadvanced/- Async pipelines, custom transforms
Testing
# Rust tests
cargo test
cargo test --features jvol
# Python tests
pytest tests/
# Benchmarks (see "Reproducing benchmarks" above)
python benchmarks/bench_medrs.py --quick
python benchmarks/bench_monai.py --quick
python benchmarks/bench_torchio.py --quick
# Generate benchmark plots
python benchmarks/plot_results.py
License
medrs is dual-licensed under MIT and Apache-2.0. See LICENSE for details. The vendored .jvol codec (src/jvol/codec/) is MIT-licensed separately; see LICENSE-jvol and Credits.
Credits
The .jvol volumetric compression codec (src/jvol/codec/) is vendored from jvol-rust by Fernando Pérez-García, MIT licensed. Only the codec modules (wavelet lifting, entropy coding, subband management, type definitions) are vendored; medrs's own NIfTI I/O front-end and Python bindings wrap it. Full license text: LICENSE-jvol.
Contributing
See CONTRIBUTING.md for guidelines.
Maintainer
Liam Chalcroft (liam.chalcroft.20@ucl.ac.uk)
Metadata
Release files for medrs 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 | Actions |
|---|---|---|---|---|
| medrs-0.2.0.tar.gz | 334.9 kB | With provenance | Details for medrs-0.2.0.tar.gz |
Built distributions (wheels)
Total release size: 29.0 MB
Release files / medrs-0.2.0.tar.gz
| Download URL | medrs-0.2.0.tar.gz |
|---|---|
| Size | 334.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3a73ed73a456232395d93979b9736a7ef31225e555341cb907d340158b433d74
|
|
BLAKE2b-256 checksum How to use checksums |
91029b18f8fcd8e008557feb02d867bb96ab79807c59d0476ad6fa9709ee0ea8
|
| 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 Jul 2, 2026.
Transparency logRelease files / medrs-0.2.0-cp313-cp313-win_amd64.whl
| Download URL | medrs-0.2.0-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
25320365a50704b96372210dd071cdd38b3c43254281f135a21a5ebff21305c1
|
|
BLAKE2b-256 checksum How to use checksums |
3d4d85425d5a25ab8ec0dada9baf9a30d7ffa04e068b123a16364669ec1488bc
|
| 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 Jul 2, 2026.
Transparency logRelease files / medrs-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | medrs-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.6 MB |
| Tags | CPython 3.13 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
bf54dc1cf05f91f0db5be51f3fa15792d394a618bceee85b69888ccbd72822e3
|
|
BLAKE2b-256 checksum How to use checksums |
715fe3ec040e2d48321147d918ccfdaf7892a1212dbb9aa3c93cf83284e4f29b
|
| 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 Jul 2, 2026.
Transparency logRelease files / medrs-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | medrs-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 1.4 MB |
| Tags | CPython 3.13 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
23de050b242c21a302cc6c2344cb9dd08a5eac7be5e6ecdb14043403bd97ecf3
|
|
BLAKE2b-256 checksum How to use checksums |
9d08f78fe5107f0e853ad49e167aa2b6e3eb58581508d4a00a81f426df75799f
|
| 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 Jul 2, 2026.
Transparency logRelease files / medrs-0.2.0-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | medrs-0.2.0-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
7df32c260dda1573026ac0073b5b38ba3697a9309ac4d2e47377cde4c45251fa
|
|
BLAKE2b-256 checksum How to use checksums |
d0a4ac97290b003ee52f542c54600792dbe96779441f376a4d2716cef26ebc0e
|
| 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 Jul 2, 2026.
Transparency logRelease files / medrs-0.2.0-cp313-cp313-macosx_10_12_x86_64.whl
| Download URL | medrs-0.2.0-cp313-cp313-macosx_10_12_x86_64.whl |
|---|---|
| Size | 1.5 MB |
| Tags | CPython 3.13 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
8545d7ec6635301415f38a03a0fb25ac5aa91e08696f72141cdbb2cb6c84a15e
|
|
BLAKE2b-256 checksum How to use checksums |
4e94428043b29d171edb09364c6a81b6bfd5ff4596fa863f7148ef692540275f
|
| 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 Jul 2, 2026.
Transparency logRelease files / medrs-0.2.0-cp312-cp312-win_amd64.whl
| Download URL | medrs-0.2.0-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
54f307e12e2128f9a1fd329f4a9789eb5ac67b414628478e96b18487b70c9845
|
|
BLAKE2b-256 checksum How to use checksums |
7560cde7dcd915b41a53bd764d27f33e111d4926e4758e8db5e5655b1a0701ab
|
| 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 Jul 2, 2026.
Transparency logRelease files / medrs-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | medrs-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.6 MB |
| Tags | CPython 3.12 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
b653bf360961d143ebb43dfbd94a3e9138f3fe8b779f901c107cad3b04eb96eb
|
|
BLAKE2b-256 checksum How to use checksums |
62cc6ff92d6714fe6664f3a33b4c350bf3c430b28695f5ea429bf56b943c8ec2
|
| 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 Jul 2, 2026.
Transparency logRelease files / medrs-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | medrs-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 1.4 MB |
| Tags | CPython 3.12 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
709d41924045e2336729be9b92ce0421fdc108c760f1a820ade4bc6a873eab93
|
|
BLAKE2b-256 checksum How to use checksums |
a0bec55c85f7849e1e84e5864a3ed5a375d88e1ff534901b8b34af3732592fe6
|
| 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 Jul 2, 2026.
Transparency logRelease files / medrs-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | medrs-0.2.0-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
3d0b059536c6b247a40fc8782445718fdc582254daf080195a4f9625c13d5574
|
|
BLAKE2b-256 checksum How to use checksums |
57720b07bdf78b0b70ab58b926883d69ef4e73d7b82000aba92e8801a992e1e5
|
| 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 Jul 2, 2026.
Transparency logRelease files / medrs-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl
| Download URL | medrs-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl |
|---|---|
| Size | 1.5 MB |
| Tags | CPython 3.12 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
7b13d71bae9873345e3f89cebda4d0653becd24a8adc4e85d77411dd3e9e9022
|
|
BLAKE2b-256 checksum How to use checksums |
04cb8c4fe2c5bb409482bb1ba390157bf64c36b0e19826454cfc6d9a25a880fe
|
| 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 Jul 2, 2026.
Transparency logRelease files / medrs-0.2.0-cp311-cp311-win_amd64.whl
| Download URL | medrs-0.2.0-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
832e9b49d8f9b21f6d744f96056b13fe08355bedeffbc4d3862a2ba2e4c422f6
|
|
BLAKE2b-256 checksum How to use checksums |
90dd86472dd17f0a7cc5cce6a2097de74caf5269ef7375ddfdcb1aa4cc7d9ed2
|
| 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 Jul 2, 2026.
Transparency logRelease files / medrs-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | medrs-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.6 MB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
6cb30c6f6042b8ec36dc61721044837759e8ce20fe20ec0e76e26f95517c245f
|
|
BLAKE2b-256 checksum How to use checksums |
95e237222071f8a94b0260b40e9b8cec58552d8138594cb2ef3a712876296c0e
|
| 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 Jul 2, 2026.
Transparency logRelease files / medrs-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | medrs-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 1.4 MB |
| Tags | CPython 3.11 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
6388f9d09bbf05269fb58cbee53aae8097873e89e08628d7a78721760061082e
|
|
BLAKE2b-256 checksum How to use checksums |
fd8dc5ef08ec093f422bf577f4b32783b6e32f8c26f4625b10f8f60763bf6504
|
| 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 Jul 2, 2026.
Transparency logRelease files / medrs-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | medrs-0.2.0-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
dc20d669b4900a0dfda1e621e2299fb94e4b13bb017368bfed25d77853c92846
|
|
BLAKE2b-256 checksum How to use checksums |
f8d1de0e491054ba11d6b55cda98f8bf01397ad714c8544d0c0c5fa141bdddbb
|
| 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 Jul 2, 2026.
Transparency logRelease files / medrs-0.2.0-cp311-cp311-macosx_10_12_x86_64.whl
| Download URL | medrs-0.2.0-cp311-cp311-macosx_10_12_x86_64.whl |
|---|---|
| Size | 1.5 MB |
| Tags | CPython 3.11 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
05bbb7c60838b6f1697db7e518b08e401488b2ea284b9e248d24940df1f279ce
|
|
BLAKE2b-256 checksum How to use checksums |
3be2d42897473800623457322a481d3b977bfec481db659f974c2e7dcfdc7b12
|
| 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 Jul 2, 2026.
Transparency logRelease files / medrs-0.2.0-cp310-cp310-win_amd64.whl
| Download URL | medrs-0.2.0-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
92f285fac529297442e8439acb6a23ddd13ccb4a2accd234b433dbffda759988
|
|
BLAKE2b-256 checksum How to use checksums |
7526a86ef87b2fd9ce6ede3d8927c1629c92eb87c76e53262e710ac9f7a21bd4
|
| 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 Jul 2, 2026.
Transparency logRelease files / medrs-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | medrs-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.6 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
8a163f26b02d808aef4cb345a285866641465bf892fa78f7964010c1ac010b66
|
|
BLAKE2b-256 checksum How to use checksums |
33f98f701463a8c4ab67967cfb21c2e6236232d46e8efc2c4121369128ae11d6
|
| 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 Jul 2, 2026.
Transparency logRelease files / medrs-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | medrs-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 1.4 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
f51b20c34a0bcec2c45b5c1305b8b66d77cbb966a6935735a146a5d2c5a42486
|
|
BLAKE2b-256 checksum How to use checksums |
dcbb27f0e837d0906f5dd7e4932742cc9791805ad32e658ba8b99f536dd2a666
|
| 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 Jul 2, 2026.
Transparency logRelease files / medrs-0.2.0-cp310-cp310-macosx_11_0_arm64.whl
| Download URL | medrs-0.2.0-cp310-cp310-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.10 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
7a12c7d3573061e6152c5f6e6d4e2fa736b914c47c527746d090fcd571b5e631
|
|
BLAKE2b-256 checksum How to use checksums |
953897312f2bc124bfc15c58b5b869c99574cc052216492549436f8dd25e1d01
|
| 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 Jul 2, 2026.
Transparency logRelease files / medrs-0.2.0-cp310-cp310-macosx_10_12_x86_64.whl
| Download URL | medrs-0.2.0-cp310-cp310-macosx_10_12_x86_64.whl |
|---|---|
| Size | 1.5 MB |
| Tags | CPython 3.10 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
ea06c5198949f38c05de112b11cd8a32ecd9363dabfeb41eccefdf8bd26782b7
|
|
BLAKE2b-256 checksum How to use checksums |
f829ce505cfcca9423c0a2df7df9d43fb2bbf78a79f39c2132a243129ffc6829
|
| 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 Jul 2, 2026.
Transparency logSecurity for medrs 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 21 files in this release have been uploaded with provenance metadata.
Attestation for medrs-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 Jul 2, 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.