If you’re running self-hosted services, a status page is essential for communicating uptime and incidents to your users — or just monitoring your own infrastructure at a glance. Commercial status page services like StatusPage.io or Better Uptime charge premium prices, but several excellent self-hosted alternatives give you full control without recurring costs.
In this comprehensive guide, we’ll compare the three most popular self-hosted status page solutions in 2026: Cachet, Statusfy, and Gatus. Each takes a different approach to status page management, from full-featured incident tracking to minimalist static pages. We’ll cover features, setup, resource requirements, and help you choose the right solution for your needs.
What is a Status Page?
A status page is a public or private web page that displays the current operational status of your services. It typically shows:
- Current status of each monitored service (operational, degraded, down)
- Historical uptime percentages
- Incident history with timelines and updates
- Scheduled maintenance windows
- Response time metrics (optional)
- Subscribe options for email/RSS notifications
Status pages serve two distinct use cases:
Public-facing: For SaaS products, APIs, or any service with external users. Transparent communication during outages builds trust and reduces support tickets.
Internal/homelab: For monitoring your own infrastructure. A well-designed status page gives you immediate visibility into what’s working and what’s not, especially useful when accessed from mobile devices during troubleshooting.
Quick Comparison Table
| Feature | Cachet | Statusfy | Gatus |
|---|---|---|---|
| Type | Full web app | Static site generator | Web app |
| Database | MySQL/PostgreSQL/SQLite | None (files) | SQLite/PostgreSQL |
| Incident Management | Full (create, update, resolve) | Manual (edit markdown) | Automatic (from monitoring) |
| Built-in Monitoring | No (displays data from external sources) | No | Yes (HTTP/TCP/DNS checks) |
| UI Customization | High (themes, CSS) | High (Vue.js components) | Medium (config-based) |
| Resource Usage | Medium-High | Low (just HTTP server) | Low-Medium |
| Maintenance Overhead | High (database, updates) | Low (static files) | Low (single binary) |
| Best For | Public status pages with full incident workflow | Developer-friendly static deployments | Integrated monitoring + status display |
| Active Development | Intermittent | Stalled (2021) | Very active |
Cachet: The Full-Featured Option
Cachet is a Laravel-based status page system that’s been around since 2015. It provides a complete incident management workflow and is the closest open-source equivalent to StatusPage.io.
Key Features
- Incident Timeline: Create incidents with multiple status levels (investigating, identified, watching, fixed)
- Components: Organize services into hierarchical component groups
- Metrics: Display custom graphs (response times, error rates, etc.)
- Subscriber Notifications: Email alerts for incidents and scheduled maintenance
- API: Full REST API for automation and integrations
- Multi-language: Translated into 20+ languages
- Customizable Themes: Multiple built-in themes or custom CSS
Architecture
Cachet is a traditional PHP web application:
- Backend: Laravel 8 framework
- Database: MySQL, PostgreSQL, or SQLite
- Frontend: Vue.js components
- Web Server: Requires nginx or Apache with PHP-FPM
Setup with Docker
The easiest deployment method is using Docker Compose:
| |
Generate an application key:
| |
After starting the containers, access http://localhost:8000 to complete the web-based setup wizard.
Integration with Monitoring Tools
Cachet doesn’t include built-in monitoring — it’s a status page display layer. You need to push data to it from external monitoring tools:
With Uptime Kuma:
- Install the Uptime Kuma Cachet plugin
- Configure Cachet API URL and token in Uptime Kuma
- Uptime Kuma will automatically update component status and create incidents
With Prometheus/Grafana: Use cachet-monitor to bridge Prometheus alerts to Cachet incidents.
Manual API Updates:
| |
Pros and Cons
Pros:
- Most feature-complete open-source status page
- Professional appearance suitable for business use
- Excellent incident management workflow
- Strong API for automation
- Good documentation and community
Cons:
- Higher resource requirements (PHP + database)
- More complex to deploy and maintain
- Development has been sporadic (long gaps between updates)
- Some reported bugs in newer PHP versions
- Overkill for simple homelab use
Best For: Public-facing status pages for businesses, SaaS products, or anyone needing full incident management features.
Statusfy: The Static Site Approach
Statusfy takes a unique approach: it’s a static site generator specifically for status pages. You define your system components and incidents in markdown files, then build the site into static HTML/CSS/JS that can be served from any web server or CDN.
Key Features
- Static Generation: No database or backend required in production
- JAMstack Architecture: Excellent performance and security
- Multi-language Support: Built-in internationalization
- Markdown-Based: All content in version-controllable markdown files
- Automated Builds: Integrate with CI/CD pipelines
- PWA Support: Can be installed as a progressive web app
- Modern UI: Clean, responsive design
Architecture
Statusfy is built with:
- Framework: Vue.js + Nuxt.js
- Build Tool: Node.js-based generator
- Runtime: Static files served by any HTTP server (nginx, Apache, Netlify, Vercel, etc.)
- Storage: Markdown files in Git repository
Setup
Install Statusfy globally:
| |
Create a new status page project:
| |
This generates a project structure:
my-statuspage/
├── .statusfy/ # Build output
├── content/ # Markdown content
│ └── incidents/ # Incident files
├── locales/ # Translations
├── public/ # Static assets
└── config.yml # Configuration
Edit config.yml to define your components:
| |
Create an incident in content/incidents/2026-04-01-database-maintenance.md:
| |
Build the static site:
| |
This creates production-ready static files in .statusfy/dist/. Deploy them to any web server:
| |
Automation with CI/CD
The static nature makes Statusfy perfect for Git-based workflows:
- Commit incident markdown files to Git
- Push to GitHub/GitLab
- CI/CD pipeline rebuilds and deploys the site automatically
Example GitHub Actions workflow:
| |
Pros and Cons
Pros:
- Extremely lightweight in production (static files)
- No database or backend security concerns
- Fast page loads and excellent SEO
- Version control for incidents (Git history)
- Can be hosted on CDN for global performance
- Minimal maintenance overhead
Cons:
- Requires build step for every update (not real-time)
- No built-in monitoring — purely display layer
- Development stalled since 2021 (last release: v0.6.0)
- Manual incident creation (no automatic detection)
- Dependency updates may require migration work
Best For: Developers comfortable with Git workflows, projects prioritizing performance and security, or anyone who wants infrastructure-as-code for their status page.
Gatus: The Monitoring-First Solution
Gatus is a health dashboard and status page combined into one tool. Unlike Cachet and Statusfy, Gatus includes built-in monitoring — it actively checks your services and automatically updates the status page.
Key Features
- Built-in Monitoring: HTTP, TCP, DNS, ICMP checks with extensive conditions
- Real-Time Updates: WebSocket-powered live status display
- Uptime Badges: Embeddable SVG badges for README files
- Flexible Alerting: Slack, Discord, email, PagerDuty, webhook notifications
- Metrics Storage: SQLite or PostgreSQL for historical data
- Response Time Graphs: Visualize performance trends
- Lightweight: Single Go binary, minimal resource usage
- Dark Mode: Built-in theme switcher
Architecture
Gatus is impressively simple:
- Language: Go (single static binary)
- Database: Optional (SQLite for persistence, PostgreSQL for scale)
- Frontend: Embedded in binary, served by built-in HTTP server
- Configuration: Single YAML file
Setup with Docker
Create config.yaml:
| |
Docker Compose deployment:
| |
Start it:
| |
Access the status page at http://localhost:8080.
Advanced Monitoring Conditions
Gatus supports sophisticated health checks:
Check JSON response body:
| |
TLS certificate expiry:
| |
Custom headers and authentication:
| |
Public vs Private Status Page
Gatus supports a readonly mode for public access:
| |
Or use a reverse proxy (Traefik, nginx) to:
- Serve
/publicly (status page) - Require authentication for
/adminor/config
Pros and Cons
Pros:
- All-in-one solution (monitoring + status page)
- Real-time updates without external services
- Extremely lightweight (single <20MB binary)
- No complex setup or dependencies
- Active development (regular releases)
- Excellent for homelab use
- Beautiful, modern UI
Cons:
- Less suitable for public business status pages (simpler design)
- No rich incident management (just status + timeline)
- Configuration-only (no web UI for editing)
- Fewer notification channels than dedicated monitoring tools
- Limited historical data visualization compared to Grafana
Best For: Homelabs, internal dashboards, developers wanting simple monitoring + status in one tool, anyone prioritizing ease of setup and low maintenance.
Choosing the Right Solution
Here’s a decision framework based on your needs:
Choose Cachet if you:
- Need a public-facing status page for a business or SaaS product
- Want comprehensive incident management with updates and timelines
- Already have monitoring tools (Uptime Kuma, Prometheus) and need a status display
- Have users who expect professional incident communication
- Don’t mind managing a PHP application and database
Choose Statusfy if you:
- Prefer Git-based workflows and infrastructure-as-code
- Want maximum performance and security (static files)
- Have a CI/CD pipeline you can integrate with
- Don’t need real-time updates (scheduled builds are fine)
- Value simplicity in production (just static files + web server)
Choose Gatus if you:
- Want monitoring and status page in a single tool
- Prioritize ease of setup and minimal maintenance
- Are building a homelab or internal infrastructure dashboard
- Need real-time status updates
- Don’t require elaborate incident management workflows
- Want something lightweight and actively maintained
Hybrid Approaches
You’re not limited to one tool. Many self-hosters combine solutions:
Gatus + Cachet:
- Use Gatus for monitoring and alerting
- Push status updates to Cachet’s API for public-facing display
- Best of both: Gatus’s simplicity + Cachet’s professional incident management
Statusfy + Uptime Kuma:
- Uptime Kuma for real-time monitoring and alerts
- Statusfy for a polished public status page
- Manual workflow: When incidents occur, create markdown files and rebuild Statusfy
Gatus + Grafana:
- Gatus for status page and basic health checks
- Grafana for deep metrics and visualization
- Complementary: Status at a glance + detailed analytics when needed
Hardware Requirements
All three solutions are relatively lightweight, but here’s what to expect:
Cachet:
- CPU: 1-2 cores (PHP processing)
- RAM: 512MB-1GB (Laravel + database)
- Storage: 2GB+ (application + database growth)
- Best on: Mid-range mini PCs or VPS with 2GB+ RAM
Statusfy:
- Build time CPU: 2-4 cores (faster builds)
- Build time RAM: 512MB-1GB (Node.js compilation)
- Production CPU: Negligible (static files)
- Production RAM: Negligible (static files)
- Storage: 50-100MB (static assets)
- Best on: Any web server, even a Raspberry Pi 4
Gatus:
- CPU: <1 core (efficient Go runtime)
- RAM: 50-200MB (depends on endpoint count)
- Storage: 100MB-1GB (binary + SQLite data)
- Best on: Raspberry Pi, low-end VPS, or any existing server with spare resources
My Recommendation
After running status pages for both public projects and homelab infrastructure, here’s what I recommend:
For homelabs: Start with Gatus. You get monitoring and status display in one tool, it’s trivially easy to set up, and maintenance is minimal. The configuration-as-code approach fits well with typical homelab workflows.
For public SaaS/business: Use Cachet if you need full incident management features and don’t mind the operational overhead. Alternatively, if you have developers who are comfortable with Git workflows, Statusfy offers a modern, performant alternative with zero runtime dependencies.
For developers: Statusfy is elegant if you embrace the static site philosophy. Pair it with GitHub Actions for automatic deployments, and you’ve got a status page that’s essentially infrastructure-as-code.
Alternative: Uptime Kuma’s Status Page
Worth mentioning: Uptime Kuma (covered in detail in a previous guide) also includes a basic status page feature. It’s not as polished as dedicated solutions, but if you’re already running Uptime Kuma for monitoring, it might be sufficient for internal use.
Uptime Kuma Status Page:
- Public-facing URL with shareable token
- Shows current status and uptime percentages
- No incident management
- Automatically updated by monitoring checks
- Good for simple use cases, but lacks customization
For most users, if Uptime Kuma’s built-in status page meets your needs, there’s no reason to add another tool. Upgrade to a dedicated solution when you need more features or better design.
Conclusion
Self-hosted status pages have matured significantly. Whether you choose the full-featured approach of Cachet, the modern static architecture of Statusfy, or the integrated monitoring of Gatus, you can build a professional status page without monthly SaaS fees.
For most self-hosters in 2026, Gatus offers the best balance of features, simplicity, and maintainability. It’s what I run for my own infrastructure, and I recommend starting there unless you have specific needs that require Cachet’s incident management or Statusfy’s static architecture.
The key is to actually use your status page. Configure monitoring for your critical services, set up alerting, and make checking the status page a habit. A well-maintained status page is invaluable when troubleshooting issues or planning maintenance windows.
Have questions about status page setup? Run into issues with any of these tools? Drop a comment below — I’m happy to help troubleshoot.