Skip to main content

Zig ANSI syntax highlighting library

Project description

uv Ruff

zig-codeblocks

zig-codeblocks is a Rust-powered CPython 3.9+ library for adding syntax highlighting to Zig code blocks in Markdown files through ANSI escape codes. Originally intended for patching the lack of syntax highlighting for Zig on Discord.

Installation

zig-codeblocks is available on PyPI:

pip install zig-codeblocks

You can also install it from source:

pip install git+https://github.com/trag1c/zig-codeblocks.git

zig-codeblocks also exposes a CLI via a cli extra:

pip install "zig-codeblocks[cli]"

If the CLI is all you need, you can run it with uvx:

uvx "zig-codeblocks[cli]" --help

API Reference

extract_codeblocks

def extract_codeblocks(source: str | bytes) -> list[CodeBlock]

Yields CodeBlocks from a Markdown source. Assumes UTF-8 if source is bytes.

Example usage:

from pathlib import Path

from zig_codeblocks import extract_codeblocks

source = Path("examples/riiz.md").read_text()
for codeblock in extract_codeblocks(source):
    print(f"Language: {codeblock.lang}")
    print(f"Body:\n{codeblock.body}")
Language: py
Body:
print("Hello, World!")

Language: zig
Body:
const std = @import("std");
pub fn main() !void {
    std.debug.print("Hello, World!\n", .{});
}

highlight_zig_code

def highlight_zig_code(source: str | bytes, theme: Theme = DEFAULT_THEME) -> str

Returns an ANSI syntax-highlighted version of the given Zig source code. Assumes UTF-8 if source is bytes. An optional Theme can be supplied (defaults to DEFAULT_THEME).

Example usage:

from pathlib import Path

from zig_codeblocks import DEFAULT_THEME, Color, Style, highlight_zig_code

source = Path("examples/hello_world.zig").read_text()

theme = DEFAULT_THEME.copy()
theme["BuiltinIdentifier"] = Style(Color.Orange, underline=True)
theme["String"] = Style(Color.Cyan)
del theme["Type"]

print(
    highlight_zig_code(source),
    highlight_zig_code(source, theme),
    sep="\n\n",
)

process_markdown

def process_markdown(
    source: str | bytes,
    theme: Theme = DEFAULT_THEME,
    *,
    only_code: bool = False,
) -> str

Returns a Markdown source with Zig code blocks syntax-highlighted. Assumes UTF-8 if source is bytes. An optional Theme can be supplied (defaults to DEFAULT_THEME). If only_code is True, only processed Zig code blocks will be returned.

Example usage:

from pathlib import Path

from zig_codeblocks import process_markdown

source = Path("examples/riiz.md").read_text()
print(process_markdown(source))

CodeBlock

class CodeBlock:
    lang: str
    body: str

A code block extracted from a Markdown source. Immutable.

Color

class Color(Enum):
    Gray = "30"
    Red = "31"
    Green = "32"
    Orange = "33"
    Blue = "34"
    Magenta = "35"
    Cyan = "36"
    White = "37"  # Black for light mode

An enumeration of 3-bit ANSI colors. Some names were adjusted to match Discord's style. A color can be instantiated from a string too: Color.from_string("Blue").

Style

class Style:
    color: Color
    bold: bool = False
    underline: bool = False

A style for syntax highlighting. Takes a Color and can optionally be bold and/or underlined. Immutable. Produces an SGR sequence when converted to a string.

Theme

class Theme(TypedDict, total=False):
    BuiltinIdentifier: Style
    Call: Style
    Comment: Style
    Identifier: Style
    Keyword: Style
    Numeric: Style
    PrimitiveValue: Style
    String: Style
    Type: Style

A theme dict for syntax highlighting Zig code. Each key is optional and can be provided a Style to apply to the corresponding token type. Can be instantiated with a dict literal or with a Theme call:

from zig_codeblocks import Color, Style, Theme

theme_foo = Theme(
    Numeric=Style(Color.Blue),
    String=Style(Color.Green),
)

theme_bar: Theme = {
    "Numeric": Style(Color.Blue),
    "String": Style(Color.Green),
}

assert theme_foo == theme_bar

DEFAULT_THEME

The default theme used for highlighting, defined as follows:

DEFAULT_THEME: Theme = {
    "BuiltinIdentifier": Style(Color.Blue, bold=True),
    "Call": Style(Color.Blue),
    "Comment": Style(Color.Gray),
    "Keyword": Style(Color.Magenta),
    "Numeric": Style(Color.Cyan),
    "PrimitiveValue": Style(Color.Cyan),
    "String": Style(Color.Green),
    "Type": Style(Color.Orange),
}

License

zig-codeblocks is licensed under the MIT License.
© trag1c, 2025

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

zig_codeblocks-0.3.1.tar.gz (538.2 kB view details)

Uploaded Source

Built Distributions

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

zig_codeblocks-0.3.1-cp313-cp313t-win_amd64.whl (482.3 kB view details)

Uploaded CPython 3.13tWindows x86-64

zig_codeblocks-0.3.1-cp313-cp313t-win32.whl (447.1 kB view details)

Uploaded CPython 3.13tWindows x86

zig_codeblocks-0.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl (862.1 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ x86-64

zig_codeblocks-0.3.1-cp313-cp313t-musllinux_1_2_i686.whl (904.7 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ i686

zig_codeblocks-0.3.1-cp313-cp313t-musllinux_1_2_armv7l.whl (839.8 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARMv7l

zig_codeblocks-0.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl (753.2 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARM64

zig_codeblocks-0.3.1-cp313-cp313t-manylinux_2_28_x86_64.whl (708.4 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.28+ x86-64

zig_codeblocks-0.3.1-cp313-cp313t-manylinux_2_28_ppc64le.whl (761.0 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.28+ ppc64le

zig_codeblocks-0.3.1-cp313-cp313t-manylinux_2_28_armv7l.whl (651.8 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.28+ ARMv7l

zig_codeblocks-0.3.1-cp313-cp313t-manylinux_2_28_aarch64.whl (663.9 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.28+ ARM64

zig_codeblocks-0.3.1-cp313-cp313t-macosx_11_0_arm64.whl (421.9 kB view details)

Uploaded CPython 3.13tmacOS 11.0+ ARM64

zig_codeblocks-0.3.1-cp313-cp313t-macosx_10_12_x86_64.whl (432.4 kB view details)

Uploaded CPython 3.13tmacOS 10.12+ x86-64

zig_codeblocks-0.3.1-cp39-abi3-win_amd64.whl (486.1 kB view details)

Uploaded CPython 3.9+Windows x86-64

zig_codeblocks-0.3.1-cp39-abi3-win32.whl (450.8 kB view details)

Uploaded CPython 3.9+Windows x86

zig_codeblocks-0.3.1-cp39-abi3-musllinux_1_2_x86_64.whl (868.1 kB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ x86-64

zig_codeblocks-0.3.1-cp39-abi3-musllinux_1_2_i686.whl (910.0 kB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ i686

zig_codeblocks-0.3.1-cp39-abi3-musllinux_1_2_armv7l.whl (844.2 kB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ ARMv7l

zig_codeblocks-0.3.1-cp39-abi3-musllinux_1_2_aarch64.whl (758.2 kB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ ARM64

zig_codeblocks-0.3.1-cp39-abi3-manylinux_2_28_x86_64.whl (715.1 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ x86-64

zig_codeblocks-0.3.1-cp39-abi3-manylinux_2_28_ppc64le.whl (767.7 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ ppc64le

zig_codeblocks-0.3.1-cp39-abi3-manylinux_2_28_armv7l.whl (656.6 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ ARMv7l

zig_codeblocks-0.3.1-cp39-abi3-manylinux_2_28_aarch64.whl (669.4 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ ARM64

zig_codeblocks-0.3.1-cp39-abi3-macosx_11_0_arm64.whl (433.7 kB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

zig_codeblocks-0.3.1-cp39-abi3-macosx_10_12_x86_64.whl (442.7 kB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

File details

Details for the file zig_codeblocks-0.3.1.tar.gz.

File metadata

  • Download URL: zig_codeblocks-0.3.1.tar.gz
  • Upload date:
  • Size: 538.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.8.3

File hashes

Hashes for zig_codeblocks-0.3.1.tar.gz
Algorithm Hash digest
SHA256 46d73dc91678e898626b361b7bf1aa1a388c9b9b79b44229c8ae21c7b61cae97
MD5 efd22745084bfbc8327f08ee3dcf56cd
BLAKE2b-256 199214e35f9aaedd071d7ed470f834e27e8ed1ae0974cf52d3c6d75890378634

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp313-cp313t-win_amd64.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp313-cp313t-win_amd64.whl
Algorithm Hash digest
SHA256 d30c0118ebbaf8a3de98a287bff7a7c9b9b527fbe5154b0f75baf05942b15532
MD5 62c328fa69f47e03425a3e0cddc0e028
BLAKE2b-256 da6a303a47dcb73668bcb3e1bcadf888f449fa1375695d8c1ff93418d897f9e4

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp313-cp313t-win32.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp313-cp313t-win32.whl
Algorithm Hash digest
SHA256 0339056cf8b493d3b0ed4deef9d04f9270800d9eac59fc1ea5bca505a4b4f04a
MD5 9fd6a05c66492b953708dfe6fb9f39a8
BLAKE2b-256 3cba9c0450c3db0ddec7cf24b7d877f756019b4cfbe902fb166033bb43a53614

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 5611f313d398373984e8695ed4709ca10c225e7ab5ec86a8639425f58afd0e7e
MD5 fb75b41dde308c677e0f9f1a75dd9cd4
BLAKE2b-256 f499c82eee05c3c75bcb55fb20c077aef9e573ffb8cd7aa59b20dfa6daa36dcb

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp313-cp313t-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp313-cp313t-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 901d6dca03baf06c552fdb573c27fbb8309a02ec2542e92062b8785b1ee1197b
MD5 a1726b6f5232983779ec0dce259e091c
BLAKE2b-256 6bd5d09d00942954df4ba35d97d832184cd098da7ccc2d92bbb6af6beb3e1361

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp313-cp313t-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp313-cp313t-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 89d16b99bbb5f5f0047a2d718079176f0e3492a4af11693dd8fc5616128317af
MD5 bb7022ac8b5bcee4388c065235c28b4a
BLAKE2b-256 ccf7fc7b91a97c3c99b345f7daddde8c95a2b0fd164194aaa98261a3e5bf35bf

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 7dc39ba2ae19051062389280fc73b9e94601b4d0632297822fd57aafcb632b90
MD5 1481f28e00d38dfc789eabcfeaff1fac
BLAKE2b-256 54ada21eae339bf5bdb1c41b449e3579e80e0c8ed378dfa2f0108e2091f42457

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp313-cp313t-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp313-cp313t-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 aa63f57937530246f9964e69867a988c75f1aa6fb7b6aec4354dc8eff1acc5e4
MD5 94ab4b79edf975000fc096a66db0a9a3
BLAKE2b-256 cfbe80096fce1bddd6bd8a51373d2c07389d08e11864b9aea733ba617b090d66

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp313-cp313t-manylinux_2_28_ppc64le.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp313-cp313t-manylinux_2_28_ppc64le.whl
Algorithm Hash digest
SHA256 585027d0c14839bf3d3bf6ca3e8e4fb782ff7e1bb2371a325bf977e1f75561f1
MD5 7735886080b6f666941bbf978ae457ac
BLAKE2b-256 39549e9816c048772055eb1f2f378a9e430f8891671aad238bfd94693d0262bf

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp313-cp313t-manylinux_2_28_armv7l.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp313-cp313t-manylinux_2_28_armv7l.whl
Algorithm Hash digest
SHA256 433923194f23ce60a324616a525620e4d2b6a38db5b9b528ca697b1c1bfa2303
MD5 18cf6788e29400d54efe9e0d5f5dd9aa
BLAKE2b-256 d8d0db30c10bfe852cdbdedad8fb8a3c0233fc556e88ae699f27cf0bbaa7c447

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp313-cp313t-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp313-cp313t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1bb0c37bfc01f9aa5dba6eada675638ae1f28f8d1e36adfdfb9b2ccd08417b44
MD5 6819dc34c91d39480776b81689804e1c
BLAKE2b-256 7b381582f37ee293a16b756fc8101ff16aaafa271296b89a70d9ed14becdd0e7

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp313-cp313t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp313-cp313t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9e924de4a9c8d63474baec2af78386fe8bee4f2371bacc76b7132633f6af27dd
MD5 0337dc296dfde53e4f4a40182bec6a05
BLAKE2b-256 94118bbc3c499f1b1f626cf1b21facd0631c57d4bc20a7b2ea937d8152789863

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp313-cp313t-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp313-cp313t-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 33be6a151c9115b36052577246484907770f30225ddf5a478c2b18c1508b7ade
MD5 d03d290f7ffaec3339d391533907cef9
BLAKE2b-256 124de9fdd0b1e353ba8373f3b8a12b8f2066a9e388c19593eb01c461826cae91

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp39-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 9180a1d77e9519973d385c4e4b6ab7a26e3e1330ef7a0886145e035e408a16c3
MD5 d7d969f30877d55e2c6c1aae7509e01b
BLAKE2b-256 b22e84c9f193d9139415d4e24af8f220c9f5c7420d9fc51b8c206c2a249b8626

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp39-abi3-win32.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp39-abi3-win32.whl
Algorithm Hash digest
SHA256 17ca15b90c223b206f846135745095c34e5f36325cadd982488d58ef56119bd0
MD5 b57a3c4bdb18869fdde34a5933eaf60b
BLAKE2b-256 b6ea09d19b993cf9241704a1700f1128726e556db1d577ac77277975800026f6

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp39-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp39-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 733609d00445152742a35ba29d55ec6262998616ccc6f19d5712e5435ecbd0ac
MD5 e7b6c375b3041c82a49ba5e8be0da740
BLAKE2b-256 f59ffbdde4b512f24950349a4320933eadf6b72e3d35c2567d13ce477bf7816f

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp39-abi3-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp39-abi3-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 42370a193d20472ba6b92b63c3e4985f4dbe6b094c74f4a18bb69a924285a4dd
MD5 b7d308ecbae542a22b089c5cacbdeab9
BLAKE2b-256 24a11bd3a8501b2d1477c8699c4dac36353d57044ba243cea18664bd1bd14963

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp39-abi3-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp39-abi3-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 d50c94ba3fb3d93869750e58fdc7305047a874f5dbe57dab66c879e142ca9285
MD5 b2d21f552d1d55f874972333e9c8db6e
BLAKE2b-256 1ac74ab43ad4d32f5e8bb36dfbd35ad64359c229079ec9764c7af7fa81d7fdb0

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp39-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp39-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 a84cfa3420f29e709855e8ae2ebdf719d975857ebd5db6d5589c989d30e5a552
MD5 e24f092c3d87ea3fbeb1103c06f6f161
BLAKE2b-256 e15d4241270657a89bff0ed52afd763eb28161d049266def29012c8edc7b58e8

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp39-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp39-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 75a564deb749d0fde075bed041338a055c0f45f6586fa279bf7c3d145fdb5d1a
MD5 e709bdac3f81574e4d81c8f4c2af2646
BLAKE2b-256 f64a3ea2455753607c9fb6d9a955b76b30ff5d92ce2d0f85f0423208ab67d160

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp39-abi3-manylinux_2_28_ppc64le.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp39-abi3-manylinux_2_28_ppc64le.whl
Algorithm Hash digest
SHA256 22b4de196e406225a74055fa423fdcd70596951d0cacf6f94171f1f732cf1971
MD5 efc48dd6f67187ac51a75d2d19c19379
BLAKE2b-256 76006cc3e419e6f379adb86a2b516da12739c0572a36a7ecc2097075b038dbb3

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp39-abi3-manylinux_2_28_armv7l.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp39-abi3-manylinux_2_28_armv7l.whl
Algorithm Hash digest
SHA256 fb7a7d847327b1de02aa26deed339a0dabc8af702b4a2ba703dda5860268c3a3
MD5 68c2501ce7a8e90253f7fafbe81707f3
BLAKE2b-256 2bcbfe1377d697c396a7a46ef7e63c6f831d68c25ea0ec5621466e2dbd5bff5d

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp39-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp39-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1c85e40e902615bc925f3b9ce9aabd4b686d88d33e8467289b29cc7970b7c268
MD5 f7543332cb0203bde7ac25af18bba3d6
BLAKE2b-256 117e3100331346211dc370c578f8ccd2c2ff9f51e1dae477d92ca745ad2933a1

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8df749c5246286c4688061ba5dd05b15f13bbdf6cdd2fa118ed7055f4ad8d986
MD5 160a05c3e587158ebb295f434eb81ac8
BLAKE2b-256 92aeaf2772e7e79a4af952909e31b89cc037c6c06e4244912a83aa7d6a2c7cf4

See more details on using hashes here.

File details

Details for the file zig_codeblocks-0.3.1-cp39-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for zig_codeblocks-0.3.1-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 b6117cc691c7ea39ea43366e4b47e78370b9f250f603fba2bca2de46f2f0440c
MD5 38faaf5c5d3a2ea5aaf35ed62e47508d
BLAKE2b-256 18694e32716d9c90ef61265069133c069ff490c59999adec733f66ebc519cdfc

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