Skip to content
NeonRookPublic

About

Simple uptime monitoring for solo builders. HTTP, TCP, and push-based health checks with status pages. Self-host or use hosted.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

481 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Uppity

License: AGPL-3.0 Contributor Covenant

A self-hosted monitoring and status page application built with SvelteKit 2 and Svelte 5.

Features

  • Monitor Types: HTTP, TCP, and push-based health checks
  • Incident Management: Track and manage service incidents
  • Notifications: Multi-channel alerts via Email, Slack, Discord, and Webhooks
  • Public Status Pages: Customizable status pages for your customers
  • Multi-tenant: Organization-based authentication with team support
  • Admin Panel: Manage users and organizations

Tech Stack

Getting Started

Prerequisites

  • mise — mise install reads mise.toml and gives you Node and pnpm at the pinned versions. CI installs from the same file.
  • PostgreSQL (v15+) or use Docker

Quick Start

  1. Clone the repository

    git clone https://github.com/NeonRook/uppity.git
    cd uppity
  2. Install the toolchain and dependencies

    mise install
    pnpm install
  3. Start PostgreSQL (using Docker)

    docker compose -f docker-compose.dev.yml up -d
  4. Configure environment

    cp .env.example .env

    Edit .env and set at minimum:

    • DATABASE_URL - PostgreSQL connection string (default works with Docker)
    • BETTER_AUTH_SECRET - Generate with openssl rand -base64 32
  5. Push database schema

    pnpm db:push
  6. Start the development server

    pnpm dev

    Open http://localhost:5173 in your browser.

Development

Commands

# Start dev server
pnpm dev

# Type checking
pnpm check

# Linting (with auto-fix)
pnpm lint

# Linting and formatting as CI checks them, without fixing
pnpm lint:ci

# Formatting
pnpm fmt

# Run unit tests
pnpm test:unit run

# Run e2e tests
pnpm test:e2e

# Database GUI
pnpm db:studio

Project Structure

src/
├── lib/
│   ├── server/
│   │   ├── db/schema.ts        # Drizzle database schema
│   │   ├── services/           # Business logic layer
│   │   ├── notifications/      # Notification channel implementations
│   │   └── auth.ts             # Authentication configuration
│   ├── schemas/                # Validation schemas
│   └── components/ui/          # shadcn-svelte components
└── routes/
    ├── (app)/                  # Protected application routes
    │   ├── dashboard/          # Main dashboard
    │   ├── monitors/           # Monitor management
    │   ├── incidents/          # Incident tracking
    │   ├── notifications/      # Notification channels
    │   ├── status-pages/       # Status page configuration
    │   └── settings/           # User settings
    ├── (auth)/                 # Login and registration
    ├── (admin)/                # Admin panel
    ├── (public)/status/[slug]/ # Public status pages
    └── api/                    # API endpoints

worker/                         # Long-lived processes, deployed separately
├── monitor/                    # Schedules and runs health checks
└── notifier/                   # Delivers queued notifications

Deployment

Docker

Build and run with Docker Compose:

# Set required environment variables
export BETTER_AUTH_SECRET=$(openssl rand -base64 32)
export BETTER_AUTH_URL=https://your-domain.com
export BETTER_AUTH_TRUSTED_ORIGINS=https://your-domain.com

# The address users type, scheme included. Form submissions from any other
# origin are rejected. Unset, the server assumes https:// and the request's Host
# header; behind a proxy that rewrites Host you can set HOST_HEADER instead.
export ORIGIN=https://your-domain.com

# Start the full stack
docker compose up -d

Or build the image manually:

docker build -t uppity .

Verifying the image

Published images carry a Sigstore-backed build provenance attestation. Verify that an image was built by this repository's workflow, from this repository's source, before running it:

gh attestation verify oci://ghcr.io/neonrook/uppity:latest --repo NeonRook/uppity

No keys to distribute and no trust in the registry required — the attestation is signed by GitHub's OIDC identity for the workflow that produced it.

Images are published for linux/amd64 and linux/arm64.

Tags

Tag Contents
latest The most recent release
0.2.0, 0.2 A specific release, and the newest patch on that minor
edge The current state of main. Not release-tested
main-<sha> A specific commit on main

For production self-hosting, pin the digest rather than a tag — a tag can be repointed, a digest cannot:

docker pull ghcr.io/neonrook/uppity@sha256:<digest>

Each release's digest is printed in its GitHub release notes.

Environment Variables

See .env.example for all available configuration options.

Required:

  • DATABASE_URL - PostgreSQL connection string
  • BETTER_AUTH_SECRET - Auth secret key (min 32 characters)
  • BETTER_AUTH_URL - Public URL of your application

Optional:

  • SMTP_* - Email notification settings
  • UPPITY_DEFAULT_* - Monitor default configurations
  • UPPITY_CRON_* - Background job schedules

Contributing

We welcome contributions! Please see our Contributing Guide for details.

This project follows the Contributor Covenant Code of Conduct.

License

This project is licensed under the GNU Affero General Public License v3.0.

Commercial licensing is available for organizations that cannot use AGPL-licensed software. Contact us for details.

About

Simple uptime monitoring for solo builders. HTTP, TCP, and push-based health checks with status pages. Self-host or use hosted.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages