📟 PagerDuty on-call widget for monitoring dashboard. DataDog and Grafana compatible
Branch: master
Clone or download
Latest commit 740e905 Feb 7, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
.circleci [CLEANUP circleci] Move test key from secrets to allow exogenous PRs Feb 6, 2019
.github [DOC readme] Add sponsors section to README.md Dec 17, 2018
assets 1.0.0 [skip ci] Feb 7, 2019
docs Move PagerBeauty on Heroku documentation Feb 4, 2019
src Bring back default body margin Feb 6, 2019
test Fix lint Feb 6, 2019
.codecov.yml Turn off CodeCov status reports until they make sense Jan 5, 2019
.dockerignore CircleCI: report acceptance results Dec 29, 2018
.eslintignore Start linting src/assets Dec 22, 2018
.eslintrc.js Dust lint Jan 6, 2019
.gitignore CircleCI: report acceptance results Dec 29, 2018
.nycrc.json Setup NYC Dec 30, 2018
.releaserc.js Dust lint Jan 6, 2019
CHANGELOG.md 1.0.0 [skip ci] Feb 7, 2019
CODE_OF_CONDUCT.md Rules of contribution Oct 12, 2018
CONTRIBUTING.md Add Grafana docs Feb 6, 2019
Dockerfile Move to org.label-schema labels Feb 4, 2019
Dockerfile-dev Move to org.label-schema labels Feb 4, 2019
Dockerfile-test-acceptance Move to org.label-schema labels Feb 4, 2019
LICENSE Initial commit Aug 31, 2018
Procfile Heroku: update button app Jan 21, 2019
README.md Add PagerBeauty on Grafana Dashboard screenshot Feb 6, 2019
_config.yml Add pages config Oct 12, 2018
app.json Update Datadog gif Feb 6, 2019
ava.config.js Add grafana service with pre-provisioned PagerBeauty! Feb 6, 2019
docker-compose.circleci.yaml Document new auth and port variables Feb 3, 2019
docker-compose.test.yml Setup docker compose for local development Dec 25, 2018
docker-compose.yaml Document Grafana in CONTRIBUTING.md Feb 6, 2019
package.json 1.0.0 [skip ci] Feb 7, 2019
webpack.common.js Reduce js size even more Jan 22, 2019
webpack.dev.js Minimize CSS in prod builds Dec 19, 2018
webpack.prod.js Prepare dist-prod for automatic assets generation Dec 19, 2018
yarn.lock Resolve terser on 3.14.1 Feb 4, 2019


Pager Beauty CircleCI dependencies Status

Add concise PagerDuty on-call widget to your monitoring dashboard. Live Demo!

Who's on-call?

PagerDuty On Call

Active PagerDuty Incident Active PagerDuty Incident
PagerBeauty on Real Datadog Dashboard PagerBeauty on Real Datadog Dashboard
PagerBeauty on Grafana Dashboard PagerBeauty on Grafana Dashboard

Running on Heroku

Deploy to Heroku

The easiest way give PagerBeauty a run is one-click deployment using Heroku Button.
Refer to advanced PagerBeauty on Heroku documentation for manual deployments using Heroku CLI and keeping PagerBeauty up-to-date.

Running with Docker

Docker repo: sergiitk/pagerbeauty

You can run PagerBeauty locally on your infrastructure using Docker.
Create .env file as instructed in configuration and run:

docker run --rm -p 8080:8080 --env-file=.env -it sergiitk/pagerbeauty:latest

Or set individual environment variables as needed:

docker run --rm -p 8080:8080 -e PAGERBEAUTY_PD_API_KEY=yourkey -e PAGERBEAUTY_PD_SCHEDULES=SCHEDL1,SCHEDL2 -it sergiitk/pagerbeauty:latest

Example running PagerBeauty using test key:

docker run --rm -p 8080:8080 -e PAGERBEAUTY_PD_API_KEY=y_NbAkKc66ryYTWUXYEu -e PAGERBEAUTY_PD_SCHEDULES=PJ1P5JQ,P538IZH -it sergiitk/pagerbeauty:latest

Running with Node

NPM repo: pagerbeauty

Setup PagerBeauty by following configuration section and run:

yarn add pagerbeauty
node --experimental-modules node_modules/pagerbeauty/src/pagerbeauty.mjs


Configure PagerBeauty with .env file or by exporting environment variables:

# For Docker compatibility, do not placed quotation marks around the values.
# https://docs.docker.com/compose/env-file/

# PagerDuty REST API v2 Access Key (Read-only)
# Docs: https://support.pagerduty.com/docs/using-the-api

# Comma-separated list of PagerDuty schedule ids
# You can find schedule id in the URL of the schedule on PagerDuty website after symbol #
# For example, schedule https://example.pagerduty.com/schedules#PJ1P5JQ has id PJ1P5JQ

# (Optional) How often to refresh the schedules, in minutes.
# Default: 10.

# (Optional) Disable polling for active incidents.
# Default: false

# (Optional) How often to refresh active incidents, in minutes.
# Default: 1

# (Optional) Highest logging level to include into application logs.
# One of: error, warn, info, verbose, debug, silly
# Default: info

# (Optional) Log format. One of:
# machine - Machine-readable JSON format
# human   - Human-readable colorized format
# Default: resolved to `human` for development and `machine` for production.

# (Optional) The port for HTTP server to listen on.
# Default: 8080

# (Optional) Enable basic HTTP authentication
# Default: disabled
# PAGERBEAUTY_HTTP_USER=basic_username

# (Optional) Enable authentication access token (RFC6750)
# Note: embedding iframes that link to a page with basic HTTP name/password
# authentication is not supported by most modern browsers. To bypass it, you
# can set random access_token and append it to schedule URL. For example, if you can't embed schedule
# https://pb.example.com/v1/schedules/P538IZH.html, you can append your access token like so:
# https://pb.example.com/v1/schedules/P538IZH.html?acccess_token=your_token
# This link is embeddable now. Please use HTTPS.
# Default: disabled

Adding to Datadog dashboard

Add PagerDuty to Datadog dashboard

  1. Open the schedules list in PagerBeauty. Make sure the app is running behind HTTPS
  2. Find the schedule you want to embed, copy its URL
  3. Open your Datadog dashboard, click Edit Board.
  4. Drag IFrame widget to the board
  5. Paste copied PagerBeauty schedule URL to IFrame URL on Datadog board
  6. Resize and save!

Add to Grafana dashboard

Add PagerDuty to Grafana dashboard

  1. Install AJAX plugin:
    grafana-cli plugins install ryantxu-ajax-panel
  2. Restart Grafana Server
  3. Open the schedules list in PagerBeauty
  4. Find the schedule you want to embed, open it, copy its URL
  5. Open your Grafana dashboard, click "Add Panel"
  6. Select AJAX panel
  7. Click Panel title -> Edit
  8. On Request tab, fill out:
    URL: paste copied PagerBeauty schedule URL
    Method: iframe
    Parameters: { theme: "grafana" }
  9. On General tab, set your panel title and check Transparent
  10. Close panel edit, resize and save!


How it works?

PagerBeauty acts as a local cache server for PagerDuty schedules. It fetches and refreshes PagerDuty schedules in the background using secret PagerDuty API key and makes them available through web interface. This is done to protect your secret API key from public exposure. This means you'll need to run PagerBeauty as a service.

How to add my userpic?

PagerDuty uses Gravatar to manage profile photos. If you already have a Gravatar account, you can attach your PagerDuty login email to this account.


Contribution guide and step-by-step local development instructions.
The source code of Pager Beauty is maintained by @sergiitk. It's an Open Source project under MIT License. Contributions are welcomed. Follow the usual GitHub Pull Request process. Be nice.


This project is under active development.

Version 1.0

  • Load and process on-calls
  • JSON response
  • HTML response
  • HTML responsive layout
  • Basic autorefresh
  • MVP: Embed in Datadog dashboard as an iframe
  • Show dates in local time
  • Configurable refresh period
  • HTTP Basic Authentication
  • On-call TimeZone is loaded from the PagerDuty schedule settings
  • Application logging
  • Ajax refresh
  • Automated Testing
  • Automated Builds
  • No limit on the total number of schedules supported
  • Make on-call view red during an active incident
  • HTTP authentication bypass support for embeds

Version 2.0

  • Built-in SSL Support
  • Next on duty
  • Websocket refresh

Documentation and examples

  • Live demo on Heroku
  • Example: Heroku
  • Example: Custom SSL certificate using Docker
  • Example: Digital Ocean

Sponsors and Supporters

JW Player


Ask me on Twitter: @sergiitk


Pager Beauty is released under the MIT License.