kener

GitHub

Stunning status pages, batteries included!

AI Prompts & Endpoints
Agent Skills View CodeWiki Knowledge Base

Agents/Domain

Domain Docs

How the engineering skills should consume this repo's domain documentation when exploring the codebase.

This repo is configured as a single-context repo.

Before exploring, read these

- CONTEXT.md at the repo root.
- docs/adr/ β€” read ADRs that touch the area you're about to work in.

If any of these files don't exist, proceed silently. Don't flag their absence; don't suggest creating them upfront. The producer skill (/grill-with-docs) creates them lazily when terms or decisions actually get resolved.

File structure

Single-context repo:

text
/
β”œβ”€β”€ CONTEXT.md
β”œβ”€β”€ docs/adr/
β”‚ β”œβ”€β”€ 0001-event-sourced-orders.md
β”‚ └── 0002-postgres-for-write-model.md
└── src/

Use the glossary's vocabulary

When your output names a domain concept (in an issue title, a refactor proposal, a hypothesis, a test name), use the term as defined in CONTEXT.md. Don't drift to synonyms the glossary explicitly avoids.

If the concept you need isn't in the glossary yet, that's a signal β€” either you're inventing language the project doesn't use (reconsider) or there's a real gap (note it for /grill-with-docs).

Flag ADR conflicts

If your output contradicts an existing ADR, surface it explicitly rather than silently overriding:

_Contradicts ADR-0007 (event-sourced orders) β€” but worth reopening because…_

---

Agents/Issue Tracker

Issue tracker: GitHub

Issues and PRDs for this repo live as GitHub issues. Use the gh CLI for all operations.

Conventions

- Create an issue: gh issue create --title "..." --body "...". Use a heredoc for multi-line bodies.
- Read an issue: gh issue view <number> --comments, filtering comments by jq and also fetching labels.
- List issues: gh issue list --state open --json number,title,body,labels,comments --jq '[.[] | {number, title, body, labels: [.labels[].name], comments: [.comments[].body]}]' with appropriate --label and --state filters.
- Comment on an issue: gh issue comment <number> --body "..."
- Apply / remove labels: gh issue edit <number> --add-label "..." / --remove-label "..."
- Close: gh issue close <number> --comment "..."

Infer the repo from git remote -v β€” gh does this automatically when run inside a clone.

When a skill says "publish to the issue tracker"

Create a GitHub issue.

When a skill says "fetch the relevant ticket"

Run gh issue view <number> --comments.

---

Agents/Triage Labels

Triage Labels

The skills speak in terms of five canonical triage roles. This file maps those roles to the actual label strings used in this repo's issue tracker.

| Label in mattpocock/skills | Label in our tracker | Meaning |
| -------------------------- | -------------------- | ---------------------------------------- |
| needs-triage | needs-triage | Maintainer needs to evaluate this issue |
| needs-info | needs-info | Waiting on reporter for more information |
| ready-for-agent | ready-for-agent | Fully specified, ready for an AFK agent |
| ready-for-human | ready-for-human | Requires human implementation |
| wontfix | wontfix | Will not be actioned |

When a skill mentions a role (e.g. "apply the AFK-ready triage label"), use the corresponding label string from this table.

Edit the right-hand column to match whatever vocabulary you actually use.

---

README

Kener - Stunning Status Pages

<p align="center">
<img src="https://kener.ing/og.jpg?v=1" width="100%" height="auto" class="rounded-lg shadow-lg" alt="kener example illustration">
</p>

<p align="center">
<img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/rajnandan1/kener?label=Star%20Repo&style=social">
<a href="https://github.com/ivbeg/awesome-status-pages"><img src="https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg" alt="Awesome status page" /></a>
<a href="https://awesome-selfhosted.net/tags/status--uptime-pages.html#kener"><img src="https://awesome.re/mentioned-badge.svg" alt="Awesome self hosted" /></a>
</p>

<p align="center">
<a href="https://hub.docker.com/r/rajnandan1/kener"><img src="https://img.shields.io/docker/pulls/rajnandan1/kener" alt="Docker Kener" /></a>
<a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name=latest"><img alt="Docker Image Size" src="https://img.shields.io/docker/image-size/rajnandan1/kener/latest?logo=docker&logoColor=white&label=debian" /></a>
<a href="https://hub.docker.com/r/rajnandan1/kener/tags?page=1&ordering=last_updated&name=alpine"><img alt="Docker Image Size" src="https://img.shields.io/docker/image-size/rajnandan1/kener/alpine?logo=docker&logoColor=white&label=alpine" /></a>
</p>

<p align="center">
<a href="https://github.com/rajnandan1/kener/actions/workflows/publish-images.yml"><img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/rajnandan1/kener/publish-images.yml" /></a>
<a href="https://github.com/rajnandan1/kener/commit/HEAD"><img src="https://img.shields.io/github/last-commit/rajnandan1/kener/main" alt="" /></a>
<a href="https://github.com/rajnandan1/kener/issues"><img alt="GitHub issues" src="https://img.shields.io/github/issues/rajnandan1/kener.svg" /></a>
<a href="https://deepwiki.com/rajnandan1/kener"><img alt="Ask DeepWiki" src="https://deepwiki.com/badge.svg" /></a>
</p>

<p align="center">
<a href="https://www.producthunt.com/posts/kener-2" target="_blank">
<img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=kener-2&theme=light" alt="Kener on Product Hunt">
</a>
</p>

<p align="center">
<picture>
<source srcset="https://fonts.gstatic.com/s/e/notoemoji/latest/1f514/512.webp" type="image/webp">
<img src="https://fonts.gstatic.com/s/e/notoemoji/latest/1f514/512.gif" alt="πŸ””" width="32" height="32">
</picture>
<picture>
<source srcset="https://fonts.gstatic.com/s/e/notoemoji/latest/1f680/512.webp" type="image/webp">
<img src="https://fonts.gstatic.com/s/e/notoemoji/latest/1f680/512.gif" alt="πŸš€" width="32" height="32">
</picture>
<picture>
<source srcset="https://fonts.gstatic.com/s/e/notoemoji/latest/1f6a7/512.webp" type="image/webp">
<img src="https://fonts.gstatic.com/s/e/notoemoji/latest/1f6a7/512.gif" alt="🚧" width="32" height="32">
</picture>
</p>

| 🌍 Live Server | πŸŽ‰ Quick Start | πŸ—„ Documentation |
| ----------------------------------- | ----------------------------------------------------------------------- | -------------------------------------------------------------------------- |

<p align="center">

[](https://railway.com/deploy/spSvic?referralCode=1Pn7vs&utm_medium=integration&utm_source=template&utm_campaign=generic)
[](https://zeabur.com/templates/1YRTMI?referralCode=rajnandan1)
[](https://render.com/deploy?repo=https%3A%2F%2Fgithub.com%2Frajnandan1%2Fkener)

</p>

What is Kener?

Kener is a sleek and lightweight status page system built with SvelteKit and NodeJS. It’s not here to replace heavyweights like Datadog or Atlassian but rather to offer a simple, modern, and hassle-free way to set up a great-looking status page with minimal effort.

Designed with ease of use and customization in mind, Kener provides all the essential features you’d expect from a status pageβ€”without unnecessary complexity.

Why Kener?

βœ… &nbsp;Minimal overhead &ndash; Set up quickly with a clean, modern UI<br>
βœ… &nbsp;Customizable &ndash; Easily tailor it to match your brand<br>
βœ… &nbsp;Open-source & free &ndash; Because great tools should be accessible to everyone

What's in a Name?

β€œKener” is inspired by the Assamese word _β€œKene”_, meaning _β€œhow’s it going?”_. The _β€˜.ing’_ was added because, well… that domain was available. πŸ˜„

Quick Start

Get Kener running in minutes.

bash
git clone https://github.com/rajnandan1/kener.git
cd kener

Uses docker-compose.yml (includes Redis + Kener)


Set a strong KENER_SECRET_KEY and ORIGIN in docker-compose.yml before first run


docker compose up -d

Open http://localhost:3000.

IMPORTANT

Set a strong KENER_SECRET_KEY and set ORIGIN to your public URL before starting for the first time.

Use docker-compose.dev.yml when you want to build from local source instead of pulling the published image:

bash
docker compose -f docker-compose.dev.yml up -d --build

Or combine both files to keep base production config while overriding Kener with a local build:

bash
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d --build

Run pre-built image

You can use either image:

- docker.io/rajnandan1/kener:latest
- ghcr.io/rajnandan1/kener:latest

For subpath deployments (/status), use:

- docker.io/rajnandan1/kener:latest-status
- docker.io/rajnandan1/kener:latest-status-alpine
- ghcr.io/rajnandan1/kener:latest-status
- ghcr.io/rajnandan1/kener:latest-status-alpine

bash
mkdir -p database
docker run -d \
--name kener \
-p 3000:3000 \
-v "$(pwd)/database:/app/database" \
-e "KENER_SECRET_KEY=replace_with_a_random_string" \
-e "ORIGIN=http://localhost:3000" \
-e "REDIS_URL=redis://host.docker.internal:6379" \
docker.io/rajnandan1/kener:latest

Run pre-built subpath image (/status)

bash
mkdir -p database
docker run -d \
--name kener-status \
-p 3000:3000 \
-v "$(pwd)/database:/app/database" \
-e "KENER_SECRET_KEY=replace_with_a_random_string" \
-e "ORIGIN=http://localhost:3000" \
-e "KENER_BASE_PATH=/status" \
-e "REDIS_URL=redis://host.docker.internal:6379" \
docker.io/rajnandan1/kener:latest-status

NOTE

For subpath mode, keep ORIGIN as the site origin (http://localhost:3000), not http://localhost:3000/status.

Run without Docker

Requirements:

- Node.js >= 20
- Redis

bash
git clone https://github.com/rajnandan1/kener.git
cd kener
npm install

Start Redis (example)


docker run -d --name kener-redis -p 6379:6379 redis:7-alpine

npm run build
npm run start

Create a .env with at least:

dotenv
KENER_SECRET_KEY=replace_with_a_random_string
ORIGIN=http://localhost:3000
REDIS_URL=redis://localhost:6379
PORT=3000

For the full quick start (including local Docker builds and dev mode), see the docs:

- https://kener.ing/docs/v4/getting-started/quick-start

Features

Kener combines public status page essentials with advanced admin workflows.

πŸ“Š &nbsp;Monitoring, Reliability, and Communication

- Monitor API, Ping, TCP, DNS, SSL, SQL, Heartbeat, and GameDig checks
- Manage incidents with clear timelines, updates, and acknowledgements
- Schedule maintenance windows and keep users informed throughout
- Send notifications via Email, Webhook, Slack, and Discord
- Explore historical monitoring data and uptime trends

🎨 &nbsp;Status Page Experience and Branding

- Build branded, customizable status pages (logo, colors, CSS, themes)
- Support light/dark mode, localization, and timezone-aware display
- Embed status widgets and badges into external sites and portals
- Provide SEO-friendly public pages for global audiences

πŸ› οΈ &nbsp;Operations, Collaboration, and Automation

- Invite teams with role-based collaboration across workflows
- Manage multiple status pages from one Kener instance
- Use trigger-based workflows and template-driven messaging
- Manage API keys for secure integrations and automations
- Integrate analytics providers like GA, Plausible, Mixpanel, Umami, and Clarity
- Access the full REST API for incidents, monitors, and reporting

Technologies Used

- SvelteKit
- shadcn-svelte

Support Me

If you’re enjoying Kener and want to support its development, consider sponsoring me on GitHub or treating me to a coffee. Your support helps keep the project growing! πŸš€

- Sponsor Me Using GitHub

- Buy Me a Coffee

Contributing

If you want to contribute to Kener, please read the Contribution Guide.

Star History

[](https://star-history.com/#rajnandan1/kener&Date)

---