# Kener

Status page generator that shows service uptime and incidents.

- Replaces: [Statuspage](https://openlogs.fyi/alternatives/statuspage)
- Summary: Paid status page services, such as Statuspage.
- Stack: TypeScript (language), Redis (database)
- Deployment: docker_compose
- License: MIT (osi) [source](https://github.com/rajnandan1/kener/blob/5bc658b771d44f48b61a514cfdb5037468c5aa36/LICENSE)
- Business model: unknown. The README at the pinned commit does not state a business model, so it stays unknown. ([source](https://github.com/rajnandan1/kener/blob/5bc658b771d44f48b61a514cfdb5037468c5aa36/README.md), read 2026-10-22)
- 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.
- Requirements: not stated
- Repository: [rajnandan1/kener](https://github.com/rajnandan1/kener)

## Install

1. Docker with the Compose plugin ([source](https://github.com/rajnandan1/kener/blob/5bc658b771d44f48b61a514cfdb5037468c5aa36/docker-compose.yml))

   ```text
   A host with Docker and the Docker Compose plugin. This entry runs from a compose file.
   ```

2. Save the compose file as docker-compose.yml ([source](https://github.com/rajnandan1/kener/blob/5bc658b771d44f48b61a514cfdb5037468c5aa36/docker-compose.yml))

   ```yaml
   # =============================================================================
   # 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
   ```

3. Set the values the compose file needs ([source](https://github.com/rajnandan1/kener/blob/5bc658b771d44f48b61a514cfdb5037468c5aa36/docker-compose.yml))

   ```text
   Replace the placeholder values listed under Gotchas.
   ```

4. Start it ([source](https://github.com/rajnandan1/kener/blob/5bc658b771d44f48b61a514cfdb5037468c5aa36/docker-compose.yml))

   ```bash
   docker compose up -d
   ```

5. Open the app ([source](https://github.com/rajnandan1/kener/blob/5bc658b771d44f48b61a514cfdb5037468c5aa36/docker-compose.yml))

   ```text
   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. ([source](https://github.com/rajnandan1/kener/blob/5bc658b771d44f48b61a514cfdb5037468c5aa36/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). ([source](https://github.com/rajnandan1/kener/blob/5bc658b771d44f48b61a514cfdb5037468c5aa36/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. ([source](https://github.com/rajnandan1/kener/blob/5bc658b771d44f48b61a514cfdb5037468c5aa36/docker-compose.yml), checked 2026-10-22)

### Signals

Computed from a GitHub snapshot taken 2026-10-22.

- Open issues and pull requests: 64
- Stars: 5212, forks: 311
- Last push: 2026-10-22 (0 days ago)
- Latest release: v4.1.8 on 2026-10-22 (0 days ago)

## Sources

- [Repository: https://github.com/rajnandan1/kener](https://github.com/rajnandan1/kener)
- [License: https://github.com/rajnandan1/kener/blob/5bc658b771d44f48b61a514cfdb5037468c5aa36/LICENSE](https://github.com/rajnandan1/kener/blob/5bc658b771d44f48b61a514cfdb5037468c5aa36/LICENSE)
- [Business model: https://github.com/rajnandan1/kener/blob/5bc658b771d44f48b61a514cfdb5037468c5aa36/README.md](https://github.com/rajnandan1/kener/blob/5bc658b771d44f48b61a514cfdb5037468c5aa36/README.md)
- [Compose file: https://github.com/rajnandan1/kener/blob/5bc658b771d44f48b61a514cfdb5037468c5aa36/docker-compose.yml](https://github.com/rajnandan1/kener/blob/5bc658b771d44f48b61a514cfdb5037468c5aa36/docker-compose.yml)

---
Canonical: https://openlogs.fyi/tools/kener  
Last updated: 2026-10-22
