Open-source alternative to Instatus. Free, self-hosted status pages with incident management, uptime tracking, and email subscriptions.
- Unlimited components — No artificial limits on monitored services
- Incident lifecycle — Investigating → Identified → Monitoring → Resolved with timestamped updates
- Maintenance windows — Schedule planned downtime in advance (Instatus charges $49/mo for this)
- 90-day uptime bars — Per-component uptime history visualization
- Email subscriptions — Users subscribe for incident/maintenance notifications
- Public status page — Clean, shareable
/s/[slug]URL - Incident history — Full timeline of past resolved incidents
- Row Level Security — Supabase RLS ensures users can only access their own data
- Next.js 15 (App Router, TypeScript strict)
- Supabase (PostgreSQL + Auth + RLS)
- Tailwind CSS v4 + shadcn/ui
- Vercel deployment
git clone https://github.com/postcabinets-jp/status-page
cd status-page
npm install- Create a project at supabase.com
- Run the migration in
supabase/migrations/20260627000001_initial_schema.sqlvia Supabase SQL Editor - Copy your project URL and anon key
cp .env.example .env.local
# Edit .env.local with your Supabase credentialsNEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
NEXT_PUBLIC_APP_URL=http://localhost:3000
npm run devClick the deploy button above or:
vercel --prodSet these environment variables in your Vercel project settings:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYNEXT_PUBLIC_APP_URL(your Vercel deployment URL)
All tables use RLS with public read access and owner-only write access. See supabase/migrations/ for the full schema.
| Table | Purpose |
|---|---|
pages |
Status pages (one per service) |
components |
Services being monitored |
incidents |
Active and historical incidents |
incident_updates |
Timestamped status updates |
incident_components |
Affected components per incident |
maintenances |
Scheduled maintenance windows |
subscribers |
Email notification subscribers |
uptime_records |
Daily uptime history per component |
src/
├── app/
│ ├── (auth)/ # Login, register, forgot-password
│ ├── (dashboard)/ # Admin dashboard (protected)
│ │ └── dashboard/
│ │ └── [pageId]/
│ │ ├── incidents/
│ │ ├── maintenance/
│ │ └── settings/
│ ├── s/[slug]/ # Public status pages
│ │ └── history/ # Incident history
│ └── actions/ # Server Actions
├── components/
│ ├── auth/
│ ├── dashboard/
│ └── status/
├── lib/
│ ├── supabase/ # Client, server, middleware
│ └── status.ts # Status config & utilities
└── types/
└── database.ts # Supabase type definitions
| Feature | StatusPage OSS | Instatus Starter |
|---|---|---|
| Price | Free | $15/mo |
| Components | Unlimited | 25 max |
| Incident management | Yes | Yes |
| Maintenance windows | Yes | Business plan ($49/mo) |
| Email subscriptions | Yes | Limited |
| 90-day uptime history | Yes | Yes |
| Data ownership | Full (your Supabase DB) | Instatus servers |
| Open-source | MIT | No |
MIT
Built by POST CABINETS — Web & SNS Marketing, Tokyo