Skip to main content

Source-available Rust/Python quantum error correction decoder package for QEC research, PyMatching-compatible validation, belief-matching, BP-OSD/qLDPC workflows, CPU/GPU batch decoding, and reproducible benchmark evidence

Project description

QECTOR Decoder v3

Python and Rust quantum error correction decoder package.

QECTOR Decoder v3 helps researchers and developers test quantum error correction decoder workflows from Python, with native Rust performance paths and reproducible benchmark artifacts.

Common search terms: quantum error correction, QEC decoder, quantum decoder Python, Rust quantum error correction, PyMatching-compatible decoder, Stim workflow, Sinter benchmark, BP-OSD, LDPC, qLDPC, surface code decoder, MWPM decoder, union find decoder, belief matching, PyO3, maturin, QECTOR.

Website: https://www.qector.store
PyPI: https://pypi.org/project/qector-decoder-v3/
DOI: https://doi.org/10.5281/zenodo.20825980
Repository: https://github.com/GuillaumeLessard/qector-decoder
Commercial licensing: https://www.qector.store


Installation

Recommended command:

pip install qector-decoder-v3

Verify the install:

python -c "from qector_decoder_v3 import UnionFindDecoder, BlossomDecoder; print('QECTOR OK')"

Optional extras:

pip install "qector-decoder-v3[stim]"
pip install "qector-decoder-v3[bench]"
pip install "qector-decoder-v3[all]"

Windows note

Use the pip bound to your active standard Python environment. Do not force py -m pip unless you have checked which interpreter the Windows launcher selected.

On some systems, py can select a free-threaded interpreter such as python3.13t.exe. QECTOR v0.5.x publishes standard CPython wheels, not cp313t free-threaded wheels.

Working Windows command:

pip install qector-decoder-v3
python -c "from qector_decoder_v3 import UnionFindDecoder, BlossomDecoder; print('QECTOR OK')"

Check launcher targets with:

py -0p

Supported public wheels

Platform Wheel status
Linux x86_64 Published
Windows x64 Published
macOS arm64 / Apple Silicon Published
macOS Intel x86_64 Not published in v0.5.x public CI
CPython free-threaded builds such as cp313t Not published in v0.5.x

Supported Python classifiers are standard CPython 3.9 to 3.13.


Quick start

import numpy as np
from qector_decoder_v3 import UnionFindDecoder, BlossomDecoder

check_to_qubits = [[0, 1], [1, 2], [2, 3], [3, 4]]
n_qubits = 5
syndrome = np.array([0, 1, 0, 0], dtype=np.uint8)

uf = UnionFindDecoder(check_to_qubits, n_qubits)
print(uf.decode(syndrome))

mwpm = BlossomDecoder(check_to_qubits, n_qubits)
print(mwpm.decode(syndrome))

Batch decoding:

import numpy as np
from qector_decoder_v3 import BatchDecoder

checks = [[0, 1], [1, 2], [2, 3], [3, 4]]
syndromes = np.random.randint(0, 2, size=(4096, 4), dtype=np.uint8)

cpu = BatchDecoder(checks, n_qubits=5)
corrections = cpu.parallel_batch_decode(syndromes)
# single-shot also works (v0.5.3+):
corrections_single = cpu.decode(syndromes[0])
print(corrections.shape)

API surface

Stim / DEM integration

import stim
from qector_decoder_v3.stim_compat import (
    from_stim_detector_error_model,
    stim_circuit_to_check_matrix,  # identical alias
    to_stim_decoder,
    stim_decoder_from_dem,
)

dem = stim.Circuit.generated(
    "surface_code:rotated_memory_x", distance=5
).detector_error_model(decompose_errors=True)

c2q, nq = from_stim_detector_error_model(dem)
# or equivalently: stim_circuit_to_check_matrix(dem)

decoder = stim_decoder_from_dem(dem)

Sinter integration

import sinter
from qector_decoder_v3.sinter_compat import (
    QectorSinterDecoder,
    QectorDecoderWrapper,   # backward-compat alias for QectorSinterDecoder
    qector_sinter_decoders,
)

samples = sinter.collect(
    num_workers=4,
    tasks=tasks,
    decoders=["qector_belief", "qector_blossom", "qector_unionfind"],
    custom_decoders=qector_sinter_decoders(),
)

# standalone single-syndrome decode (v0.5.3+, no Sinter required):
dec = QectorSinterDecoder("blossom")
obs = dec.decode(syndrome, dem=dem)

BeliefMatching raw H constructor (v0.5.3+)

import numpy as np
from qector_decoder_v3.belief_matching import BeliefMatching

# From a Stim DEM (recommended for circuit-level noise):
bm = BeliefMatching.from_detector_error_model(dem)

# From a raw check matrix H (uniform prior p=0.1):
H = np.array([[1, 1, 0], [0, 1, 1]], dtype=np.uint8)
bm = BeliefMatching(H, p=0.05)
obs = bm.decode(syndrome)

CUDA / GPU

from qector_decoder_v3 import CUDABatchDecoder

# Always check availability before constructing
if CUDABatchDecoder.is_available():
    dec = CUDABatchDecoder(check_to_qubits, n_qubits)
    corrections = dec.batch_decode(syndromes)
else:
    print("No CUDA GPU detected — use BatchDecoder for CPU batch decoding")

Independent validation (v0.5.3)

Validated by independent automated test suite (87/87 checks PASS on v0.5.3). Platform: Windows 10, AMD Ryzen 16-core, NVIDIA GTX 1660 Ti (CUDA 7.5), Python 3.11, PyMatching 2.4.0. Full artifact: benchmark_results/results_v053_retest.json.

v0.5.3 API fixes (all 3 verified):

Fix Before After
BatchDecoder.decode(syndrome) absent (only parallel_batch_decode) present, 1-row batch wrapper
BeliefMatching(H, p=0.1) TypeError (expected _Matrices) accepts raw numpy H, uniform prior
QectorSinterDecoder.decode(syndrome, dem) absent present, DEM cached on first call
Claim Result
30 decoder x code combinations, 100% syndrome-valid corrections Confirmed
pymatching_compat bit-identical to PyMatching 2.4.0 Confirmed
Blossom LER within 0.00% of PyMatching on repetition code d=3-9 Confirmed
Blossom LER within 1.78% of PyMatching on rotated surface code d=3-7 Confirmed
CUDA batch 100% CPU-agreeing at all tested batch sizes (GTX 1660 Ti) Confirmed
CUDA batch 6.9-7.7x faster than CPU batch at 100k shots Confirmed
Workbench single-decode rep d=5 Blossom: 285,713 dec/s, p50 3.50 us, p99 9.50 us Confirmed
AutoDecoder backends: cpu, cuda GTX 1660 Ti, opencl=False Confirmed
Workbench JSON/CSV/PDF export pipeline end-to-end Confirmed
LookupTableDecoder table_size for rep d=5: 64 entries Confirmed
d=101 stress decode completes without error Confirmed
Invalid input rejected with clear ValueError / TypeError Confirmed

Single-shot latency reference (us/decode, 2000 samples, independently validated)

Decoder rep d=5 rep d=9 surf d=3 surf d=5
UnionFindDecoder 9.3 10.0 12.2 10.1
FastUnionFindDecoder 9.5 10.2 11.4 12.1
BlossomDecoder 10.6 10.6 14.8 16.8
SparseBlossomDecoder 11.8 10.6 11.5 29.2
CPUBatchDecoder 11.2 9.7 9.5 10.7
LookupTableDecoder 8.7 10.7 9.5

LookupTableDecoder is the fastest single-shot decoder on rep d=5 (precomputed table, 64 entries, O(1) lookup).

Known limitations

  • Union-Find is ~3x less accurate than MWPM — expected speed/accuracy trade-off.
  • Single-round code-capacity noise does not produce surface-code distance scaling. Use circuit-level Stim DEM with qector_sinter_decoders() for threshold curves.
  • SparseBlossom batch may return different (but valid) corrections than single-shot on degenerate syndromes. Benign matching degeneracy.
  • CUDABatchDecoder raises RuntimeError cleanly when no CUDA GPU is present. Use CUDABatchDecoder.is_available() to check first.

License

Source-available. Commercial use requires written licensing through https://www.qector.store.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

qector_decoder_v3-0.5.5-cp313-cp313-win_amd64.whl (517.9 kB view details)

Uploaded CPython 3.13Windows x86-64

qector_decoder_v3-0.5.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (616.3 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

qector_decoder_v3-0.5.5-cp313-cp313-macosx_11_0_arm64.whl (545.9 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

qector_decoder_v3-0.5.5-cp312-cp312-win_amd64.whl (517.6 kB view details)

Uploaded CPython 3.12Windows x86-64

qector_decoder_v3-0.5.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (616.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

qector_decoder_v3-0.5.5-cp312-cp312-macosx_11_0_arm64.whl (546.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

qector_decoder_v3-0.5.5-cp311-cp311-win_amd64.whl (517.9 kB view details)

Uploaded CPython 3.11Windows x86-64

qector_decoder_v3-0.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (616.3 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

qector_decoder_v3-0.5.5-cp311-cp311-macosx_11_0_arm64.whl (550.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

qector_decoder_v3-0.5.5-cp310-cp310-win_amd64.whl (518.1 kB view details)

Uploaded CPython 3.10Windows x86-64

qector_decoder_v3-0.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (616.6 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

qector_decoder_v3-0.5.5-cp310-cp310-macosx_11_0_arm64.whl (550.7 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

qector_decoder_v3-0.5.5-cp39-cp39-win_amd64.whl (519.3 kB view details)

Uploaded CPython 3.9Windows x86-64

qector_decoder_v3-0.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (617.9 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

qector_decoder_v3-0.5.5-cp39-cp39-macosx_11_0_arm64.whl (551.6 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

Details for the file qector_decoder_v3-0.5.5-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for qector_decoder_v3-0.5.5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 c6530fa821aea4aa074cd28d2e36d44855edd33a4f3f41e7a5b0a78df3ef9ff9
MD5 66589d01a02955f602043cabaf9174eb
BLAKE2b-256 d4d9121494a788d05ec099771591b16702d1bd91a9902fde192a0624b2deb999

See more details on using hashes here.

Provenance

The following attestation bundles were made for qector_decoder_v3-0.5.5-cp313-cp313-win_amd64.whl:

Publisher: CI.yml on GuillaumeLessard/qector-decoder

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qector_decoder_v3-0.5.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for qector_decoder_v3-0.5.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 db8a5334f4f095db6456e8e5134d581af594b60a33ed607da06ee9f08435eea9
MD5 9081a79c59ad598d211a7c00ca0ac7ac
BLAKE2b-256 89411303540e5d74c787c3b6cab0905d4daac8ab93fa107fb5f7a0042d79884e

See more details on using hashes here.

Provenance

The following attestation bundles were made for qector_decoder_v3-0.5.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: CI.yml on GuillaumeLessard/qector-decoder

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qector_decoder_v3-0.5.5-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for qector_decoder_v3-0.5.5-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8a13f8dc69695571610d237dab5b58e0fa48af0a2b2b310975e479331bf9235b
MD5 12d7a65be3cc5c92376a0fe557f56019
BLAKE2b-256 fa755f911352f1218942c74fda55ea421a42a34d2fdd8843da7273031017670b

See more details on using hashes here.

Provenance

The following attestation bundles were made for qector_decoder_v3-0.5.5-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: CI.yml on GuillaumeLessard/qector-decoder

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qector_decoder_v3-0.5.5-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for qector_decoder_v3-0.5.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 b79d6d47cd7826af2044d7bd8bd3ccfa5b4a7d9046ebb3c1de9f002130788219
MD5 35fca33c4d8c2bcf5693aa5a91874e50
BLAKE2b-256 342eb633292179f842a78104f92f18ac8ff61947d7f9534035c75a4ec4cfecc6

See more details on using hashes here.

Provenance

The following attestation bundles were made for qector_decoder_v3-0.5.5-cp312-cp312-win_amd64.whl:

Publisher: CI.yml on GuillaumeLessard/qector-decoder

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qector_decoder_v3-0.5.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for qector_decoder_v3-0.5.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3ca4ef5b7e74045ee12b252bebd5e200cee6fd9b76442a5b8943e4548ed6c9a4
MD5 afa1d5a946b8d1419d44a48b44784112
BLAKE2b-256 d71e5892c064599141f30d5f8fea9654ff457d4bf20e11aaeffc1dc4575be700

See more details on using hashes here.

Provenance

The following attestation bundles were made for qector_decoder_v3-0.5.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: CI.yml on GuillaumeLessard/qector-decoder

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qector_decoder_v3-0.5.5-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for qector_decoder_v3-0.5.5-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 470f9758349d5bec8e593b4151ef210281c773e49d25313d71355b1f175890fa
MD5 6c6fafa0c31f6e5374c3e36e19a4cc1a
BLAKE2b-256 c8ee61a0501bdaffd939816fc89b0209002d2b3f06f71dfb3cb9ce2c8d5f973e

See more details on using hashes here.

Provenance

The following attestation bundles were made for qector_decoder_v3-0.5.5-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: CI.yml on GuillaumeLessard/qector-decoder

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qector_decoder_v3-0.5.5-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for qector_decoder_v3-0.5.5-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 5e8d9f4f83f18f3b3fc527870cc82ed20d58f1b4f2eb5d1bed15732373d32c4f
MD5 70cc2be53b33eb1304f68812f7600357
BLAKE2b-256 7c90a7f90ba639b6b60e2d83afef4c302af625a0ff6ecbc56c2667146a1f0d53

See more details on using hashes here.

Provenance

The following attestation bundles were made for qector_decoder_v3-0.5.5-cp311-cp311-win_amd64.whl:

Publisher: CI.yml on GuillaumeLessard/qector-decoder

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qector_decoder_v3-0.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for qector_decoder_v3-0.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 11ea90b6ae581ca08725df7938d4c8e2b92dbe6813c2a32ba88e4ec4a0ea71bb
MD5 8220a0175b7a60b50ced47f38925a910
BLAKE2b-256 23e2a3d695e08eab95a0bc3cf0a0323494c636b75bc3e61101aac1ce4f1b2a6c

See more details on using hashes here.

Provenance

The following attestation bundles were made for qector_decoder_v3-0.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: CI.yml on GuillaumeLessard/qector-decoder

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qector_decoder_v3-0.5.5-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for qector_decoder_v3-0.5.5-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d16106ed322c31ac6f21c9b342224b3f83712e25c64f76a6bcfe3074b026349f
MD5 686e03cbde0e19ba8b5b78446da8a0eb
BLAKE2b-256 373435b7433d436dd01a992009ccc59dce7f3694765eaea4e3e9e36a3597b0ae

See more details on using hashes here.

Provenance

The following attestation bundles were made for qector_decoder_v3-0.5.5-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: CI.yml on GuillaumeLessard/qector-decoder

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qector_decoder_v3-0.5.5-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for qector_decoder_v3-0.5.5-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 1e5d5e5c66b15ffb94fa1e809269669f829ffb7439e98247f8d1f9e63831d354
MD5 37f1143f6ef1db8875f7865262fa1521
BLAKE2b-256 d3c1d94fdba09ce92fe026849015ccb4b0e15213f25ad2d82d7d677bf57a9a9e

See more details on using hashes here.

Provenance

The following attestation bundles were made for qector_decoder_v3-0.5.5-cp310-cp310-win_amd64.whl:

Publisher: CI.yml on GuillaumeLessard/qector-decoder

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qector_decoder_v3-0.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for qector_decoder_v3-0.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a949f9b2d6a30e756c57d93f9e42d5a14b7fc842ef982425b41fa06d7508a7be
MD5 e561a5add42a5e760d20662b0b40fc26
BLAKE2b-256 5e1f1d14d59143690b91cf677be1440789d6fe4d52b24473114cb151c9788d77

See more details on using hashes here.

Provenance

The following attestation bundles were made for qector_decoder_v3-0.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: CI.yml on GuillaumeLessard/qector-decoder

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qector_decoder_v3-0.5.5-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for qector_decoder_v3-0.5.5-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d9f360e90c7ecf8fb1e93fe3cd677dfc2edd3b52c559364dcd37a0e284e3fb0b
MD5 19de2a269eb37214c3c250773f42dfc6
BLAKE2b-256 1c40203c3c81eedb709988c67acb77ff5d2db323ec442a4a94da6f1cb6cfeaac

See more details on using hashes here.

Provenance

The following attestation bundles were made for qector_decoder_v3-0.5.5-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: CI.yml on GuillaumeLessard/qector-decoder

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qector_decoder_v3-0.5.5-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for qector_decoder_v3-0.5.5-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 b5144ce0d340c64ab9fddf2b16c911751e7332d4b6341498488b06ca4696888d
MD5 83bd9f44fe727e75b3305af7a4831873
BLAKE2b-256 8c3385e6066a7bfaa2bc3557578d3dc280c296edce991b9a7d38dc7408b6e5fc

See more details on using hashes here.

Provenance

The following attestation bundles were made for qector_decoder_v3-0.5.5-cp39-cp39-win_amd64.whl:

Publisher: CI.yml on GuillaumeLessard/qector-decoder

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qector_decoder_v3-0.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for qector_decoder_v3-0.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3f64ceb9dc4286ef673f8a9e074a71e335b0c072f081dd33e14b575f0435f720
MD5 ef35f037ad13bedcf3eca8a8b492ee9b
BLAKE2b-256 2e7a4766e0bf7ed7e5e1c0e224a4e021af3436d7eb9d600f37b3041ce45af54a

See more details on using hashes here.

Provenance

The following attestation bundles were made for qector_decoder_v3-0.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: CI.yml on GuillaumeLessard/qector-decoder

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qector_decoder_v3-0.5.5-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for qector_decoder_v3-0.5.5-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 380f536d1a5a35f96df6d5372e78dc62a8d1d8637585aacba3aca985f40eb216
MD5 cb042762a375b0dbba10d3e0d49daec4
BLAKE2b-256 4afa543a4be424b9c592b6a9ef71dd94c84ff860513d25e228e3d4de265f3c2e

See more details on using hashes here.

Provenance

The following attestation bundles were made for qector_decoder_v3-0.5.5-cp39-cp39-macosx_11_0_arm64.whl:

Publisher: CI.yml on GuillaumeLessard/qector-decoder

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page