Skip to main content

ihist

Fast histogram computation for image data with APIs in Python, Java, and C.

Currently in early development and API may change.

Only 64-bit platforms are supported (let us know in an issue if you have a use case requiring 32-bit support).

Jump to: Python API, Java API, C API, Performance notes.

Python API

Python Quick Start

pip install ihist
import numpy as np
import ihist

# Grayscale image
image = np.random.randint(0, 256, (100, 100), dtype=np.uint8)
hist = ihist.histogram(image)  # Shape: (256,)

# RGB image
rgb = np.random.randint(0, 256, (100, 100, 3), dtype=np.uint8)
hist = ihist.histogram(rgb)  # Shape: (3, 256)

# With masking
mask = np.ones((100, 100), dtype=np.uint8)
hist = ihist.histogram(image, mask=mask)

Python Function

The Python API provides a single function for computing histograms:

import ihist

histogram = ihist.histogram(image, bits=None, mask=None,
                            components=None, out=None,
                            accumulate=False, parallel=True)

Python Parameters

image : array_like Input image data. Must be uint8 or uint16, and 1D, 2D, or 3D.

  • 1D arrays (W,) are interpreted as (1, W, 1)
  • 2D arrays (H, W) are interpreted as (H, W, 1)
  • 3D arrays (H, W, C) use C as number of components

Total pixel count must not exceed 2^32-1.

bits : int, optional Number of significant bits per sample. If not specified, defaults to full depth (8 for uint8, 16 for uint16). Valid range: [0, 8] for uint8, [0, 16] for uint16.

mask : array_like, optional Per-pixel mask. Must be uint8. Shape must match image dimensions:

  • For 1D images (W,): mask must be 1D, shape (W,)
  • For 2D/3D images: mask must be 2D, shape (H, W)

Only pixels with non-zero mask values are included. If not specified, all pixels are included.

components : sequence of int, optional Indices of components to histogram. If not specified, all components are histogrammed. Each index must be in range [0, n_components).

Examples:

  • [0] - histogram only the first component (e.g., red in RGB)
  • [0, 1, 2] - histogram first three components (e.g., RGB in RGBA, skipping alpha)

out : array_like, optional Pre-allocated output buffer. Must be uint32, and either:

  • 1D with shape (2^bits,) for single-component histogram, or
  • 2D with shape (n_hist_components, 2^bits)

If not specified, a new array is allocated and returned.

accumulate : bool, optional If False (default), the output buffer is zeroed before computing the histogram. If True, histogram values are accumulated into the existing buffer values. No effect if out is not given.

parallel : bool, optional If True (default), allows automatic multi-threaded execution for large images. If False, guarantees single-threaded execution.

Python Return Value

histogram : ndarray Histogram(s) as uint32 array.

  • If the image is 1D or 2D and components is not specified, returns 1D array of shape (2^bits,)
  • If the image is 3D or components is explicitly specified, returns 2D array of shape (n_hist_components, 2^bits)
  • If out was provided, returns the same array after filling

Java API

Java Installation

The Java bindings are available on Maven Central. You need both the main JAR and a platform-specific natives JAR containing the JNI library. The native library is automatically extracted and loaded at runtime.

Available platforms: Linux x86_64, macOS arm64, macOS x86_64, Windows x86_64.

Windows note: The Windows native library requires the Microsoft Visual C++ Redistributable. Most systems have this installed. If you get an error, install it from https://aka.ms/vc14/vc_redist.x64.exe.

Maven
<properties>
    <ihist.version>0.1.2</ihist.version>
</properties>

<dependencies>
    <dependency>
        <groupId>io.github.marktsuchida</groupId>
        <artifactId>ihist</artifactId>
        <version>${ihist.version}</version>
    </dependency>
    <dependency>
        <groupId>io.github.marktsuchida</groupId>
        <artifactId>ihist</artifactId>
        <version>${ihist.version}</version>
        <classifier>${ihist.natives.classifier}</classifier>
    </dependency>
</dependencies>

<profiles>
    <profile>
        <id>natives-linux-x86_64</id>
        <activation>
            <os><name>Linux</name><arch>amd64</arch></os>
        </activation>
        <properties>
            <ihist.natives.classifier>natives-linux-x86_64</ihist.natives.classifier>
        </properties>
    </profile>
    <profile>
        <id>natives-macos-arm64</id>
        <activation>
            <os><family>mac</family><arch>aarch64</arch></os>
        </activation>
        <properties>
            <ihist.natives.classifier>natives-macos-arm64</ihist.natives.classifier>
        </properties>
    </profile>
    <profile>
        <id>natives-macos-x86_64</id>
        <activation>
            <os><family>mac</family><arch>x86_64</arch></os>
        </activation>
        <properties>
            <ihist.natives.classifier>natives-macos-x86_64</ihist.natives.classifier>
        </properties>
    </profile>
    <profile>
        <id>natives-windows-x86_64</id>
        <activation>
            <os><family>windows</family><arch>amd64</arch></os>
        </activation>
        <properties>
            <ihist.natives.classifier>natives-windows-x86_64</ihist.natives.classifier>
        </properties>
    </profile>
</profiles>
Gradle (Kotlin DSL)
plugins {
    id("com.google.osdetector") version "1.7.3"
}

val ihistVersion = "0.1.2"
val ihistNativesClassifier = when {
    osdetector.os == "linux" && osdetector.arch == "x86_64" -> "natives-linux-x86_64"
    osdetector.os == "osx" && osdetector.arch == "aarch_64" -> "natives-macos-arm64"
    osdetector.os == "osx" && osdetector.arch == "x86_64" -> "natives-macos-x86_64"
    osdetector.os == "windows" && osdetector.arch == "x86_64" -> "natives-windows-x86_64"
    else -> throw GradleException("Unsupported platform: ${osdetector.os}-${osdetector.arch}")
}

dependencies {
    implementation("io.github.marktsuchida:ihist:$ihistVersion")
    runtimeOnly("io.github.marktsuchida:ihist:$ihistVersion:$ihistNativesClassifier")
}
Gradle (Groovy DSL)
plugins {
    id 'com.google.osdetector' version '1.7.3'
}

def ihistVersion = '0.1.2'
def ihistNativesClassifier
switch ("${osdetector.os}-${osdetector.arch}") {
    case 'linux-x86_64': ihistNativesClassifier = 'natives-linux-x86_64'; break
    case 'osx-aarch_64': ihistNativesClassifier = 'natives-macos-arm64'; break
    case 'osx-x86_64': ihistNativesClassifier = 'natives-macos-x86_64'; break
    case 'windows-x86_64': ihistNativesClassifier = 'natives-windows-x86_64'; break
    default:
        throw new GradleException(
            "Unsupported platform: ${osdetector.os}-${osdetector.arch}")
}

dependencies {
    implementation "io.github.marktsuchida:ihist:$ihistVersion"
    runtimeOnly "io.github.marktsuchida:ihist:$ihistVersion:$ihistNativesClassifier"
}

Java Version Compatibility

The library targets Java 8 and works with all later versions:

  • Java 8: Use as a regular classpath dependency
  • Java 9+: Can be used on the classpath or as an automatic module with name io.github.marktsuchida.ihist

Java Quick Start

import io.github.marktsuchida.ihist.HistogramRequest;
import java.nio.IntBuffer;

// Grayscale image
byte[] image = new byte[100 * 100];
IntBuffer hist = HistogramRequest.forImage(image, 100, 100).compute(); // 256 bins
// hist.remaining() == 256, access with hist.get(i)

// RGB image
byte[] rgb = new byte[100 * 100 * 3];
IntBuffer hist = HistogramRequest.forImage(rgb, 100, 100, 3).compute(); // 3 * 256 bins

// With advanced options
IntBuffer hist = HistogramRequest.forImage(image, 100, 100)
    .roi(10, 10, 80, 80)       // Region of interest
    .mask(maskData, 80, 80)    // Per-pixel mask
    .bits(8)                   // Significant bits
    .parallel(true)            // Allow multi-threading
    .compute();

Java Classes

HistogramRequest - Builder-style interface:

// Multi-component image (e.g., RGB)
IntBuffer hist = HistogramRequest.forImage(image, width, height, 3)
    .selectComponents(0, 1, 2)      // Which components to histogram
    .roi(x, y, roiWidth, roiHeight) // Region of interest
    .mask(maskData, maskWidth, maskHeight)  // Per-pixel mask with dimensions
    .maskOffset(offsetX, offsetY)   // Mask offset for ROI alignment
    .bits(sampleBits)               // Significant bits per sample
    .output(preallocatedBuffer)     // Pre-allocated output (size must be exact)
    .accumulate(true)               // Add to existing values
    .parallel(true)                 // Allow multi-threading
    .compute();

// All methods except for forImage() and compute() are optional.

// The returned IntBuffer has position/limit set to cover the histogram data.
// If output(IntBuffer) was used, the returned buffer is a duplicate that shares
// storage with the original; the original's position/limit are not modified.
// For heap buffers (default or when output(int[]) was used), get the array:
int[] array = hist.array();

IHistNative - Low-level JNI wrapper (advanced):

// Buffer-based (direct or array-backed buffers)
IHistNative.histogram8(sampleBits, imageBuffer, maskBuffer,
    height, width, imageStride, maskStride, nComponents, componentIndices,
    histogramBuffer, parallel);

(And, similarly, histogram16() for 16-bit images.)

Java Input Types

The Java API supports both arrays and NIO buffers:

  • 8-bit images: byte[] or ByteBuffer
  • 16-bit images: short[] or ShortBuffer
  • Mask: byte[] or ByteBuffer
  • Histogram output: int[] or IntBuffer

Java Notes

  • Signed types: Java byte is signed (-128 to 127), but pixel values are interpreted as unsigned (0 to 255). The native code correctly handles this. Similarly for short with 16-bit images.

  • Accumulation: Like the C API, histogram values are accumulated. Use .accumulate(false) (default) to zero the output first.

  • Exact buffer sizes: Buffer and array parameters must have exactly the required size (not just at least the required size). For the image buffer, this is width * height * nComponents; for the mask, width * height; for the histogram output, nHistComponents * 2^bits. For buffers, the size that must match is the value of remaining() (distance from position() to limit()), not capacity().

  • Thread safety: The histogram functions are thread-safe for independent calls. Multiple threads can compute histograms simultaneously.

C API

C Installation

Dependencies: oneTBB (optional but recommended for parallelization). TBB should be installed as a shared library and discoverable via pkg-config. (TBB as a static library works but is not recommended unless ihist is the only code using TBB in your application.)

Build and install:

meson setup builddir --prefix=/your/install/path
meson compile -C builddir
meson install -C builddir

On Windows, add --vsenv to have Meson set up the Visual Studio environment.

Building with Clang (CXX=clang++ or, on Windows, CXX=clang-cl) is recommended for best performance, as benchmarking and tuning were done with Clang.

To build without TBB, add -Dtbb=disabled to the meson setup command.

(just and the provided justfile can be used for development builds but is not recommended for production builds.)

Using in your project:

Meson:

ihist_dep = dependency('ihist')

CMake:

find_package(PkgConfig REQUIRED)
pkg_check_modules(IHIST REQUIRED IMPORTED_TARGET ihist)
target_link_libraries(your_target PkgConfig::IHIST)

C Functions

The C API provides two functions for computing histograms of 2D image data:

  • ihist_hist8_2d() - for 8-bit samples (uint8_t)
  • ihist_hist16_2d() - for 16-bit samples (uint16_t)

Both functions have identical behavior except for the sample data type.

#include <ihist/ihist.h>

void ihist_hist8_2d(
    size_t sample_bits,
    uint8_t const *restrict image,
    uint8_t const *restrict mask,
    size_t height,
    size_t width,
    size_t image_stride,
    size_t mask_stride,
    size_t n_components,
    size_t n_hist_components,
    size_t const *restrict component_indices,
    uint32_t *restrict histogram,
    bool maybe_parallel);

void ihist_hist16_2d(
    size_t sample_bits,
    uint16_t const *restrict image,
    uint8_t const *restrict mask,
    size_t height,
    size_t width,
    size_t image_stride,
    size_t mask_stride,
    size_t n_components,
    size_t n_hist_components,
    size_t const *restrict component_indices,
    uint32_t *restrict histogram,
    bool maybe_parallel);

These functions compute histograms for one or more components (stored as interleaved multi-sample pixels) from image data. They support:

  • Multi-component images (e.g., grayscale, RGB, RGBA)
  • Selective histogramming of specific components
  • Optional per-pixel masking
  • Region of interest (ROI) processing via stride and pointer offset
  • Automatic parallelization for large images
  • Arbitrary bit depths (not just full 8 or 16 bits)

C Parameters

sample_bits Number of significant bits per sample. Valid range: 1-8 for ihist_hist8_2d(), 1-16 for ihist_hist16_2d(). The histogram will contain 2^sample_bits bins per sample.

Values with bits set beyond sample_bits are discarded and not counted in any bin.

image Pointer to image data. Samples are interleaved in row-major order:

  • Row 0, pixel 0: all samples
  • Row 0, pixel 1: all samples
  • ...
  • Row 1, pixel 0: all samples
  • ...

May be NULL if height or width is 0.

mask (optional) Per-pixel mask for selective histogramming. If non-NULL, must point to height * mask_stride uint8_t values. Only pixels where the corresponding mask value is non-zero are included in the histogram.

Pass NULL to histogram all pixels.

height Image height in pixels. May be 0 for empty input.

width Image width in pixels. May be 0 for empty input.

image_stride Row stride for the image in pixels (not bytes). Must be ≥ width.

When image_stride equals width, the image is treated as contiguous. Use image_stride > width together with an offset image pointer to process a rectangular region of interest (ROI) within a larger image.

mask_stride Row stride for the mask in pixels (not bytes). Must be ≥ width.

When mask_stride equals width, the mask is treated as contiguous. This parameter allows the mask to have a different stride from the image, which is useful, for example, if you have a mask that covers only a rectanglular ROI of the image.

n_components Number of interleaved per pixel. Examples:

  • 1 for grayscale
  • 3 for RGB
  • 4 for RGBA

Must be > 0.

n_hist_components Number of components to histogram. Must be > 0.

This allows histogramming a subset of components, such as skipping the alpha component in RGBA images.

component_indices Array of n_hist_components indices specifying which components to histogram. Each index must be in the range [0, n_components).

Examples:

  • {0} - histogram only the first component (e.g., red in RGB)
  • {0, 1, 2} - histogram first three components (e.g., RGB in RGBA, skipping alpha)
  • {1, 2, 3} - histogram last three components (e.g., skip first component in ARGB)

Must not be NULL.

histogram (output, accumulated) Output buffer for histogram data. Must point to n_hist_components * 2^sample_bits uint32_t values.

Histograms for each component are stored consecutively:

  • Bins for component_indices[0]: histogram[0] to histogram[2^sample_bits - 1]
  • Bins for component_indices[1]: histogram[2^sample_bits] to histogram[2 * 2^sample_bits - 1]
  • ...

Important: The histogram is accumulated into this buffer. Existing values are added to, not replaced. To obtain a fresh histogram, zero-initialize the buffer before calling the function.

maybe_parallel Controls parallelization.

  • true - Allows automatic multi-threaded execution for large images, if ihist was built with parallelization support (TBB).
  • false - Guarantees single-threaded execution.

Performance

The library uses cache-conscious algorithms with platform-specific tuning for x86_64 and Apple ARM64. The details below are subject to change upon future tuning.

Parallelization

When built with TBB support (default for released binaries), histogram computation automatically parallelizes for large images (currently ≥ 1 M pixels). Only physical CPU cores are used (hyperthreads are excluded) because histogramming is almost always backend-bound (that is, bottlenecked by CPU resources that are shared between logical cores).

Although minimizing latency is a goal, we also want to maintain efficiency: CPU time should not be consumed when it does not contribute much to speedup. This is the reason for the relatively large parallelization threshold; we also increase the thread count only gradually above the threshold.

Use parallel=False (Python), .parallel(false) (Java), or maybe_parallel=false (C) to force single-threaded execution.

Optimized Pixel Formats

The following pixel formats have specialized optimized code paths:

  • Grayscale (1 component)
  • RGB (3 components, histogramming all)
  • RGBx (or BGRx, RGBA, etc.; 4 components, histogramming first 3)
  • xRGB (or xBGR, ARGB, etc.; 4 components, histogramming last 3)

Other component selections (e.g., histogramming only the red and blue channels of an RGB image) fall back to a slower generic implementation. More optimized pixel formats could be added, subject to tradeoffs with binary size and tuning effort.

Bit Depth

  • 8-bit images use 256-bin histograms
  • 16-bit images with 12 or fewer significant bits use 4096-bin histograms
  • 16-bit images with more than 12 significant bits use 65536-bin histograms

When a bit depth other than 8 (for 8-bit images) or 12 or 16 (for 16-bit images) is requested, the resulting histogram is simply truncated.

Memory Layout

Contiguous images are the fastest but 2D strided images are also optimized, so that histogramming rectangular regions of interest does not require copying the image or mask.

Zero-copy Language Bindings

The Python and Java bindings try to avoid copying the input and output arrays as much as possible. However, there are cases where this cannot be avoided:

  • Python: C-contiguous arrays are used directly, as are 2D (single-component) Fortran-contiguous arrays. 3D Fortran-contiguous arrays require a copy because color components must be interleaved in memory. Sliced views where neither spatial axis is contiguous (such as arr[:, ::2] on a row-major array) are also copied.

  • Java: Buffers that are not direct and whose .hasArray() method returns false (this includes read-only heap buffers and ShortBuffer/IntBuffer that are views of heap byte buffers) cannot be accessed via JNI; these are copied to temporary direct buffers. Direct buffers are preferred if you have the choice, especially for large images, because pinning heap buffers for JNI access can interfere with the smooth operation of the garbage collector.

Release files for ihist 0.1.3

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

Source distribution (sdist)

Source distribution for ihist 0.1.3
File Size Uploaded
ihist-0.1.3.tar.gz 100.2 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for ihist 0.1.3
File
ihist-0.1.3-cp314-cp314t-win_amd64.whl CPython 3.14 CPython 3.14 free-threading Windows x86-64 Details
ihist-0.1.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
ihist-0.1.3-cp314-cp314t-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64 Details
ihist-0.1.3-cp314-cp314t-macosx_10_15_x86_64.whl CPython 3.14 CPython 3.14 free-threading macOS 10.15+ x86-64 Details
ihist-0.1.3-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
ihist-0.1.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
ihist-0.1.3-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details
ihist-0.1.3-cp314-cp314-macosx_10_15_x86_64.whl CPython 3.14 CPython 3.14 macOS 10.15+ x86-64 Details
ihist-0.1.3-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
ihist-0.1.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
ihist-0.1.3-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
ihist-0.1.3-cp313-cp313-macosx_10_15_x86_64.whl CPython 3.13 CPython 3.13 macOS 10.15+ x86-64 Details
ihist-0.1.3-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
ihist-0.1.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
ihist-0.1.3-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
ihist-0.1.3-cp312-cp312-macosx_10_15_x86_64.whl CPython 3.12 CPython 3.12 macOS 10.15+ x86-64 Details
ihist-0.1.3-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
ihist-0.1.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
ihist-0.1.3-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
ihist-0.1.3-cp311-cp311-macosx_10_15_x86_64.whl CPython 3.11 CPython 3.11 macOS 10.15+ x86-64 Details
ihist-0.1.3-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
ihist-0.1.3-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
ihist-0.1.3-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details
ihist-0.1.3-cp310-cp310-macosx_10_15_x86_64.whl CPython 3.10 CPython 3.10 macOS 10.15+ x86-64 Details

Total release size: 4.3 MB

Release files / ihist-0.1.3.tar.gz

Download URL ihist-0.1.3.tar.gz
Size 100.2 kB
Tags Source
SHA-256 checksum
How to use checksums
5be2d5f02ce8f0771272deed7fa5a47c40b9dc5d0fa673f02a1f07218766169c
BLAKE2b-256 checksum
How to use checksums
fec136eea91093807da22de06b97b4a24018a5641c5a0b0a788e83690d6442a9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp314-cp314t-win_amd64.whl

Download URL ihist-0.1.3-cp314-cp314t-win_amd64.whl
Size 187.8 kB
Tags CPython 3.14 CPython 3.14 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
80a5ecdd2813466f25ac364b9ba822d9c32b33da9636fffda8dc0c309342dc40
BLAKE2b-256 checksum
How to use checksums
24772ce1976407bb1786098ad2b113d84b564894b14c55451d2d053095075294
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL ihist-0.1.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 224.9 kB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
860ee766489deeb64773371269a3b45245bd7074e9cbb18440864e70395a189f
BLAKE2b-256 checksum
How to use checksums
57e16fd5696ada75eafbbfe54cdd9dc64472e3cbc4d6e5d37d6a43e31c655c1b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp314-cp314t-macosx_11_0_arm64.whl

Download URL ihist-0.1.3-cp314-cp314t-macosx_11_0_arm64.whl
Size 145.5 kB
Tags CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
4801a58ac4a6d94c82dcfea3ac2aebc59b3eff814537516e2ecb1d984a8e44ae
BLAKE2b-256 checksum
How to use checksums
6f0d9d8ab33125ea1ff14f07233f78c50dc6e6594d7c984384e11c86ad326413
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp314-cp314t-macosx_10_15_x86_64.whl

Download URL ihist-0.1.3-cp314-cp314t-macosx_10_15_x86_64.whl
Size 152.6 kB
Tags CPython 3.14 CPython 3.14 free-threading macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
0c4fea60e8832370743f64b2a7d7f2b2461f4b1d8ab924f335a7a8f21aa6bd9e
BLAKE2b-256 checksum
How to use checksums
7847d4f70ab0e372a0d9c0b4e2266a836438390421f8a1ec7edaf1c8f353ffee
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp314-cp314-win_amd64.whl

Download URL ihist-0.1.3-cp314-cp314-win_amd64.whl
Size 187.2 kB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
bda872e86a5f5cdb7f38736e1ebbdbb6fe3bc8c8b35bbc2edd5c298992f95587
BLAKE2b-256 checksum
How to use checksums
107b803ffcf001f7a7d64ef6f75a5c35902d51d51db2ec4a136c4d0bdf5718e9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL ihist-0.1.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 226.5 kB
Tags CPython 3.14 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
69d775c4e2a1d0872e9f8051944b5ad04eaade53ba45e202aadb44fa23d6ffb9
BLAKE2b-256 checksum
How to use checksums
b222881f58514d7717a29188e1057d335e0a534b7bc9c507e7f073227bd26664
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp314-cp314-macosx_11_0_arm64.whl

Download URL ihist-0.1.3-cp314-cp314-macosx_11_0_arm64.whl
Size 144.0 kB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
1a210995375e793567e037f26bd9cc266abe442f2ecce65ed96a32cb3be62cad
BLAKE2b-256 checksum
How to use checksums
c5524365f57266bc0b600297793e93a16cf44502788cd213d75cb18cea77449b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp314-cp314-macosx_10_15_x86_64.whl

Download URL ihist-0.1.3-cp314-cp314-macosx_10_15_x86_64.whl
Size 151.3 kB
Tags CPython 3.14 macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
840ed8a0d8587e5fd63e1b8fa8793d7fd6feeb3376c48c1734a404d6fca2c24b
BLAKE2b-256 checksum
How to use checksums
679b3fc2773b1ae52b9bc2a6e84d9afe0b1eac45d36a607116c1667997044ad5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp313-cp313-win_amd64.whl

Download URL ihist-0.1.3-cp313-cp313-win_amd64.whl
Size 182.8 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
405f66fb1927f566075428402289d45d89f98f1d62fb0e2dd85e3b12f4644e49
BLAKE2b-256 checksum
How to use checksums
12d96f4c7d4147275ca9648aade54f3599fd3cde90cbe887a091700880d48efb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL ihist-0.1.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 226.5 kB
Tags CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
db63091ba3f2c3fc0434bd1b3fe28455fc803a5962b489ed26701ed2099b72e5
BLAKE2b-256 checksum
How to use checksums
b443e5771a91fde55817a284b9753d0a46689b8adcc99c8eed0ed4788c15bcc4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp313-cp313-macosx_11_0_arm64.whl

Download URL ihist-0.1.3-cp313-cp313-macosx_11_0_arm64.whl
Size 143.9 kB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
94fca3f826aac8b4e8d3de0e1132fceafd26f476d8ebd4f7a367fc98a479d282
BLAKE2b-256 checksum
How to use checksums
834a8e5b21669c8f3b1e08259fef27a5c08c698b5fe6bc3f4e0796e5a37202a4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp313-cp313-macosx_10_15_x86_64.whl

Download URL ihist-0.1.3-cp313-cp313-macosx_10_15_x86_64.whl
Size 151.2 kB
Tags CPython 3.13 macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
99281323ad2210a367b18bbc9960fd89edd9689b8f5fb59d96a5979a79e75823
BLAKE2b-256 checksum
How to use checksums
3a61a1ee4fe302d28697254396b272b63506bb33151e77f16697c3ede7653305
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp312-cp312-win_amd64.whl

Download URL ihist-0.1.3-cp312-cp312-win_amd64.whl
Size 182.8 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
0762a469749bf04feee789da61d319f47a5e26ef450de1c6c1dec4a6d0d4b0da
BLAKE2b-256 checksum
How to use checksums
3bf66c154c70ca55888b3fbe29fba975a7873d4785dabec90823cb962447cfa2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL ihist-0.1.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 226.5 kB
Tags CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
01bd5aec5d326c3dea9b3d2c96fe26065cb8d45edbfc700080cd24515b45f1bf
BLAKE2b-256 checksum
How to use checksums
877feca98ebc90319106546474622280c7b8915fad6f94bc883dceb8417d61ca
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp312-cp312-macosx_11_0_arm64.whl

Download URL ihist-0.1.3-cp312-cp312-macosx_11_0_arm64.whl
Size 143.9 kB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
f1f6a4537385e0a3eb57fc4c592ac6058fa2438bcdbdcd44a6669c4d39f17134
BLAKE2b-256 checksum
How to use checksums
54df020d90aaee7fe752bf39464fe5453dd40b57f6abe03f58a8bde523ef9d9c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp312-cp312-macosx_10_15_x86_64.whl

Download URL ihist-0.1.3-cp312-cp312-macosx_10_15_x86_64.whl
Size 151.2 kB
Tags CPython 3.12 macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
89a97dca62ced8cca88eded2a3be155bbfab03bda1347584588dcdafd40b3a34
BLAKE2b-256 checksum
How to use checksums
a81272526c5c6a4f8cb32af2423493470c23a61264512f1c9e6fd4d9f2ca3665
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp311-cp311-win_amd64.whl

Download URL ihist-0.1.3-cp311-cp311-win_amd64.whl
Size 182.8 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
3deb67c23fd9ec26645a38748eeaf80744eb67d870b6ab8b307415197cf1e97f
BLAKE2b-256 checksum
How to use checksums
675b73cb1f9e4fcac46f6ad0b2b4b9c31ece233f66b3f2d56cb0edc0489820b7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL ihist-0.1.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 226.7 kB
Tags CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
7ea617418ee259bd3fea80029aeaf965cfae5ac4069d1de7d5a69ff04b9b643f
BLAKE2b-256 checksum
How to use checksums
556f2b40b291453f69aff244acbd9bdfc407d7d1100b996b5abe926797496ffa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp311-cp311-macosx_11_0_arm64.whl

Download URL ihist-0.1.3-cp311-cp311-macosx_11_0_arm64.whl
Size 144.0 kB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
b739037aebb284b579037cf2a4a3307eabcc4f0790d9f00a5139a4b9e513a261
BLAKE2b-256 checksum
How to use checksums
a102558b3becc4d843b1b11f4470eded6455db05856b19a35bf184d58de94cbb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp311-cp311-macosx_10_15_x86_64.whl

Download URL ihist-0.1.3-cp311-cp311-macosx_10_15_x86_64.whl
Size 151.2 kB
Tags CPython 3.11 macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
84ec47d6855db1012ff4ac2254166f438b2eba96bb25ce29d779aa054f63db21
BLAKE2b-256 checksum
How to use checksums
6857827076e96a536ddc9c9b299c399874fb9ffdd694ea22b117c93b433f46f3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp310-cp310-win_amd64.whl

Download URL ihist-0.1.3-cp310-cp310-win_amd64.whl
Size 182.9 kB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
73a0ca7743573278f65154c9a24b80b32f8d5f45ab2f64f512e787009e842bee
BLAKE2b-256 checksum
How to use checksums
0c2cef2f3704f193bc965fc28161eafc36aaa70ee555d518658111e04857a257
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL ihist-0.1.3-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 226.8 kB
Tags CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
a7df0eb7e9f0e4483ebaa996b94c13260fe2d37ed0d4a302e9ae9b92c73532cb
BLAKE2b-256 checksum
How to use checksums
b7d02f42e6d5e441cd43bdd6d78814ba101f6c77be03b3e5e10446e843ac1ded
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp310-cp310-macosx_11_0_arm64.whl

Download URL ihist-0.1.3-cp310-cp310-macosx_11_0_arm64.whl
Size 144.1 kB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
de457cc515d31fbd2d672330106d12486dcdfbf61070dc8f338bb7918fad6ee0
BLAKE2b-256 checksum
How to use checksums
eee5908faa0d0e8ccd607bfe9a937b4896244b88744e2e4e80aca21bb140b906
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release files / ihist-0.1.3-cp310-cp310-macosx_10_15_x86_64.whl

Download URL ihist-0.1.3-cp310-cp310-macosx_10_15_x86_64.whl
Size 151.3 kB
Tags CPython 3.10 macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
e9bd5fd556aeb5b5f9bb6e7bdf2f4cf306e0a2a5f6d60f1d7947e06bcf3a519b
BLAKE2b-256 checksum
How to use checksums
8df3daaa6bc28b1c0af92e821811c30c2202746ac90dc8bf3965ce79882afed1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Jan 14, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.3 This release

25 release files

0.1.2

25 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