Menu

Tree [dbf514] main /
 History

HTTPS access


File Date Author Commit
 docs 3 days ago samxblake samxblake [dbf514] Add README, LICENSE, CONTRIBUTING, and architec...
 public 3 days ago samxblake samxblake [085f67] Initial commit: status page as a service
 src 3 days ago samxblake samxblake [085f67] Initial commit: status page as a service
 .dockerignore 3 days ago samxblake samxblake [085f67] Initial commit: status page as a service
 .env.example 3 days ago samxblake samxblake [085f67] Initial commit: status page as a service
 .gitignore 3 days ago samxblake samxblake [dbf514] Add README, LICENSE, CONTRIBUTING, and architec...
 CONTRIBUTING.md 3 days ago samxblake samxblake [dbf514] Add README, LICENSE, CONTRIBUTING, and architec...
 Dockerfile 3 days ago samxblake samxblake [085f67] Initial commit: status page as a service
 LICENSE 3 days ago samxblake samxblake [dbf514] Add README, LICENSE, CONTRIBUTING, and architec...
 PRD.md 3 days ago samxblake samxblake [085f67] Initial commit: status page as a service
 README.md 3 days ago samxblake samxblake [dbf514] Add README, LICENSE, CONTRIBUTING, and architec...
 docker-compose.yml 3 days ago samxblake samxblake [085f67] Initial commit: status page as a service
 next.config.ts 3 days ago samxblake samxblake [085f67] Initial commit: status page as a service
 package.json 3 days ago samxblake samxblake [085f67] Initial commit: status page as a service
 postcss.config.mjs 3 days ago samxblake samxblake [085f67] Initial commit: status page as a service
 tailwind.config.ts 3 days ago samxblake samxblake [085f67] Initial commit: status page as a service
 tsconfig.json 3 days ago samxblake samxblake [085f67] Initial commit: status page as a service

Read Me

status-page-as-a-service

Self-hosted status page with an admin dashboard. SQLite, Docker, nothing else.

License: MIT


Why

Cachet is abandoned. Upptime requires GitHub Actions. OpenStatus needs Turso + Redis. Statuspage.io costs $29/mo.

This is a status page you can deploy with docker compose up -d. No external databases, no Redis, no third-party dependencies. SQLite file in a Docker volume. That's it.


Get running

git clone https://github.com/recurohq/status-page-as-a-service.git
cd status-page-as-a-service
cp .env.example .env   # set ADMIN_PASSWORD
docker compose up -d

Status page: http://localhost:3111
Admin: http://localhost:3111/login


What you get

Public page at / — server-rendered, works without JS, SEO-friendly:

  • Status banner (green/yellow/red based on worst service)
  • Per-service 90-day uptime bars with daily granularity
  • Active incidents with timestamped update timeline
  • Scheduled maintenance with affected services
  • 14-day incident history
  • Dark mode (follows system preference)
  • Email subscribe/unsubscribe

Admin dashboard at /admin — password-protected:

  • Add/edit/reorder services, set status manually
  • Create incidents, post Markdown updates, resolve
  • Schedule maintenance windows
  • Manage email subscribers, export CSV
  • Configure timezone (any IANA timezone), site name, SMTP
  • Import/export all data as JSON

Everything is mobile-friendly. Admin sidebar collapses to a hamburger on small screens.


Configuration

Set these in .env or docker-compose.yml:

Variable Default Description
ADMIN_PASSWORD (required) Admin login password
SITE_NAME Status Page Header and page title
SITE_DESCRIPTION Current status of our services Meta description
DATABASE_PATH /app/data/status-page.db SQLite file location
BASE_URL http://localhost:3000 Used in email links
SMTP_HOST For subscriber notifications
SMTP_PORT 587
SMTP_USER
SMTP_PASS
SMTP_FROM status@example.com

Site name, timezone, and SMTP can also be changed from the admin Settings page.


Notifications

If you configure SMTP, subscribers get emailed when:

  • An incident is created, updated, or resolved
  • Maintenance is scheduled

Users subscribe from the public page, confirm via email, and can unsubscribe with one click. Admins can also add subscribers directly.


Stack

Next.js 15, TypeScript, Tailwind, SQLite (better-sqlite3), Drizzle ORM. Single Docker image, ~100MB.

Architecture details in docs/architecture.md.


Roadmap

  • [ ] REST API
  • [ ] RSS/Atom feed
  • [ ] Custom branding (colors, logo upload)
  • [ ] Embeddable status badge
  • [ ] Webhook subscribers
  • [ ] Integration with healthcheck-as-a-service

Contributing

See CONTRIBUTING.md.

License

MIT

MongoDB Logo MongoDB