Skip to content

codenamev/ups

ups

Modern status pages built with Rails 8 + SQLite.

ups status page

A complete, self-hostable status page platform for your web services, APIs, and infrastructure. Public status pages, incident management, subscriber notifications, synthetic monitoring, and a full REST API — all backed by SQLite.

Don't want to self-host? ups.dev runs the managed version — set up a status page in under 2 minutes. Free tier included.

License: AGPL-3.0 Ruby Rails

Why ups?

Most status page tools are either expensive SaaS ($29-399/mo), abandoned open-source projects, or over-engineered for what should be a simple problem.

ups is a single Rails app with a SQLite database. No Redis, no Postgres, no external dependencies. Deploy it anywhere Docker runs.

ups (self-hosted) Statuspage.io Betteruptime
Price Free $29-399/mo $20-85/mo
Self-hostable Yes No No
Open source Yes (AGPL-3.0) No No
Database SQLite Postgres Unknown
Setup time 5 minutes 30 minutes 15 minutes

Features

  • Status Pages — Public, branded pages showing real-time component status
  • Components — Track services with operational / degraded / partial outage / major outage / maintenance states
  • Incidents — Create, update, and resolve incidents with full timeline history
  • Subscriber Notifications — Email alerts when status changes or incidents are posted
  • Synthetic Monitoring — HTTP/HTTPS/TCP health checks with configurable intervals
  • REST API — Full CRUD with token authentication for programmatic management
  • MCP Server — Model Context Protocol endpoint for AI agent integration
  • Webhooks — Outbound webhook delivery for existing tooling
  • Real-time Updates — Turbo Streams push changes to connected browsers
  • Multi-tenant — Multiple accounts, status pages, and team members
  • Magic Link Auth — Passwordless authentication via email

Quick Start

Docker (recommended)

docker run -d \
  -p 3000:80 \
  -v ups_storage:/rails/storage \
  -e SECRET_KEY_BASE=your-secret-key \
  -e HOST_URL=https://status.yourdomain.com \
  ghcr.io/codenamev/ups:latest

No credentials file or master key needed. A random SECRET_KEY_BASE is auto-generated if not provided.

Docker issues? See Docker Troubleshooting Guide

Docker Compose

# Copy the included docker-compose.yml and .env.example
cp .env.example .env
# Edit .env with your configuration
nano .env

# Start with reverse proxy (includes Caddy for SSL)
docker compose --profile proxy up -d

# Or start just the ups service
docker compose up -d

See the included docker-compose.yml for a complete setup with SSL, health checks, and optional reverse proxy.

From Source

git clone https://github.com/codenamev/ups.git
cd ups
bundle install
bin/rails db:prepare
bin/rails server

Visit http://localhost:3000, create an account, and set up your first status page.

Deploy with Kamal

cp config/deploy.yml.example config/deploy.yml
cp .kamal/secrets.example .kamal/secrets
# Edit both files with your server details
bin/kamal setup

Tech Stack

  • Ruby 4.0.1 / Rails 8.1
  • SQLite with Solid Queue, Solid Cache, and Solid Cable
  • Tailwind CSS / Turbo / Stimulus
  • Kamal for zero-downtime deployments
  • Resend for transactional email (configurable)

API

All endpoints require a Bearer token (create one in the dashboard under API Tokens).

# List components
curl -H "Authorization: Bearer YOUR_TOKEN" \
  https://your-instance.com/api/v1/status_pages/your-slug/components

# Report an incident
curl -X POST \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"incident": {"title": "API Degradation", "impact": "minor"}}' \
  https://your-instance.com/api/v1/status_pages/your-slug/incidents

Discovery endpoint at /api/v1 describes all available resources.

MCP (Model Context Protocol)

ups includes an MCP server at /mcp, allowing AI agents to query and manage status pages programmatically. See the ActionMCP docs for client integration.

Configuration

Variable Description Default
SECRET_KEY_BASE Secret for sessions/cookies Auto-generated
RESEND_API_KEY Resend email API key Optional
HOST_URL Public URL for email links http://localhost:3000
SOLID_QUEUE_IN_PUMA Run jobs in web process true
WEB_CONCURRENCY Puma worker count 1

Email delivery is configured via the RESEND_API_KEY environment variable.

Managed Service

If you'd rather not deal with hosting, updates, backups, and SSL certificates, ups.dev runs the managed version with:

  • Free tier (1 status page, 5 components)
  • Automatic monitoring and alerting
  • Managed SSL and CDN
  • Email delivery included
  • No infrastructure to maintain

Self-hosters: if you outgrow your setup, migrate to the managed service anytime.

Contributing

Pull requests welcome. See CONTRIBUTING.md for guidelines.

License

AGPL-3.0 — self-host, modify, and distribute freely. If you offer ups as a hosted service, modifications must be open-sourced under AGPL-3.0.