Vail/Configuration

Configuration

Every option in settings.json: site details, theme, announcement, footer and incidents.

Vail is set up in settings.json in its folder. The file is read on the server each time the page loads, so changes show on the next refresh. Visitors never see the file.

settings.json
{
  "site": {
    "title": "Zero Development",
    "description": "Live status for our services.",
    "logo": "",
    "icon": "/icon.png",
    "favicon": "/favicon.ico",
    "links": [{ "label": "Home", "url": "https://zerodev.ca" }]
  },
  "theme": { "primaryColor": "blue", "defaultColorScheme": "dark", "radius": "sm" },
  "announcement": { "enabled": false, "type": "info", "title": "Scheduled Maintenance", "message": "Upgrades on Sunday at 02:00 UTC." },
  "footer": { "text": "%sitename% • Made with Vail Status" },
  "discord": { "enabled": false, "webhookUrl": "", "apiKey": "", "username": "Vail Status", "avatarUrl": "" },
  "groups": [],
  "incidents": []
}

groups holds your services. See Monitors. discord is covered in Discord Alerts.

site

OptionWhat it does
titleThe page name, shown in the header and the browser tab.
descriptionA line under the title.
iconA square icon next to the title, such as /icon.png. Without one, a pulse icon is shown.
logoReserved. Not shown yet.
faviconThe browser tab icon.
linksHeader buttons, each with a label and url.

Images can be a full URL or a file in the public/ folder, such as /icon.png.

theme

OptionWhat it does
primaryColorThe accent colour. Any Mantine colour, such as blue, cyan, teal, violet, orange or red.
defaultColorSchemedark, light or auto to follow the visitor's device. Visitors can switch with the button in the header.
radiusCorner roundness: xs, sm, md, lg or xl.

announcement

A banner above the status summary, for maintenance or news.

OptionWhat it does
enabledShow the banner.
typeinfo (blue), warning (yellow) or error (red).
titleThe heading.
messageThe text.
PlaceholderBecomes
%sitename%site.title.
%year%The current year.
"footer": { "text": "© %year% %sitename%" }

incidents

Incidents show under Incident History. Updates are shown in the order you list them, so put the newest first.

"incidents": [
  {
    "id": "api-latency",
    "title": "API Latency",
    "status": "resolved",
    "severity": "minor",
    "createdAt": "2026-09-12T14:00:00.000Z",
    "updates": [
      { "timestamp": "2026-09-12T14:30:00.000Z", "status": "resolved", "message": "Response times are back to normal." },
      { "timestamp": "2026-09-12T14:00:00.000Z", "status": "investigating", "message": "We are looking into slow API responses." }
    ]
  }
]
OptionWhat it does
idAny unique text.
titleThe incident name.
statusinvestigating, identified, monitoring or resolved.
severityminor, major or critical.
createdAtWhen it started, as an ISO date.
updatesThe timeline, each with a timestamp, status and message.

Dates are shown with their time zone, as rendered by your server.