Skip to main content

Paged HTML rendering library

Project description

build docs license downloads pypi pyver

PlutoPrint

PlutoPrint is a lightweight and easy-to-use Python library for generating high-quality PDFs and images directly from HTML or XML content. It is based on PlutoBook’s robust rendering engine and provides a simple API to convert your HTML into crisp PDF documents or vibrant image files. This makes it ideal for reports, invoices, or visual snapshots.

Invoices

Tickets

Invoices

Tickets

Installation

pip install plutoprint

PlutoPrint requires PlutoBook. On Windows (win_amd64), Linux (manylinux_2_28_x86_64) and macOS (macosx_14_0_arm64), prebuilt binaries are bundled with the package and no further steps are necessary. On other architectures or when building from source, see the Getting Started guide for dependency setup and build instructions.

On macOS and Linux, you can also install PlutoPrint using Homebrew:

brew update
brew install plutoprint

Quick Usage

Generate a PDF from the command line with the installed plutoprint script:

plutoprint input.html output.pdf --size=A4

Generate PDF with Python

import plutoprint

book = plutoprint.Book(plutoprint.PAGE_SIZE_A4)
book.load_url("hello.html")

# Export the entire document to PDF
book.write_to_pdf("hello.pdf")

# Export pages 2 to 15 (inclusive) in order
book.write_to_pdf("hello-range.pdf", 2, 15, 1)

# Export pages 15 to 2 (inclusive) in reverse order
book.write_to_pdf("hello-reverse.pdf", 15, 2, -1)

# Render pages manually with PDFCanvas (in reverse order)
with plutoprint.PDFCanvas("hello-canvas.pdf", book.get_page_size()) as canvas:
   canvas.scale(plutoprint.UNITS_PX, plutoprint.UNITS_PX)
   for page_index in range(book.get_page_count() - 1, -1, -1):
      canvas.set_size(book.get_page_size_at(page_index))
      book.render_page(canvas, page_index)
      canvas.show_page()

Generate PNG with Python

import plutoprint
import math

book = plutoprint.Book(media=plutoprint.MEDIA_TYPE_SCREEN)
book.load_html("<b>Hello World</b>", user_style="body { text-align: center }")

# Outputs an image at the document’s natural size
book.write_to_png("hello.png")

# Outputs a 320px wide image with auto-scaled height
book.write_to_png("hello-width.png", width=320)

# Outputs a 240px tall image with auto-scaled width
book.write_to_png("hello-height.png", height=240)

# Outputs an 800×200 pixels image (may stretch/squish content)
book.write_to_png("hello-fixed.png", 800, 200)

# Get the natural document size
width = math.ceil(book.get_document_width())
height = math.ceil(book.get_document_height())

# Outputs a high-resolution 5x scaled image
book.write_to_png("hello-scaled.png", width * 5, height * 5)

# Render manually on a canvas with white background
with plutoprint.ImageCanvas(width, height) as canvas:
   canvas.clear_surface(1, 1, 1)
   book.render_document(canvas)
   canvas.write_to_png("hello-canvas.png")

Generate QR Codes

Quick example of using -pluto-qrcode(<string>[, <color>]) to create QR codes with optional colors.

import plutoprint

HTML_CONTENT = """
<table>
  <tr>
    <th class="email">Email</th>
    <th class="tel">Tel</th>
  </tr>
  <tr>
    <th class="website">Website</th>
    <th class="github">GitHub</th>
  </tr>
</table>
"""

USER_STYLE = """
body {
  margin: 0;
  height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
  background: #f7f7f7;
  font: 16px Arial;
}

table {
  border-spacing: 2rem;
  background: #fff;
  padding: 2rem;
  border: 1px solid #ccc;
  border-radius: 16px;
}

th::before {
  display: block;
  width: 130px;
  height: 130px;
  margin: 0 auto 0.8rem;
}

.email::before   { content: -pluto-qrcode('mailto:contact@example.com', #16a34a); }
.tel::before     { content: -pluto-qrcode('tel:+1234567890', #2563eb); }
.website::before { content: -pluto-qrcode('https://example.com', #ef4444); }
.github::before  { content: -pluto-qrcode('https://github.com/plutoprint', #f59e0b); }
"""

book = plutoprint.Book(plutoprint.PAGE_SIZE_LETTER.landscape())
book.load_html(HTML_CONTENT, USER_STYLE)
book.write_to_png("qrcard.png")
book.write_to_pdf("qrcard.pdf")

Expected output:

QR card

Generate Charts with Matplotlib

import plutoprint

import matplotlib.pyplot as plt
import urllib.parse
import io

class CustomResourceFetcher(plutoprint.ResourceFetcher):
   def fetch_url(self, url):
      if not url.startswith('chart:'):
         return super().fetch_url(url)
      values = [float(v) for v in urllib.parse.unquote(url[6:]).split(',')]
      labels = [chr(65 + i) for i in range(len(values))]

      plt.bar(labels, values)
      plt.title('Bar Chart')
      plt.xlabel('Labels')
      plt.ylabel('Values')

      buffer = io.BytesIO()
      plt.savefig(buffer, format='svg', transparent=True)

      return plutoprint.ResourceData(buffer.getvalue(), "image/svg+xml", "utf-8")

book = plutoprint.Book(plutoprint.PAGE_SIZE_A4.landscape(), plutoprint.PAGE_MARGINS_NONE)

book.custom_resource_fetcher = CustomResourceFetcher()

HTML_CONTENT = """
<body>
  <img src='chart:23,45,12,36,28,50'>
  <img src='chart:5,15,25,35,45'>
  <img src='chart:50,40,30,20,10'>
  <img src='chart:10,20,30,40,50,60,70'>
</body>
"""

USER_STYLE = """
body {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  background: #f7f7f7;
  height: 100vh;
  margin: 0;
}

img {
  background: #fff;
  border: 1px solid #ccc;
  margin: auto;
  max-height: 45vh;
}
"""

book.load_html(HTML_CONTENT, USER_STYLE)
book.write_to_png("charts.png")
book.write_to_pdf("charts.pdf")

Expected output:

Charts

Samples

Invoices
Invoice 1 Invoice 2 Invoice 3
Tickets
Ticket 1 Ticket 2
Ticket 3 Ticket 4

Support and Contribution

This project continues to grow through the encouragement and involvement of its users. If it has been helpful to you or your team, here are a few meaningful ways you can support its future:

  • Give it a Star on GitHub. Starring the project helps others discover it and shows your appreciation for the work behind it.

  • Sponsor the project to help drive new features, improve stability, and ensure the project continues to evolve for everyone who relies on it.

  • Share your feedback. If you have suggestions, feature requests, or notice an issue, please open a GitHub issue. Your voice and experience help guide the project’s direction.

Star History Chart

License

PlutoPrint is licensed under the MIT License, allowing for both personal and commercial use.

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

plutoprint-0.20.0.tar.gz (41.3 kB view details)

Uploaded Source

Built Distributions

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

plutoprint-0.20.0-cp314-cp314-win_amd64.whl (19.9 MB view details)

Uploaded CPython 3.14Windows x86-64

plutoprint-0.20.0-cp314-cp314-manylinux_2_28_x86_64.whl (21.3 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

plutoprint-0.20.0-cp314-cp314-macosx_14_0_arm64.whl (19.1 MB view details)

Uploaded CPython 3.14macOS 14.0+ ARM64

plutoprint-0.20.0-cp313-cp313-win_amd64.whl (19.1 MB view details)

Uploaded CPython 3.13Windows x86-64

plutoprint-0.20.0-cp313-cp313-manylinux_2_28_x86_64.whl (21.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

plutoprint-0.20.0-cp313-cp313-macosx_14_0_arm64.whl (19.1 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

plutoprint-0.20.0-cp312-cp312-win_amd64.whl (19.1 MB view details)

Uploaded CPython 3.12Windows x86-64

plutoprint-0.20.0-cp312-cp312-manylinux_2_28_x86_64.whl (21.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

plutoprint-0.20.0-cp312-cp312-macosx_14_0_arm64.whl (19.1 MB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

plutoprint-0.20.0-cp311-cp311-win_amd64.whl (19.1 MB view details)

Uploaded CPython 3.11Windows x86-64

plutoprint-0.20.0-cp311-cp311-manylinux_2_28_x86_64.whl (21.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

plutoprint-0.20.0-cp311-cp311-macosx_14_0_arm64.whl (19.1 MB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

plutoprint-0.20.0-cp310-cp310-win_amd64.whl (19.1 MB view details)

Uploaded CPython 3.10Windows x86-64

plutoprint-0.20.0-cp310-cp310-manylinux_2_28_x86_64.whl (21.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

plutoprint-0.20.0-cp310-cp310-macosx_14_0_arm64.whl (19.1 MB view details)

Uploaded CPython 3.10macOS 14.0+ ARM64

File details

Details for the file plutoprint-0.20.0.tar.gz.

File metadata

  • Download URL: plutoprint-0.20.0.tar.gz
  • Upload date:
  • Size: 41.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for plutoprint-0.20.0.tar.gz
Algorithm Hash digest
SHA256 1df8118b07f1d20cd8265174beef50430cfbb853ee0de7abdae2c8fe5e256b9d
MD5 e97b25a99e74ee33c193320fd4d7bd63
BLAKE2b-256 272ba9c50995cb828efacfe31cb0b3c8bac793ece51c87afa794a88fe7667084

See more details on using hashes here.

Provenance

The following attestation bundles were made for plutoprint-0.20.0.tar.gz:

Publisher: main.yml on plutoprint/plutoprint

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

File details

Details for the file plutoprint-0.20.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: plutoprint-0.20.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 19.9 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for plutoprint-0.20.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 debd0c5c8c735df4b160412fb04f7ebbab0d23f7cb6128fdd0e3a5bad0706a62
MD5 99be81e7c4cf6f55e1c0446bb054a567
BLAKE2b-256 d16eb11df6ed283fe39f6343104206348c1027dce80347e469fd36c3388ec40f

See more details on using hashes here.

Provenance

The following attestation bundles were made for plutoprint-0.20.0-cp314-cp314-win_amd64.whl:

Publisher: main.yml on plutoprint/plutoprint

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

File details

Details for the file plutoprint-0.20.0-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for plutoprint-0.20.0-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9d7545fecd5a110902f2eba310d76b4545f9d942abeda41291976d84e157b15d
MD5 6996f121b8f2cec8e1f4f37ecc7d2ddf
BLAKE2b-256 3a366b77aa21f8d9e8d39363826b84a8dd5288b1084e2c545eb5ac3ec3531244

See more details on using hashes here.

Provenance

The following attestation bundles were made for plutoprint-0.20.0-cp314-cp314-manylinux_2_28_x86_64.whl:

Publisher: main.yml on plutoprint/plutoprint

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

File details

Details for the file plutoprint-0.20.0-cp314-cp314-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for plutoprint-0.20.0-cp314-cp314-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 87c039e08b9badd904d14b96eb204dc8bdfc041c4d4b35c03df3af22312e6c10
MD5 980705fa7b036e4f203c42fb1cc55c31
BLAKE2b-256 82fb8a95af00a9ce0744ac7e1beb03aab2d952ec7a0c1f8f391c1bb392db7a4b

See more details on using hashes here.

Provenance

The following attestation bundles were made for plutoprint-0.20.0-cp314-cp314-macosx_14_0_arm64.whl:

Publisher: main.yml on plutoprint/plutoprint

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

File details

Details for the file plutoprint-0.20.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: plutoprint-0.20.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 19.1 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for plutoprint-0.20.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 a39fc95c46a3e73f38739111a83f0b0da6f1374c153a49c1bc1a0c32e0b9b7dc
MD5 a2a9b2cdfe6cc9a864a28d8ad6ea491f
BLAKE2b-256 a601947a3c16693492d922202c47b065d8f5d9613bda3321c8e31a60b39a4a77

See more details on using hashes here.

Provenance

The following attestation bundles were made for plutoprint-0.20.0-cp313-cp313-win_amd64.whl:

Publisher: main.yml on plutoprint/plutoprint

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

File details

Details for the file plutoprint-0.20.0-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for plutoprint-0.20.0-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a040e0688aa93ebc75fc62fe76cc84d38895e18363160cf940bda5f0823aac2a
MD5 ce6b832b19024e3f47cab7f08a7c76f5
BLAKE2b-256 02a330a0882c53747848c2a392bbcc617e73c5f38e14f4c3c1d16458871b8993

See more details on using hashes here.

Provenance

The following attestation bundles were made for plutoprint-0.20.0-cp313-cp313-manylinux_2_28_x86_64.whl:

Publisher: main.yml on plutoprint/plutoprint

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

File details

Details for the file plutoprint-0.20.0-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for plutoprint-0.20.0-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 3ab5e1ee3283f9a801971a82399804b41c57a23eeeef9482cc73d404043341cf
MD5 0bd0a795b49aef3ee5784979dcae8e68
BLAKE2b-256 cba330eea8382e7dc77a5fdd63314be7a842b2c172d238ebfcf96dfcb455ba21

See more details on using hashes here.

Provenance

The following attestation bundles were made for plutoprint-0.20.0-cp313-cp313-macosx_14_0_arm64.whl:

Publisher: main.yml on plutoprint/plutoprint

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

File details

Details for the file plutoprint-0.20.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: plutoprint-0.20.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 19.1 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for plutoprint-0.20.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 6bd3b5626da8c1731b446479bb847946958b4f65573c715eb22da46708986740
MD5 c79cae5b9e4d8aa8d10888271db472fb
BLAKE2b-256 b2f5542c33901a5065638244a3fa4dffd5d77d686a5a027a29bb5c0e17d8e51c

See more details on using hashes here.

Provenance

The following attestation bundles were made for plutoprint-0.20.0-cp312-cp312-win_amd64.whl:

Publisher: main.yml on plutoprint/plutoprint

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

File details

Details for the file plutoprint-0.20.0-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for plutoprint-0.20.0-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0e300b86ee5d84f4f451a0441c78f1d7a50faaea129d401bf67249fffbb70b27
MD5 e2f0e22aa0eadfad93ac077f87c2af7e
BLAKE2b-256 6259c151c4780dc65372075bc171c61a730bb801bf5b33e128f1a3e6231664f5

See more details on using hashes here.

Provenance

The following attestation bundles were made for plutoprint-0.20.0-cp312-cp312-manylinux_2_28_x86_64.whl:

Publisher: main.yml on plutoprint/plutoprint

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

File details

Details for the file plutoprint-0.20.0-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for plutoprint-0.20.0-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 3532ecf02366655f96552b5b496b00c53ac108e4cb3e0082168f0e928b6ec717
MD5 2df63f13787620aedaf5c7b0078a680b
BLAKE2b-256 d1761b0ef08b5cbf87e2df72c50b12186d803f879d24d352114ed4ec73908757

See more details on using hashes here.

Provenance

The following attestation bundles were made for plutoprint-0.20.0-cp312-cp312-macosx_14_0_arm64.whl:

Publisher: main.yml on plutoprint/plutoprint

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

File details

Details for the file plutoprint-0.20.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: plutoprint-0.20.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 19.1 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for plutoprint-0.20.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 917d4cbdf8f5c182d57bb68ee3fed8c3416fac43940b28ee532994d85a95acb3
MD5 8523003a80c8a8f1574ebc9c16278ce5
BLAKE2b-256 50352e9e2c774bac794f8030812ffbedc0834b3d4630e7973da85fa035f9af54

See more details on using hashes here.

Provenance

The following attestation bundles were made for plutoprint-0.20.0-cp311-cp311-win_amd64.whl:

Publisher: main.yml on plutoprint/plutoprint

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

File details

Details for the file plutoprint-0.20.0-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for plutoprint-0.20.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2577dd9b782e8d0c17bbd0f050af49a18f6ac6d1f23659a4fbf6051100151317
MD5 b96c07cbb3199af61f5c7a3a113f2172
BLAKE2b-256 e0b0ce273d8f8f81a467d5fc3e97d396b37a8d9ebaba37938d2d2f97f2edb9a9

See more details on using hashes here.

Provenance

The following attestation bundles were made for plutoprint-0.20.0-cp311-cp311-manylinux_2_28_x86_64.whl:

Publisher: main.yml on plutoprint/plutoprint

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

File details

Details for the file plutoprint-0.20.0-cp311-cp311-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for plutoprint-0.20.0-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 dcb2d95b28d1f13c8d2fae24c64b25d7e81b4b224ec5fad43254ad824dc0d104
MD5 29f14011a108077700a68fd1d4b6cf5e
BLAKE2b-256 87ebf89c50f7bee5a5ebb8126cdc4b75b547e9cb922552181043bafa87e9a79b

See more details on using hashes here.

Provenance

The following attestation bundles were made for plutoprint-0.20.0-cp311-cp311-macosx_14_0_arm64.whl:

Publisher: main.yml on plutoprint/plutoprint

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

File details

Details for the file plutoprint-0.20.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: plutoprint-0.20.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 19.1 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for plutoprint-0.20.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 07262d3e454f6d97059c4107b948e26031dbf1d17b4f6cfed7272acf3b8093b8
MD5 00e3d77346e223d7109779d5dcda5444
BLAKE2b-256 2073e0125860f0c1501afbbf8ef72e7f383410c920d9ec2936654217a7e22162

See more details on using hashes here.

Provenance

The following attestation bundles were made for plutoprint-0.20.0-cp310-cp310-win_amd64.whl:

Publisher: main.yml on plutoprint/plutoprint

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

File details

Details for the file plutoprint-0.20.0-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for plutoprint-0.20.0-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7da9dbafcbb9e5086da014e4231cd8d17e9618536326fc89d0133dd984d58dce
MD5 2c09152937f5d0282d37e02afcabcf9b
BLAKE2b-256 d24d2af41f4fa44a7ef31a8c9c452cc684109bc5a5e74d16593b73a4b24866eb

See more details on using hashes here.

Provenance

The following attestation bundles were made for plutoprint-0.20.0-cp310-cp310-manylinux_2_28_x86_64.whl:

Publisher: main.yml on plutoprint/plutoprint

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

File details

Details for the file plutoprint-0.20.0-cp310-cp310-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for plutoprint-0.20.0-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 fab9c37154ed33de8dd34f5813b8106a658451e33c444acf4e11e1220689c319
MD5 8d117eb18a55fdef02c76abef7c27dec
BLAKE2b-256 0a3f37fee7254a0368f99e6253f676666ffda3547bd45d25d4b74e93e04deb01

See more details on using hashes here.

Provenance

The following attestation bundles were made for plutoprint-0.20.0-cp310-cp310-macosx_14_0_arm64.whl:

Publisher: main.yml on plutoprint/plutoprint

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

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page