Case study
BetterStatusPage: a status page in a single process
Open source, self-hosted, no external database and no subscription. I designed it and delivered it up to version 0.8.0.
- Started
- April 4, 2026
- Releases
- 15, latest 0.8.0 (beta)
- Commits
- 461
- GitHub stars
- 62
- Stack
- Node.js 26, TypeScript, React 19, Fastify 5, SQLite, Docker
- License
- MIT
Problem
A team can choose between a static page nobody updates and a paid SaaS. The goal was a tool that can be set up in minutes on your own server and that watches services, alerts and communication with users during an outage by itself.
Architecture decisions
- One process, zero external dependencies.Node.js and SQLite instead of Postgres, Redis and Kubernetes. Installation is one script and Docker Compose, and backups and restore are built in.
- The public page survives a server outage.A static fallback keeps it up when the application is down, which is exactly when users look at it most.
- Security in the core.Secrets vault (AES-256-GCM, optional HashiCorp Vault), OpenID Connect sign-in, roles with 2FA and an audit log.
- Reusable modules.Accounts, audit log and backups live in a separate repository, Better-Forge, as npm packages. ESLint rules guard the boundaries between layers.
- Open to automation.Configuration as code in YAML, API tokens and an MCP server that lets an AI agent browse monitors and incidents. It is off by default.
Delivery
- Easy to deploy.Image in GitHub Container Registry, an install script that generates secrets, and deployment guides with Nginx.
- Quality enforced automatically.Lint, type checks, unit tests and Playwright end-to-end scenarios, plus Dependabot and GitHub Actions workflows.
- Working with AI agents by rules.The repository defines roles: an architect designs changes, a recon agent maps the code, a reviewer checks security, and small edits go to a cheaper model. I set the architecture and the boundaries, and the agents work within them.
- Documentation is part of the product.A separate docs site with guides, a README in Polish and English, and a security policy.