Skip to main content

High-performance C11 JSON parser python bindings

Project description

cjsonx Logo
Extreme-performance JSON parser for C11/C++ featuring a 16-byte ultra-compact DOM.

cjsonx

Linux macOS Windows WASM Sanitizers Fuzzing

License: MIT Language Header-Only Dependencies npm PyPI

Read the Official Documentation: docs/index.md
Try the Live WebAssembly Demo: https://tiw302.github.io/cjsonx/demo/

Verified Compatibility — Cross-Platform Passing

Architecture Platform Verified Backend
x86_64 (Modern) Linux / Windows AVX2 (Vectorized)
ARM64 (Apple) macOS (M1/M2/M3) NEON (Vectorized)
WebAssembly Chrome / Node.js WASM-SIMD128
RISC-V64 Linux (QEMU) Scalar C11
General Desktop Linux / Windows Scalar C11 Fallback

Table of Contents


Introduction

cjsonx is a header-only C library for parsing JSON. It is designed to achieve high parsing speeds (exceeding 1.0 GB/s on modern hardware) while offering a fully mutable, ultra-compact 16-byte Flat-DOM.

Built on top of a highly optimized dual-stage architecture, cjsonx validates structural characters using SIMD bitmasks (AVX2/NEON/WASM-SIMD) before applying a recursive descent parsing phase that utilizes the state-of-the-art Eisel-Lemire algorithm for blazing-fast 64-bit IEEE 754 floating-point numerical conversions.


Why cjsonx?

Standard JSON parsers often face specific limitations: they can be slower due to heavy heap allocation per node (using malloc recursively), or they consume excessive memory per node (e.g., standard parsers often require 56-64 bytes per node).

cjsonx was built to address these specific use cases by providing a fully mutable DOM while drastically reducing memory overhead and maximizing computational throughput:

Parser Speed (Large Payload) DOM Node Size Allocation Strategy Portability
cJSON ~130 MB/s ~64 bytes Heavy (O(N) Malloc) Universal
jsmn ~600 MB/s Tokenizer Only None Universal
yyjson ~1000+ MB/s 16-24 bytes Arena High
cjsonx ~1000+ MB/s 16 bytes (Fixed) Flat Arena Universal

cjsonx aims to provide an alternative: delivering high throughput and a fully mutable DOM while maintaining an incredibly dense 16-byte memory footprint.


Trade-offs & Alternatives (When NOT to use cjsonx)

We believe in engineering honesty. cjsonx is built for a specific niche and is not a silver bullet. You should evaluate alternatives if your requirements match the following:

  • Need the absolute fastest C++ parser? Use simdjson. It runs at 3-6 GB/s and is the industry gold standard for C++ server backends. cjsonx is pure C11 and cannot compete with their multi-year optimized C++ engine.
  • Need a battle-tested, general-purpose C parser? Use yyjson. It is incredibly fast, highly optimized for general use cases, and has a massive community.
  • Need to drop in a ubiquitous, legacy C parser? Use cJSON. It's older and much slower, but it works on ancient C89 compilers and has no modern standard requirements. (Note: cjsonx also runs without SIMD on any platform via its Scalar fallback, but requires a C11-compliant compiler).

So when should you use cjsonx?

  1. High-Performance Mutable Data: You need a pure C11 parser that allows you to read, edit, add, and remove JSON nodes rapidly, and stringify them back to JSON text without rebuilding the entire document.
  2. Strict Memory Constraints (IoT/RTOS): You need high-speed parsing but absolutely refuse to waste memory. Our 16-byte nodes use 4x less RAM than traditional parsers like cJSON. Additionally, cjsonx_parse_with_buffer() provides a True Zero-Allocation mode for embedded systems.
  3. WASM / Node.js / Browser: The @tiw302/cjsonx npm package brings full DOM querying to JavaScript. After parsing, you can walk the tree field-by-field via getRoot(), .get(key), .getIndex(i), .pointer(path), and .toJS() — no JSON.parse re-serialization needed.

Design Philosophy

The library is built around three strict constraints:

Flat Arena DOM. There are no calls to malloc per node. The entire document tree is parsed sequentially into a continuous array of 16-byte structs. This guarantees cache locality and enables O(1) skipping over complex objects and arrays during iteration.

State-of-the-art Number Parsing. cjsonx incorporates the Eisel-Lemire fast float algorithm directly into its lexical analysis phase. It parses 99.9% of all IEEE 754 floating-point numbers natively using a single fast path, falling back to strict standard library parsing only on extreme mathematical edge cases.

Zero OS-Dependencies. The library is built entirely on standard C11. It does not rely on OS-specific file I/O or POSIX headers. It compiles seamlessly to WebAssembly, embedded ARM targets, and standard desktop operating systems.

True Zero-Allocation Mode. For strict embedded constraints, the cjsonx_parse_with_buffer() API completely bypasses malloc by parsing the JSON entirely into a user-provided fixed-size stack buffer or RTOS memory pool.


Limits & Guarantees

Professional-grade software requires transparent technical boundaries. Here is exactly what cjsonx guarantees, and where it draws the line:

  • RFC 8259 Compliance: cjsonx strictly adheres to RFC 8259 and ECMA-404. It correctly rejects structural anomalies, unescaped control characters, and deeply nested bombs.
  • Thread Safety: The core parsing engine is entirely stateless. Multiple threads can safely parse different JSON documents concurrently without any mutexes or locks.
  • Length Limit: The maximum byte length of any single string or serialized container is 16MB (specifically, 16,777,215 bytes, due to the 24-bit length field packed in the 16-byte DOM node structure).
  • Nesting Depth Limit: The maximum nesting depth is 1000 (CJSONX_MAX_DEPTH) to prevent stack overflow on deeply nested documents. This value is compile-time configurable.
  • Builder Performance: Pushing elements to an array via cjsonx_array_push is an O(N) operation because it traverses the list of siblings to locate the end of the array. Repeated sequential pushes to build large arrays will result in O(N^2) complexity.
  • Static Buffer Read-Only: Documents parsed with cjsonx_parse_with_buffer() are marked is_static = true. The entire DOM is read-only — calling any Builder API function (e.g., cjsonx_object_set, cjsonx_array_push) on a static document will return failure, as the internal node array cannot grow. cjsonx_doc_free() on a static document is a safe no-op.

Requirements

Component Requirement
C Standard C11 or later
Compiler GCC 4.9+, Clang 3.5+, MSVC 2019+, Emscripten 3.0+
Dependencies None (Standard C Library only)

Verified Toolchains

The following toolchains are tested on every commit via GitHub Actions:

Toolchain Platform Backend
GCC Linux x86_64 Scalar, AVX2
GCC (riscv64-linux-gnu) Linux RISC-V64 (QEMU) Scalar
Clang macOS Apple Silicon NEON
MSVC Windows x64 Scalar, AVX2
Emscripten WASM (Node.js) WASM-SIMD, Scalar

Build and Installation

cjsonx is entirely header-only.

Single-Header Distribution (Recommended)

The simplest integration is copying the amalgamated single_include/cjsonx.h into your project. Define the implementation macro in exactly one C file to compile the core functions:

#define CJSONX_IMPLEMENTATION
#include "cjsonx.h"

All other translation units should include the header without the macro.

CMake (System Install)

You can build the test suites and install the library system-wide:

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build
sudo cmake --install build

Then in your project's CMakeLists.txt:

find_package(cjsonx REQUIRED)
target_link_libraries(my_app PRIVATE cjsonx::cjsonx)

Python / PyPI

Install the Python bindings via pip — no build tools required, wheels are pre-built for Linux, macOS, and Windows:

pip install cjsonx

Then use it directly from Python:

import cjsonx

doc = cjsonx.parse('{"name": "alice", "scores": [10, 20, 30]}')
print(doc["name"])              # alice
print(doc["scores"][0])         # 10
print(doc.get("/scores/2"))     # 30 (json pointer)

Node.js / npm

Install the pre-built WebAssembly package — no native compilation or Emscripten required:

npm install @tiw302/cjsonx

Then query the DOM directly from JavaScript:

const cjsonx = require('@tiw302/cjsonx');
await cjsonx.ready;

const ok = cjsonx.parse('{"name": "alice", "scores": [10, 20, 30]}');
if (ok) {
    const root  = cjsonx.getRoot();
    const name  = root.get('name').str;             // 'alice'
    const first = root.get('scores').getIndex(0).num; // 10
    const obj   = root.toJS();                      // plain JS object
    cjsonx.free();
}

Developer Build Flags

The CMake build exposes optional flags for contributors and CI pipelines:

# Enable AddressSanitizer + UndefinedBehaviorSanitizer
cmake -B build_san -DCJSONX_ENABLE_SANITIZERS=ON
cmake --build build_san
ctest --test-dir build_san

# Enable gcov code coverage instrumentation
cmake -B build_cov -DCJSONX_ENABLE_COVERAGE=ON
cmake --build build_cov
ctest --test-dir build_cov

Configuration Macros

All constants can be overridden at compile time by defining them before including the header (or passing them as -D flags to your compiler). The defaults are suitable for most workloads.

Macro Default Description
CJSONX_MAX_DEPTH 1000 Maximum JSON nesting depth. Documents exceeding this during parsing are rejected to prevent stack overflow.
CJSONX_ARENA_CHUNK_SIZE 4096 Byte size of each chunk allocated by the string arena. Increase for documents with many long escaped strings.
CJSONX_INITIAL_TAPE_CAP 1024 Initial capacity (in entries) of the Stage 1 structural token tape.
CJSONX_INITIAL_CONTAINER_CAP 16 Initial capacity (in nodes) of the flat DOM node array.

Example — embedded target with a tiny nesting limit:

#define CJSONX_MAX_DEPTH 32
#define CJSONX_ARENA_CHUNK_SIZE 512
#define CJSONX_IMPLEMENTATION
#include "cjsonx.h"

API Reference

Core Parsing

Function Signature Description
cjsonx_parse cjsonx_doc_t* cjsonx_parse(const char* json, size_t length) Parses a JSON string into a managed document tree. Zero-copy — the input buffer must outlive the document. Returns NULL on fatal memory error. Check doc->is_valid for syntax status.
cjsonx_parse_ex cjsonx_doc_t* cjsonx_parse_ex(const char* json, size_t length, cjsonx_allocator_t* alloc) Parses a JSON string using custom memory allocation hooks.
cjsonx_parse_with_buffer cjsonx_doc_t* cjsonx_parse_with_buffer(const char* json, size_t length, void* buffer, size_t buffer_size) Zero-allocation mode. Parses JSON into a user-provided buffer. Result is read-only (is_static = true); Builder API calls will fail on this document.
cjsonx_doc_free void cjsonx_doc_free(cjsonx_doc_t* doc) Frees the entire document arena in a single call.
cjsonx_error_string const char* cjsonx_error_string(cjsonx_error_t err) Translates an error code into a human-readable string.

Owned-Copy Parsing

Use these when you don't want to manage the lifetime of the input buffer yourself. The document takes ownership of an internal copy of the JSON string — you can free or modify the original buffer immediately after the call.

Function Signature Description
cjsonx_parse_copy cjsonx_doc_t* cjsonx_parse_copy(const char* json, size_t length) Copies the input buffer and parses it. The document owns the copy.
cjsonx_parse_copy_ex cjsonx_doc_t* cjsonx_parse_copy_ex(const char* json, size_t length, cjsonx_allocator_t* alloc) Same as above, but with a custom allocator.
cjsonx_parse_copy_cstr cjsonx_doc_t* cjsonx_parse_copy_cstr(const char* json) Convenience wrapper for null-terminated strings.

DOM Access

Function Signature Description
cjsonx_get cjsonx_val_t cjsonx_get(cjsonx_val_t obj, const char* key) Retrieves a child node from an Object by its exact null-terminated string key. O(N) linear scan.
cjsonx_get_len cjsonx_val_t cjsonx_get_len(cjsonx_val_t obj, const char* key, size_t key_len) Same as cjsonx_get but accepts a key with explicit length. Useful for keys that are not null-terminated.
cjsonx_get_index cjsonx_val_t cjsonx_get_index(cjsonx_val_t arr, size_t index) Retrieves a child node from an Array by its index. O(N) sibling walk.
cjsonx_get_type cjsonx_type_t cjsonx_get_type(cjsonx_val_t val) Returns the type of the node (CJSONX_STRING, CJSONX_NUMBER, etc.).
cjsonx_num double cjsonx_num(cjsonx_val_t val) Retrieves the numerical value as a float.
cjsonx_int int64_t cjsonx_int(cjsonx_val_t val) Retrieves the numerical value as a 64-bit integer.
cjsonx_str const char* cjsonx_str(cjsonx_val_t val) Retrieves the string pointer. Note: zero-copy strings are not null-terminated — always use cjsonx_str_len() to bound the read.
cjsonx_str_len size_t cjsonx_str_len(cjsonx_val_t val) Returns the exact byte length of the string.
cjsonx_size size_t cjsonx_size(cjsonx_val_t val) Returns the element count of an Array or Object.
cjsonx_bool bool cjsonx_bool(cjsonx_val_t val) Retrieves the boolean value.
cjsonx_is_null bool cjsonx_is_null(cjsonx_val_t val) Returns true if the node is explicitly a JSON null or is empty/invalid.
cjsonx_pointer_get cjsonx_val_t cjsonx_pointer_get(cjsonx_val_t root, const char* path) Retrieves a node using a RFC 6901 JSON Pointer path.

Iteration

Function Signature Description
cjsonx_iter_init cjsonx_iter_t cjsonx_iter_init(cjsonx_val_t val) Initializes a lightweight iterator for an Array or Object.
cjsonx_iter_next bool cjsonx_iter_next(cjsonx_iter_t* iter) Advances the iterator to the next element or key-value pair.

Mutation & Builder API

Function Signature Description
cjsonx_create_null cjsonx_val_t cjsonx_create_null(cjsonx_doc_t* doc) Creates a null node.
cjsonx_create_bool cjsonx_val_t cjsonx_create_bool(cjsonx_doc_t* doc, bool val) Creates a boolean node.
cjsonx_create_number cjsonx_val_t cjsonx_create_number(cjsonx_doc_t* doc, double val) Creates a number node.
cjsonx_create_string cjsonx_val_t cjsonx_create_string(cjsonx_doc_t* doc, const char* str) Creates a string node (copies string to arena).
cjsonx_create_object cjsonx_val_t cjsonx_create_object(cjsonx_doc_t* doc) Creates an empty Object node.
cjsonx_create_array cjsonx_val_t cjsonx_create_array(cjsonx_doc_t* doc) Creates an empty Array node.
cjsonx_object_set bool cjsonx_object_set(cjsonx_val_t obj, const char* key, cjsonx_val_t val) Inserts or overwrites a key-value pair in an Object.
cjsonx_array_push bool cjsonx_array_push(cjsonx_val_t arr, cjsonx_val_t val) Appends a value to an Array.
cjsonx_object_remove bool cjsonx_object_remove(cjsonx_val_t obj, const char* key) Removes a key-value pair from an Object.
cjsonx_array_remove bool cjsonx_array_remove(cjsonx_val_t arr, size_t index) Removes a value at the given index from an Array.
cjsonx_clone_val cjsonx_val_t cjsonx_clone_val(cjsonx_doc_t* dest_doc, cjsonx_val_t src_val) Recursively clones a value node and its children into another document arena.
cjsonx_merge_patch cjsonx_val_t cjsonx_merge_patch(cjsonx_val_t target, cjsonx_val_t patch) Applies an RFC 7396 JSON Merge Patch to a target node.
cjsonx_stringify char* cjsonx_stringify(cjsonx_doc_t* doc) Converts document to minified JSON string (malloc'd).
cjsonx_stringify_format char* cjsonx_stringify_format(cjsonx_doc_t* doc, int indent) Converts document to pretty JSON string with indent spaces.

File I/O Utilities

Function Signature Description
cjsonx_read_file cjsonx_doc_t* cjsonx_read_file(const char* path) Reads and parses a JSON file.
cjsonx_read_file_ex cjsonx_doc_t* cjsonx_read_file_ex(const char* path, cjsonx_allocator_t* alloc) Reads and parses a JSON file using a custom allocator.
cjsonx_write_file bool cjsonx_write_file(const char* path, cjsonx_doc_t* doc) Serializes a document to a file (minified).
cjsonx_write_file_format bool cjsonx_write_file_format(const char* path, cjsonx_doc_t* doc, int indent) Serializes a document to a file (pretty printed).

Type Aliases

All core types have _t-suffix canonical names and shorter aliases for convenience. Both forms compile identically and can be used interchangeably:

Canonical (_t) Short Alias Description
cjsonx_doc_t cjsonx_doc Parsed document handle
cjsonx_val_t cjsonx_val Value / node handle
cjsonx_iter_t cjsonx_iter Iterator state
cjsonx_type_t cjsonx_type Node type enum
cjsonx_allocator_t cjsonx_alc Custom allocator struct

Documentation

Check out the docs/ directory for deep-dives into the architecture and API:

  • The cjsonx Algorithm: Detailed explanation of the 2-stage SIMD scanning and Eisel-Lemire numerical parsing engine.
  • API Reference: Complete guide to all functions, structures, and memory safety guarantees.

Examples

Runnable examples are provided in the examples/ directory:

  • simple_parse.c — Demonstrates standard parsing, key retrieval, array iteration, and type checking using the iterator API.
  • dom_access.c — Demonstrates basic JSON object parsing and index-based array access.
  • embedded_noalloc.c — Demonstrates zero-allocation memory parsing using a pre-allocated static stack buffer (true zero malloc).
  • error_handling.c — Demonstrates detailed parse error diagnostics, showing how to extract byte offset and display a code pointer to the error source.
  • float128_precision.c — Demonstrates parsing extreme, high-precision float and massive integer formats safely.

Quick Start: Basic Parsing & Iteration

#define CJSONX_IMPLEMENTATION
#include "cjsonx.h"
#include <stdio.h>
#include <string.h>

int main(void) {
    const char* json = "{\"name\": \"Alice\", \"skills\": [\"C\", \"SIMD\"]}";

    // Parse the JSON string
    cjsonx_doc* doc = cjsonx_parse(json, strlen(json));
    if (!doc || !doc->is_valid) {
        printf("Failed to parse JSON!\n");
        return 1;
    }

    // Retrieve name and skills
    cjsonx_val name = cjsonx_get(doc->root, "name");
    cjsonx_val skills = cjsonx_get(doc->root, "skills");

    printf("Name: %.*s\n", (int)cjsonx_str_len(name), cjsonx_str(name));

    // Iterate array using flat DOM iterator
    if (cjsonx_get_type(skills) == CJSONX_ARRAY) {
        printf("Skills:\n");
        cjsonx_iter iter = cjsonx_iter_init(skills);
        while (cjsonx_iter_next(&iter)) {
            printf("  - %.*s\n", (int)cjsonx_str_len(iter.value), cjsonx_str(iter.value));
        }
    }

    cjsonx_doc_free(doc);
    return 0;
}

Quick Start: Zero-Allocation Mode (Embedded/RTOS)

#define CJSONX_IMPLEMENTATION
#include "cjsonx.h"
#include <stdio.h>
#include <string.h>

int main(void) {
    const char* json = "{\"sensor\": \"temp\", \"value\": 24.5}";
    uint8_t static_buffer[4096]; // Static buffer on the stack (zero malloc!)

    cjsonx_doc* doc = cjsonx_parse_with_buffer(json, strlen(json), static_buffer, sizeof(static_buffer));
    if (doc && doc->is_valid) {
        cjsonx_val sensor = cjsonx_get(doc->root, "sensor");
        cjsonx_val value = cjsonx_get(doc->root, "value");

        printf("Sensor: %.*s, Value: %.1f\n", (int)cjsonx_str_len(sensor), cjsonx_str(sensor), cjsonx_num(value));
    }

    cjsonx_doc_free(doc); // No-op since we used static buffer
    return 0;
}

Benchmark Results

Benchmarks were executed on a modern x86_64 CPU (GCC -O3 -march=native). We track Parse Speed, Stringify Speed, and the Peak Memory (Maximum RAM allocated during the parse operation).

Note on Memory: cjsonx uses a Flat DOM approach with exactly 16 bytes per node. By optimizing initial node allocation capacity and performing a shrink-to-fit step at the end of parsing, cjsonx now achieves the lowest peak memory usage among tested libraries while maintaining high parsing throughput.

1. twitter.json (0.60 MB)

Library Parse (MB/s) Stringify (MB/s) Peak Mem (MB)
cjsonx 611.63 1546.55 0.92
yyjson 756.00 3922.39 1.20
cJSON 283.91 414.75 1.23

2. citm_catalog.json (1.65 MB)

Library Parse (MB/s) Stringify (MB/s) Peak Mem (MB)
cjsonx 1156.58 1990.31 2.13
yyjson 736.33 6539.28 3.29
cJSON 267.55 755.45 2.57

3. canada.json (2.15 MB) - Heavy Floating-Point Arrays

Library Parse (MB/s) Stringify (MB/s) Peak Mem (MB)
cjsonx 303.56 272.62 4.76
yyjson 754.31 606.38 7.87
cJSON 71.25 24.91 10.20
View raw console output from bench_compare
tiw@tiw-CachyOS ~/Public/cjsonx (master)
❯ ./build/bench_compare benchmarks/datasets/citm_catalog.json && ./build/bench_compare benchmarks/datasets/twitter.json && ./build/bench_compare benchmarks/datasets/canada.json

Dataset: benchmarks/datasets/citm_catalog.json (1.65 MB)
========================================================================
Library    | Parse (MB/s)    | Stringify (MB/s) | Peak Mem (MB)  
-----------|-----------------|------------------|-----------------------
cjsonx     | 1156.58         | 1990.31         | 2.13           
yyjson     | 736.33          | 6539.28         | 3.29           
cJSON      | 267.55          | 755.45          | 2.57           
========================================================================
Dataset: benchmarks/datasets/twitter.json (0.60 MB)
========================================================================
Library    | Parse (MB/s)    | Stringify (MB/s) | Peak Mem (MB)  
-----------|-----------------|------------------|-----------------------
cjsonx     | 611.63          | 1546.55         | 0.92           
yyjson     | 756.00          | 3922.39         | 1.20           
cJSON      | 283.91          | 414.75          | 1.23           
========================================================================
Dataset: benchmarks/datasets/canada.json (2.15 MB)
========================================================================
Library    | Parse (MB/s)    | Stringify (MB/s) | Peak Mem (MB)  
-----------|-----------------|------------------|-----------------------
cjsonx     | 303.56          | 272.62          | 4.76           
yyjson     | 754.31          | 606.38          | 7.87           
cJSON      | 71.25           | 24.91           | 10.20          
========================================================================

tiw@tiw-CachyOS ~/Public/cjsonx (master)

Analysis

cjsonx demonstrates significant parsing throughput on large payloads, measuring up to 1169.02 MB/s on citm_catalog.json. This provides a performance profile comparable to, and often exceeding, modern parsers like yyjson during tree construction, while dramatically outperforming legacy standards like cJSON in computational speed and maintaining the lowest peak memory overhead.


Development Methodology & AI Assistance

Building a memory-safe, SIMD-accelerated C parser from scratch involves handling incredibly complex edge cases—from vectorized bit-masking to IEEE 754 catastrophic cancellation bounds.

To achieve this level of stability and performance within a short timeframe, this project was architected and rigorously verified in collaboration with Advanced Agentic AI. AI was specifically utilized to:

  • Stress-test the Eisel-Lemire numerical engine against extreme floating-point edge cases and LibFuzzer.
  • Assist in planning the memory layout and cache-locality of the 16-byte arena DOM.
  • Automate the generation of robust cross-platform CI/CD pipelines (Linux, macOS, Windows, WASM, ClusterFuzzLite).

However, human agency remains at the core of this project. Every single line of code generated or suggested was manually inspected, audited, and strictly verified. The core architecture, algorithms, and memory design were meticulously human-planned. This hybrid approach—combining human architectural vision with AI-driven debugging and verification—allowed us to push the boundaries of performance and reliability in a modern C library without compromising security or code ownership.


Author's Note

I'm just a kid building projects as a hobby. Thank you for showing interest in my little library! It really means a lot to me. :)


License

This project is licensed under the MIT License - see the LICENSE file for details.

Project details


Download files

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

Source Distribution

cjsonx-1.2.5.tar.gz (16.9 kB view details)

Uploaded Source

Built Distributions

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

cjsonx-1.2.5-cp313-cp313-win_amd64.whl (147.7 kB view details)

Uploaded CPython 3.13Windows x86-64

cjsonx-1.2.5-cp313-cp313-musllinux_1_2_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

cjsonx-1.2.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

cjsonx-1.2.5-cp313-cp313-macosx_11_0_arm64.whl (176.3 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

cjsonx-1.2.5-cp313-cp313-macosx_10_13_x86_64.whl (181.0 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

cjsonx-1.2.5-cp312-cp312-win_amd64.whl (147.7 kB view details)

Uploaded CPython 3.12Windows x86-64

cjsonx-1.2.5-cp312-cp312-musllinux_1_2_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

cjsonx-1.2.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

cjsonx-1.2.5-cp312-cp312-macosx_11_0_arm64.whl (176.4 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

cjsonx-1.2.5-cp312-cp312-macosx_10_13_x86_64.whl (181.0 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

cjsonx-1.2.5-cp311-cp311-win_amd64.whl (145.5 kB view details)

Uploaded CPython 3.11Windows x86-64

cjsonx-1.2.5-cp311-cp311-musllinux_1_2_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

cjsonx-1.2.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

cjsonx-1.2.5-cp311-cp311-macosx_11_0_arm64.whl (176.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

cjsonx-1.2.5-cp311-cp311-macosx_10_9_x86_64.whl (179.0 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

cjsonx-1.2.5-cp310-cp310-win_amd64.whl (144.2 kB view details)

Uploaded CPython 3.10Windows x86-64

cjsonx-1.2.5-cp310-cp310-musllinux_1_2_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

cjsonx-1.2.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

cjsonx-1.2.5-cp310-cp310-macosx_11_0_arm64.whl (175.4 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

cjsonx-1.2.5-cp310-cp310-macosx_10_9_x86_64.whl (177.9 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

cjsonx-1.2.5-cp39-cp39-win_amd64.whl (144.4 kB view details)

Uploaded CPython 3.9Windows x86-64

cjsonx-1.2.5-cp39-cp39-musllinux_1_2_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ x86-64

cjsonx-1.2.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

cjsonx-1.2.5-cp39-cp39-macosx_11_0_arm64.whl (175.4 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

cjsonx-1.2.5-cp39-cp39-macosx_10_9_x86_64.whl (178.0 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

cjsonx-1.2.5-cp38-cp38-win_amd64.whl (143.7 kB view details)

Uploaded CPython 3.8Windows x86-64

cjsonx-1.2.5-cp38-cp38-musllinux_1_2_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.8musllinux: musl 1.2+ x86-64

cjsonx-1.2.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

cjsonx-1.2.5-cp38-cp38-macosx_10_9_x86_64.whl (179.8 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

File details

Details for the file cjsonx-1.2.5.tar.gz.

File metadata

  • Download URL: cjsonx-1.2.5.tar.gz
  • Upload date:
  • Size: 16.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for cjsonx-1.2.5.tar.gz
Algorithm Hash digest
SHA256 15f4a4b45bdf078db5985930b55947d750b16d865147e0f083b00e7b20549e77
MD5 a0c8fadb317feaa700e4e04bf1ffe1b6
BLAKE2b-256 0c6955e8544239107a606c7e7dfd41a3677d015a74c01d515c7bd9f45c823a1d

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: cjsonx-1.2.5-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 147.7 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for cjsonx-1.2.5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 c1d78ba8dc68551e6353a8d47d7dc2164d22a962c1f8b1ac65ea199cd8cf389a
MD5 ec238f76d2724b66b7b1707d1d0c0a6b
BLAKE2b-256 1554be9834db7d05aa7515fdc98729ead9d551e29cd5934b38892dddb871db5b

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 27b467344bc724e1b922d2809aa11053a2dbc19074848fa469ca0a8941dd344f
MD5 456ea779755e321b74da34c9dd913033
BLAKE2b-256 604e556ece86f3c6a5562c632d7bab93ff3daa1011612eb06db96e6397396332

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0abce941037a05abc9c79a5b40768429a59f7545deaac2d46b05e7394cf82403
MD5 bc4400def2621211006251bd3f5f0b68
BLAKE2b-256 7cab13cc74cf71fe2ec5a8f4852798e80cdfdc1cadd416ad6dc34b4e17cc6dfd

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 79fb4f0ad5d552fc9d6fc18fa4b62f47fff76c3624d8d0a562afab6b6d1c8370
MD5 c70f01b63961a31d05e2b9edac836ddc
BLAKE2b-256 4a273419bb941c8b77dfbbfa2c57b6d1a14523ba65de2dac9b96aa8632fd15b8

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 824a0474b23b1c0ecb4710559814968af04505c77af2297f9d383d83b1b3f734
MD5 2f0427169a069a02f8f1fd6565331c0f
BLAKE2b-256 5ae6762a0b5725d5178ab250f40799efb77f2aef28a3a6ccae8feeaff1c37831

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: cjsonx-1.2.5-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 147.7 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for cjsonx-1.2.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 8763691c9e9e11b8efdfc625936f480ea59dc17f221c14ec390acd79549543ae
MD5 be68526d6ca890b369a621b7952dc382
BLAKE2b-256 f99ed7d730187a4be741523606d1d4625e3e142b681832223e631c96bdf4def3

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 18bbbf438e98dfa3324a9496f7db95a4c8cb4b163d3599bbd6cc7c90534f3fd0
MD5 e770a173a4dbdcf2de7491c901246d59
BLAKE2b-256 bf138f16453c35d2b1d3f14c74c8f96c6f7ee355380409437f0a892b325d607a

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c741acfb8931829537f2aab553778836f61d52a46e6b2fe6cabc9cd45b22e5f7
MD5 487e28f174c9e329e3eaa85d35c880cf
BLAKE2b-256 4c0fcba0ea18e6d596c80be143e264f2be0600b4bb31662fc0fa385789bd000b

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 556654fda21388ad0c513e33002354cd9c039f84f0182a2d4e548605c58e25a4
MD5 c81ca1ee41b651c79fd348e22ea9a137
BLAKE2b-256 dd7f5cf8bc1156dc4393fcb1e1883535aabbd4faffaba8e347358d379452910a

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 e6755b163a72d58ebadfd26569eb85028c9f0f7a0acd99999eb60a843ab95aea
MD5 47a5212834d775331e01ed714009a88a
BLAKE2b-256 c6a08326000945998bde8e9783294452c49a5ff56da753b324bb917fbe994a74

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: cjsonx-1.2.5-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 145.5 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for cjsonx-1.2.5-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 35e305c65f76bbb6c9be5a85abf6b62fc03de2ac480e10c34a0173d8b966c096
MD5 b59952d6c6d3973f847eaccbd6b51ea3
BLAKE2b-256 a9d3cafd444332b462003b2d6f5907e6c4432236fe180571c2c53cfca44dc677

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 27dcb7f3f46c233728c4b4f4f0aeea46cf48ec5420eb4937e822af87f156ba8d
MD5 6af5e79edb16ddc2e76f4212741758ef
BLAKE2b-256 8e99fc38a1d665b42cf670e91cbe59621c2196b5028d8e8055fc7015e098e8f2

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a88303f1a580c85e2f4457ca91d74931654305ac29627a7aeed6c4e6c4d39adc
MD5 f13c720a877232bf2e4442e7eb251d85
BLAKE2b-256 824a735fc34cd6cc077ff18a6919bbcfcb8eae19be10beb56b859885e1c0364a

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 90f5200f70faec9a7e03acb0d136de1d2b3bca9b2454787e08ca5491e340ac78
MD5 f7f6dfad1cb84d6a5aa3bacf4f26471b
BLAKE2b-256 eb6090502a5b3477a51dd0eacf5366dae1a893cdbbf80136d8dbd3a68dbaf05c

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4ef2ddc467cec7ea1e0f57494491ad31af30cdfec14d14a0f45f287bdefb5ca6
MD5 22841c23c91650188197f12e13b5af95
BLAKE2b-256 9ff1a1a67ee03e3ea66ca04e9220df9e24ef9d7a9e5a06aeade182556e15c5fa

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: cjsonx-1.2.5-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 144.2 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for cjsonx-1.2.5-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 b0ad497b27448ee27a745fc65db4868e62afc61c66de86a06d0bf117c0246a2c
MD5 7e4c199c84ce1d527b6f6ac558e36722
BLAKE2b-256 d12e8ac13fcfeda754b2e8274871a8926a1634cd194f1e59f3a4cef3e5fada45

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d94783423babb168b9a68156ccc5eccf50d7b20282fafe28d31e361d1eb2f29c
MD5 7133f262e2c5c32cd91981976e1b5cff
BLAKE2b-256 4783e96016ba35624699647d9fd54ae83bef05e31dbdc1dec9139c50794287c4

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b58bc2903e91ca86ea36c1dcc8409edab40d5a35bd4816bf86243ce2ae2e0307
MD5 d916a5e9f970ed1be8611a0b95328264
BLAKE2b-256 8ec754e98a581fb78e259e66ba8f84213ba28ec48fcae15b5d18d79121039864

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a1a7d04f135d0fc33064a0fcf28e858301cf062eb827865540323b9b5dd4b04e
MD5 c1433dfd0ce262a80b35ec01cd7dd319
BLAKE2b-256 1b30518a4458cfe8590ea262148889ea4385514530c2a20b7566e6a4fda10b03

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 fbadbec4d4b5b0fa59c66f563511ea4b3d737730a93fd9e203e024e755b59501
MD5 824f0527d7e18e4e599cf2689cdd6352
BLAKE2b-256 95921c8596892bf58649dad9e39128e779bfa74b246927b0aba96ab3c488c4de

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: cjsonx-1.2.5-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 144.4 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for cjsonx-1.2.5-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 9eb153d16d0cf58bf7883f1223d7d4dac745cf3f927fe840159329ddcdb67f9a
MD5 d372e78467b2e598e96b9ed35b0257e5
BLAKE2b-256 5d9a9727ba88789234857dc0950d83103941d44a99473c5a1544d9b29a441b3c

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp39-cp39-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6cf63e7f3d31415649b3b3c59772dec16f81f9774123775c5ccd8a6c118a4c9d
MD5 787a3b22206bc34c62b15467f2227e25
BLAKE2b-256 aeb1340d0022c47df7f227c6759c44550bc3857604bed68c1342befb86af7800

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 10dbeea5fab234491dd176f588c175ccbe99092487b550863fa5ebb9848a2221
MD5 b8703ac4502ff9bf110f5161c38ef5a7
BLAKE2b-256 64a34f3afe0510b9dea4846115d7f99f54025e886294450dd6f65095d42d2451

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 521d49b5281222ea1fdc64e70a374ea92339a5b60405d64f67c35b95b7718bb1
MD5 7c19a9967b501703d399a5c646976ace
BLAKE2b-256 5776074e96cc7b6f244dedffe5dbbd1a6f3c2d39771ca46d7247bfead801c9fe

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 944b566a42f9da732ad64cfce9e5a6e3174e0f058ec0ee31efa91cba9ee54f1d
MD5 57c16373169720721662abb52151a471
BLAKE2b-256 82b43102690a13bc5028846deaa6f35d45b271d523638abb72aaa169e309267a

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: cjsonx-1.2.5-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 143.7 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for cjsonx-1.2.5-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 da00284704799d03f9aca99f4e12844102020ee3a1f30e6a277ac1378dc2da97
MD5 b19b649a801e74af610ff191b5141e6d
BLAKE2b-256 5583af658abdbcc7e8b1d8733ab709cde8cb0d071919a5a1dbc9331b7af07192

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp38-cp38-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp38-cp38-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 867d7e56eb8f5021cd8cd57d4b23c20d46ecdad22a594f743b3535be0bdb22cd
MD5 1faffebecb120dfd6c15c8ce3abd7969
BLAKE2b-256 e16e2211bbcc9f228a2f41da351e1f8e0f84635539e04795771bb1fcc3653300

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 acc6b1132933fdfd5dfb9d3ef747d52b7b784040da223a8d770277d8e7bab1d4
MD5 b590ccce40ab08a9af0119cfd407a29d
BLAKE2b-256 b28b93b56fd641a3c3f18f8f00717b0daa9ac7070e2cd7001f288179348123a8

See more details on using hashes here.

File details

Details for the file cjsonx-1.2.5-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for cjsonx-1.2.5-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 79f946d31b9547c551bb86358d8aa306923a6687b88f5290bf9f333582e1b2ad
MD5 c01488382e244548a6f9db01970c00cd
BLAKE2b-256 588b5300bf3b332a3323698b9aec645a7bc6b8a64cce4f3ebe8704d36248c5e3

See more details on using hashes here.

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