Skip to main content

medh5

PyPI version Python versions License: MIT CI Documentation Typed Code style: ruff

One medical imaging sample — a subject, at every timepoint, with all of its ground truth — in a single self-describing HDF5 file.

Multi-modality images, segmentation in five encodings, detection boxes, keypoints, contours, meshes, classification, registration between visits, provenance and quality records, and per-object integrity digests — and, from format 1.1, the clinical history around the images, with when each fact became known, so a model trained at a cutoff reads only what was available then. Format versions 1.0 and 1.1, with normative specifications and a 172-case conformance suite any implementation can run.

import medh5

# A subject with two visits: images, segmentation, registration, tracking.
with medh5.open("subject.medh5") as s:
    s.identity.subject_id                              # "BRATS-GLI-01234"
    s.at("tp1").images["CT_tp1"].read(physical=True)   # HU, not raw counts
    s.annotations["organs"].dense(["liver", "spleen"]) # any encoding, one API
    s.transform_between("tp0", "tp1")                  # resolved via frames
    s.tracks("lesion")                                 # lesions joined across visits

Install

pip install medh5

That is all most people need: the Python package and the medh5 command line, enough to create, read, validate and inspect files. HDF5 and its compression filters are built in, so NumPy is the only other dependency. pip downloads it ready-built for Python 3.10 and later on Linux (x86_64, ARM64), macOS (Intel, Apple silicon) and Windows (x64). Python 3.10 is still supported past its end of life; dropping it will be announced one release ahead.

Add an extra for each tool you connect medh5 to:

To… Install
train with PyTorch pip install "medh5[torch]"
load samples into MONAI pip install "medh5[monai]"
import or export NIfTI and nnU-Net pip install "medh5[nifti]"
import DICOM series, SEG and RTSTRUCT pip install "medh5[dicom]"
export DICOM SEG pip install "medh5[dicomseg]"
import a clinical history from MEDS pip install "medh5[meds]"
open files directly with h5py pip install "medh5[h5py]"

Extras combine: pip install "medh5[torch,nifti,dicom]".

Only the command line, without Python? brew install medh5-project/medh5/medh5, or download it from the latest release. Converting DICOM or NIfTI files still needs the Python package.

Writing Rust? cargo add medh5 adds the format engine itself. The Python package and the command line run the same code, so all three read and write the same bytes. Building it compiles HDF5, which needs Rust 1.85.1 or later, a C compiler and CMake.

Other systems, building from source, the 1.x line and troubleshooting are on the install page.

Documentation

medh5.readthedocs.io — tutorials, how-to guides, the Python and CLI reference, and the normative specifications.

Write your first sample · How-to guides · Python API · CLI · Specification 1.0, 1.1 and the task and cache contract

What the format is for

  • One file per subject, not per scan — every visit in one place, so longitudinal work has a referent and splitting by file cannot leak a patient.
  • Geometry is stated once and never guessed — declared grids, boxes at voxel edges, and converters that refuse rather than invent.
  • Absence is not silence — a class examined and not found is recorded as such, which is a different training signal from one nobody examined.
  • Every claim is checkable — per-object digests, a Merkle content_id that survives recompression, a stable diagnostic-code table, and a 172-case conformance corpus.
  • Reading a patch is fast — a 64³ multi-class patch in ~2.3 ms, and O(1) foreground sampling once build_index() has run.
  • What was known, when — labs, reports and their revisions, diagnoses and assessments on one subject clock, each with when it happened and when it became available; strict prospective selection decides what a row may read, and tasks and feature caches are pinned to the sample versions they read.

The reasoning behind each.

Write a sample

import numpy as np
import medh5
from medh5 import LabelClass, LabelSet

# Stand-ins for a real CT and its masks.
ct = np.random.default_rng(0).integers(-1000, 1500, (64, 96, 96)).astype(np.int16)
liver = np.zeros(ct.shape, bool); liver[10:40, 20:70, 20:70] = True
lesion = np.zeros(ct.shape, bool); lesion[20:26, 35:45, 35:45] = True

labels = LabelSet("demo-v1", version="1.0.0", classes=[
    LabelClass(1, "liver", "Liver", category="organ"),
    LabelClass(2, "spleen", "Spleen", category="organ"),
    LabelClass(3, "lesion", "Lesion", parents=[1], category="lesion"),
])

with medh5.create("case_0001.medh5", sample_id="case_0001",
                  subject_id="DEMO-0001") as w:
    w.label_set(labels)
    w.add_timepoint("tp0", label="baseline", days_from_baseline=0)
    w.add_grid("ct", shape=ct.shape, spacing=(2.0, 0.8, 0.8),
               origin=(-64.0, -38.4, -38.4), timepoint="tp0")
    w.add_image("CT", ct, grid="ct", modality="CT",
                value_type="quantitative", value_units="HU")
    w.add_segmentation("organs", grid="ct",
                       masks={"liver": liver, "lesion": lesion},
                       annotated_classes=["liver", "spleen", "lesion"])
    w.build_index()   # optional; foreground sampling is O(1) only with it

annotated_classes names the spleen although there is no spleen mask: that records "we looked and found none". The encoding is chosen by measuring the class overlap graph — liver and lesion overlap, so it picks one that can represent that — and the write is atomic.

Train on it

from torch.utils.data import DataLoader
from medh5.torch import PatchDataset, collate, worker_init_fn
from medh5.sampling import PatchSampler

sampler = PatchSampler((96, 96, 96), strategy="balanced",
                       foreground_classes=["liver", "lesion"])
dataset = PatchDataset(paths, sampler, images=["CT"],
                       annotations={"organs": ["liver", "lesion"]},
                       samples_per_volume=8)

loader = DataLoader(dataset, batch_size=2, num_workers=8,
                    worker_init_fn=worker_init_fn, collate_fn=collate)

worker_init_fn drops handles inherited across a fork. It is recommended rather than required: the handle cache is PID-keyed and re-checks ownership on every access, so a forked worker abandons the parent's handles on first use rather than reading through or closing them.

With a clinical history (format 1.1), a task asks a question at a cutoff, and the batch holds only what was known then — images from the visit available at the cutoff, the report version current at it, missing modalities and censored targets as masks rather than zeros:

from torch.utils.data import DataLoader
from medh5.task import TaskManifest
from medh5.torch import ClinicalTaskDataset, collate_clinical

task = TaskManifest.load("cohort/progression.task.json")
assert task.preflight().ok                  # every pin, clock and duplicate checked
train = ClinicalTaskDataset(task, partition="train")
batch = next(iter(DataLoader(train, batch_size=8, collate_fn=collate_clinical)))
batch["present"]["mr"], batch["events"]["mask"], batch["target"]["observed"]

See clinical history and training on clinical tasks.

Command line

pip install medh5 puts medh5 on the path; so does the standalone binary, which is the same code compiled ahead of time.

medh5 info case.medh5                  # grids, images, annotations, coverage
medh5 validate case.medh5 --level integrity
medh5 verify case.medh5                # digests and content_id
medh5 timeline case.medh5              # visits and intervals
medh5 track case.medh5 --class lesion  # per-lesion volumes across visits

medh5 dataset index studies/ -o cohort.json
medh5 dataset split cohort.json --group-by group_id --stratify-by site_id --write-claims
medh5 dataset index studies/ -o cohort.json  # record the claims just written
medh5 dataset stats cohort.json --partition train --workers 8
medh5 dataset check cohort.json --deep

medh5 convert from-dicom /studies out/     # one sample per patient, all visits
medh5 convert from-nifti case.medh5 --image CT=ct.nii.gz
medh5 convert from-rtstruct plan.dcm case.medh5 --rasterize
medh5 migrate old/*.medh5 -o new/ --group-by subject --subject-key extra.patient_id

medh5 scrub out/*.medh5 --apply --date-shift-days -117
medh5 pack cohort/*.medh5 -o shard.medh5c
medh5 recompress cohort/*.medh5 --profile training
medh5 bench                                # reproduce the performance targets
medh5 conformance publish suite/           # the suite, for another implementation

medh5 clinical select case.medh5 --cutoff-hours 24    # what was known then (1.1)
medh5 task preflight progression.task.json           # every row: in or out, and why
medh5 cache validate reports.medh5cache --task progression.task.json

Interoperability

Format
NIfTI affine and voxels bit-identical on round trip; RAS↔LPS is a sign flip, never a resample
DICOM slices ordered by geometry, spacing measured between origins, modality LUT stored not applied, tags on an explicit allow-list; slices that disagree about orientation, spacing or rescale are refused rather than read off the first one
DICOM SEG frames placed by geometry; segments matched by label, not number; import preserves overlap and FRACTIONAL, export writes BINARY
RTSTRUCT contours stay contours; rasterisation is opt-in and recorded in provenance
nnU-Net v2 class ids kept; region labels become label-set DAG parents; dataset.json round-trips
MONAI to_metatensor gives a MetaTensor with the correct affine
0.x medh5 migrate, reporting every decision and every guess

Every conversion returns a report distinguishing what it decided from the data and where it guessed — the encoding chosen, the class ids minted, a half-voxel convention changed, a timepoint order inferred rather than read.

COCO is deliberately unsupported: it has no world geometry, spacing or frame of reference, so importing means inventing a grid and exporting means discarding the geometry that makes a medical annotation reproducible.

Reading it without medh5

import h5py, json, hdf5plugin       # pip install "medh5[h5py]"; hdf5plugin for Blosc2

with h5py.File("case_0001.medh5") as f:
    doc = json.loads(f["meta"][()])
    doc["identity"]["subject_id"]
    dict(f["grids"]["ct"].attrs)     # spacing, origin, direction
    f["images"]["CT"][10:20]

medh5 recompress --profile portable writes gzip, readable by any HDF5 build.

Versioning

The format is 1.1: 1.0 plus the optional clinical profile, and nothing else. A sample is written at the lowest version its content needs, so imaging-only data is still 1.0, which 1.x reads; a reader opens a later minor as a projection, never amending it. A minor version may add optional objects, profiles, encodings and diagnostic codes; it may not change what an existing one means (spec §16). The package follows semantic versioning from 1.0.0: 2.0 moved the implementation to the Rust engine and changed the Python API at the HDF5 boundary (what changed).

0.x files are not readable by 1.0 and are not meant to be — medh5 migrate converts them once. See Migrate from 0.x.

Contributing

See CONTRIBUTING.md for the development setup, the checks a change has to pass, and how the specification and documentation are kept in step with the code. Release notes are in CHANGELOG.md.

License

MIT

Metadata

Release files for medh5 2.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for medh5 2.1.0
File Size Uploaded
medh5-2.1.0.tar.gz 2.8 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for medh5 2.1.0
File
medh5-2.1.0-cp314-cp314t-win_amd64.whl CPython 3.14 CPython 3.14 free-threading Windows x86-64 Details
medh5-2.1.0-cp314-cp314t-manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ x86-64 Details
medh5-2.1.0-cp314-cp314t-manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ ARM64 Details
medh5-2.1.0-cp314-cp314t-macosx_11_0_x86_64.whl CPython 3.14 CPython 3.14 free-threading macOS 11.0+ x86-64 Details
medh5-2.1.0-cp314-cp314t-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64 Details
medh5-2.1.0-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details
medh5-2.1.0-cp310-abi3-manylinux_2_28_x86_64.whl CPython 3.10 abi3 Linux glibc 2.28+ x86-64 Details
medh5-2.1.0-cp310-abi3-manylinux_2_28_aarch64.whl CPython 3.10 abi3 Linux glibc 2.28+ ARM64 Details
medh5-2.1.0-cp310-abi3-macosx_11_0_x86_64.whl CPython 3.10 abi3 macOS 11.0+ x86-64 Details
medh5-2.1.0-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details

Total release size: 113.0 MB

Release files / medh5-2.1.0.tar.gz

Download URL medh5-2.1.0.tar.gz
Size 2.8 MB
Tags Source
SHA-256 checksum
How to use checksums
8a91a9dd18bed15cbf9af6349cf024fb4a62c4754ea36f3fa03e0aaee51adbfd
BLAKE2b-256 checksum
How to use checksums
255b37a45ebc165fcc88bd1d0df48ba15e2fb05eeb46e4f2043a812a7248418e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / medh5-2.1.0-cp314-cp314t-win_amd64.whl

Download URL medh5-2.1.0-cp314-cp314t-win_amd64.whl
Size 12.3 MB
Tags CPython 3.14 CPython 3.14 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
73b6a3d8dc1ab616f5862ba7b01013ff5a816b02e969050302dd3a96088404bd
BLAKE2b-256 checksum
How to use checksums
4084ec7f7c4c2003e5d289243a0591f25c8043dbf503a2bdbe8a6e79afd20ed4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / medh5-2.1.0-cp314-cp314t-manylinux_2_28_x86_64.whl

Download URL medh5-2.1.0-cp314-cp314t-manylinux_2_28_x86_64.whl
Size 11.5 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
abbfe2345405adbea54bd5f796ff9d838467dd1feb414fbd79f1b538763d928a
BLAKE2b-256 checksum
How to use checksums
72ff83e9f56c387251c560bb6d999469a75cb1fb5f53a0260a776a54f7526649
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / medh5-2.1.0-cp314-cp314t-manylinux_2_28_aarch64.whl

Download URL medh5-2.1.0-cp314-cp314t-manylinux_2_28_aarch64.whl
Size 10.6 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
eb714fb6cfdfbf38f4a0e88da3e17e4a59e346b2b5dd1e74952aaf3ba31c2b26
BLAKE2b-256 checksum
How to use checksums
e5e45a4c8cb5ea7b4367134464e98bfd96ea6c88b1c99c10bbdf202900cf4685
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / medh5-2.1.0-cp314-cp314t-macosx_11_0_x86_64.whl

Download URL medh5-2.1.0-cp314-cp314t-macosx_11_0_x86_64.whl
Size 10.9 MB
Tags CPython 3.14 CPython 3.14 free-threading macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
ccdd8e11d8ebad5e8389c583b48fa3532979d52d76df0d920d885e2aee2cd38b
BLAKE2b-256 checksum
How to use checksums
fd5ca8f498d9ce124e745d78408ef8d946bd7ebd03a19a4bc7c9014b675f64a5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / medh5-2.1.0-cp314-cp314t-macosx_11_0_arm64.whl

Download URL medh5-2.1.0-cp314-cp314t-macosx_11_0_arm64.whl
Size 9.9 MB
Tags CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
ca805e726f68f74177f7099a76fd968267d41278216e1701e823177c69d76b07
BLAKE2b-256 checksum
How to use checksums
a8c3cd5eea5ce98ea166814aed665fdcdc8064423ddd366dd71e880ae326d1ac
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / medh5-2.1.0-cp310-abi3-win_amd64.whl

Download URL medh5-2.1.0-cp310-abi3-win_amd64.whl
Size 12.3 MB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
796980993e7e86689dba4294e359fa05849c4f7e3c909fd8b56b429838807063
BLAKE2b-256 checksum
How to use checksums
e80adb1292e5885dc00710af570fb8bdccd5afffd357130100bd6939889ff8c1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / medh5-2.1.0-cp310-abi3-manylinux_2_28_x86_64.whl

Download URL medh5-2.1.0-cp310-abi3-manylinux_2_28_x86_64.whl
Size 11.5 MB
Tags CPython 3.10 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
84591962b35d35026620156374f237c7f64a9e49a10eb429a4b9d1360aaa53cc
BLAKE2b-256 checksum
How to use checksums
c95be8c4ca1d0c30e36ac15492819e1695e3facfa776b8256777b95d9ead4f75
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / medh5-2.1.0-cp310-abi3-manylinux_2_28_aarch64.whl

Download URL medh5-2.1.0-cp310-abi3-manylinux_2_28_aarch64.whl
Size 10.6 MB
Tags CPython 3.10 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
063176f77faad8abdc14174cfb9d9503bc7512cbba2e0ae336ba4b45907f4f97
BLAKE2b-256 checksum
How to use checksums
cdc57ae88ca59affee99e465b613c615748e9b485948f73488f8af17af9d270c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / medh5-2.1.0-cp310-abi3-macosx_11_0_x86_64.whl

Download URL medh5-2.1.0-cp310-abi3-macosx_11_0_x86_64.whl
Size 10.8 MB
Tags CPython 3.10 abi3 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
f4ca2cbae646e740ec5f105d8bc85eb07b0827a6d937c778caa8e5af5423e3cb
BLAKE2b-256 checksum
How to use checksums
62d55dce5d1284b5957aac1a523c5d22d0e8d5cf507cdf64dd573d8378d24dd6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / medh5-2.1.0-cp310-abi3-macosx_11_0_arm64.whl

Download URL medh5-2.1.0-cp310-abi3-macosx_11_0_arm64.whl
Size 9.9 MB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
7a3ec524addf46d0d56cda4664cc4464ff09c3dab6cb2b9ea25679b186ba05a9
BLAKE2b-256 checksum
How to use checksums
f5bee44bc5ebee0f7a638152172fa4e2457867349ccc7eda2a2540bb4988c4bd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

2.1.0 This release

11 release files

2.0.3

6 release files

2.0.2

6 release files

2.0.1

6 release files

2.0.0

6 release files

1.4.4

2 release files

1.4.3

2 release files

1.4.2

2 release files

1.4.1

2 release files

1.4.0

2 release files

1.3.0

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page