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.2.tar.gz (539.3 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.2-cp313-cp313t-win_amd64.whl (479.6 kB view details)

Uploaded CPython 3.13tWindows x86-64

zig_codeblocks-0.3.2-cp313-cp313t-win32.whl (445.7 kB view details)

Uploaded CPython 3.13tWindows x86

zig_codeblocks-0.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl (857.1 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ x86-64

zig_codeblocks-0.3.2-cp313-cp313t-musllinux_1_2_i686.whl (898.3 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ i686

zig_codeblocks-0.3.2-cp313-cp313t-musllinux_1_2_armv7l.whl (834.0 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARMv7l

zig_codeblocks-0.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl (744.3 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARM64

zig_codeblocks-0.3.2-cp313-cp313t-manylinux_2_28_x86_64.whl (703.3 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.28+ x86-64

zig_codeblocks-0.3.2-cp313-cp313t-manylinux_2_28_ppc64le.whl (838.2 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.28+ ppc64le

zig_codeblocks-0.3.2-cp313-cp313t-manylinux_2_28_armv7l.whl (645.2 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.28+ ARMv7l

zig_codeblocks-0.3.2-cp313-cp313t-manylinux_2_28_aarch64.whl (653.7 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.28+ ARM64

zig_codeblocks-0.3.2-cp313-cp313t-macosx_11_0_arm64.whl (418.8 kB view details)

Uploaded CPython 3.13tmacOS 11.0+ ARM64

zig_codeblocks-0.3.2-cp313-cp313t-macosx_10_12_x86_64.whl (429.7 kB view details)

Uploaded CPython 3.13tmacOS 10.12+ x86-64

zig_codeblocks-0.3.2-cp39-abi3-win_amd64.whl (483.5 kB view details)

Uploaded CPython 3.9+Windows x86-64

zig_codeblocks-0.3.2-cp39-abi3-win32.whl (449.0 kB view details)

Uploaded CPython 3.9+Windows x86

zig_codeblocks-0.3.2-cp39-abi3-musllinux_1_2_x86_64.whl (862.0 kB view details)

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

zig_codeblocks-0.3.2-cp39-abi3-musllinux_1_2_i686.whl (905.1 kB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ i686

zig_codeblocks-0.3.2-cp39-abi3-musllinux_1_2_armv7l.whl (838.6 kB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ ARMv7l

zig_codeblocks-0.3.2-cp39-abi3-musllinux_1_2_aarch64.whl (749.6 kB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ ARM64

zig_codeblocks-0.3.2-cp39-abi3-manylinux_2_28_x86_64.whl (708.5 kB view details)

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

zig_codeblocks-0.3.2-cp39-abi3-manylinux_2_28_ppc64le.whl (843.0 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ ppc64le

zig_codeblocks-0.3.2-cp39-abi3-manylinux_2_28_armv7l.whl (650.7 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ ARMv7l

zig_codeblocks-0.3.2-cp39-abi3-manylinux_2_28_aarch64.whl (659.5 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ ARM64

zig_codeblocks-0.3.2-cp39-abi3-macosx_11_0_arm64.whl (430.3 kB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

zig_codeblocks-0.3.2-cp39-abi3-macosx_10_12_x86_64.whl (440.7 kB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

File details

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

File metadata

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

File hashes

Hashes for zig_codeblocks-0.3.2.tar.gz
Algorithm Hash digest
SHA256 6f18cd87dffbb3bb7022eced9dfb4d5fe86928755c2e70f8912e976ccd697508
MD5 4ba08240caa22be8d6fe5175af5780b6
BLAKE2b-256 69f9911df16dbafd2ad82967d632821b9038c2bfe28c07f87b7d227c9a56e438

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp313-cp313t-win_amd64.whl
Algorithm Hash digest
SHA256 8681957d689a8b4603332fb13332a18a0f20aac02cdb59c984e2d7fd0d05ba71
MD5 31264d9101f3d997f544fec0ab9ba727
BLAKE2b-256 850d428cf01a119d00cd91d32a8f5e21a1976cbacaef9daf973e3cd25e8fae18

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp313-cp313t-win32.whl
Algorithm Hash digest
SHA256 350a5106a437d17567de95b817ea791c25de40884594a4cac83e846616925edc
MD5 cba33be12f08861690fe9e3cff068880
BLAKE2b-256 ff15ecb508cce7ba952baacef923cd2b910de10274e50e40dc9193b4e309822d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 68642d2b878f9f9faccfc68b63ff2792311cc8e5a3433b0d339bd25b3978a7aa
MD5 83c26b1ce86cd6d28c75fbf2d7e2f11b
BLAKE2b-256 17ba5d51d25f04c72006f7002c0d6f6c3496ecba4865b2231b03dfe5e161f494

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp313-cp313t-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 c35b0c4b3e88f843592ac90df4f1b410ce0002f3f44acd34d1a878bc7d168f79
MD5 2739722c7170cf2a00179c35a10863d5
BLAKE2b-256 753ba18ced727ad8015255baa3b5f159d2721836db57db214210435d963b9d50

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp313-cp313t-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 878295ad42c57f8e28d05f06120922b4515286dc4b6b587e678e7fb33cbfd6fd
MD5 77c796e45045f5684d806044a9a0f525
BLAKE2b-256 4919895a048e7a016949341fad0a76656b41e846e13d41908a07d0e1760a5dad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 de721d80981f13bb85d443507dbeb42ed2b7bc7262cffc79c87fcd38e1873cc6
MD5 59eef64a7d7a5c81e29b28c6a3520f71
BLAKE2b-256 b83e5c05af0635ba3e7cd319e585e8f7882764b1b471d72dc0c67bb78e5d7e5a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp313-cp313t-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 32d2b29c160336f968c0a96bd3dbe833836b25ae97ff448e827231298ed36e13
MD5 4d26063597614fc29cd7846c013e1dbe
BLAKE2b-256 65343886e47f501a14b5752095281c76fa1474a08cb905b6f1185b5b1d5afc6e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp313-cp313t-manylinux_2_28_ppc64le.whl
Algorithm Hash digest
SHA256 0d0ca7818b5247128ed32d67cc200b80213dfbf90e520cc175179f4a3c4ed06f
MD5 8814ec101001b58df4cdf37471c46a13
BLAKE2b-256 a759fd3c7e2e53ece22ead11c24a2ed5e63b32e7e2d91f2fc357f389bc06695e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp313-cp313t-manylinux_2_28_armv7l.whl
Algorithm Hash digest
SHA256 cfd36d2a3a60f2d52a04243720e9b2da11a7868588da740cbf9b049fc19c8c4a
MD5 8596bbd79dbfcd3f69441dc595d53c62
BLAKE2b-256 26d00a8154ccc253468f8f2033d3ce7a192defcb42b9384c0289fd40249ebb29

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp313-cp313t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 bf8e757a92d60bc15e6dd5c80caaa0a6c26dbfffca0bf1a3e19a85568e254a40
MD5 e1ed96fc9d1063c30ac2f3514e0e8de1
BLAKE2b-256 2282dd86478d8e8917b7d69ac095ea75efc7b93375ffacf6e49ccd598ecbca47

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp313-cp313t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5c453a5159b91a363718a39eb053fa287ebe58b06dc2779614e647ae275cb9ab
MD5 ee0a231b78cd49f637f197a17f02ea18
BLAKE2b-256 027df17fc69ef3da39652575efec920d4dc4f16bf83c77ce488f73e44ab544f0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp313-cp313t-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 65a4be5d5de4f1c47127efd1b86b141eaa5a85c54e8817b37d8927145dbfeb89
MD5 fe7f06cdd92bc753dfec25800437175b
BLAKE2b-256 a9867ccc0970dc4d8173ab21a7a549c3bb52a7220d493a75597f1eb5dc97f539

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 767edf45a64fb4efa55c2867fdf328effa063abaaf776baaaf9bf413bb498674
MD5 3c7318b7085b93ee19bcf7f83d6ef72e
BLAKE2b-256 16650ffea8f7870193fbcc63592594ede8002032b28aa9b0c276cb0098a56ea4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp39-abi3-win32.whl
Algorithm Hash digest
SHA256 51d62c5b79b81b3a134667ec996958e0d8534b1b2214f07004baf79a8cb87cc9
MD5 eb7aa9fc328b8d47635ec5c5e7d867ea
BLAKE2b-256 b450b080f1007717a6f0d03b173d1a5443df291374386874fb18d9aa16f1dcb3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp39-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c4768d4bc910d1de8d22f99bbe221dbfc8573a574e37d4608fbb31569b6515f3
MD5 70f7097b53f9dcf55840797fb9ff733a
BLAKE2b-256 a4f8944ab298f863b421fdfcfdf371d644e046da0dbf0e51edc9d214e247927b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp39-abi3-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 8eab651d79a1fad7665bf7252fd3cc095abe3359e98a1266bf5b053523c3feb4
MD5 4dcc8292bf094c7151bdfd5e356a94e4
BLAKE2b-256 27c6340319eb339525af99ff8955fc437a4409fe1e74aae3c9583c0cf0b321d5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp39-abi3-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 00d4a373aa46f29c90f9451544aa76d892870eabf68d680eeded34c254480ed3
MD5 8fb851eb388a2431021e987e78890f94
BLAKE2b-256 2097aeba55f00d6d7282d8a644ff8923d21e0306fb0dd4171566710d48038388

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp39-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 be901ebd092711a79ffea01a1f3bdd59fd8528f53a1578ba3877e1b9cd9b7c6e
MD5 6c994d77bd38a69f1f808d80a27dc1ba
BLAKE2b-256 7196b5890d97b220764233208dc5918042a033b1bf3454f12c44f4a6594cebbb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp39-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 43664f314b00885088b85cf41b8415e40c8a5676ef78faff5d7d4d0e8cc0effb
MD5 134d002c07a027dbfe452c3f3b320fa5
BLAKE2b-256 6e197109ab8166bfb05a7f07acb9a94c8dad62ce907b52a285d6501de7f5e721

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp39-abi3-manylinux_2_28_ppc64le.whl
Algorithm Hash digest
SHA256 8e7c3a074b4216be4040f10a1ffece1c5dfab14b4d4413232992237f02dc4ca2
MD5 fbd5b22d3c067600d14074ec83d015cf
BLAKE2b-256 f7622223cc5d3c2c67c9483b2cee36cf3d283e7d434a8d9655a8f0d4b0e826e8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp39-abi3-manylinux_2_28_armv7l.whl
Algorithm Hash digest
SHA256 f30e0955d45f9b07a61aa205e3b519906b3b425dbdb4d217dd029095e5c4063e
MD5 b0f290de16995221226b8984e947ea64
BLAKE2b-256 8c0fb000635b38b056a5f890fac675d7baaf4c5dad77287e49dd4f94556b544d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp39-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c38f5d818e3887768583d2cecd0ac45b725298d82d436b734763867ed9ee25fd
MD5 9eca0faed4505126b15ba27c4e658bf2
BLAKE2b-256 1668ec6aa0d76a002f527d87dd9faf3a4bbc0b0ab4957eeebe04ed1b22e5f562

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c04a3c2721e6f0d4d0122ffe31be6294ba204ed05d3f9d6fba58cbd56a284180
MD5 56d7d9d7e4404600d1f9f3cf5bac4729
BLAKE2b-256 a9ae32cab2339abb02eb988de5c4f5eddb5534c59ad0433b8ae7bed717d7e1ca

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zig_codeblocks-0.3.2-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 e32d94480ba1eb2c1aee96c27c662c9498a66d2ed36280c7df121e2a5ee1a9f3
MD5 b1c552d26a5d5432a2805d92c21a1b4c
BLAKE2b-256 cc4777c5783d29918a193af60d32b418585701b9620f8ff8c9b61862728551d6

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