Kener
Status page generator that shows service uptime and incidents.
- Replaces
-
Paid status page services, such as Statuspage.
All open-source alternatives to Statuspage
- Difficulty
-
Difficulty: Medium
2 services (1 database or broker: redis), 2 volume mounts, no env values to set, no elevated host access. Heuristic score 3 of 11: medium.
- Stack
TypeScript (language), Redis (database)
- Deployment
docker_compose
- Requirements
Not stated.
- License
-
MIT(OSI-approved open source) - Business model
-
Unknown
The README at the pinned commit does not state a business model, so it stays unknown.
Source: github.com/rajnandan1/kener/blob/5bc658b/README.md, read on .
- Repository
GitHub stats
- Stars
- 5,212
- Forks
- 311
- Open issues and pull requests
- 64
- Last push
- 2026-10-22
- Latest release
- v4.1.8
- Released
- 2026-10-22
From the GitHub API on . These numbers are a snapshot, not live. GitHub detected the license as MIT.
Compose file
# =============================================================================
# Kener v4 — Production Docker Compose
#
# Usage:
# docker compose up -d
#
# Defaults to the published image. To use a local build instead:
# docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d
# =============================================================================
services:
# ---------------------------------------------------------------------------
# Redis — required for BullMQ queues, caching, and scheduler
# ---------------------------------------------------------------------------
redis:
image: redis:7-alpine
container_name: kener-redis
restart: unless-stopped
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
# ---------------------------------------------------------------------------
# Kener — Status Page Application
# ---------------------------------------------------------------------------
kener:
image: rajnandan1/kener:latest
# For Alpine variant use: rajnandan1/kener:alpine
container_name: kener
environment:
# ── Required ──
KENER_SECRET_KEY: replace_me_with_a_random_string # generate: openssl rand -base64 32
ORIGIN: http://localhost:3000 # public URL of your Kener instance (required for CSRF protection)
REDIS_URL: redis://redis:6379
# ── Database (default: SQLite) ──
# DATABASE_URL: sqlite://./database/kener.sqlite.db
# DATABASE_URL: postgresql://user:password@postgres:5432/kener
# DATABASE_URL: mysql://user:password@mysql:3306/kener
# ── Email (optional) ──
# RESEND_API_KEY:
# RESEND_SENDER_EMAIL:
# SMTP_HOST:
# SMTP_PORT:
# SMTP_USER:
# SMTP_PASSWORD:
# SMTP_SENDER:
# SMTP_SECURE: 0
# ── Advanced (you likely don't need to change these) ──
# PORT: 3000
# KENER_BASE_PATH:
# NODE_ENV: production # already set in the image
ports:
- "3000:3000"
volumes:
- data:/app/database
depends_on:
redis:
condition: service_healthy
restart: unless-stopped
# ---------------------------------------------------------------------------
# Optional: PostgreSQL (uncomment and set DATABASE_URL above)
# ---------------------------------------------------------------------------
# postgres:
# image: postgres:16-alpine
# container_name: kener-postgres
# environment:
# POSTGRES_USER: kener
# POSTGRES_PASSWORD: change_me # use a strong password
# POSTGRES_DB: kener
# volumes:
# - postgres_data:/var/lib/postgresql/data
# restart: unless-stopped
# healthcheck:
# test: ["CMD-SHELL", "pg_isready -U kener"]
# interval: 10s
# timeout: 5s
# retries: 5
# ---------------------------------------------------------------------------
# Optional: MySQL / MariaDB (uncomment and set DATABASE_URL above)
# ---------------------------------------------------------------------------
# mysql:
# image: mariadb:11
# container_name: kener-mysql
# environment:
# MYSQL_USER: kener
# MYSQL_PASSWORD: change_me # use a strong password
# MYSQL_DATABASE: kener
# MYSQL_RANDOM_ROOT_PASSWORD: "true"
# volumes:
# - mysql_data:/var/lib/mysql
# restart: unless-stopped
# healthcheck:
# test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
# interval: 10s
# timeout: 5s
# retries: 5
volumes:
data:
name: kener_db
redis_data:
name: kener_redis
# postgres_data:
# name: kener_postgres
# mysql_data:
# name: kener_mysql
From the app's own repository: github.com/rajnandan1/kener/blob/5bc658b/docker-compose.yml.
Compose file from the app repository.
Install
- Docker with the Compose plugin (github.com/rajnandan1/kener/blob/5bc658b/docker-compose.yml)
A host with Docker and the Docker Compose plugin. This entry runs from a compose file.
- Save the compose file as docker-compose.yml (github.com/rajnandan1/kener/blob/5bc658b/docker-compose.yml)
Use the compose file shown above.
- Set the values the compose file needs (github.com/rajnandan1/kener/blob/5bc658b/docker-compose.yml)
Replace the placeholder values listed under Gotchas.
- Start it (github.com/rajnandan1/kener/blob/5bc658b/docker-compose.yml)
docker compose up -d - Open the app (github.com/rajnandan1/kener/blob/5bc658b/docker-compose.yml)
Open http://localhost:3000. The compose file publishes host port 3000 for the kener service.
Compose file check: config_ok on 2026-10-22.
Gotchas and maintenance
Gotchas
- Some images use the latest tag or no tag. Images without a pinned version: kener: rajnandan1/kener:latest. A later pull can get a different version. (github.com/rajnandan1/kener/blob/5bc658b/docker-compose.yml, checked 2026-10-22)
- The compose file has placeholder values. Placeholder values: KENER_SECRET_KEY is "replace_me_with_a_random_string" (kener). (github.com/rajnandan1/kener/blob/5bc658b/docker-compose.yml, checked 2026-10-22)
- The compose file publishes host ports. Host ports: 3000 (kener). A port without a host address listens on all host network interfaces. (github.com/rajnandan1/kener/blob/5bc658b/docker-compose.yml, checked 2026-10-22)
Signals
- Open issues and pull requests: 64
- Last push: 2026-10-22 (0 days before this page was built)
- Latest release: v4.1.8 on 2026-10-22 (0 days before this page was built)