{"id":47707775,"url":"https://github.com/wenisch-tech/kairos","last_synced_at":"2026-06-07T14:01:27.409Z","repository":{"id":343418553,"uuid":"1177051810","full_name":"wenisch-tech/Kairos","owner":"wenisch-tech","description":"Kairos is a self-hosted uptime and availability monitoring application built with Spring Boot. It periodically checks whether your URLs and Docker images are reachable, stores a full check history, and presents the results on a clean status dashboard — with Prometheus metrics included.","archived":false,"fork":false,"pushed_at":"2026-04-13T11:52:01.000Z","size":6553,"stargazers_count":2,"open_issues_count":10,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-13T12:04:32.130Z","etag":null,"topics":["announcements","docker","docker-check","docker-probing","http-check","monitoring","statuspage","uptime-monitor"],"latest_commit_sha":null,"homepage":"https://kairos.wenisch.tech","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wenisch-tech.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-09T16:39:47.000Z","updated_at":"2026-04-13T11:52:04.000Z","dependencies_parsed_at":"2026-04-13T12:02:04.543Z","dependency_job_id":null,"html_url":"https://github.com/wenisch-tech/Kairos","commit_stats":null,"previous_names":["jfwenisch/kairos","wenisch-tech/kairos"],"tags_count":76,"template":false,"template_full_name":null,"purl":"pkg:github/wenisch-tech/Kairos","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wenisch-tech%2FKairos","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wenisch-tech%2FKairos/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wenisch-tech%2FKairos/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wenisch-tech%2FKairos/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wenisch-tech","download_url":"https://codeload.github.com/wenisch-tech/Kairos/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wenisch-tech%2FKairos/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32299644,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T09:34:17.070Z","status":"ssl_error","status_checked_at":"2026-04-26T09:34:00.993Z","response_time":129,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["announcements","docker","docker-check","docker-probing","http-check","monitoring","statuspage","uptime-monitor"],"created_at":"2026-04-02T18:04:30.836Z","updated_at":"2026-04-26T14:00:59.884Z","avatar_url":"https://github.com/wenisch-tech.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Kairos - Uptime Monitor\n\n\n[![GitHub Release](https://img.shields.io/github/v/release/wenisch-tech/Kairos?logo=github)](https://github.com/wenisch-tech/Kairos/releases)\n[![License: AGPL v3](https://img.shields.io/badge/License-AGPLv3-blue.svg)](LICENSE.md)\n[![Container](https://img.shields.io/badge/container-ghcr.io-blue?logo=github)](https://github.com/wenisch-tech/Kairos/pkgs/container/kairos)\n[![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/kairos)](https://artifacthub.io/packages/helm/jfwenisch/kairos)\n[![Signed](https://img.shields.io/badge/signed-cosign-green?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0id2hpdGUiIGQ9Ik0xMiAxTDMgNXY2YzAgNS41NSAzLjg0IDEwLjc0IDkgMTIgNS4xNi0xLjI2IDktNi40NSA5LTEyVjVsLTktNHoiLz48L3N2Zz4=)](https://github.com/wenisch-tech/Kairos/actions)\n\n**Kairos** is a self-hosted uptime and availability monitoring application built with Spring Boot. It periodically checks whether your HTTP services and Docker images are reachable, can discover Docker images from repository prefixes, stores a full check history, and presents the results on a clean status dashboard - with Prometheus metrics included.\n\n---\n\n## Screenshots\n\n![Status Dashboard – Card View](docs/img/kairos-hero.png)\n\n| Screenshot | Description |\n|---|---|\n| ![Status Dashboard](docs/img/dashboard.png) | **Status Dashboard (Timeline view)** — 24-hour timeline bars per resource, uptime percentages, and active outage indicators across multiple groups. |\n| ![Status Dashboard](docs/img/dashboard-cards.png) | **Status Dashboard (Card view)** — card based overview per resource, uptime percentages, and active outage indicators across multiple groups. |\n| ![Resource Detail](docs/img/resource-detail.png) | **Resource Detail** — Full check history table with status, response time, and error codes; manual \"Check Now\" button and outage history. |\n| ![Manage Resources](docs/img/admin-resources.png) | **Admin · Manage Resources** — Add, edit, and delete monitored resources; drag-and-drop reordering within and across groups. |\n| ![Resource Types](docs/img/admin-resource-types.png) | **Admin · Resource Type Configuration** — Configure check intervals, parallelism, outage and recovery thresholds per resource type (HTTP, Docker, Docker Repository). |\n| ![Announcements](docs/img/admin-announcements.png) | **Admin · Announcements** — Create and manage rich-text status announcements with severity levels and optional auto-expiry. |\n| ![API Keys](docs/img/admin-api-keys.png) | **Admin · API Keys** — Generate and revoke named API keys for machine-to-machine access to the REST API. |\n| ![Users](docs/img/admin-users.png) | **Admin · Users** — Manage local user accounts and passwords. |\n| ![Settings](docs/img/admin-settings.png) | **Admin · General Settings** — Application-wide settings including public submission mode and OIDC configuration. |\n| ![Outages Timeline](docs/img/outages-timeline.png) | **Outages · Calendar (Timeline view)** — Gantt-style outage calendar showing per-resource outage bars across a 7-day window with time-axis ticks and active outage highlight. |\n| ![Outages List](docs/img/outages-list.png) | **Outages · List** — Tabular outage log with resource name, type, active/resolved status badge, start time, end time, and duration; supports filtering by status and time range. |\n\n---\n\n## Features\n\n- **HTTP monitoring** - HTTP GET checks with configurable interval and parallelism\n- **Latency tracking** - end-to-end request latency measured per check and broken down into DNS resolution, TCP connect, and TLS handshake phases; stored in the database and displayed as an interactive trend chart on the resource detail page with individual data points, tooltips, zoom (1×–8×), drag-to-pan, and a time axis; also shows latest and average latency per resource on the dashboard; the chart adapts to the selected time range (24 h / 7 d / 30 d) by fetching real per-check samples from the API and downsampling client-side so detail is preserved when zooming in\n- **Docker image monitoring** - validates image pullability via the OCI/Docker Registry HTTP API (manifest + blob probe, no Docker socket required)\n- **Dockerrepository discovery** - provide a repository prefix (for example `ghcr.io/wenisch-tech`) and Kairos auto-creates/updates Docker resources for discovered images (optional recursive traversal)\n- **Authentication support** - per-resource-type Basic Auth credentials with wildcard URL pattern matching; HTTP checks send an `Authorization: Basic ...` header, Docker checks use credentials for registry API/token requests\n- **Instant checks on startup** - monitoring begins immediately when the application starts; no waiting for the first interval tick\n- **Status dashboard** - 24-hour timeline, uptime percentages (24 h / 7 d / 30 d), and a full check history per resource with filterable table\n- **Outage tracking** - per-resource outage lifecycle from first failure streak to recovery streak, with active outage indicators and live \"since\" counters in dashboard/resource views\n- **Manual instant checks** - admins can trigger an immediate check from the resource detail page, bypassing scheduler interval and parallelism queue\n- **Public \"Check Now\"** - optionally allow unauthenticated users to trigger an immediate check from the resource detail page\n- **Resource groups** - organise resources into named groups; drag-and-drop reordering within and across groups; a resource can belong to **multiple groups simultaneously**\n- **Group visibility controls** - per resource group, choose `PUBLIC`, `AUTHENTICATED`, or `HIDDEN`; when a resource is in multiple groups the most-permissive visibility wins\n- **Admin panel** - manage resources, tune check intervals and parallelism per resource type, manage users, configure authentication credentials\n- **API keys** - generate and revoke named API keys for machine-to-machine access to the REST API\n- **YAML import / export** - export resources from the admin panel and import them again via a versioned, forward-compatible YAML exchange format\n- **Announcement system** - publish rich-text announcements with three severity kinds (`INFORMATION`, `WARNING`, `PROBLEM`), active/inactive state, optional auto-expiry (`active until`), creator and creation timestamp\n- **Public announcements** - active announcements are shown on the dashboard and a dedicated public announcements page lists all announcements by creation date\n- **Embeddable status widget** - expose a lightweight iframe status badge (green/red indicator with status text) and control embedding centrally via **Admin -\u003e Embed Widget** with policies for disabled, allow-all, or domain allowlist\n- **Public submission mode** - optionally allow unauthenticated users to add resources via the REST API\n- **Access mode control** - choose between public access and authenticated-only access for all pages via **Admin -\u003e General Settings**\n- **OIDC / OAuth2 login** - plug in any OpenID Connect provider (Keycloak, Auth0, etc.)\n- **Prometheus metrics** - `kairos_resource_status` gauge per resource, exposed at `/actuator/prometheus`\n- **H2 (default) or PostgreSQL** - switch databases with a single property change\n- **Automatic schema migrations** - Flyway runs database migrations automatically on startup (existing databases are baselined)\n- **Dark-mode UI** - Bootstrap 5 with Bootstrap Icons, served via WebJars (no CDN dependency)\n\n---\n\n## Quick Start\n\n\n\n### Run with Docker\n\n```bash\ndocker run -d \\\n  --name kairos \\\n  -p 8080:8080 \\\n  -v kairos-data:/app/data \\\n  ghcr.io/wenisch-tech/kairos:latest\n```\n\nOpen **http://localhost:8080** in your browser.\n\n**Default credentials** (created automatically on first start):\n\n| Email | Password |\n|-------|----------|\n| `admin@kairos.local` | `admin` |\n\n\u003e Warning: Change the default password immediately after first login via **Admin -\u003e Users**.\n\n\n\n### Run on Kubernetes with Helm\n\nKairos includes a production-ready Helm chart for Kubernetes deployments.\n\n#### Prerequisites\n\n- Kubernetes 1.20+\n- Helm 3.0+\n\n#### Install\n\n```bash\nhelm repo add wenisch-tech https://charts.wenisch.tech\nhelm repo update\nhelm install my-kairos wenisch-tech/kairos --version 1.0.4 -n kairos --create-namespace\n```\nor install from repository\n```bash\ngit clone https://github.com/wenisch-tech/Kairos.git\n\nhelm install kairos ./charts/kairos -n kairos --create-namespace\n```\n\n#### With Persistence (H2 Database)\n\n```bash\nhelm install kairos ./charts/kairos \\\n  -n kairos --create-namespace \\\n  --set persistence.enabled=true\n```\n\n#### With PostgreSQL\n\n```bash\nhelm install kairos ./charts/kairos \\\n  -n kairos --create-namespace \\\n  --set env.SPRING_DATASOURCE_URL=\"jdbc:postgresql://postgres:5432/kairos\" \\\n  --set env.SPRING_DATASOURCE_USERNAME=\"kairos\" \\\n  --set secrets.SPRING_DATASOURCE_PASSWORD=\"your-password\"\n```\n\n#### With Ingress\n\n```bash\nhelm install kairos ./charts/kairos \\\n  -n kairos --create-namespace \\\n  --set ingress.enabled=true \\\n  --set ingress.className=nginx \\\n  --set ingress.hosts[0].host=kairos.example.com \\\n  --set ingress.hosts[0].paths[0].path=/ \\\n  --set ingress.hosts[0].paths[0].pathType=Prefix\n```\n\nFor more Helm configuration options, see [charts/kairos/README.md](charts/kairos/README.md).\n\n---\n\n## Configuration\n\nKairos is configured via standard Spring Boot `application.properties` or environment variables.\n\n| Property | Env var | Default | Description |\n|----------|---------|---------|-------------|\n| `spring.datasource.url` | `SPRING_DATASOURCE_URL` | `jdbc:h2:file:./kairos` | JDBC URL (H2 file or PostgreSQL) |\n| `spring.datasource.username` | `SPRING_DATASOURCE_USERNAME` | `sa` | Database username |\n| `spring.datasource.password` | `SPRING_DATASOURCE_PASSWORD` | *(empty)* | Database password |\n| `OIDC_ENABLED` | `OIDC_ENABLED` | `false` | Enable OIDC / OAuth2 login |\n| `OIDC_CLIENT_ID` | `OIDC_CLIENT_ID` | *(empty)* | OIDC client ID |\n| `OIDC_CLIENT_SECRET` | `OIDC_CLIENT_SECRET` | *(empty)* | OIDC client secret |\n| `OIDC_ISSUER_URI` | `OIDC_ISSUER_URI` | *(empty)* | OIDC issuer URI (e.g. `https://keycloak.example.com/realms/myrealm`) |\n\nSee [docs/configuration.md](docs/configuration.md) for advanced configuration including PostgreSQL setup, Flyway migrations, registry checks, and OIDC.\n\n\n## Documentation\nOfficial Documentation including advanced configuration and information is generated via the markdown files in [docs/](docs/index.md)  folder and published to https://kairos.wenisch.tech . \n\n---\n\n## REST API\n\nThe REST API is available at `/api`. An **interactive Swagger UI** (auto-generated from the OpenAPI spec) is served at **[/api](http://localhost:8080/api)** - no separate tooling needed.\n\nThe raw OpenAPI JSON spec is at `/v3/api-docs`.\n\n| Method | Path | Auth | Description |\n|--------|------|------|-------------|\n| `GET` | `/api/resources` | Public | List all active resources |\n| `GET` | `/api/resources/{id}` | Public | Get resource details + latest health status |\n| `POST` | `/api/resources` | Admin | Add a new resource |\n| `DELETE` | `/api/resources/{id}` | Admin | Delete a resource |\n| `GET` | `/api/resources/{id}/history` | Authenticated | Full check history for a resource |\n| `GET` | `/api/resources/{id}/latency-samples` | Public | Per-check latency samples for a resource (`?hours=24\\|168\\|720`) |\n| `GET` | `/api/announcements` | Public | List all announcements |\n| `GET` | `/api/announcements/{id}` | Public | Get a single announcement |\n| `POST` | `/api/announcements` | Admin | Create an announcement |\n| `PUT` | `/api/announcements/{id}` | Admin | Update an announcement |\n| `DELETE` | `/api/announcements/{id}` | Admin | Delete an announcement |\n\nSee [docs/api.md](docs/api.md) for full request/response examples.\n\n---\n\n## Monitoring with Prometheus\n\nKairos exposes a Prometheus-compatible endpoint at `/actuator/prometheus`. The key metric is:\n\n```\nkairos_resource_status{resource_name=\"GitHub\",resource_type=\"HTTP\"} 1.0\n```\n\nValues: `1` = available, `0` = not available, `-1` = unknown (no checks yet).\n\nA health endpoint is also available at `/actuator/health`.\n\n---\n\n## Development\n\n### Prerequisites\n\n- Java 17+\n- Maven 3.8+ \n- Network access to target Docker/OCI registries if you want Docker image checks\n\n### Run from source\n\n```bash\ngit clone https://github.com/wenisch-tech/Kairos.git\ncd Kairos\n./mvnw spring-boot:run\n```\n\n```bash\n# Run tests\n./mvnw test\n\n# Run with H2 console enabled (default - open http://localhost:8080/h2-console)\n./mvnw spring-boot:run\n```\n\n### Build a JAR\n\n```bash\n./mvnw package -DskipTests\njava -jar target/kairos-0.0.1-SNAPSHOT.jar\n```\n\n---\n\n## License\nLicensed under \n[AGPL v3.0](LICENSE.md) by  [Jean-Fabian Wenisch](https://github.com/jfwenisch) / wenisch.tech [wenisch.tech](https://wenisch.tech) ","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwenisch-tech%2Fkairos","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwenisch-tech%2Fkairos","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwenisch-tech%2Fkairos/lists"}