{% if not locked %}{% endif %} {% if ws_style %}{% endif %} {% if not locked %}{% endif %} {% if custom_css %}{% endif %}
{% if locked %}
🔒

This status page is private

{{ page.title }} shares live status with its team{% if page.password_hash %} and with people who have the page password{% endif %}.

{% if unlock_error %}
{{ unlock_error }}
{% endif %} Log in to view {% if page.password_hash %}
or unlock with the page password

Access stays unlocked on this browser for 30 days.

{% endif %}
{% else %} {% if page.description %}

{{ page.description }}

{% endif %} {% if notice %}
{{ notice }}
{% endif %} {% if sub_error %}
{{ sub_error }}
{% endif %}

{{ overall_text }}

Updated {{ now.strftime('%d %b %Y, %H:%M UTC') }} · refreshes every minute
{% if maintenance or active_maint %}

Scheduled maintenance

Next 14 days
{% for r in active_maint %}{% set i = r.i %}
In progress {{ i.title }}
Started {{ i.started_at.strftime('%d %b %H:%M UTC') }}{% if i.scheduled_end %} · expected to finish {{ i.scheduled_end.strftime('%d %b %H:%M UTC') }}{% endif %}{% if r.affected %} · {{ r.affected|join(', ') }}{% endif %}
{% if i.updates and i.updates[-1].message %}
{{ i.updates[-1].message }}
{% endif %}
Details
{% endfor %} {% for w in maintenance %}
{% if w.active %}In progress{% else %}Upcoming{% endif %} {{ w.name }}
{{ w.starts_at.strftime('%a %d %b, %H:%M') }} → {{ w.ends_at.strftime('%H:%M UTC') if w.ends_at.date() == w.starts_at.date() else w.ends_at.strftime('%a %d %b, %H:%M UTC') }}{% if w.repeat != 'none' %} · repeats {{ w.repeat }}{% endif %}
{% if w.components %}{{ w.components|join(', ') }}{% else %}All components{% endif %}
{% endfor %}
{% endif %} {% macro component(r) %}
{{ r.name }} {% if r.latency24 is not none %}{{ r.latency24 }} ms{% endif %} {% if r.uptime90 is not none %}{{ r.uptime90 }}%{% endif %} {{ r.label }}
{% for b in r.bars %}{% endfor %}
90 days ago{% if r.uptime90 is not none %}{{ r.uptime90 }}% uptime{% endif %}Today
{% endmacro %}

Components

{{ rows|length }} monitored
{% if groups %}{% for g in groups %}
{{ g.name }}{{ state_label[g.state] }}
{% for r in g.rows %}{{ component(r) }}{% endfor %}
{% endfor %}{% endif %} {% if ungrouped %}
{% for r in ungrouped %}{{ component(r) }}{% endfor %}
{% endif %} {% if not rows %}

No components configured yet.

{% endif %}

Incident history

Last 30 days
{% if inc_rows %}{% for r in inc_rows %}{% set i = r.i %}
{{ i.title }} {{ 'resolved' if i.resolved_at else i.status }} {% if i.kind == 'maintenance' %}maintenance{% endif %} {% if r.affected %}
Affected: {{ r.affected|join(', ') }}
{% endif %}
{{ i.started_at.strftime('%d %b %Y, %H:%M UTC') }}
{% if i.resolved_at %}lasted {{ fmt_duration(i.duration_seconds) }}{% elif i.scheduled_end %}until {{ i.scheduled_end.strftime('%d %b %H:%M UTC') }}{% else %}ongoing · {{ fmt_duration(i.duration_seconds) }}{% endif %}
{% if i.updates %}
    {% for u in i.updates|reverse %}
  • {{ u.status }}{% if u.message %} — {{ u.message }}{% endif %}
    {{ (u.at or '')[:16]|replace('T', ' ') }} UTC
  • {% endfor %}
{% elif i.cause %}
{{ i.cause[:300] }}
{% endif %} {% if i.postmortem %}
Postmortem
{{ i.postmortem }}
{% endif %}
{% endfor %}{% else %}

No incidents in the last 30 days.

{% endif %}

Subscribe to updates

Atom / RSS feed

Get a message whenever an incident is opened, updated or resolved: by email, in a Slack or Discord channel, or to any HTTPS endpoint (JSON webhook).

{% if rows|length > 1 %}
Only some components
{% for r in rows %}{% endfor %}
Leave all unchecked to receive every incident.
{% endif %}
{% endif %}