Self-hosted status page with an admin dashboard. SQLite, Docker, nothing else.
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.
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
Public page at / — server-rendered, works without JS, SEO-friendly:
Admin dashboard at /admin — password-protected:
Everything is mobile-friendly. Admin sidebar collapses to a hamburger on small screens.
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.
If you configure SMTP, subscribers get emailed when:
Users subscribe from the public page, confirm via email, and can unsubscribe with one click. Admins can also add subscribers directly.
Next.js 15, TypeScript, Tailwind, SQLite (better-sqlite3), Drizzle ORM. Single Docker image, ~100MB.
Architecture details in docs/architecture.md.
See CONTRIBUTING.md.