Logo

Status Page

Changelog

Track the latest features, improvements, and updates.

Fixed
  • Fixed subscription modal JavaScript error by moving modal HTML and script to end of body tag, ensuring DOM elements exist before script execution.
Improvement
  • Replaced info color scheme (cyan) with primary color scheme (purple) across 57 template files for better brand consistency in alerts, badges, and background highlights on dashboard, public pages, and admin panel.
  • Added cache-busting timestamps (v=20260107193100) to all CSS references to prevent browser caching issues.
  • Removed demo.css references from all templates (previously unused demo asset).
  • Updated future 24-hour tick colors on status pages to be much lighter in light theme (#e8e8e8 with reduced opacity) while maintaining current appearance in dark theme for better visual hierarchy.
Updated
  • Updated Frest Admin Template CSS to latest version (May 2025) from source SCSS files.
  • Established proper SCSS compilation workflow using `make scss-build` for future CSS updates.

Fixed
  • Fixed HTTP 500 internal server error when subscribing to status updates with an undeliverable email address.
Improvement
  • Added manual override prompt for subscriptions blocked by email validation, allowing users to confirm and force subscription if they believe the address is valid.

New
  • Added Swetrix as a web analytics provider for status pages (header-only, requires project_id).
Security
  • Self-hosted 19 third-party JS/CSS libraries (twemoji, sweetalert2, chart.js stack, leaflet, jdenticon, sortablejs, apexcharts, marked, tagify, confetti, popper, tippy, bootstrap) under static/js/css/vendor to remove CDN runtime dependencies.
  • Added vendor copy automation (bin/scripts/copy-vendor-libs.js) wired into npm postinstall/make assets-full; templates now load local paths across admin/user/public/status pages.
  • Kept external-only analytics (Plausible, GoatCounter, etc., Sapat) by design.
Updated
  • Web analytics settings UI, placement rules, and support docs now include Swetrix.
  • Clarified web analytics copy/docs to note analytics work on custom domains and hosted subdomains (statuspage.me, sp.fyi, hostedstatus.page).

Fixed
  • Disable footer placement for Plausible Analytics and always inject Plausible scripts in the page header.
  • Disable footer placement for Umami Analytics and always inject Umami scripts in the page header.
  • Fix web analytics enablement not persisting after saving analytics configuration, which prevented tracking snippet injection on public status pages.
  • Fix status pages list activity timestamps
    show seconds for <60s and auto-refresh on each status page's monitor interval.
  • Fix scheduled SSL monitor emails not sending reliably; now sends 30/15/5 day warnings and a renewal confirmation email.
Improvement
  • Admin tools
    added a "Realign Next Check (UTC)" action to force-align enabled tool monitors to the next UTC boundary.
  • Add RSS/Atom feed autodiscovery tags (`<link rel="alternate">`) to public status page HTML.
  • Redesign the user dashboard “Your Status Pages” table into an operational view (health, active incidents, affected monitors, latest activity).
  • Show monitor type/target/interval and last check time in status page settings → Monitors.
  • Live-update the affected row in “Your Status Pages” when new monitor check data arrives.
  • Allow Plausible `script_src` to be provided as either a full URL or just the `pa-*.js` filename (auto-expanded to `https
    //plausible.io/js/...`).
  • Align Simple Analytics install snippet with the official embed (remove `defer`).
  • Lock analytics script placement for providers with official placement requirements/recommendations (e.g., Cabin footer-only; Fathom/Pirsch/Simple header-only).
  • Auto-disable SSL tool monitors after 15 consecutive invalid/expired certificate checks and email the user with re-enable instructions.
New
  • Add public status page feeds at `/rss.xml` (RSS 2.0) and `/atom.xml` (Atom 1.0) to follow incident and maintenance updates.
  • Surface RSS/Atom feed links in the status page “Subscribe to Updates” modal.
Updated
  • Update Plausible Analytics service configuration to accept a site-specific script `src` URL/path (e.g. `https
    //plausible.io/js/pa-XXXXX.js`) rather than a domain-only setup.
  • Update tool monitors scheduling
    DNSBL + SSL run daily aligned to 00:00 UTC; Email Auth runs every 6 hours aligned to 00/06/12/18 UTC; manual checks no longer shift the next scheduled run.

Fixed
  • Password field focus on protected pages now retries on load/pageshow to avoid browser skip cases.
  • Uptime tooltips on day ticks now show four-decimal precision to avoid rounding away small downtime.
  • User Tools monitors (SSL/DNSBL/Email Auth) now run reliably via the scheduler even when only the user component is deployed.
Improvement
  • Password-protected status pages now autofocus and select the password field on load for quicker access.
  • Public status pages can optionally show monitor type badges (API/DNS/Site) before monitor names.
  • Public status pages now render monitor type badges with a visible badge background and center the availability period controls.
  • Status page settings now include a "View your status page" button next to Save, with an unsaved-changes prompt before viewing.
New
  • Added a per-monitor toggle to exclude it from overall status and global uptime calculations.
Updated
  • Status page hourly history now renders as a compact segmented progress bar (with per-hour hover details) instead of large numbered pills.
  • Future hours in the Today (UTC) bar now render as solid gray to clearly signal upcoming time slots.
  • Status page day ticks now render downtime as hard-stop vertical fills with bad color anchored at the bottom instead of diagonal gradients.
  • Day tick popovers now include a visual notice when a day was unhealthy or had downtime, even if no incidents are listed.

Fixed
  • Fallback to the default status page template when the optional Daisy/test templates are missing, preventing blank renders for `/test` routes and gated views.
  • Private and blocked status pages now set X-Robots-Tag and meta noindex to stay out of search results.
New
  • All status subdomains and custom domains now serve /robots.txt to satisfy crawlers.

Improvement
  • Made upgrade page for Incident Templates dynamic
    the required plan name is now fetched from the plan limits cache instead of being hardcoded
  • Refactored incident_templates handlers to use the new features package for upgrade data
  • Upgrade pages now support dynamic feature names, descriptions, images, and custom benefits
New
  • Created `internal/features` package with reusable feature gates system for plan-gated features
  • Added `templates/user/partials/upgrade_feature.gohtml` reusable partial template for upgrade CTAs
  • Added `dict`, `strList`, and `or` template functions for better template composition

Fixed
  • Added the admin tools CSRF token to stop 403 responses when running the Auto-Heal action for free tools.
  • Corrected the Auto-Heal DKIM/SPF query to target the existing dkim_spf_monitors table, preventing 500 errors.
  • Fixed `/user/analytics/
    id` deep-links not auto-loading charts/data by force-loading the default 90-day view on page load.
  • Fixed the dashboard “Service health” overall badge showing UNKNOWN by returning and using the same live overall status semantics as the public status page.
Improvement
  • Converted the landing page "Featured On" SaaS directory widgets into a single-row scrolling carousel to match the existing logo treatment and avoid grid wrapping and ensured both homepage logo rows (customers and SaaS directories) auto-scroll by initializing every carousel track, not just the first and reduced the logo height to 50px for a tighter strip layout.
  • Landing page signup analytics now attributes signups by activation intervals (based on recorded template activation times) instead of relying on the `users.landing_template` snapshot.
  • Dashboard quick-start and zero-status-page callouts now use Frest card/icon patterns, and the Activity action control adopts the Frest icon-only style for consistency.
  • Tools dashboard now includes a Frest-style quick-start bar and uses label badges for all tool tiles to match the updated dashboard visual language.
  • Replaced remaining Boxicons on user dashboard-related templates/partials with Bootstrap Icons to avoid missing assets and keep styling consistent.
  • Monitor add/edit forms now use Frest-style headers, alert treatments, and padded containers for a consistent dashboard UX.
  • Applied comprehensive Frest UI/UX beautification across all 70+ user dashboard templates and partials
  • All pages now use consistent `container-xxl flex-grow-1 container-p-y` wrapper.
  • All cards now have `shadow-sm` for subtle depth.
  • Card headers feature icon badges with `bg-label-*` rounded-circle styling.
  • All solid badge backgrounds (`bg-success`, `bg-danger`, etc.) replaced with label variants (`bg-label-success`, `bg-label-danger`).
  • Action buttons converted to icon-only pill style
    `btn btn-sm btn-icon btn-text-secondary rounded-pill`.
  • Alerts now use subtle backgrounds
    `bg-info-subtle`, `bg-warning-subtle`, `bg-danger-subtle`, `bg-success-subtle` with matching borders.
  • All FontAwesome (`fa-*`), Boxicons (`bx bx-*`), and Tabler (`ti ti-*`) icons replaced with Bootstrap Icons (`bi bi-*`).

Improvement
  • Inject privacy-friendly analytics snippets on public status pages with placement control, exclusion rules, and a custom-domain-only disclosure.
  • Add self-exclusion option for status page owners
    when enabled in Account Settings > Notifications > Privacy, logged-in owners won't be tracked by their own status page analytics, keeping visitor data clean and accurate.
  • Add UI disable/enable behavior for analytics configuration section
    when the "Enable web analytics" toggle is off, all configuration fields are visually dimmed (50% opacity) and disabled from interaction.
  • Add owner self-exclusion backend logic in public status page handler
    checks if logged-in viewer is the page owner with self-exclusion enabled before injecting analytics scripts.
  • Add privacy settings toggle in user account notifications page for self-exclusion preference management.
  • Add database migration (0229) to support owner self-exclusion
    new `exclude_self_from_analytics` boolean column on users table.
  • Create comprehensive WEB_ANALYTICS_IMPLEMENTATION.md documentation covering database schema, models, API endpoints, privacy features, user guide, and security considerations.
  • Create user-facing documentation article "Configuring Web Analytics" with step-by-step setup guide, service comparison, troubleshooting, and compliance information.

Fixed
  • Monitor creation for DNSBL/SSL/DKIM-SPF now sets `next_check_at` into the future immediately (6 hours ahead) to prevent "Next Check" showing past times.
  • Analytics print styles improved so charts render correctly in print/PDF.
Improvement
  • Brand palette and Custom CSS injection applied to live status pages and archives; UI polish for palette controls (auto-save, disable when off, remove flow).[Fixed]
  • Fixed critical bug where `InsertAlert()` was never called in the scheduler's `alertOnStatusChange()` function, causing the alerts table to remain empty and the `/user/monitors/{id}/alerts` page to always show "No alerts for this monitor"
  • Alerts are now recorded for ALL monitors on status change, not just those attached to components (auto-incidents still require component attachment)
  • **Fixed cascade failure issue**
    Local scheduler now skips checks for self-hosted infrastructure (statuspage.me, hostedstatus.page) to prevent false "down" events when the local status-pages service crashes. External agents are used exclusively for monitoring our own infrastructure.
  • Fixed critical scheduler goroutine bug causing tool monitors (SSL, DNSBL, DKIM/SPF/DMARC) to stop executing after 18+ days locally and 1+ month in production. The scheduler goroutine was exiting immediately after starting all schedulers because it had no blocking mechanism, causing deferred cleanup to run and kill all child goroutines. Added `<-ctx.Done()` to keep the goroutine alive until context cancellation.
  • Fixed analytics dashboard failing on production with "Failed to load analytics data" error. The `/api/analytics/status-pages/
    id` route was registered on the root router without session middleware, so `GetUserFromContext()` returned nil. Added route to `userGroup` for authenticated users while keeping the root route for token-based stakeholder access.
  • Fixed analytics showing incorrect uptime percentages for recently created status pages. The system was counting days before monitors existed as 0% uptime (e.g., 90-day period for a 30-day-old monitor showed ~38% instead of ~100%). Now clamps the analytics start date to the earliest monitor creation date for the status page.
  • Reduced Caddy load balancer failover timing from 15s (5s interval + 10s duration) to 7s (2s interval + 5s duration) for faster automatic failover when status-pages service is unavailable
  • The embed API, public API, and homepage routes now failover more quickly to the user service when status-pages is down
  • Added "Next Check" column to DNSBL and Email Auth monitoring tables to show when the next automated check will occur
New
  • Admin Tools page with Auto-Heal actions to normalize `next_check_at` across DNSBL, SSL, and DKIM/SPF monitors.
  • Added `SELF_HOSTED_DOMAINS` environment variable (comma-separated) to configure which domains are self-hosted. Defaults to `statuspage.me,hostedstatus.page`. Monitors targeting these domains skip local region checks to prevent cascade failures.
  • Added custom favicon upload for status pages - users can now upload their own PNG, JPG, SVG, or ICO favicon (max 100KB) to personalize their status page branding. Requires Custom CSS plan feature.
  • Added automatic brand color palette extraction from logo - users can extract dominant colors from their uploaded logo using k-means clustering, with suggested palettes for primary, secondary, accent, background, and text colors. Dark mode colors are auto-derived.
  • Added color palette editor with live preview in status page settings - includes color picker inputs, hex value editing, and real-time preview of how brand colors will appear on the status page.

Fixed
  • Analytics share token management aligns with database schema and no longer queries non-existent columns.
  • Revoked or expired analytics share links now render a clear "access revoked" message instead of failing unexpectedly.
  • Analytics share token usage counting is performed on token-based analytics API access.
  • Added a legacy `/user/analytics/statuspage` route that redirects to the current analytics JSON endpoint to prevent older/cached clients from failing with 404.
  • Plan upgrades/changes initiated from the billing pricing UI now redirect back to billing with `success=true`, ensuring the purchase thank-you modal shows after successful plan changes.
  • The plan purchase client script now handles successful plan-change responses that return a redirect URL instead of a Dodo checkout payment link.
  • Adaptive Post‑Incident Monitoring eligibility now correctly detects non-free plans even when the stored plan key casing differs (e.g., `GROWTH`).
Improvement
  • Analytics dashboard now requires selecting a status page before loading metrics (no automatic fetch on page load).
  • Analytics downtime-only filter now affects both the chart and component health table.
  • Shared analytics links open a simplified read-only analytics view.
  • API/HTTP monitors can now mark DOWN when response time is greater or less than a threshold via Advanced Conditions.
Updated
  • Added new Analytics documentation articles (dashboard + sharing).

Fixed
  • Dashboard tool history now records entries even when a lookup is served from cache.
  • Tools dashboard pages now reliably show the plan badge across `/user/*` routes.
  • Fixed incident visibility leak where componentless incidents could potentially be exposed to unauthorized users.
  • Fixed automated incident creation failures when incident state lookup returned empty values.
  • Fixed issue where incidents could be created without being linked to any status page (orphaned incidents).
  • Automated incident creation now respects plan limits for `auto_incidents` feature.
  • Status page activity checks now work correctly for both component-based and componentless incidents.
  • Fixed email recipients not displaying on first dialog open when editing email notification channels.
  • Monitors no longer disappear from public status pages when their component assignment is cleared; they now render under a standalone "Monitors" section
  • Fixed monitor status-page resolution in dashboard models so component-less monitors are correctly attributed to their status page (including uptime calculations and downgrade preview).
Improvement
  • **Response Time Percentiles** - `daily_monitor_aggregations` table now computes and stores P95 and P99 response time percentiles during nightly aggregation job via PostgreSQL PERCENTILE_CONT() function
  • **Print-Optimized Reports** - Analytics dashboard includes @media print styles for landscape tabular output, enabling users to generate monitoring reports without PDF export
  • Added visible "Recent checks" history to the dashboard Domain WHOIS and Domain Age tools.
  • Added pagination and an items-per-page picker to "Recent checks" for the Domain WHOIS and Domain Age dashboard tools.
  • Non-subscribed users see up to 3 recent checks; paid users see unlimited history.
  • Recent checks update immediately after running a new lookup.
  • Recent checks show whether results were cached or fresh.
  • Blog post pages now use their cover image for social previews (OpenGraph/Twitter) when available.
  • Standardized more dashboard pages to render via the shared `renderUser` helper so plan/CSRF context is consistently available.
  • Incident creation form now includes direct status page selection for better UX.
  • Improved incident validation to ensure all incidents are properly linked to a status page.
New
  • **Analytics Dashboard** - Comprehensive historical monitoring analytics for status page owners with time-series charts, customizable date ranges (7/30/90/365 days or custom), and print support
  • **Analytics Metrics** - Display key performance indicators
    uptime percentage, average/min/max/p95/p99 response times, MTBF/MTTR, incident count, and downtime duration
  • **Component Health Breakdown** - Per-component analytics showing availability, response time percentiles, incident frequency, and operational status (up/degraded/down)
  • **Dual-Layer Analytics Cache** - Redis hot cache (7d/30d periods, 30min TTL) + file-based cold cache (90d/365d periods, 6h TTL) + in-process LRU (500 entries) for optimal performance
  • **Analytics Share Tokens** - Secure token-based access for stakeholders with optional expiry dates, read-only flags, and usage tracking (foundation for Q2 2026 stakeholder feature)
  • **Team Members Stub** - Database table created for future Teams feature enabling role-based access control (owner/editor/viewer)
  • Made blog and Help Center tags clickable with SEO-friendly tag pages (e.g. `/blog/tag/monitor/`, `/docs/tag/monitor/`).
  • Component selection is now optional when creating incidents – create general status-page-wide incidents.
  • Added "Verify" button for unverified email notification channels to manually resend verification emails.
Updated
  • Added user dashboard sidebar "Analytics" entry linking to `/user/analytics` (auto-redirects to the first active status page).
  • Registered public Analytics page at `/analytics/
    id?token=...` for stakeholder access (read-only) and ensured the template passes the token to API calls.
  • Wired `GET /api/analytics/status-pages/
    id` in the server and initialized an analytics cache (Redis + file) for performance.
  • Implemented full token management UI
    list, create, and revoke share tokens with optional expiry and read-only flags; includes copy-to-clipboard share URL generation and usage tracking.
  • Token management accessible at `/user/analytics/
    id/tokens` with ownership enforcement; routes: `GET /user/analytics/:id/tokens` (list), `POST` (create), `DELETE/:token_id` (revoke).

Fixed
  • Fixed malformed checkbox HTML in Domain WHOIS tool where CSS code was incorrectly mixed into the label element.
  • Added missing template variables (user, isUserLoggedIn) to Domain WHOIS and Domain Age tools for proper user dashboard rendering.
  • Double-reading of HTTP response body during monitor checks now avoided with shared body content
  • SLA report template panic when switching months (float/int comparisons in template logic)
  • Incorrect daily downtime attribution that could exceed 24 hours on a single day for long-running incidents
Improvement
  • Monitor onboarding wizard now displays CDN detection warnings with actionable recommendations
  • Monitor test runs now include metadata storage in JSONB column for CDN detection results
  • Status page settings UI with ownership transfer tab and pending transfer status
  • OSS Hero application form automatically restores draft data after failed submissions
  • Failed OSS applications now trigger admin Telegram alerts with error details and IP address
  • SLA report month navigation updated to use explicit Month + Year dropdowns (stable template rendering)
  • Aligned dark theme styling of WHOIS raw output on the user tools page to match the public tool for better readability.
New
  • Public changelog page with date-based markdown entries at /changelog
  • CDN detection system for monitoring checks (Cloudflare, Akamai, Fastly, CloudFront, Sucuri, Imperva)
  • Status page ownership transfer system with email invitations and single-use tokens
  • Educational warnings when monitors detect CDN usage to prevent false positive HTTP 200 responses
  • Blog post explaining CDN false positives and health check endpoint best practices
  • OSS Hero application form now auto-saves drafts on submission failures
  • Admin Telegram notifications for OSS Hero application submissions (success and failure)
  • Automated SLA breach email notifications with deep links to the relevant monitor SLA report
  • One-off SLA incident metrics backfill utility for recomputing daily aggregates over a date range
Updated
  • Added Tools submenu links for Domain WHOIS and Domain Age in the user dashboard for easier access with the option to flush cache.