Skip to main content

Configuration

The config.json file controls your status page's appearance, behavior, and integrations.

Basic Configuration

Here's a minimal configuration to get started:

config.json
{
"domain": "https://status.example.com",
"siteSettings": {
"siteName": "My Status Page",
"siteDescription": "Service status for My Company"
},
"github": {
"owner": "your-username",
"repo": "your-repo-name"
}
}

Full Configuration Reference

Site Settings

{
"domain": "https://status.example.com",
"majorOutageThreshold": 2,
"siteSettings": {
"siteName": "My Status Page",
"siteDescription": "Service status for My Company",
"metaColor": "#3b5998"
}
}
PropertyTypeDefaultDescription
domainstringRequiredFull URL of your status page
majorOutageThresholdnumber2Consecutive failures before marking as "Major Outage"
siteSettings.siteNamestringRequiredDisplay name shown in header
siteSettings.siteDescriptionstring""Description shown below the title
siteSettings.metaColorstring"#3b5998"Theme color for browser/embed meta tags

GitHub Integration

{
"github": {
"owner": "your-username",
"repo": "your-repo-name",
"issuesLabel": "incident",
"manualMonitorLabel": "manual",
"maintenanceLabel": "maintenance",
"announcementLabel": "announce"
}
}
PropertyTypeDefaultDescription
ownerstringRequiredGitHub username or organization
repostringRequiredRepository name
issuesLabelstring"incident"Label for incident issues
manualMonitorLabelstring"manual"Label for manual status updates
maintenanceLabelstring"maintenance"Label for maintenance windows
announcementLabelstring"announce"Label for announcements
tip

Create these labels in your GitHub repository before using them. Go to Issues > Labels > New label.


Design Options

{
"design": {
"useLogo": "/img/logo.png",
"logoDimensions": {
"width": 200,
"height": 50
},
"showSiteName": true,
"showDescription": true,
"showOverallStatus": true,
"footer": {
"enabled": true,
"credits": true
},
"statusDot": {
"enabled": {
"group": true,
"monitor": true
},
"animation": {
"group": false,
"monitor": "ping"
}
},
"recentIncidents": {
"active": true,
"number": 5
},
"incident": {
"showCommentAuthor": true,
"showGithubLink": true
},
"announcement": {
"showIcon": true,
"showTitle": true,
"showCommentAuthor": false,
"showGithubLink": true
}
}
}

Logo & Header

PropertyTypeDefaultDescription
useLogostringnullPath to logo image (relative to static/)
logoDimensions.widthnumber200Logo width in pixels
logoDimensions.heightnumber50Logo height in pixels
showSiteNamebooleantrueShow site name in header
showDescriptionbooleantrueShow description below header
showOverallStatusbooleantrueShow overall status banner
PropertyTypeDefaultDescription
footer.enabledbooleantrueShow footer
footer.creditsbooleantrueShow "Powered by Shadow Development" credit

Status Indicators

PropertyTypeDefaultDescription
statusDot.enabled.groupbooleantrueShow status dot on groups
statusDot.enabled.monitorbooleantrueShow status dot on monitors
statusDot.animation.groupstring/booleanfalseAnimation for group dots ("ping", "pulse", or false)
statusDot.animation.monitorstring/boolean"ping"Animation for monitor dots

Incidents & Announcements

PropertyTypeDefaultDescription
recentIncidents.activebooleantrueShow recent resolved incidents
recentIncidents.numbernumber5Number of recent incidents to show
incident.showCommentAuthorbooleantrueShow author on incident updates
incident.showGithubLinkbooleantrueLink to GitHub issue
announcement.showIconbooleantrueShow icon on announcements
announcement.showTitlebooleantrueShow title on announcements
announcement.showCommentAuthorbooleanfalseShow author on announcement updates
announcement.showGithubLinkbooleantrueLink to GitHub issue on announcements

Page Width (design.pageWidth)

Controls the maximum width of the page content area.

{
"design": {
"pageWidth": "auto"
}
}
ValueCSS ClassDescription
"auto"(calculated)Default — width determined by layout/grid columns
"3xl"max-w-3xl~768px
"4xl"max-w-4xl~896px
"5xl"max-w-5xl~1024px
"6xl"max-w-6xl~1152px
"7xl"max-w-7xl~1280px

When set to "auto" (or omitted), the width adapts based on the monitor layout and gridColumns setting. Set an explicit value to override this behavior.


Monitor Display Settings (design.monitors)

Controls the monitor list layout and filter bar.

{
"design": {
"monitors": {
"layout": "default",
"gridColumns": 2,
"showFilterBar": true,
"showSearch": true,
"showStatusFilter": true,
"showGroupFilter": true,
"showCollapseButtons": true,
"showMonitorType": true,
"showSSL": true
}
}
}
SettingTypeDefaultDescription
layoutstring"default"Monitor layout: "default" (stacked cards), "table" (compact rows), or "grid" (multi-column cards)
gridColumnsnumber2Columns in grid layout. Page width auto-adjusts: 2→max-w-3xl, 3→max-w-5xl, 4→max-w-6xl, 5+→max-w-7xl
showFilterBarbooleantrueShow or hide the entire search/filter bar
showSearchbooleantrueShow the text search input
showStatusFilterbooleantrueShow the status filter dropdown
showGroupFilterbooleantrueShow the group filter dropdown
showCollapseButtonsbooleantrueShow expand/collapse all buttons (default layout only)
showMonitorTypebooleantrueShow the monitor type badge (e.g. http, tcp) on each monitor card
showSSLbooleantrueShow SSL days-remaining info on ssl monitors

Layout examples:

Table layout (compact rows):

"monitors": { "layout": "table" }

3-column grid:

"monitors": { "layout": "grid", "gridColumns": 3 }

Minimal — no filter bar:

"monitors": { "layout": "default", "showFilterBar": false }
note

In table and grid modes, groups are shown as divider labels rather than collapsible containers.


Monitor Search & Filter

The search and filter bar appears automatically above the monitor list. Each control can be individually disabled via design.monitors settings above.

ControlDescription
Search boxFilters monitors by name (case-insensitive substring match)
Status dropdownShows only monitors with a specific status (e.g. Degraded, Major Outage)
Group dropdownShows only monitors from a selected group, or "Ungrouped" for top-level monitors
Clear buttonResets all active filters (appears only when a filter is active)
Expand / Collapse allOpens or closes all groups simultaneously (default layout only)

When filters produce no results, a "No monitors match your filters." message is shown in place of the list.


History Graph Settings (design.historyGraph)

Controls the 90-day history chart that appears below each monitor.

{
"design": {
"historyGraph": {
"defaultTab": "status",
"showStatusTab": true,
"showResponseTimeTab": true
}
}
}
SettingTypeDefaultDescription
defaultTabstring"status"Which tab is shown by default: "status" or "response"
showStatusTabbooleantrueShow the 90-day status bar chart tab
showResponseTimeTabbooleantrueShow the response time line graph tab

Examples:

Show response time graph by default:

"historyGraph": { "defaultTab": "response", "showStatusTab": true, "showResponseTimeTab": true }

Status bars only (no response time tab):

"historyGraph": { "defaultTab": "status", "showStatusTab": true, "showResponseTimeTab": false }

Response time only (no status bars):

"historyGraph": { "defaultTab": "response", "showStatusTab": false, "showResponseTimeTab": true }
note

When only one tab is enabled, the tab buttons are hidden and that view is shown directly with no toggle.


Page Section Order (design.pageOrder)

Controls the order in which page sections are rendered. Omit a section ID to hide it entirely.

{
"design": {
"pageOrder": [
"overall-status",
"announcements",
"active-incidents",
"monitors",
"upcoming-maintenance",
"recent-incidents"
]
}
}
Section IDDescription
overall-statusThe overall system status banner
announcementsService announcements from GitHub Issues
active-incidentsCurrently active incidents
monitorsThe full monitor list with filter bar
upcoming-maintenanceScheduled future maintenance windows
recent-incidentsRecently resolved incidents

Unknown IDs are silently ignored. To hide a section, remove it from the array.


Overall Status Text

Customize the messages shown in the overall status banner:

{
"overallStatusText": {
"operational": "All systems are running smoothly.",
"degraded": "Some systems are experiencing issues.",
"major": "We're experiencing a major outage.",
"maintenance": "Scheduled maintenance is in progress."
}
}

Status Levels

Define the available status levels for incidents and monitors:

{
"statusLevels": {
"operational": {
"label": "Operational",
"color": "success",
"priority": 0
},
"degraded": {
"label": "Degraded Performance",
"color": "warning",
"priority": 1
},
"partial": {
"label": "Partial Outage",
"color": "warning",
"priority": 2
},
"major": {
"label": "Major Outage",
"color": "error",
"priority": 3
},
"maintenance": {
"label": "Under Maintenance",
"color": "info",
"priority": 4
}
}
}
PropertyTypeDescription
labelstringDisplay text for this status
colorstringColor theme: "success", "warning", "error", or "info"
prioritynumberHigher number = worse status. Used to determine overall/group status
Priority Logic

When calculating overall or group status, the system uses the highest priority among all monitors. For example, if one monitor is major (priority 3) and others are operational (priority 0), the overall status shows "Major Outage".

Exception: maintenance (priority 4) only applies during active maintenance windows, not as a "worst" status.


Notifications

Configure Discord and webhook notifications:

{
"notifications": {
"defaultEnabled": true,
"numberOfDown": 1,
"discord": {
"enabled": true,
"defaultPingRole": "",
"pingForReturn": false
},
"webhook": false
}
}
PropertyTypeDefaultDescription
defaultEnabledbooleantrueEnable notifications by default for monitors
numberOfDownnumber1Consecutive failures before sending notification
discord.enabledbooleanfalseEnable Discord notifications
discord.defaultPingRolestring""Role to ping: "" (none), "everyone", "here", or role ID
discord.pingForReturnbooleanfalsePing when service recovers
webhookbooleanfalseEnable generic webhook notifications

See the Notifications guide for detailed setup instructions.


Complete Example

Click to expand full config.json example
config.json
{
"domain": "https://status.example.com",
"majorOutageThreshold": 2,
"siteSettings": {
"siteName": "Example Status",
"siteDescription": "Real-time status for Example services",
"metaColor": "#3b5998"
},
"github": {
"owner": "example-org",
"repo": "status-page",
"issuesLabel": "incident",
"manualMonitorLabel": "manual",
"maintenanceLabel": "maintenance",
"announcementLabel": "announce"
},
"design": {
"useLogo": "/img/logo.png",
"logoDimensions": {
"width": 200,
"height": 50
},
"showSiteName": true,
"showDescription": false,
"showOverallStatus": true,
"footer": {
"enabled": true,
"credits": true
},
"statusDot": {
"enabled": {
"group": true,
"monitor": true
},
"animation": {
"group": false,
"monitor": "ping"
}
},
"recentIncidents": {
"active": true,
"number": 5
},
"incident": {
"showCommentAuthor": false,
"showGithubLink": true
},
"announcement": {
"showIcon": true,
"showTitle": false,
"showCommentAuthor": false,
"showGithubLink": true
},
"pageWidth": "auto",
"historyGraph": {
"defaultTab": "status",
"showStatusTab": true,
"showResponseTimeTab": true
},
"monitors": {
"layout": "default",
"gridColumns": 2,
"showFilterBar": true,
"showSearch": true,
"showStatusFilter": true,
"showGroupFilter": true,
"showCollapseButtons": true,
"showMonitorType": true,
"showSSL": true
},
"pageOrder": [
"overall-status",
"announcements",
"active-incidents",
"monitors",
"upcoming-maintenance",
"recent-incidents"
]
},
"overallStatusText": {
"operational": "All systems are running smoothly.",
"degraded": "Some systems are experiencing issues.",
"major": "We're experiencing a major outage.",
"maintenance": "Scheduled maintenance is in progress."
},
"statusLevels": {
"operational": {
"label": "Operational",
"color": "success",
"priority": 0
},
"degraded": {
"label": "Degraded Performance",
"color": "warning",
"priority": 1
},
"partial": {
"label": "Partial Outage",
"color": "warning",
"priority": 2
},
"major": {
"label": "Major Outage",
"color": "error",
"priority": 3
},
"maintenance": {
"label": "Under Maintenance",
"color": "info",
"priority": 4
}
},
"notifications": {
"defaultEnabled": true,
"numberOfDown": 1,
"discord": {
"enabled": true,
"defaultPingRole": "",
"pingForReturn": false
},
"webhook": false
}
}