Skip to main content

Python bindings for NIST-standardized post-quantum cryptography, powered by OpenSSL. Honoring Alkindi, the 9th-century pioneer of cryptography.

Project description

Alkindi

In honor of Alkindi (الكِندي), the 9th-century pioneer of cryptography*

Status: Alpha License: Apache-2.0

High-performance Python bindings for NIST-standardized post-quantum cryptography, powered by OpenSSL.


Table of Contents


About

The project is named after Alkindi (الكِنْدي), the 9th-century Arab Muslim polymath who pioneered cryptanalysis and frequency analysis, laying the foundations for modern cryptography.

Alkindi makes quantum-resistant cryptography straightforward and accessible in Python by providing clean, type-safe bindings to OpenSSL's implementations of NIST-standardized post-quantum algorithms. As quantum computers advance, traditional public-key systems like RSA and elliptic curves become vulnerable. Alkindi provides the cryptographic primitives needed to protect against both classical and quantum attacks.

Supported Algorithms

  • ML-KEM (formerly Kyber) — Key encapsulation mechanisms for secure key exchange
    Based on lattice cryptography, ML-KEM enables two parties to establish a shared secret over an insecure channel. Available in three security levels (ML-KEM-512, ML-KEM-768, ML-KEM-1024) corresponding to AES-128, AES-192, and AES-256 equivalent security.

  • ML-DSA (formerly Dilithium) — Digital signatures for authentication and integrity
    Lattice-based signatures that provide quantum-resistant authentication. Three parameter sets (ML-DSA-44, ML-DSA-65, ML-DSA-87) offer balanced trade-offs between signature size and security strength.

  • SLH-DSA (formerly SPHINCS+) — Hash-based signatures for conservative security guarantees
    Unlike lattice-based schemes, SLH-DSA relies only on hash function security, making it ideal for long-term signatures and applications requiring minimal cryptographic assumptions. Available in multiple variants optimized for either speed or size.

Alkindi uses CFFI to interface directly with OpenSSL's C implementations, achieving high performance with minimal overhead. The library provides a stateless, thread-safe API with full type annotations for enhanced developer experience.

Status: Alpha — Alkindi is under active development with the explicit goal of becoming a production-grade, thoroughly reviewed PQC library for Python. APIs may change before version 1.0.0.


Why Alkindi?

Alkindi bridges the gap between enterprise-grade cryptography and Python developer ergonomics, bringing NIST-standardized post-quantum algorithms to your applications with production readiness in mind:

Feature Description
Battle-tested backend Built on OpenSSL, leveraging decades of cryptographic engineering and security audits rather than implementing algorithms from scratch.
Standards-first Uses NIST-standardized post-quantum algorithms exclusively and avoids experimental or pre-standard variants.
High performance CFFI-based bindings call OpenSSL directly, achieving near-native C performance with minimal Python overhead.
Type-safe, simple API Full type hints and a stateless, thread-safe design for safer concurrent usage and superior developer experience.
Minimal attack surface A deliberately focused API that is easier to reason about, audit, and review than a sprawling cryptographic toolkit.

Installation

From PyPI (Coming Soon)

pip install alkindi

From Source

Requirements: Python 3.10+ and C compiler

# Clone the repository
git clone https://github.com/alraddady/alkindi.git
cd alkindi

# Build OpenSSL with PQC support
./scripts/build_openssl.sh

# Install Alkindi
pip install -e .

# Or install with development dependencies
pip install -e ".[dev]"

Quick Start

Key Encapsulation (ML-KEM)

ML-KEM enables two parties to establish a shared secret over an insecure channel. The sender encapsulates a secret into a ciphertext using the receiver's public key, and the receiver decapsulates it to recover the same secret.

from alkindi import KEM

# Generate a keypair for the receiver
keypair = KEM.generate_keypair("ML-KEM-768")

# Sender: encapsulate a shared secret
ciphertext, shared_secret_sender = KEM.encapsulate("ML-KEM-768", keypair.public_key)

# Receiver: decapsulate to recover the shared secret
shared_secret_receiver = KEM.decapsulate("ML-KEM-768", keypair.private_key, ciphertext)

# Both parties now share the same secret
assert shared_secret_sender == shared_secret_receiver

Digital Signatures (ML-DSA)

ML-DSA provides digital signatures for authentication and message integrity. A signer uses their private key to sign messages, and verifiers use the corresponding public key to confirm authenticity.

from alkindi import Signature

# Generate a keypair for the signer
keypair = Signature.generate_keypair("ML-DSA-65")

# Sign a message
message = b"Hello, quantum world!"
signature = Signature.sign("ML-DSA-65", keypair.private_key, message)

# Verify the signature
is_valid = Signature.verify("ML-DSA-65", keypair.public_key, message, signature)
print(f"Signature valid: {is_valid}")  # True

# Tampering detection
is_valid = Signature.verify("ML-DSA-65", keypair.public_key, b"Tampered message", signature)
print(f"Tampered signature valid: {is_valid}")  # False

Documentation

Algorithm Selection Guide

Choosing the right algorithm and parameter set depends on your security requirements, performance constraints, and use case. For detailed guidance on selecting appropriate algorithms, see the Algorithm Selection Guide.

NIST Standards

Additional Resources


Contributing

Contributions are welcome! Please review our Contributing Guidelines before submitting pull requests or opening issues.


License

Licensed under the Apache License 2.0. See LICENSE for complete terms.


Acknowledgments

Alkindi stands on the shoulders of giants. I would like to thank the following organizations and teams for their foundational work:

  • National Institute of Standards and Technology (NIST): for standardizing post-quantum cryptography
  • OpenSSL Project: for providing the cryptographic foundation
  • Algorithm Development Teams:
    • Kyber developers
    • Dilithium developers
    • SPHINCS+ developers
  • Open Quantum Safe (OQS): for their pioneering work in making post-quantum cryptography practical and for fostering a welcoming community

My sincere gratitude also extends to the broader open-source community, whose collaborative spirit and tireless contributions make projects like this possible.

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.

alkindi-0.0.2-cp313-cp313-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.13Windows x86-64

alkindi-0.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ x86-64manylinux: glibc 2.28+ x86-64

alkindi-0.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (1.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

alkindi-0.0.2-cp313-cp313-macosx_14_0_arm64.whl (967.4 kB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

alkindi-0.0.2-cp312-cp312-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.12Windows x86-64

alkindi-0.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ x86-64manylinux: glibc 2.28+ x86-64

alkindi-0.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (1.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

alkindi-0.0.2-cp312-cp312-macosx_14_0_arm64.whl (967.4 kB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

alkindi-0.0.2-cp311-cp311-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.11Windows x86-64

alkindi-0.0.2-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ x86-64manylinux: glibc 2.28+ x86-64

alkindi-0.0.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (1.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

alkindi-0.0.2-cp311-cp311-macosx_14_0_arm64.whl (967.3 kB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

alkindi-0.0.2-cp310-cp310-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.10Windows x86-64

alkindi-0.0.2-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.26+ x86-64manylinux: glibc 2.28+ x86-64

alkindi-0.0.2-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (1.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

alkindi-0.0.2-cp310-cp310-macosx_14_0_arm64.whl (967.3 kB view details)

Uploaded CPython 3.10macOS 14.0+ ARM64

File details

Details for the file alkindi-0.0.2-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: alkindi-0.0.2-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for alkindi-0.0.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 8c50bbb7a031b72fbd33f5644413777097e8bcae02bfbf5cf1cf513a0b56442b
MD5 c18a1cb83e7c8f131eb856b80bd4c044
BLAKE2b-256 00c7b174a28b701d095a3438cb2f232076e5813b97f7aa9846d6e4ae66787580

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.2-cp313-cp313-win_amd64.whl:

Publisher: python-publish.yml on alraddady/alkindi

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

File details

Details for the file alkindi-0.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 bc93a126f29d622e44f69f45426dbc86f492f7165fafc1b9d09ad52685b4f654
MD5 7fac71d01f722176858d020d5dd63c3d
BLAKE2b-256 f626469fbf3001b8998a8fb44c252ac24be49dd214e9aeb0dac6ff24422744ea

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl:

Publisher: python-publish.yml on alraddady/alkindi

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

File details

Details for the file alkindi-0.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e02fd70ea8a52fcbf07d71a51dd49c005ee4094bc117216a933279d02a2de7a4
MD5 15401bbcdc2a121758374b0b2c597e7f
BLAKE2b-256 5dcb4afeecb85acf6afaa39ee7332b8d1079d964af039134478013ad8a303718

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl:

Publisher: python-publish.yml on alraddady/alkindi

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

File details

Details for the file alkindi-0.0.2-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.2-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 6beb748f633116af1b2e5320fa106aa00aff911703140257b11f91f957ef01c3
MD5 1022b4d3850ad8be65d43dbc66aabf31
BLAKE2b-256 2db1b320887788bdc7e19d614ad3b40608ca7c21058ee76c9e63b2b55ce39de2

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.2-cp313-cp313-macosx_14_0_arm64.whl:

Publisher: python-publish.yml on alraddady/alkindi

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

File details

Details for the file alkindi-0.0.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: alkindi-0.0.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for alkindi-0.0.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 bdc01579780f3baf605086e5c62ce273c670fdb27eef93677ca94d6ed7ab1de9
MD5 48fce70e10050d5ac87169df82990e1c
BLAKE2b-256 9e39b0a7808c28c225f6980efae042b99ec7851c1782cd2502123e6dff5b9274

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.2-cp312-cp312-win_amd64.whl:

Publisher: python-publish.yml on alraddady/alkindi

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

File details

Details for the file alkindi-0.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9c92991833939362a622ad46586f81e651c377d63891b315499e6af3d245816e
MD5 a495eb584fcb5f7b70d4240f0c4d6b8d
BLAKE2b-256 c34a63e0d7edf3ae24af3a636688fbcf75b36e46d4695ed4f2ab7b37cb4e5edb

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl:

Publisher: python-publish.yml on alraddady/alkindi

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

File details

Details for the file alkindi-0.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 27bb24ed81892340aff442a4870217e13d5e72c2b6db4dff3faaf7b12f0b53e0
MD5 fd644f66cb0e62eb59ed9f569a95a26b
BLAKE2b-256 a1ff283430be6871b104a0b9a583aec710890960f1c8c6a5705df84a816fe280

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl:

Publisher: python-publish.yml on alraddady/alkindi

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

File details

Details for the file alkindi-0.0.2-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.2-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 7f47f7da313e2ebb82a40c195163368f4e95b535d47ef3abe6f85d4b5b24eb2d
MD5 4d27eaa421a40099fc48ff7de07a45e3
BLAKE2b-256 33dbf38956b53bd605b98c59bf6300c0defb5f6d17b8492674923cdf978ae5f3

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.2-cp312-cp312-macosx_14_0_arm64.whl:

Publisher: python-publish.yml on alraddady/alkindi

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

File details

Details for the file alkindi-0.0.2-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: alkindi-0.0.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for alkindi-0.0.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 dbf3552fc07cd673872a85bab58684ba35eecd1b932cd8540a3fa8ee45086474
MD5 90412b7f8af51a2843967175c2fa6965
BLAKE2b-256 451da160cdd1ad450a02f1a406b0247543d53ede411c7d5e476400d691afbb8c

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.2-cp311-cp311-win_amd64.whl:

Publisher: python-publish.yml on alraddady/alkindi

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

File details

Details for the file alkindi-0.0.2-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.2-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 05233952a92d56430d51b07334a03e9a0f72be9bb8cd649defc792c56f0d030b
MD5 a6e0512041ed03cd533999d41dec1011
BLAKE2b-256 2f8c93c36afe4989af60d81adee475262786d44980a47eccb84d197c5b708a1f

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.2-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl:

Publisher: python-publish.yml on alraddady/alkindi

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

File details

Details for the file alkindi-0.0.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4fc7b2089a352c153a628c3b8320b0eedc0a03ef5e780e2e0be077aa56c381e9
MD5 e0f164ff7742b47a5bde97d903fbde6b
BLAKE2b-256 85742cdc90744c38d1530fd90a4eb6c42fff55ca3dbbdafcdb3673474e703d7f

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl:

Publisher: python-publish.yml on alraddady/alkindi

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

File details

Details for the file alkindi-0.0.2-cp311-cp311-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.2-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 0a0e9bcb342fd3c6705b8969ae8827c79a537e0c309ed57e9afe256bd2e96f2c
MD5 a52d36212eb3ca492d576750df63c087
BLAKE2b-256 4aa5f6f6fbd2e0bf537097034e762d80bbebc56f61782dddb134f96f4e9b6579

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.2-cp311-cp311-macosx_14_0_arm64.whl:

Publisher: python-publish.yml on alraddady/alkindi

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

File details

Details for the file alkindi-0.0.2-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: alkindi-0.0.2-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for alkindi-0.0.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 258cb03a8e6f46a53a7b80f4ca1ae5a1045b18ce5412bbe9eab51a7987c5f235
MD5 3488da05f852aba0fabb2435cdda0cd6
BLAKE2b-256 e52d83d46e12d85a2723dc88262bde3bbad83903b4e39c064bca0ad36b79cd13

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.2-cp310-cp310-win_amd64.whl:

Publisher: python-publish.yml on alraddady/alkindi

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

File details

Details for the file alkindi-0.0.2-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.2-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c66f250ec39ed0e1b069b13c33917beb8f06019b3d43bb0377b68753782b3eb0
MD5 f582c696951b4b94fedff255d14e41e8
BLAKE2b-256 874c3bd691c4bbdac8d8c9d0ed763da5d58c64e7ca545cb95b5d2f61db148f30

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.2-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl:

Publisher: python-publish.yml on alraddady/alkindi

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

File details

Details for the file alkindi-0.0.2-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.2-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 034647eb57acb022dadd4189917d0c88a9d0c65b6b23cc9f3270308988148264
MD5 f820df962ecd5041e3c81cdd53d3f2e1
BLAKE2b-256 002da9958bea609ae5986951bfcba3d8dc26fbc94ca991515871286321fc84d8

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.2-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl:

Publisher: python-publish.yml on alraddady/alkindi

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

File details

Details for the file alkindi-0.0.2-cp310-cp310-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.2-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 7f0a6e33fefe04a40259222a5fb28239e9c8ff024cbab3f6340487e801e7f2e9
MD5 fbe7d7868c6df9689d9a4ba24c4c638e
BLAKE2b-256 54f9ca2ee9581c7190f3c075f3d9ca505635bb3ad66103ee8c2d343d234b61d4

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.2-cp310-cp310-macosx_14_0_arm64.whl:

Publisher: python-publish.yml on alraddady/alkindi

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