Skip to main content

noqtis for Python NOQTIS hex logo

Post-quantum signatures, key encapsulation, hashes and sealed file capsules, from the noqtis C library. The library is compiled into the package: no runtime dependencies, and wheels for Linux (glibc and musl), macOS and Windows on x86-64 and arm64, one abi3 wheel per platform for CPython 3.9 and later.

Family Algorithms Standard
Signatures ML-DSA-44/65/87 FIPS 204
SLH-DSA-SHA2 and SLH-DSA-SHAKE, 128/192/256, s and f FIPS 205
Ed25519; hybrids ML-DSA-44/65/87+Ed25519 (both parts must verify) RFC 8032
KEMs ML-KEM-512/768/1024 FIPS 203
HQC-128/192/256 HQC round 4
Hashes SHA-224 ... SHA-512/256, SHA3-224 ... SHA3-512, SHAKE128/256, HMAC FIPS 180-4, FIPS 202
pip install noqtis      # or: uv add noqtis

Signatures

from noqtis import sign

pk, sk = sign.keygen("ML-DSA-65")
sig = sign.sign("ML-DSA-65", sk, b"message", ctx=b"app-v1")
assert sign.verify("ML-DSA-65", pk, b"message", sig, ctx=b"app-v1")
  • keygen(alg, seed=None) returns (pk, sk); a seed gives the standard's deterministic key pair.
  • sign(alg, sk, msg, ctx=b"", deterministic=False, prehash=None): prehash="SHA-512" (or any name from noqtis.hashes()) selects HashML-DSA / HashSLH-DSA; msg is still the message.
  • verify(...) returns True or False; it never raises for a bad or malformed signature.

Key encapsulation

from noqtis import kem

pk, sk = kem.keygen("ML-KEM-768")
ct, ss = kem.encap("ML-KEM-768", pk)
assert kem.decap("ML-KEM-768", sk, ct) == ss

A tampered ciphertext decapsulates to an unrelated secret rather than an error (implicit rejection, as FIPS 203 requires).

Hashes

import noqtis

noqtis.hash("SHA3-256", b"abc")
noqtis.hash("SHAKE256", b"abc", 100)   # 100 bytes of output
noqtis.hmac("SHA-256", b"key", b"data")

Capsules

A capsule is a folder sealed with a manifest of every file in it (noqtis.json) and a post-quantum signature over it (noqtis.sig).

import noqtis

pk, sk = noqtis.sign.keygen("ML-DSA-65")
noqtis.seal("results/", sk, pk, meta={"project": "survey-2026"})

report = noqtis.check("results/", pk)
print(report.ok)            # True only if every check passed
for row in report.rows:     # (check, ok, detail)
    print(row)

Without pk, check trusts the key inside the seal and its report says so. anchors=[der, ...] requires an RFC 3161 timestamp under one of the given TSA certificates.

Format 2, proofs and lineage

seal(..., format=2) adds a Merkle tree over the files to the manifest and signs its head. prove then shows some files to a reader without the names or digests of the others:

noqtis.seal("results/", sk, pk, format=2)
proof = noqtis.prove("results/", ["tables/t1.csv"])    # bytes (JSON)
noqtis.check(proof=proof, pk=pk).ok                    # the proof alone
noqtis.check("results/", pk, proof=proof).ok           # and the files

seal(..., inputs=["raw/", ("cleaned", "clean/")]) records the capsules this one was made from, by id (noqtis.capid(dir), 32 bytes); check(dir, pk, lineage=["raw/", "clean/"]) finds each input among those folders and checks it, to 64 levels. check(dir, pk, only=["a.csv"]) checks just those files (a "partial" row says so). noqtis.files(dir) lists what the manifest holds, File(path, size, sha256), with nothing checked.

Key statements

st = noqtis.rotate(old_sk, old_pk, new_sk, new_pk, reason="yearly")
noqtis.check("results/", old_pk, keys=[st]).ok   # sealed by the new key
rv = noqtis.revoke(old_sk, old_pk, at=1767225600)

A statement (bytes, or a file path) needs pk, the trusted key. With it, check accepts a seal by a key the trusted key was rotated to, and requires a verified timestamp from before a seal key was rotated away or revoked. Ed25519 alone cannot make statements.

Identity cards

card = noqtis.idcard(sk, pk, "Ada Lovelace", orcid="0000-0002-1825-0097",
                     url="https://example.org/ada")
c = noqtis.idcheck(card)          # a Card, or None when it does not verify
c.name, c.orcid, c.key_sha256     # compare the key with the one published
noqtis.idcheck(card, pk)          # None unless the card is for pk

A card (noqtis-idcard-1, JSON) binds a signing key to its holder's name and, when given, ORCID iD (check digit verified), e-mail address, https:// page and affiliation, signed by the key under its own context, so it is never a seal or a key statement. It is self-signed: it shows the key's holder wrote it, not that the name is true. A field out of its limits raises ArgError; input that is not a card, DecodeError.

DSSE envelopes

from noqtis import dsse

env = dsse.sign("ML-DSA-65", sk, pk, "application/vnd.in-toto+json", stmt)
dsse.verify("ML-DSA-65", pk, env)   # Signed(type, payload), or None

The envelope (in-toto and SLSA's signing wrapper) is canonical JSON with one signature over the pre-authentication encoding; its keyid is the hex SHA-256 of pk. verify returns None when no signature verifies and raises DecodeError for text that is not an envelope.

Key files

noqtis.keyfile reads and writes the text key files noqtis keygen makes (noqtis-key-1 <alg> <pub|sec>, then base64), as strictly as the command-line tool reads them:

from noqtis import keyfile

k = keyfile.read("me", "sec")      # Key(alg, kind, key); "me.pub" for pub
noqtis.sign.sign(k.alg, k.key, b"a message")

pk, sk = noqtis.sign.keygen("ML-DSA-65")
keyfile.write("you", "ML-DSA-65", "sec", sk)      # owner-only, no overwrite
keyfile.write("you.pub", "ML-DSA-65", "pub", pk)
text = keyfile.encode("ML-DSA-65", "pub", pk)     # the same text, as a str
assert keyfile.decode(text).key == pk

write never replaces a file unless force=True. Python's base64 is not constant time: decode secret key files where timing is not observable.

Errors

Every failure raises a subclass of noqtis.NoqtisError, one per library error code: ArgError, BufError, VerifyError, DecodeError, RandError, MemError, FileError, UnsupportedError, LimitError, StateError. Each has .code, the library's NQE* value.

Notes

  • Inputs may be bytes, bytearray or memoryview; outputs are bytes. Python cannot wipe bytes, so secret keys and shared secrets you hold in Python live until the garbage collector frees them.
  • Long operations release the GIL, so threads sign and verify in parallel.
  • The package is typed (py.typed).

Licensed under Apache-2.0 WITH LLVM-exception.

Metadata

Release files for noqtis 0.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for noqtis 0.1.2
File Size Uploaded Provenance Actions
noqtis-0.1.2.tar.gz 249.6 kB With provenance Details for noqtis-0.1.2.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for noqtis 0.1.2
File Actions
noqtis-0.1.2-cp39-abi3-win_arm64.whl CPython 3.9 abi3 Windows ARM64 Details for noqtis-0.1.2-cp39-abi3-win_arm64.whl
noqtis-0.1.2-cp39-abi3-win_amd64.whl CPython 3.9 abi3 Windows x86-64 Details for noqtis-0.1.2-cp39-abi3-win_amd64.whl
noqtis-0.1.2-cp39-abi3-musllinux_1_2_x86_64.whl CPython 3.9 abi3 Linux musl 1.2+ x86-64 Details for noqtis-0.1.2-cp39-abi3-musllinux_1_2_x86_64.whl
noqtis-0.1.2-cp39-abi3-musllinux_1_2_aarch64.whl CPython 3.9 abi3 Linux musl 1.2+ ARM64 Details for noqtis-0.1.2-cp39-abi3-musllinux_1_2_aarch64.whl
noqtis-0.1.2-cp39-abi3-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl CPython 3.9 abi3 Linux glibc 2.34+ RISC-V 64, Linux glibc 2.39+ RISC-V 64 Details for noqtis-0.1.2-cp39-abi3-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl
noqtis-0.1.2-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl CPython 3.9 abi3 Linux glibc 2.26+ x86-64, Linux glibc 2.28+ x86-64 Details for noqtis-0.1.2-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
noqtis-0.1.2-cp39-abi3-manylinux_2_26_s390x.manylinux_2_28_s390x.whl CPython 3.9 abi3 Linux glibc 2.26+ IBM System/390x, Linux glibc 2.28+ IBM System/390x Details for noqtis-0.1.2-cp39-abi3-manylinux_2_26_s390x.manylinux_2_28_s390x.whl
noqtis-0.1.2-cp39-abi3-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl CPython 3.9 abi3 Linux glibc 2.28+ PowerPC 64-le, Linux glibc 2.26+ PowerPC 64-le Details for noqtis-0.1.2-cp39-abi3-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl
noqtis-0.1.2-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl CPython 3.9 abi3 Linux glibc 2.28+ ARM64, Linux glibc 2.26+ ARM64 Details for noqtis-0.1.2-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
noqtis-0.1.2-cp39-abi3-macosx_11_0_x86_64.whl CPython 3.9 abi3 macOS 11.0+ x86-64 Details for noqtis-0.1.2-cp39-abi3-macosx_11_0_x86_64.whl
noqtis-0.1.2-cp39-abi3-macosx_11_0_arm64.whl CPython 3.9 abi3 macOS 11.0+ ARM64 Details for noqtis-0.1.2-cp39-abi3-macosx_11_0_arm64.whl

Total release size: 3.1 MB

Release files / noqtis-0.1.2.tar.gz

Download URL noqtis-0.1.2.tar.gz
Size 249.6 kB
Tags Source
SHA-256 checksum
How to use checksums
5b15333170308bec232f5744ef66724f0f0af2899d5312f107d94d7fc0c2ea66
BLAKE2b-256 checksum
How to use checksums
39d7374a0a03fdf91fa43148baea600ebc773c31bff708ff2778e7cd3c32b682
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.

Transparency log

Release files / noqtis-0.1.2-cp39-abi3-win_arm64.whl

Download URL noqtis-0.1.2-cp39-abi3-win_arm64.whl
Size 215.1 kB
Tags CPython 3.9 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
957b3b53bf204539fa0b39fa2854b35b0391500f955528bdd859ffe14d863887
BLAKE2b-256 checksum
How to use checksums
0d83097e7be5eb83cae0152bbf8bfeacaf0d1228ebe48085dc9e9829a46ade46
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.

Transparency log

Release files / noqtis-0.1.2-cp39-abi3-win_amd64.whl

Download URL noqtis-0.1.2-cp39-abi3-win_amd64.whl
Size 237.8 kB
Tags CPython 3.9 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
f59b855fc29d017f6ec79c63384e4027487aeeaf937d916394f83ee5f958a9ea
BLAKE2b-256 checksum
How to use checksums
60779fd1aedfb5fb173ed5a6133ddd820f369bce197d493325755f57f15de757
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.

Transparency log

Release files / noqtis-0.1.2-cp39-abi3-musllinux_1_2_x86_64.whl

Download URL noqtis-0.1.2-cp39-abi3-musllinux_1_2_x86_64.whl
Size 239.5 kB
Tags CPython 3.9 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
17d925f2937edb66884a33c4c055484d1d65c36491a24f69788c600f70171041
BLAKE2b-256 checksum
How to use checksums
68ed86d2b6af75d0b6976a401ddc179b2c78c14b40a9236c20c9db4481c98a7d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.

Transparency log

Release files / noqtis-0.1.2-cp39-abi3-musllinux_1_2_aarch64.whl

Download URL noqtis-0.1.2-cp39-abi3-musllinux_1_2_aarch64.whl
Size 243.3 kB
Tags CPython 3.9 Linux musl 1.2+ ARM64 abi3
SHA-256 checksum
How to use checksums
9d1b2329c0a6fddd9cdc1a68ffae767d75984d30db70f71ae8760b85597b3621
BLAKE2b-256 checksum
How to use checksums
01d6681f7e9b86886f8dfd7a03d5db78d3440b77c31c998471a7bc225df89f49
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.

Transparency log

Release files / noqtis-0.1.2-cp39-abi3-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl

Download URL noqtis-0.1.2-cp39-abi3-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl
Size 228.6 kB
Tags CPython 3.9 Linux glibc 2.34+ RISC-V 64 Linux glibc 2.39+ RISC-V 64 abi3
SHA-256 checksum
How to use checksums
c9ca7c792ed086e2d8a63dd1c9e71460d95746ba42700abd2f71f13f6be9266a
BLAKE2b-256 checksum
How to use checksums
bec81761fe7a00a0cb748befed8f9a9d030a8889d8113b1a287c00f23c839b0e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.

Transparency log

Release files / noqtis-0.1.2-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl

Download URL noqtis-0.1.2-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Size 235.6 kB
Tags CPython 3.9 Linux glibc 2.26+ x86-64 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
cfdace999f09cb6e592e322f377318aba5411374338a2e872bb4ca994f1e7b1a
BLAKE2b-256 checksum
How to use checksums
57089fcb907c25d5c80feeafe97013c3fae1a6796a7d82a281f362409fa43d51
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.

Transparency log

Release files / noqtis-0.1.2-cp39-abi3-manylinux_2_26_s390x.manylinux_2_28_s390x.whl

Download URL noqtis-0.1.2-cp39-abi3-manylinux_2_26_s390x.manylinux_2_28_s390x.whl
Size 465.7 kB
Tags CPython 3.9 Linux glibc 2.26+ IBM System/390x Linux glibc 2.28+ IBM System/390x abi3
SHA-256 checksum
How to use checksums
99f8b9b67fd61906b62667993eadc3cd1b904792f9bd5f256f4f480b268de229
BLAKE2b-256 checksum
How to use checksums
28490ba01364b271679674ed56a89fdfe1382eec92dc732e2e18cb773d35a654
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.

Transparency log

Release files / noqtis-0.1.2-cp39-abi3-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl

Download URL noqtis-0.1.2-cp39-abi3-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl
Size 314.1 kB
Tags CPython 3.9 Linux glibc 2.26+ PowerPC 64-le Linux glibc 2.28+ PowerPC 64-le abi3
SHA-256 checksum
How to use checksums
1f5583a3887c536e035920ffcc9f79173877cea805c19da1a6b3330a4cec3235
BLAKE2b-256 checksum
How to use checksums
2ffe25d998b3d99f130925eafd8287afe66083d2a16a48fc1fa325e639f5fff2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.

Transparency log

Release files / noqtis-0.1.2-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl

Download URL noqtis-0.1.2-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Size 235.6 kB
Tags CPython 3.9 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
f7f19d01264895e6b4583b022deb0776b28f995a6af10d08043866c1041b4290
BLAKE2b-256 checksum
How to use checksums
cec6a7ea01fa72b681449ab6f54ecb89960fc063275a61b089148b66a2a0bee2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.

Transparency log

Release files / noqtis-0.1.2-cp39-abi3-macosx_11_0_x86_64.whl

Download URL noqtis-0.1.2-cp39-abi3-macosx_11_0_x86_64.whl
Size 227.5 kB
Tags CPython 3.9 abi3 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
e4f3fb9e9791651924bb93a300e58ea25b97ea90fdba69d925a26b6a367d40e9
BLAKE2b-256 checksum
How to use checksums
00447f5ee74d8fb37cd77555648b6db961697aa3d0bf6f589a1588c3fc0d7db7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.

Transparency log

Release files / noqtis-0.1.2-cp39-abi3-macosx_11_0_arm64.whl

Download URL noqtis-0.1.2-cp39-abi3-macosx_11_0_arm64.whl
Size 223.7 kB
Tags CPython 3.9 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
a449414fed8a7b4623854a3229b020455b8cfc8cbe2945056d56a8b4322627d1
BLAKE2b-256 checksum
How to use checksums
577dda04fce4f5645c1d046d77f6077fa4b5600c091d624fe25be77004c55d08
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.

Transparency log

Security for noqtis 0.1.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 12 files in this release have been uploaded with provenance metadata.

Select from 12 files

Attestation for noqtis-0.1.2.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.2 This release

12 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page