config: sync docker configs 2026-06-08T03:59:55Z

This commit is contained in:
Kenpat7177 2026-06-07 22:59:55 -05:00
parent 9b4d283e23
commit 38af27c7cb
199 changed files with 10640 additions and 92 deletions

View file

@ -0,0 +1,56 @@
services:
postgresql:
image: postgres:16-alpine
container_name: authentik-postgres
restart: unless-stopped
environment:
POSTGRES_PASSWORD: ${PG_PASS}
POSTGRES_USER: authentik
POSTGRES_DB: authentik
volumes:
- ./postgres:/var/lib/postgresql/data
redis:
image: redis:alpine
container_name: authentik-redis
restart: unless-stopped
authentik:
image: ghcr.io/goauthentik/server:latest
container_name: authentik
restart: unless-stopped
command: server
environment:
AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY}
AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: authentik
AUTHENTIK_POSTGRESQL__NAME: authentik
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
volumes:
- ./media:/media
- ./custom-templates:/templates
ports:
- "9001:9000"
depends_on:
- postgresql
- redis
authentik-worker:
image: ghcr.io/goauthentik/server:latest
container_name: authentik-worker
restart: unless-stopped
command: worker
environment:
AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY}
AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: authentik
AUTHENTIK_POSTGRESQL__NAME: authentik
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
volumes:
- ./media:/media
- ./custom-templates:/templates
depends_on:
- postgresql
- redis

View file

@ -0,0 +1,57 @@
services:
postgresql:
image: postgres:16-alpine
container_name: authentik-postgres
restart: unless-stopped
environment:
POSTGRES_PASSWORD: ${PG_PASS}
POSTGRES_USER: authentik
POSTGRES_DB: authentik
volumes:
- ./postgres:/var/lib/postgresql/data
redis:
image: redis:alpine
container_name: authentik-redis
restart: unless-stopped
authentik:
image: ghcr.io/goauthentik/server:latest
container_name: authentik
restart: unless-stopped
command: server
environment:
AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY}
AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: authentik
AUTHENTIK_POSTGRESQL__NAME: authentik
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
volumes:
- ./media:/media
- ./custom-templates:/templates
ports:
- "9001:9000"
depends_on:
- postgresql
- redis
authentik-worker:
image: ghcr.io/goauthentik/server:latest
container_name: authentik-worker
restart: unless-stopped
command: worker
environment:
AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY}
AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: authentik
AUTHENTIK_POSTGRESQL__NAME: authentik
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
volumes:
- ./media:/media
- ./custom-templates:/templates
depends_on:
- postgresql
- redis

View file

@ -0,0 +1,2 @@
01-nginx-site-confs-default
02-default-location

View file

@ -0,0 +1,23 @@
-----BEGIN CERTIFICATE-----
MIIDxzCCAq+gAwIBAgIUVt05s9wgylfcEPx3fQDn2e4dF3owDQYJKoZIhvcNAQEL
BQAwaDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMREwDwYDVQQHDAhDYXJsc2Jh
ZDEXMBUGA1UECgwOTGludXhzZXJ2ZXIuaW8xFDASBgNVBAsMC0xTSU8gU2VydmVy
MQowCAYDVQQDDAEqMB4XDTI2MDYwNTAwNDczMloXDTM2MDYwMjAwNDczMlowaDEL
MAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMREwDwYDVQQHDAhDYXJsc2JhZDEXMBUG
A1UECgwOTGludXhzZXJ2ZXIuaW8xFDASBgNVBAsMC0xTSU8gU2VydmVyMQowCAYD
VQQDDAEqMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAooBdmf0Nmewk
YIreTSqKgHJpj+C5uiYflmiQ7TBNrMCyeg7VrkDKlAIbrMsWDbdxbJ3gIWX/+WL9
iFG3SVwLwj3OLAdaPhLU8vodrjMkxkNFHk7CFNG53sEOU1WOskdwK3xtWUx3F6CD
tBJwWyIepdsiXiFoug6kgKZ7r7Koraqp7fW36iNztvW+V2DakF6F4ufSduzq1zTZ
mp+woGVPUVcI2UPoOuKLQqIt93GmHbmFqw1AKKZkbaoTxJHVnz56YfjmMn/ls+8s
ovLX8wR9zSp+ExwitrbD//zyWYt7GWmDZIuSB0pqb/ofXDSijiDiobM5UJ6bygv1
BAXXbyg0pwIDAQABo2kwZzAdBgNVHQ4EFgQUSWIeem3I7aV7kjCN9t2xKz9ayBEw
HwYDVR0jBBgwFoAUSWIeem3I7aV7kjCN9t2xKz9ayBEwDwYDVR0TAQH/BAUwAwEB
/zAUBgNVHREEDTALgglsb2NhbGhvc3QwDQYJKoZIhvcNAQELBQADggEBAIsbdBRB
sENi2gz8zRqL9oEwiZ6n02mvd/uYh0ReBxp5AAkRJ0v1vqhMtCi26lHA2FoUdUFS
aOKitgpXZn3oP5SqBVfxsE9WUTBP544H3lsUKnsQl06dBpKQCmXrnVedM6ktb33P
EpppqudyS+y+mNVLi9lM4bMqGxQRdze2y4p9+qNYHREczkPgMlEgujOKcd533YJ/
EbrwKgvYBWQeR0Rl0YnGS3j/mFXYYfsg4jpxHezX5tZRWT7FTtV8GpcchR97qvZH
Ax/cOIYmWF0KIkiW8qTmiMowwm2pEQLxOOxaLwPsICk6jf9kvPeHdu1+aMfvuZhc
MbvugyYpqDKGRCg=
-----END CERTIFICATE-----

View file

@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCigF2Z/Q2Z7CRg
it5NKoqAcmmP4Lm6Jh+WaJDtME2swLJ6DtWuQMqUAhusyxYNt3FsneAhZf/5Yv2I
UbdJXAvCPc4sB1o+EtTy+h2uMyTGQ0UeTsIU0bnewQ5TVY6yR3ArfG1ZTHcXoIO0
EnBbIh6l2yJeIWi6DqSApnuvsqitqqnt9bfqI3O29b5XYNqQXoXi59J27OrXNNma
n7CgZU9RVwjZQ+g64otCoi33caYduYWrDUAopmRtqhPEkdWfPnph+OYyf+Wz7yyi
8tfzBH3NKn4THCK2tsP//PJZi3sZaYNki5IHSmpv+h9cNKKOIOKhszlQnpvKC/UE
BddvKDSnAgMBAAECggEAFP1Bmc8+v3/p3vJw7kStaRPeILBlLO8Zq2LMPWa80bB+
HRfnb798qwtuqa39pj3oj6AAwC+dlYe8uavcYcRa3HcBN1ynwlbKXKwDw2lluZoc
xmJj3S6NtID5KbhmWw6xJVzH/v3KcCnSeSLckljg3olkcgYcsdOMWfWnCjWoZe3t
jZqwhHKn7tLUKvkcbsILGp5iM0Ff5fJeqfnCMOOAgpFpGdsLT0Ro3Hl3RGOGx29z
TBey3I2pKyaK4sC+Z444lmvPlSNA/+hXmn0CxncG1d6KqPSdVd4+rK3ubJLDM0l0
wzbzUFeCBWdWORpgJ5JirGD4Z24pU8g2zO75Rx3fiQKBgQDWa4Y0rheR3CPTE/g9
p8lT8RRGBxge50ldbw7au3+zt89AKVbZ0+PnllWgjgL/qx4bWvOJp9q9WUODhjVO
Qd+B3vlWtlLzBcs53KbVf49E6Ag4g3KvcJ4R7dHLlBNkvcqBwnHyR8WuBDNTWbr2
Yy6r5P6SXIB27W6ex1KyfCslKwKBgQDCA3D9ppWX9Wj6miJ/0cvJUSKL7wMu+Hhl
JTt8sL0KfuOzLU4/5jtkWXSxCqEWzGteWc7s5rIi/NILBJRxGPG7T/e6R3+n+iiu
T7qgoihl5gecw7sK3PzEAcJMd9TwCiD8Wcy7gGiRz/0Ajqju6fB7i5KqoYodqnTq
a1cM7ySodQKBgQC7e9klRvQk/a/1aIiuoH9RfoKTmLBmlSV5JRp/92J56ka1e3AN
l1C3tqO4d3P3yc/Ra3125+ZDmkGGR1tkygR8slKil1mAVZiVR3I5TAgh4CEQCR/G
d1o/owrGTvuGIs1nGHY5urgGqHWYc+Ueeyrb8qcFowxQ8NrAythsaFXxcQKBgQC/
qPKoQTaqxW8NkdLe/nwYxqQgJN+6OQ+Gq/9WMKqvgaajTPBuQ50Mhyq18tAsW4j9
zi6S7VuxIJzG8aFLEN9MsbUCOrurT398o5q0MT1DXLjMbreKBcFWSH6PWBntf7QS
VwvfdvzWfudq84ODcWt2QO2EzsxIfim9ooh+aIiIOQKBgErUJXO3Z6YqxpHjZka9
0zXRZaUHBTTTQTy014VUT69bKKgwYvaecKZlzgzlzj4wEAZuNmgWQfinGEfUezu8
VwL+a0BsWnQDMAK96FWGFfui55DmXp8Wo+pzIrSR7O0+GPnSr6B6RPjwEuFKziWX
v4HTdlayWFSvB+uArMUKowFP
-----END PRIVATE KEY-----

View file

@ -0,0 +1,3 @@
# This file is auto-generated only on first start, based on the container's /etc/resolv.conf file. Feel free to modify it as you wish.
resolver 127.0.0.11 valid=30s;

View file

@ -0,0 +1,46 @@
## Version 2025/12/26 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/3.23/root/defaults/nginx/site-confs/default.conf.sample
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
listen 443 quic reuseport default_server;
listen [::]:443 quic reuseport default_server;
server_name _;
include /config/nginx/ssl.conf;
set $root /app/www/public;
if (!-d /app/www/public) {
set $root /config/www;
}
root $root;
index index.html index.htm index.php;
location / {
# enable for basic auth
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
try_files $uri $uri/ /index.html /index.htm /index.php$is_args$args;
}
location ~ ^(.+\.php)(.*)$ {
# enable the next two lines for http auth
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
fastcgi_split_path_info ^(.+\.php)(.*)$;
if (!-f $document_root$fastcgi_script_name) { return 404; }
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
}
# deny access to .htaccess/.htpasswd files
location ~ /\.ht {
deny all;
}
}

View file

@ -0,0 +1,36 @@
## Version 2026/05/04 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/3.23/root/defaults/nginx/ssl.conf.sample
ssl_certificate /config/keys/cert.crt;
ssl_certificate_key /config/keys/cert.key;
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
#add_header Strict-Transport-Security "max-age=63072000" always;
### Mozilla SSL Configuration Generator
# generated 2026-05-04, Mozilla Guideline v6.0, nginx 1.28.3, OpenSSL 3.5.6, intermediate config, HSTS
# https://ssl-config.mozilla.org/#server=nginx&version=1.28.3&config=intermediate&openssl=3.5.6&hsts&guideline=6.0
# intermediate configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ecdh_curve X25519MLKEM768:X25519:prime256v1:secp384r1;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
# see also ssl_session_ticket_key alternative to stateful session cache
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
### Mozilla Practical security implementation
# https://developer.mozilla.org/en-US/docs/Web/Security
#add_header Access-Control-Allow-Origin $http_origin always;
#add_header Content-Security-Policy "upgrade-insecure-requests; base-uri 'self'; form-action 'self'; frame-ancestors 'self';" always;
#add_header Cross-Origin-Resource-Policy "same-origin" always;
#add_header Referrer-Policy "same-origin" always;
#add_header X-Content-Type-Options "nosniff" always;
#add_header X-Frame-Options "SAMEORIGIN" always;
### Optional additional headers
#add_header Alt-Svc 'h3=":443"' always;
#add_header Cache-Control "no-transform" always;
#add_header Permissions-Policy "interest-cohort=()" always;
#add_header X-UA-Compatible "IE=Edge" always;
#add_header X-XSS-Protection "1; mode=block" always;

View file

@ -0,0 +1,3 @@
# This file is auto-generated only on first start, based on the cpu cores detected. Feel free to change it to any other number or to auto to let nginx handle it automatically.
worker_processes 8;

View file

@ -0,0 +1,3 @@
; Edit this file to override php.ini directives
date.timezone = America/Chicago

View file

@ -0,0 +1,5 @@
; Edit this file to override www.conf and php-fpm.conf directives and restart the container
; Pool name
[www]

View file

@ -0,0 +1,34 @@
<html>
<head>
<title>Welcome to our server</title>
<style>
body{
font-family: Helvetica, Arial, sans-serif;
}
.message{
width:330px;
padding:20px 40px;
margin:0 auto;
background-color:#f9f9f9;
border:1px solid #ddd;
}
center{
margin:40px 0;
}
h1{
font-size: 18px;
line-height: 26px;
}
p{
font-size: 12px;
}
</style>
</head>
<body>
<div class="message">
<h1>Welcome to our server</h1>
<p>The website is currently being setup under this address.</p>
<p>For help and support, please contact: <a href="me@example.com">me@example.com</a></p>
</div>
</body>
</html>

View file

@ -0,0 +1 @@
11.8.8-MariaDB

View file

@ -0,0 +1,33 @@
services:
bookstack:
image: lscr.io/linuxserver/bookstack:latest
container_name: bookstack
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=America/Chicago
- APP_URL=http://192.168.1.205:6875
- DB_HOST=bookstack-db
- DB_PORT=3306
- DB_USERNAME=bookstack
- DB_PASSWORD=bookstackpassword
- DB_DATABASE=bookstackapp
volumes:
- ./bookstack:/config
ports:
- "6875:80"
depends_on:
- bookstack-db
bookstack-db:
image: mariadb:11
container_name: bookstack-db
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=supersecretrootpassword
- MYSQL_DATABASE=bookstackapp
- MYSQL_USER=bookstack
- MYSQL_PASSWORD=bookstackpassword
volumes:
- ./db:/var/lib/mysql

View file

@ -0,0 +1,15 @@
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
command: tunnel --no-autoupdate run
environment:
- TUNNEL_TOKEN=eyJhIjoiZDBiYjc2NzMzMzNmY2Q3OTQ2MjI5NTZmMTY2MmY3ODUiLCJ0IjoiNWU2MGVhOGUtYTU0My00OWI2LWJhYjUtMzI1ZjM5NDQxZTAwIiwicyI6IkJyR3NreXdTSEFjQllobk9IcWFBZWJhT2djRUU0cjVSMXcwKzVGeTkrUHc9In0=
networks:
- default
- kitestacks
networks:
kitestacks:
external: true

View file

@ -0,0 +1,9 @@
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
command: tunnel --no-autoupdate run
environment:
- TUNNEL_TOKEN=eyJhIjoiZDBiYjc2NzMzMzNmY2Q3OTQ2MjI5NTZmMTY2MmY3ODUiLCJ0IjoiNWU2MGVhOGUtYTU0My00OWI2LWJhYjUtMzI1ZjM5NDQxZTAwIiwicyI6Ik1ESTBPVEV5WVRNdFl6WmlOaTAwWTJNeUxUa3pPRE10T1RRME1tTmlOV1ZsTVRZNCJ9

View file

@ -0,0 +1,12 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: kitestacks-scripts
namespace: monitoring
data:
kitestacks_check.py: |
# Paste the full contents of your kitestacks_check.py script here
# Example:
# import requests
# from datetime import datetime
# ...

24
apps/forgejo/cronjob.yaml Normal file
View file

@ -0,0 +1,24 @@
apiVersion: batch/v1
kind: CronJob
metadata:
name: kitestacks-widget-check
namespace: monitoring
spec:
schedule: "0 * * * *" # every hour
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
containers:
- name: kitestacks-check
image: python:3.12-slim
command: ["python3", "/scripts/kitestacks_check.py"]
volumeMounts:
- name: scripts
mountPath: /scripts
restartPolicy: OnFailure
volumes:
- name: scripts
configMap:
name: kitestacks-scripts

View file

@ -0,0 +1,17 @@
services:
forgejo:
image: codeberg.org/forgejo/forgejo:11
container_name: forgejo
restart: unless-stopped
ports:
- "3006:3000"
- "2222:22"
environment:
- USER_UID=1000
- USER_GID=1000
- FORGEJO__server__DOMAIN=192.168.1.205
- FORGEJO__server__ROOT_URL=http://192.168.1.205:3006
- FORGEJO__server__SSH_DOMAIN=192.168.1.205
- FORGEJO__server__SSH_PORT=2222
volumes:
- ./data:/data

View file

@ -0,0 +1,12 @@
apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: GitRepository
metadata:
name: kitestacks-cron
namespace: flux-system
spec:
interval: 1m
url: https://gitforge.kitestacks.com/kenpat/kitestacks-homelab.git
ref:
branch: master
secretRef:
name: forgejo-access # Only needed if repo is private

View file

@ -0,0 +1,17 @@
apiVersion: batch/v1
kind: CronJob
metadata:
name: kitestacks-widget-check
namespace: monitoring
spec:
schedule: "0 * * * *" # every hour
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
containers:
- name: kitestacks-check
image: yourdockerhubuser/kitestacks-check:latest
imagePullPolicy: Always
restartPolicy: OnFailure

View file

View file

View file

View file

@ -0,0 +1,147 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: kitestacks-monitors
namespace: monitoring
data:
monitors.json: [
{
"name": "Open Web UI",
"type": "http",
"method": "GET",
"url": "https://www.kitestacks.com",
"interval": 60,
"retries": 3
},
{
"name": "Auth",
"type": "http",
"method": "GET",
"url": "https://auth.kitestacks.com",
"interval": 60,
"retries": 3
},
{
"name": "Kavita",
"type": "http",
"method": "GET",
"url": "http://kavita.kitestacks.com:5000",
"interval": 60,
"retries": 3
},
{
"name": "Tasks",
"type": "http",
"method": "GET",
"url": "http://tasks.kitestacks.com:8080",
"interval": 60,
"retries": 3
},
{
"name": "AI",
"type": "http",
"method": "GET",
"url": "http://ai.kitestacks.com:3100",
"interval": 60,
"retries": 3
},
{
"name": "Forgejo",
"type": "http",
"method": "GET",
"url": "http://gitforge.kitestacks.com:3006",
"interval": 60,
"retries": 3
},
{
"name": "Linkding",
"type": "http",
"method": "GET",
"url": "http://links.kitestacks.com:9005",
"interval": 60,
"retries": 3
},
{
"name": "Grafana",
"type": "http",
"method": "GET",
"url": "http://grafana.kitestacks.com:3150",
"interval": 60,
"retries": 3
},
{
"name": "OpenProject",
"type": "http",
"method": "GET",
"url": "http://openproject.kitestacks.com:8080",
"interval": 60,
"retries": 3
},
{
"name": "Prometheus",
"type": "tcp",
"host": "prometheus.kitestacks.com",
"port": 9090,
"interval": 60,
"retries": 3
},
{
"name": "Node Exporter",
"type": "tcp",
"host": "node-exporter.kitestacks.com",
"port": 9100,
"interval": 60,
"retries": 3
},
{
"name": "Pixel 4",
"type": "ping",
"host": "192.168.1.201",
"interval": 60,
"retries": 3
},
{
"name": "Lenovo T14",
"type": "ping",
"host": "192.168.1.205",
"interval": 60,
"retries": 3
},
{
"name": "Lenovo T14s",
"type": "ping",
"host": "192.168.1.206",
"interval": 60,
"retries": 3
},
{
"name": "Gaming Desktop",
"type": "ping",
"host": "192.168.1.207",
"interval": 60,
"retries": 3
},
{
"name": "Tesla Model Y",
"type": "ping",
"host": "192.168.1.208",
"interval": 60,
"retries": 3
},
{
"name": "Mom's HP Laptop",
"type": "ping",
"host": "192.168.1.209",
"interval": 60,
"retries": 3
},
{
"name": "Uptime Kuma",
"type": "http",
"method": "GET",
"url": "https://status.kitestacks.com",
"interval": 60,
"retries": 3
}
]

View file

@ -0,0 +1,13 @@
apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: GitRepository
metadata:
name: uptime-kuma-repo
namespace: flux-system
spec:
interval: 1m
url: https://gitforge.kitestacks.com/kenpat/docker
ref:
branch: master
secretRef:
name: forgejo-access

View file

@ -0,0 +1,172 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: kitestacks-monitors
namespace: monitoring
data:
monitors.json: |
[
{
"name": "Open Web UI",
"type": "http",
"method": "GET",
"url": "https://www.kitestacks.com",
"interval": 60,
"retries": 3
},
{
"name": "Auth",
"type": "http",
"method": "GET",
"url": "https://auth.kitestacks.com",
"interval": 60,
"retries": 3
},
{
"name": "Kavita",
"type": "http",
"method": "GET",
"url": "http://kavita.kitestacks.com:5000",
"interval": 60,
"retries": 3
},
{
"name": "Tasks",
"type": "http",
"method": "GET",
"url": "http://tasks.kitestacks.com:8080",
"interval": 60,
"retries": 3
},
{
"name": "AI",
"type": "http",
"method": "GET",
"url": "http://ai.kitestacks.com:3100",
"interval": 60,
"retries": 3
},
{
"name": "Forgejo",
"type": "http",
"method": "GET",
"url": "http://gitforge.kitestacks.com:3006",
"interval": 60,
"retries": 3
},
{
"name": "Linkding",
"type": "http",
"method": "GET",
"url": "http://links.kitestacks.com:9005",
"interval": 60,
"retries": 3
},
{
"name": "Grafana",
"type": "http",
"method": "GET",
"url": "http://grafana.kitestacks.com:3150",
"interval": 60,
"retries": 3
},
{
"name": "OpenProject",
"type": "http",
"method": "GET",
"url": "http://openproject.kitestacks.com:8080",
"interval": 60,
"retries": 3
},
{
"name": "Prometheus",
"type": "tcp",
"host": "prometheus.kitestacks.com",
"port": 9090,
"interval": 60,
"retries": 3
},
{
"name": "Node Exporter",
"type": "tcp",
"host": "node-exporter.kitestacks.com",
"port": 9100,
"interval": 60,
"retries": 3
},
{
"name": "Pixel 4",
"type": "ping",
"host": "192.168.1.201",
"interval": 60,
"retries": 3
},
{
"name": "Lenovo T14",
"type": "ping",
"host": "192.168.1.205",
"interval": 60,
"retries": 3
},
{
"name": "Lenovo T14s",
"type": "ping",
"host": "192.168.1.206",
"interval": 60,
"retries": 3
},
{
"name": "Gaming Desktop",
"type": "ping",
"host": "192.168.1.207",
"interval": 60,
"retries": 3
},
{
"name": "Tesla Model Y",
"type": "ping",
"host": "192.168.1.208",
"interval": 60,
"retries": 3
},
{
"name": "Mom's HP Laptop",
"type": "ping",
"host": "192.168.1.209",
"interval": 60,
"retries": 3
},
{
"name": "Uptime Kuma",
"type": "http",
"method": "GET",
"url": "https://status.kitestacks.com",
"interval": 60,
"retries": 3
}
]
---
apiVersion: batch/v1
kind: CronJob
metadata:
name: kitestacks-monitors-check
namespace: monitoring
spec:
schedule: "*/5 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: monitor-check
image: python:3.12-slim
command: ["python3", "/scripts/kitestacks_check.py"]
volumeMounts:
- name: monitors
mountPath: /scripts
restartPolicy: OnFailure
volumes:
- name: monitors
configMap:
name: kitestacks-monitors

View file

@ -0,0 +1,140 @@
[
{
"name": "Open Web UI",
"type": "http",
"method": "GET",
"url": "https://www.kitestacks.com",
"interval": 60,
"retries": 3
},
{
"name": "Auth",
"type": "http",
"method": "GET",
"url": "https://auth.kitestacks.com",
"interval": 60,
"retries": 3
},
{
"name": "Kavita",
"type": "http",
"method": "GET",
"url": "http://kavita.kitestacks.com:5000",
"interval": 60,
"retries": 3
},
{
"name": "Tasks",
"type": "http",
"method": "GET",
"url": "http://tasks.kitestacks.com:8080",
"interval": 60,
"retries": 3
},
{
"name": "AI",
"type": "http",
"method": "GET",
"url": "http://ai.kitestacks.com:3100",
"interval": 60,
"retries": 3
},
{
"name": "Forgejo",
"type": "http",
"method": "GET",
"url": "http://gitforge.kitestacks.com:3006",
"interval": 60,
"retries": 3
},
{
"name": "Linkding",
"type": "http",
"method": "GET",
"url": "http://links.kitestacks.com:9005",
"interval": 60,
"retries": 3
},
{
"name": "Grafana",
"type": "http",
"method": "GET",
"url": "http://grafana.kitestacks.com:3150",
"interval": 60,
"retries": 3
},
{
"name": "OpenProject",
"type": "http",
"method": "GET",
"url": "http://openproject.kitestacks.com:8080",
"interval": 60,
"retries": 3
},
{
"name": "Prometheus",
"type": "tcp",
"host": "prometheus.kitestacks.com",
"port": 9090,
"interval": 60,
"retries": 3
},
{
"name": "Node Exporter",
"type": "tcp",
"host": "node-exporter.kitestacks.com",
"port": 9100,
"interval": 60,
"retries": 3
},
{
"name": "Pixel 4",
"type": "ping",
"host": "192.168.1.201",
"interval": 60,
"retries": 3
},
{
"name": "Lenovo T14",
"type": "ping",
"host": "192.168.1.205",
"interval": 60,
"retries": 3
},
{
"name": "Lenovo T14s",
"type": "ping",
"host": "192.168.1.206",
"interval": 60,
"retries": 3
},
{
"name": "Gaming Desktop",
"type": "ping",
"host": "192.168.1.207",
"interval": 60,
"retries": 3
},
{
"name": "Tesla Model Y",
"type": "ping",
"host": "192.168.1.208",
"interval": 60,
"retries": 3
},
{
"name": "Mom's HP Laptop",
"type": "ping",
"host": "192.168.1.209",
"interval": 60,
"retries": 3
},
{
"name": "Uptime Kuma",
"type": "http",
"method": "GET",
"url": "https://status.kitestacks.com",
"interval": 60,
"retries": 3
}
]

View file

@ -0,0 +1,32 @@
#!/usr/bin/env python3
import json
import requests
import subprocess
# Load the monitors JSON
with open("/scripts/kitestacks-monitors.json", "r") as f:
monitors = json.load(f)
for monitor in monitors:
name = monitor.get("name")
mtype = monitor.get("type")
try:
if mtype == "http":
url = monitor.get("url")
method = monitor.get("method", "GET").upper()
resp = requests.request(method, url, timeout=10, verify=False)
print(f"[{name}] HTTP {method} {url} -> Status {resp.status_code}")
elif mtype == "tcp":
host = monitor.get("host")
port = monitor.get("port")
result = subprocess.run(["nc", "-zvw3", host, str(port)], capture_output=True)
print(f"[{name}] TCP {host}:{port} -> Returncode {result.returncode}")
elif mtype == "ping":
host = monitor.get("host")
result = subprocess.run(["ping", "-c", "1", host], capture_output=True)
print(f"[{name}] Ping {host} -> Returncode {result.returncode}")
else:
print(f"[{name}] Unknown type: {mtype}")
except Exception as e:
print(f"[{name}] Error: {e}")

View file

View file

@ -0,0 +1,59 @@
apiVersion: v1
kind: Namespace
metadata:
name: monitoring
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: uptime-kuma-pvc
namespace: monitoring
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: uptime-kuma
namespace: monitoring
spec:
replicas: 1
selector:
matchLabels:
app: uptime-kuma
template:
metadata:
labels:
app: uptime-kuma
spec:
containers:
- name: uptime-kuma
image: louislam/uptime-kuma:latest
ports:
- containerPort: 3001
volumeMounts:
- name: kuma-data
mountPath: /app/data
volumes:
- name: kuma-data
persistentVolumeClaim:
claimName: uptime-kuma-pvc
---
apiVersion: v1
kind: Service
metadata:
name: uptime-kuma
namespace: monitoring
spec:
type: NodePort
selector:
app: uptime-kuma
ports:
- protocol: TCP
port: 3001
targetPort: 3001

View file

@ -0,0 +1,24 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: uptime-kuma-ingress
namespace: monitoring
annotations:
kubernetes.io/ingress.class: nginx # or your ingress controller name
cert-manager.io/cluster-issuer: letsencrypt-prod # if using cert-manager for TLS
spec:
rules:
- host: status.kitestacks.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: uptime-kuma
port:
number: 3001
tls:
- hosts:
- status.kitestacks.com
secretName: uptime-kuma-tls

View file

@ -0,0 +1,7 @@
services:
grafana:
image: grafana/grafana-oss
container_name: grafana
ports:
- "3150:3000" # host:container
restart: unless-stopped

View file

@ -0,0 +1,19 @@
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-grafana-ingress
namespace: monitoring
spec:
podSelector:
matchLabels:
app.kubernetes.io/name: grafana
policyTypes:
- Ingress
ingress:
- from:
- ipBlock:
cidr: 192.168.1.0/24 # replace with your LAN subnet
ports:
- protocol: TCP
port: 3000

View file

View file

@ -0,0 +1,13 @@
# Use Node.js Alpine base
FROM node:20-alpine
WORKDIR /app
# Copy all homepage files
COPY . /app
# Expose port for the homepage
EXPOSE 8080
# Start the homepage (adjust if your entry point is different)
CMD ["node", "server.js"]

View file

@ -0,0 +1,6 @@
- Social:
- Discord:
- abbr:
href: https://discord.gg/QbdveTb6Kw

View file

@ -0,0 +1,10 @@
---
# For configuration options and examples, please see:
# https://gethomepage.dev/configs/docker/
# my-docker:
# host: 127.0.0.1
# port: 2375
# my-docker:
# socket: /var/run/docker.sock

View file

@ -0,0 +1,2 @@
---
# sample kubernetes config

View file

@ -0,0 +1,5 @@
---
# pve:
# url: https://proxmox.host.or.ip:8006
# token: username@pam!Token ID
# secret: secret

View file

@ -0,0 +1,90 @@
- Infrastructure:
- Portainer:
icon: portainer.png
href: https://portainer.kitestacks.com
description: Docker Management
- Authentik:
icon: authentik.png
href: https://auth.kitestacks.com
description: Identity Provider
- Cloudflare:
icon: cloudflare.png
href: https://dash.cloudflare.com
description: DNS & Tunnel Management
- Uptime Kuma:
icon: uptime-kuma.png
href: https://status.kitestacks.com
description: Uptime Monitoring
- AI:
- Kite AI:
icon: open-webui.png
href: https://ai.kitestacks.com
description: Private AI Workspace
- LiteLLM:
icon: si-openai
href: https://llm.kitestacks.com
description: AI Model Gateway
- OpenRouter:
icon: si-openai
href: https://openrouter.ai
description: Hosted AI Models
- Library:
- Kavita:
icon: kavita.png
href: https://kavita.kitestacks.com
description: Books, Comics & PDFs
- Linkding:
icon: linkding.png
href: https://links.kitestacks.com
description: Bookmark Library
- Code:
- Forgejo:
icon: forgejo.png
href: https://gitforge.kitestacks.com
description: Self-Hosted Git
- TicketSystem:
- OpenProject:
icon: openproject.png
href: https://tasks.kitestacks.com
description: Project Management
- Monitoring:
- Grafana:
icon: grafana.png
href: http://192.168.1.205:3150
description: Monitoring Dashboards
- Prometheus:
icon: prometheus.png
href: http://192.168.1.205:9090
description: Metrics Database
- Node Exporter:
icon: prometheus.png
href: http://192.168.1.205:9100
description: Host Metrics
- Future Projects:
- Kubernetes:
icon: kubernetes.png
href: https://kubernetes.io
description: Cluster Platform
- FluxCD:
icon: flux-cd.png
href: https://fluxcd.io
description: GitOps Automation
- Cilium:
icon: cilium.png
href: https://cilium.io
description: eBPF Networking
- CloudNativePG:
icon: postgresql.png
href: https://cloudnative-pg.io
description: PostgreSQL Operator
- Social:
- Discord:
icon: discord.png
href: https://discord.gg
description: Discord

View file

@ -0,0 +1,90 @@
- Infrastructure:
- Portainer:
icon: portainer.png
href: https://portainer.kitestacks.com
description: Docker Management
- Authentik:
icon: authentik.png
href: https://auth.kitestacks.com
description: Identity Provider
- Cloudflare:
icon: cloudflare.png
href: https://dash.cloudflare.com
description: DNS & Tunnel Management
- Uptime Kuma:
icon: uptime-kuma.png
href: https://status.kitestacks.com
description: Uptime Monitoring
- AI:
- Kite AI:
icon: open-webui.png
href: https://ai.kitestacks.com
description: Private AI Workspace
- LiteLLM:
icon: si-openai
href: https://llm.kitestacks.com
description: AI Model Gateway
- OpenRouter:
icon: si-openai
href: https://openrouter.ai
description: Hosted AI Models
- Library:
- Kavita:
icon: kavita.png
href: https://kavita.kitestacks.com
description: Books, Comics & PDFs
- Shaarli:
icon: shaarli.png
href: https://links.kitestacks.com
description: Bookmark Library
- Code:
- Forgejo:
icon: forgejo.png
href: https://gitforge.kitestacks.com
description: Self-Hosted Git
- TicketSystem:
- OpenProject:
icon: openproject.png
href: https://tasks.kitestacks.com
description: Project Management
- Monitoring:
- Grafana:
icon: grafana.png
href: http://192.168.1.205:3150
description: Monitoring Dashboards
- Prometheus:
icon: prometheus.png
href: http://192.168.1.205:9090
description: Metrics Database
- Node Exporter:
icon: prometheus.png
href: http://192.168.1.205:9100
description: Host Metrics
- Future Projects:
- Kubernetes:
icon: kubernetes.png
href: https://kubernetes.io
description: Cluster Platform
- FluxCD:
icon: flux-cd.png
href: https://fluxcd.io
description: GitOps Automation
- Cilium:
icon: cilium.png
href: https://cilium.io
description: eBPF Networking
- CloudNativePG:
icon: postgresql.png
href: https://cloudnative-pg.io
description: PostgreSQL Operator
- Social:
- Discord:
icon: discord.png
href: https://discord.gg
description: Discord

View file

@ -0,0 +1,32 @@
---
title: KiteStacks.AO
theme: dark
color: slate
headerStyle: boxed
hideVersion: true
useEqualHeights: true
layout:
Infrastructure:
style: row
columns: 1
Library:
style: row
columns: 1
Code:
style: row
columns: 1
Projects:
style: row
columns: 1
Monitoring:
style: row
columns: 2
Social:
style: row
columns: 1

View file

@ -0,0 +1,32 @@
---
title: KiteStacks.AO
theme: dark
color: slate
headerStyle: boxed
hideVersion: true
useEqualHeights: true
layout:
Infrastructure:
style: row
columns: 1
Library:
style: row
columns: 1
Code:
style: row
columns: 1
Projects:
style: row
columns: 1
Monitoring:
style: row
columns: 2
Social:
style: row
columns: 1

View file

@ -0,0 +1,24 @@
---
- resources:
label: System
cpu: true
memory: true
disk: /
- datetime:
text_size: xl
format:
dateStyle: full
timeStyle: short
- openmeteo:
label: Wheaton
latitude: 41.8661
longitude: -88.1065
timezone: America/Chicago
units: imperial
cache: 5
- search:
provider: google
target: _blank

View file

@ -0,0 +1,24 @@
---
- resources:
label: System
cpu: true
memory: true
disk: /
- datetime:
text_size: xl
format:
dateStyle: full
timeStyle: short
- openmeteo:
label: Wheaton
latitude: 41.8661
longitude: -88.1065
timezone: America/Chicago
units: imperial
cache: 5
- search:
provider: google
target: _blank

View file

@ -0,0 +1,6 @@
- Social:
- Discord:
- abbr:
href: https://discord.gg/QbdveTb6Kw

View file

@ -0,0 +1,91 @@
/* ==========================================================
KITESTACKS CYBERPUNK TEST THEME
TEST ONLY
========================================================== */
/* Background */
body {
background: url("/images/cyberpunk-bg.png") center center fixed !important;
background-size: cover !important;
}
/* Remove old injected banner */
body::before,
body::after {
display: none !important;
content: none !important;
}
/* Dark overlay for readability */
body::selection {
background: rgba(56,189,248,0.35);
}
/* Main containers */
div[class*="service"],
div[class*="widget"],
.card,
.service-card {
background: rgba(7,15,30,0.72) !important;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
border: 1px solid rgba(56,189,248,0.25) !important;
border-radius: 18px !important;
box-shadow:
0 0 15px rgba(56,189,248,0.08),
0 0 30px rgba(56,189,248,0.05) !important;
}
/* Section headers */
h2 {
color: #dbeafe !important;
font-weight: 700 !important;
letter-spacing: 0.03em !important;
text-shadow:
0 0 8px rgba(56,189,248,0.45);
}
/* Search box */
input[type="text"] {
background: rgba(5,10,20,0.75) !important;
border: 1px solid rgba(56,189,248,0.35) !important;
border-radius: 14px !important;
}
/* Widget row */
div[class*="widget"] {
border-radius: 18px !important;
}
/* Hover effects */
a:hover .service-card,
.service-card:hover,
.card:hover {
transform: translateY(-2px);
box-shadow:
0 0 15px rgba(56,189,248,0.25),
0 0 35px rgba(56,189,248,0.18) !important;
transition: all .2s ease;
}
/* Footer */
footer {
backdrop-filter: blur(8px);
}
/* Slightly dim the background for readability */
body::after {
content: "";
position: fixed;
inset: 0;
background: rgba(0,0,20,0.45);
pointer-events: none;
z-index: -1;
}
EOF

View file

@ -0,0 +1,31 @@
body::before {
content: "";
display: block;
height: 155px;
margin: 24px 38px 10px 38px;
background-image: url("/images/kitestacks-logo.png");
background-repeat: no-repeat;
background-position: left center;
background-size: 360px auto;
border-bottom: 2px solid rgba(56, 189, 248, 0.75);
}
body::after {
content: "Personal Infrastructure Platform";
position: absolute;
top: 128px;
left: 185px;
font-size: 15px;
letter-spacing: 0.18em;
text-transform: uppercase;
color: rgba(203, 213, 225, 0.75);
}
.service-card,
div[class*="service"] {
border-radius: 14px !important;
}
h2 {
letter-spacing: -0.02em;
}

View file

@ -0,0 +1,10 @@
---
# For configuration options and examples, please see:
# https://gethomepage.dev/configs/docker/
# my-docker:
# host: 127.0.0.1
# port: 2375
# my-docker:
# socket: /var/run/docker.sock

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

View file

@ -0,0 +1,2 @@
---
# sample kubernetes config

View file

@ -0,0 +1,5 @@
---
# pve:
# url: https://proxmox.host.or.ip:8006
# token: username@pam!Token ID
# secret: secret

View file

@ -0,0 +1,90 @@
- Infrastructure:
- Portainer:
icon: portainer.png
href: https://portainer.kitestacks.com
description: Docker Management
- Authentik:
icon: authentik.png
href: https://auth.kitestacks.com
description: Identity Provider
- Cloudflare:
icon: cloudflare.png
href: https://dash.cloudflare.com
description: DNS & Tunnel Management
- Uptime Kuma:
icon: uptime-kuma.png
href: https://status.kitestacks.com
description: Uptime Monitoring
- AI:
- Kite AI:
icon: open-webui.png
href: https://ai.kitestacks.com
description: Private AI Workspace
- LiteLLM:
icon: si-openai
href: https://llm.kitestacks.com
description: AI Model Gateway
- OpenRouter:
icon: si-openai
href: https://openrouter.ai
description: Hosted AI Models
- Library:
- Kavita:
icon: kavita.png
href: https://kavita.kitestacks.com
description: Books, Comics & PDFs
- Linkding:
icon: linkding.png
href: https://links.kitestacks.com
description: Bookmark Library
- Code:
- Forgejo:
icon: forgejo.png
href: https://gitforge.kitestacks.com
description: Self-Hosted Git
- TicketSystem:
- OpenProject:
icon: openproject.png
href: https://tasks.kitestacks.com
description: Project Management
- Monitoring:
- Grafana:
icon: grafana.png
href: http://192.168.1.205:3150
description: Monitoring Dashboards
- Prometheus:
icon: prometheus.png
href: http://192.168.1.205:9090
description: Metrics Database
- Node Exporter:
icon: prometheus.png
href: http://192.168.1.205:9100
description: Host Metrics
- Future Projects:
- Kubernetes:
icon: kubernetes.png
href: https://kubernetes.io
description: Cluster Platform
- FluxCD:
icon: flux-cd.png
href: https://fluxcd.io
description: GitOps Automation
- Cilium:
icon: cilium.png
href: https://cilium.io
description: eBPF Networking
- CloudNativePG:
icon: postgresql.png
href: https://cloudnative-pg.io
description: PostgreSQL Operator
- Social:
- Discord:
icon: discord.png
href: https://discord.gg
description: Discord

View file

@ -0,0 +1,89 @@
- Infrastructure:
- Portainer:
icon: portainer.png
href: https://portainer.kitestacks.com
description: Docker Management
- Authentik:
icon: authentik.png
href: https://auth.kitestacks.com
description: Identity & Access
- Cloudflare:
icon: cloudflare.png
href: https://dash.cloudflare.com
description: DNS & Tunnel Control
- Uptime Kuma:
icon: uptime-kuma.png
href: https://status.kitestacks.com
description: Service Health
- Monitoring:
- Grafana:
icon: grafana.png
href: http://192.168.1.205:3150
description: Dashboards & Metrics
- Prometheus:
icon: prometheus.png
href: http://192.168.1.205:9090
description: Metrics Database
- Node Exporter:
icon: prometheus.png
href: http://192.168.1.205:9100
description: Host Telemetry
- AI & Automation:
- Kite AI:
icon: open-webui.png
href: https://ai.kitestacks.com
description: Private AI Workspace
- LiteLLM:
icon: si-openai
href: https://llm.kitestacks.com
description: Model Gateway
- OpenRouter:
icon: si-openai
href: https://openrouter.ai
description: Hosted AI Models
- Knowledge Base:
- Kavita:
icon: kavita.png
href: https://kavita.kitestacks.com
description: Books, Comics & PDFs
- Shaarli:
icon: shaarli.png
href: https://links.kitestacks.com
description: Bookmark Library
- Development:
- Forgejo:
icon: forgejo.png
href: https://gitforge.kitestacks.com
description: Self-Hosted Git
- OpenProject:
icon: openproject.png
href: https://tasks.kitestacks.com
description: Project Management
- Community:
- Discord:
icon: discord.png
href: https://discord.gg
description: Community Hub
- Future Projects:
- Kubernetes:
icon: kubernetes.png
href: https://kubernetes.io
description: Coming Soon
- FluxCD:
icon: flux-cd.png
href: https://fluxcd.io
description: Coming Soon
- Cilium:
icon: cilium.png
href: https://cilium.io
description: Coming Soon
- CloudNativePG:
icon: postgresql.png
href: https://cloudnative-pg.io
description: Coming Soon

View file

@ -0,0 +1,90 @@
- Infrastructure:
- Portainer:
icon: portainer.png
href: https://portainer.kitestacks.com
description: Docker Management
- Authentik:
icon: authentik.png
href: https://auth.kitestacks.com
description: Identity Provider
- Cloudflare:
icon: cloudflare.png
href: https://dash.cloudflare.com
description: DNS & Tunnel Management
- Uptime Kuma:
icon: uptime-kuma.png
href: https://status.kitestacks.com
description: Uptime Monitoring
- AI:
- Kite AI:
icon: open-webui.png
href: https://ai.kitestacks.com
description: Private AI Workspace
- LiteLLM:
icon: si-openai
href: https://llm.kitestacks.com
description: AI Model Gateway
- OpenRouter:
icon: si-openai
href: https://openrouter.ai
description: Hosted AI Models
- Library:
- Kavita:
icon: kavita.png
href: https://kavita.kitestacks.com
description: Books, Comics & PDFs
- Shaarli:
icon: shaarli.png
href: https://links.kitestacks.com
description: Bookmark Library
- Code:
- Forgejo:
icon: forgejo.png
href: https://gitforge.kitestacks.com
description: Self-Hosted Git
- TicketSystem:
- OpenProject:
icon: openproject.png
href: https://tasks.kitestacks.com
description: Project Management
- Monitoring:
- Grafana:
icon: grafana.png
href: http://192.168.1.205:3150
description: Monitoring Dashboards
- Prometheus:
icon: prometheus.png
href: http://192.168.1.205:9090
description: Metrics Database
- Node Exporter:
icon: prometheus.png
href: http://192.168.1.205:9100
description: Host Metrics
- Future Projects:
- Kubernetes:
icon: kubernetes.png
href: https://kubernetes.io
description: Cluster Platform
- FluxCD:
icon: flux-cd.png
href: https://fluxcd.io
description: GitOps Automation
- Cilium:
icon: cilium.png
href: https://cilium.io
description: eBPF Networking
- CloudNativePG:
icon: postgresql.png
href: https://cloudnative-pg.io
description: PostgreSQL Operator
- Social:
- Discord:
icon: discord.png
href: https://discord.gg
description: Discord

View file

@ -0,0 +1,32 @@
---
title: KiteStacks.AO
theme: dark
color: slate
headerStyle: boxed
hideVersion: true
useEqualHeights: true
layout:
Infrastructure:
style: row
columns: 1
Library:
style: row
columns: 1
Code:
style: row
columns: 1
Projects:
style: row
columns: 1
Monitoring:
style: row
columns: 2
Social:
style: row
columns: 1

View file

@ -0,0 +1,37 @@
---
title: KiteStacks
theme: dark
color: slate
headerStyle: boxed
hideVersion: true
useEqualHeights: true
layout:
Infrastructure:
style: row
columns: 4
Monitoring:
style: row
columns: 3
AI & Automation:
style: row
columns: 3
Knowledge Base:
style: row
columns: 2
Development:
style: row
columns: 2
Community:
style: row
columns: 1
Future Projects:
style: row
columns: 4

View file

@ -0,0 +1,32 @@
---
title: KiteStacks.AO
theme: dark
color: slate
headerStyle: boxed
hideVersion: true
useEqualHeights: true
layout:
Infrastructure:
style: row
columns: 1
Library:
style: row
columns: 1
Code:
style: row
columns: 1
Projects:
style: row
columns: 1
Monitoring:
style: row
columns: 2
Social:
style: row
columns: 1

View file

@ -0,0 +1,24 @@
---
- resources:
label: System
cpu: true
memory: true
disk: /
- datetime:
text_size: xl
format:
dateStyle: full
timeStyle: short
- openmeteo:
label: Wheaton
latitude: 41.8661
longitude: -88.1065
timezone: America/Chicago
units: imperial
cache: 5
- search:
provider: google
target: _blank

View file

@ -0,0 +1,24 @@
---
- resources:
label: System
cpu: true
memory: true
disk: /
- datetime:
text_size: xl
format:
dateStyle: full
timeStyle: short
- openmeteo:
label: Wheaton
latitude: 41.8661
longitude: -88.1065
timezone: America/Chicago
units: imperial
cache: 5
- search:
provider: google
target: _blank

View file

@ -0,0 +1,24 @@
---
- resources:
label: System
cpu: true
memory: true
disk: /
- datetime:
text_size: xl
format:
dateStyle: full
timeStyle: short
- openmeteo:
label: Wheaton
latitude: 41.8661
longitude: -88.1065
timezone: America/Chicago
units: imperial
cache: 5
- search:
provider: google
target: _blank

View file

@ -0,0 +1,6 @@
- Social:
- Discord:
- abbr:
href: https://discord.gg/QbdveTb6Kw

View file

@ -0,0 +1,10 @@
---
# For configuration options and examples, please see:
# https://gethomepage.dev/configs/docker/
# my-docker:
# host: 127.0.0.1
# port: 2375
# my-docker:
# socket: /var/run/docker.sock

View file

@ -0,0 +1,2 @@
---
# sample kubernetes config

View file

@ -0,0 +1,5 @@
---
# pve:
# url: https://proxmox.host.or.ip:8006
# token: username@pam!Token ID
# secret: secret

View file

@ -0,0 +1,90 @@
- Infrastructure:
- Portainer:
icon: portainer.png
href: https://portainer.kitestacks.com
description: Docker Management
- Authentik:
icon: authentik.png
href: https://auth.kitestacks.com
description: Identity Provider
- Cloudflare:
icon: cloudflare.png
href: https://dash.cloudflare.com
description: DNS & Tunnel Management
- Uptime Kuma:
icon: uptime-kuma.png
href: https://status.kitestacks.com
description: Uptime Monitoring
- AI:
- Kite AI:
icon: open-webui.png
href: https://ai.kitestacks.com
description: Private AI Workspace
- LiteLLM:
icon: si-openai
href: https://llm.kitestacks.com
description: AI Model Gateway
- OpenRouter:
icon: si-openai
href: https://openrouter.ai
description: Hosted AI Models
- Library:
- Kavita:
icon: kavita.png
href: https://kavita.kitestacks.com
description: Books, Comics & PDFs
- Linkding:
icon: linkding.png
href: https://links.kitestacks.com
description: Bookmark Library
- Code:
- Forgejo:
icon: forgejo.png
href: https://gitforge.kitestacks.com
description: Self-Hosted Git
- TicketSystem:
- OpenProject:
icon: openproject.png
href: https://tasks.kitestacks.com
description: Project Management
- Monitoring:
- Grafana:
icon: grafana.png
href: http://192.168.1.205:3150
description: Monitoring Dashboards
- Prometheus:
icon: prometheus.png
href: http://192.168.1.205:9090
description: Metrics Database
- Node Exporter:
icon: prometheus.png
href: http://192.168.1.205:9100
description: Host Metrics
- Future Projects:
- Kubernetes:
icon: kubernetes.png
href: https://kubernetes.io
description: Cluster Platform
- FluxCD:
icon: flux-cd.png
href: https://fluxcd.io
description: GitOps Automation
- Cilium:
icon: cilium.png
href: https://cilium.io
description: eBPF Networking
- CloudNativePG:
icon: postgresql.png
href: https://cloudnative-pg.io
description: PostgreSQL Operator
- Social:
- Discord:
icon: discord.png
href: https://discord.gg
description: Discord

View file

@ -0,0 +1,90 @@
- Infrastructure:
- Portainer:
icon: portainer.png
href: https://portainer.kitestacks.com
description: Docker Management
- Authentik:
icon: authentik.png
href: https://auth.kitestacks.com
description: Identity Provider
- Cloudflare:
icon: cloudflare.png
href: https://dash.cloudflare.com
description: DNS & Tunnel Management
- Uptime Kuma:
icon: uptime-kuma.png
href: https://status.kitestacks.com
description: Uptime Monitoring
- AI:
- Kite AI:
icon: open-webui.png
href: https://ai.kitestacks.com
description: Private AI Workspace
- LiteLLM:
icon: si-openai
href: https://llm.kitestacks.com
description: AI Model Gateway
- OpenRouter:
icon: si-openai
href: https://openrouter.ai
description: Hosted AI Models
- Library:
- Kavita:
icon: kavita.png
href: https://kavita.kitestacks.com
description: Books, Comics & PDFs
- Shaarli:
icon: shaarli.png
href: https://links.kitestacks.com
description: Bookmark Library
- Code:
- Forgejo:
icon: forgejo.png
href: https://gitforge.kitestacks.com
description: Self-Hosted Git
- TicketSystem:
- OpenProject:
icon: openproject.png
href: https://tasks.kitestacks.com
description: Project Management
- Monitoring:
- Grafana:
icon: grafana.png
href: http://192.168.1.205:3150
description: Monitoring Dashboards
- Prometheus:
icon: prometheus.png
href: http://192.168.1.205:9090
description: Metrics Database
- Node Exporter:
icon: prometheus.png
href: http://192.168.1.205:9100
description: Host Metrics
- Future Projects:
- Kubernetes:
icon: kubernetes.png
href: https://kubernetes.io
description: Cluster Platform
- FluxCD:
icon: flux-cd.png
href: https://fluxcd.io
description: GitOps Automation
- Cilium:
icon: cilium.png
href: https://cilium.io
description: eBPF Networking
- CloudNativePG:
icon: postgresql.png
href: https://cloudnative-pg.io
description: PostgreSQL Operator
- Social:
- Discord:
icon: discord.png
href: https://discord.gg
description: Discord

View file

@ -0,0 +1,32 @@
---
title: KiteStacks.AO
theme: dark
color: slate
headerStyle: boxed
hideVersion: true
useEqualHeights: true
layout:
Infrastructure:
style: row
columns: 1
Library:
style: row
columns: 1
Code:
style: row
columns: 1
Projects:
style: row
columns: 1
Monitoring:
style: row
columns: 2
Social:
style: row
columns: 1

View file

@ -0,0 +1,32 @@
---
title: KiteStacks.AO
theme: dark
color: slate
headerStyle: boxed
hideVersion: true
useEqualHeights: true
layout:
Infrastructure:
style: row
columns: 1
Library:
style: row
columns: 1
Code:
style: row
columns: 1
Projects:
style: row
columns: 1
Monitoring:
style: row
columns: 2
Social:
style: row
columns: 1

View file

@ -0,0 +1,24 @@
---
- resources:
label: System
cpu: true
memory: true
disk: /
- datetime:
text_size: xl
format:
dateStyle: full
timeStyle: short
- openmeteo:
label: Wheaton
latitude: 41.8661
longitude: -88.1065
timezone: America/Chicago
units: imperial
cache: 5
- search:
provider: google
target: _blank

View file

@ -0,0 +1,24 @@
---
- resources:
label: System
cpu: true
memory: true
disk: /
- datetime:
text_size: xl
format:
dateStyle: full
timeStyle: short
- openmeteo:
label: Wheaton
latitude: 41.8661
longitude: -88.1065
timezone: America/Chicago
units: imperial
cache: 5
- search:
provider: google
target: _blank

View file

@ -0,0 +1,12 @@
services:
homepage-test:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage-test
restart: unless-stopped
ports:
- "3007:3000"
environment:
- HOMEPAGE_ALLOWED_HOSTS=localhost:3007,192.168.1.205:3007,www.kitestacks.test.com,kitestacks.test.com
volumes:
- ./config-test:/app/config
- /var/run/docker.sock:/var/run/docker.sock:ro

View file

@ -0,0 +1,13 @@
services:
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
restart: unless-stopped
ports:
- "3005:3000"
environment:
- HOMEPAGE_ALLOWED_HOSTS=localhost:3005,192.168.1.205:3005,www.kitestacks.com,kitestacks.com,home.kitestacks.com
volumes:
- ./config:/app/config
- /var/run/docker.sock:/var/run/docker.sock:ro

View file

@ -0,0 +1,69 @@
- Infrastructure:
- Homepage:
icon: homepage.png
href: https://www.kitestacks.com
description: Main Dashboard
- Authentik:
icon: authentik.png
href: https://auth.kitestacks.com
description: Identity Provider
- Portainer:
icon: portainer.png
href: https://portainer.kitestacks.com
description: Container Management
- Development:
- Forgejo:
icon: forgejo.png
href: https://git.kitestacks.com
description: Git Repositories
- OpenProject:
icon: openproject.png
href: https://tasks.kitestacks.com
description: Project Management
- AI:
- Kite AI:
icon: open-webui.png
href: https://ai.kitestacks.com
description: AI Workspace
- LiteLLM:
icon: litellm.png
href: https://llm.kitestacks.com
description: Model Gateway
- OpenRouter:
icon: si-openai
href: https://openrouter.ai
description: Hosted AI Models
- Library:
- Kavita:
icon: kavita.png
href: https://kavita.kitestacks.com
description: Books & Documents
- Shaarli:
icon: shaarli.png
href: https://links.kitestacks.com
description: Bookmark Library
- Monitoring:
- Grafana:
icon: grafana.png
href: https://grafana.kitestacks.com
description: Dashboards
- Prometheus:
icon: prometheus.png
href: https://prometheus.kitestacks.com
description: Metrics Collection
- Uptime Kuma:
icon: uptime-kuma.png
href: https://status.kitestacks.com
description: Service Monitoring

View file

@ -1,20 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: homepage
namespace: homepage
spec:
replicas: 1
selector:
matchLabels:
app: homepage
template:
metadata:
labels:
app: homepage
spec:
containers:
- name: homepage
image: ghcr.io/yourusername/homepage:latest
ports:
- containerPort: 80

View file

@ -1,13 +0,0 @@
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: homepage
namespace: flux-system
spec:
interval: 1m
path: ./apps/homepage
prune: true
sourceRef:
kind: GitRepository
name: kitestacks-homelab
targetNamespace: homepage

View file

@ -1,4 +0,0 @@
apiVersion: v1
kind: Namespace
metadata:
name: homepage

View file

@ -1,13 +0,0 @@
apiVersion: v1
kind: Service
metadata:
name: homepage
namespace: homepage
spec:
selector:
app: homepage
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP

View file

@ -1,32 +0,0 @@
apiVersion: batch/v1
kind: CronJob
metadata:
name: kavita-docker-auto-restart
namespace: automation
spec:
schedule: "*/15 * * * *"
successfulJobsHistoryLimit: 2
failedJobsHistoryLimit: 3
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: restart-kavita
image: docker:27-cli
command:
- /bin/sh
- -c
- |
echo "Restarting Kavita Docker container..."
docker restart kavita
echo "Kavita restart completed."
volumeMounts:
- name: docker-sock
mountPath: /var/run/docker.sock
volumes:
- name: docker-sock
hostPath:
path: /var/run/docker.sock
type: Socket

View file

@ -1,6 +0,0 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- namespace.yaml
- kavita-docker-restart-cronjob.yaml

View file

@ -1,4 +0,0 @@
apiVersion: v1
kind: Namespace
metadata:
name: automation

View file

@ -0,0 +1,15 @@
{
"TokenKey": "0dAB10RcaX3mUwxMGE5pVcauZhDybFyoaPM6bGup5GLTFGq3yO6GFKpsnWCJ2TMS8GT2BpB4cXXc8wqB7mOV14\u002BS3ys5fgb2eWjX31DrmDgfJJYapAFr2Unx\u002BTv5fpeS9TyH\u002BnzAEhISPxXRApn4n6zJ7RUbJ79QEGyX2eKCjxJqsV6xBrHta4weL7zGQmPcWoMswezglOnFMoEYhzURpyVkwl1KeXFnfbdrPuGzcUCtsbdjBoRYXqIn5gcdjDOyrdwAxNT8Of3CGMnYFGLzg0kMIwPzBPqD5nsGXBisHQYEPUSwYsIIGwAfYLV3HtS\u002B\u002BXagEW3pgnbHYljsxSTQ==",
"Port": 5000,
"IpAddresses": "",
"BaseUrl": "/",
"Cache": 75,
"AllowIFraming": false,
"OpenIdConnectSettings": {
"Authority": "",
"ClientId": "kavita",
"Secret": "",
"CustomScopes": [],
"Enabled": false
}
}

View file

@ -0,0 +1,7 @@
{
"Title": "Cover Chooser Overhaul",
"Body": "\r\n\u003Cimg width=\u00221127\u0022 height=\u0022773\u0022 alt=\u0022image\u0022 src=\u0022https://github.com/user-attachments/assets/ba3fe03a-880c-4c48-a348-25169f0afdc8\u0022 /\u003E\r\n\u003Cimg width=\u0022965\u0022 height=\u0022658\u0022 alt=\u0022image\u0022 src=\u0022https://github.com/user-attachments/assets/55b8c9ac-3781-4725-ac7a-2176214b3489\u0022 /\u003E\r\n\r\n\r\n# Added\r\n- Added: (Kavita\u002B) Cover chooser will now present cover image choices from Kavita\u002B (powered by Hardcover, MangaBaka, and ComicBookRoundup). \r\n\r\n# Changed\r\n- Changed: Redesigned Kavita\u0027s Cover Image chooser to use tabs for individual types of media (Current, Uploaded, Volume, Chapter, Kavita\u002B). (Closes #3891) (Thanks @therobbiedavis for the great design)\r\n- Changed: Moved the Reset cover image from a weird button into a dedicated button with clear labeling if the underlying cover was locked or not. \r\n\r\n# Fixed\r\n- Fixed: Fixed up a case where entity title service would avoid having Volume X in some cases\r\n- Fixed: Fixed Chrome PWA not showing the install button (Thanks @Ansh2209 )\r\n",
"Html_Url": "https://github.com/Kareadita/Kavita/pull/4691",
"Merged_At": "2026-05-19T18:27:50Z",
"Number": 4691
}

View file

@ -0,0 +1,7 @@
{
"Title": "Kavita\u002B Audit Log",
"Body": "\r\n\u003Cimg width=\u00221860\u0022 height=\u0022743\u0022 alt=\u0022image\u0022 src=\u0022https://github.com/user-attachments/assets/563b5045-c954-4b9a-9206-1ceb81fa773d\u0022 /\u003E\r\n\r\n\u003Cimg width=\u00221656\u0022 height=\u0022755\u0022 alt=\u0022image\u0022 src=\u0022https://github.com/user-attachments/assets/fb372b91-0ef1-4472-8215-633c776b3ebb\u0022 /\u003E\r\n\r\n\u003Cimg width=\u00221113\u0022 height=\u0022751\u0022 alt=\u0022image\u0022 src=\u0022https://github.com/user-attachments/assets/ae3496e3-31eb-4854-8c2f-d84307f75881\u0022 /\u003E\r\n\r\n\r\nThis is the first piece of a lot of architectural changes to make the Kavita\u002B integration feel understandable. Since Kavita\u002B launched, the systems have been evolving, but understanding what is happening under the hood has been difficult. The pressure was added with both AniList and MAL having many downtime events and users wondering when metadata is matching, needs rematching, or why a scrobble event didn\u0027t post. \r\n\r\nI hope this Audit system helps shed light and I am open to feedback to ensure it addresses the needs. \r\n\r\n\r\n# Added\r\n- Added: Added 3 new screens that help users understand what Kavita\u002B is doing around their series, their scrobbling, and for admins, the whole behind the scenes logic. (Closes #4705)\r\n\r\n# Changed\r\n- Changed: Scrobbling screen is likely going to be replaced by the new screens\r\n\r\n# Fixed\r\n- Fixed: Fixed a bug where marking a chapter as read wasn\u0027t triggering scrobbling.\r\n- Fixed: Fixed a bug where MAL was never getting a proper response for token expiration in the Account Screen\r\n- Fixed: Fixed a bug where series detail page could refresh the cover when a chapter cover update event triggered. \r\n\r\nNote: Relies on #4691",
"Html_Url": "https://github.com/Kareadita/Kavita/pull/4711",
"Merged_At": "2026-05-21T13:09:15Z",
"Number": 4711
}

View file

@ -0,0 +1,7 @@
{
"Title": "Kavita\u002B Match UX Refresh",
"Body": "\r\n\u003Cimg width=\u00221150\u0022 height=\u0022551\u0022 alt=\u0022image\u0022 src=\u0022https://github.com/user-attachments/assets/dfb1fcb3-9502-4b3c-89d5-1ac823a7f0c3\u0022 /\u003E\r\n\r\nNote: Although you see Hardcover, it is not enabled yet in Kavita. This will come later. \r\n\r\n# Added\r\n- Added: Kavita\u002B Match can now accept direct ids via anilist:1234 in addition to existing urls. \r\n\r\n# Changed\r\n- Changed: Massive UX refresh to the Match modal for Kavita\u002B to surface tips on how to search. (Closes #4725)\r\n\r\n",
"Html_Url": "https://github.com/Kareadita/Kavita/pull/4727",
"Merged_At": "2026-05-27T16:42:40Z",
"Number": 4727
}

View file

@ -0,0 +1,7 @@
{
"Title": "Feature/kavita\u002B license",
"Body": "\r\n\u003Cimg width=\u00221880\u0022 height=\u0022653\u0022 alt=\u0022image\u0022 src=\u0022https://github.com/user-attachments/assets/203bc8bf-a4c2-49c0-ae74-03d86de5d4fb\u0022 /\u003E\r\n\r\n\u003Cimg width=\u00221876\u0022 height=\u0022817\u0022 alt=\u0022image\u0022 src=\u0022https://github.com/user-attachments/assets/f62d4b8e-6660-4aca-8b5a-fb98b38b45e9\u0022 /\u003E\r\n\r\n\u003Cimg width=\u00221852\u0022 height=\u0022794\u0022 alt=\u0022image\u0022 src=\u0022https://github.com/user-attachments/assets/d13674e9-28e3-430c-8322-3b131d572018\u0022 /\u003E\r\n\r\nThis is another massive rework to Kavita/Kavita\u002B around the first setup to understanding the impact and status of Kavita\u002B. The main focus is on expanded availablility of information for licensed servers, helping users understand what Kavita\u002B is, and streamlining and polishing the registration/management points. \r\n\r\n**Note: The discord button is not implemented and some providers are not fully realized. This will come later.**\r\n\r\n\r\n# Added\r\n- Added: Added an upsell page that explains what Kavita\u002B is, so users are more informed, rather than linking to the wiki\r\n- Added: Added a status page to services that Kavita\u002B relies on, to surface incidents (like AL going down and scrobbling not working)\r\n- Added: Added stats about what Kavita\u002B is doing and how many calls your license has made (note: Not all data will be present, existing data is mixy)\r\n\r\n# Changed\r\n- Changed: Complete overhaul to the Kavita\u002B license page. New design have an upsell feel (from the main site) that explains what Kavita\u002B is. \r\n- Changed: When editing the license, the email is auto-filled for you\r\n- Changed: Expanded how much information we log out in the Kavita\u002B Audit pages (develop)\r\n- Changed: Kavita\u002B Audit will now track Metadata Sync trigger (Manual, on file Add, Background Sync)\r\n- Changed: Lots of polish added to the Match screen and made all the screens much nicer on mobile (develop)\r\n\r\n# Fixed\r\n- Fixed: Fixed incorrect native/docker wiki links (Fixes #4704)\r\n- Fixed: Fixed incorrect setup link (Fixes #4702)\r\n- Fixed: Fixed my activity throwing an exception when no K\u002B license. (develop)\r\n- Fixed: Fixed CBL Upload restriction and reworked the hardening of how file upload validation checks are done. Ensure we log out when we reject and why.\r\n- Fixed: Fixed up/down not responding to keypresses (Fixes #4697)\r\n\r\n# Developer\r\n- Reworked the cover chooser logic so that everything is streamlined via a file upload rather than base64 nonsense (bloated images). Base64 still exists for a non-breaking API, but Kavita will upload a file via upload/upload-by-file which scopes to a temp directory and returns a filename to pass going forward.\r\n\r\n#4709 ",
"Html_Url": "https://github.com/Kareadita/Kavita/pull/4731",
"Merged_At": "2026-05-31T14:58:33Z",
"Number": 4731
}

View file

@ -0,0 +1,7 @@
{
"Title": "Scrobble Provider Rework",
"Body": "This is a massive update to our Scrobble system and a major expansion into providers, by adding 2 new ones: Hardcover (Traditional Books) and MangaBaka (Manga, Light Novels, etc). We\u0027ve reworked the code from scratch to bring a much better experience, from rate limit tweaks, to allowing backfilling per-provider unlimited times, to the ability to build rules to trigger states for scrobble. \r\n\r\nWe will be taking a break from delivering overhauls to realign the UX and polish these recent additions. Please help by testing and providing feedback, both positive and constructive. \r\n\r\n\r\n\u003Cimg width=\u00221624\u0022 height=\u0022814\u0022 alt=\u0022image\u0022 src=\u0022https://github.com/user-attachments/assets/8d302034-7cc0-4aa6-80a7-d5ab3e87ae8b\u0022 /\u003E\r\n\r\n\u003Cimg width=\u00221612\u0022 height=\u0022846\u0022 alt=\u0022image\u0022 src=\u0022https://github.com/user-attachments/assets/a394f31b-2701-44d4-866c-db13950cd271\u0022 /\u003E\r\n\r\n\r\n# Added \r\n- Added: Added Mangabaka as scrobble provider\r\n- Added: Added Hardcover as scrobble provider\r\n- Added: Added per provider settings (library, age ratings, scrobble progress/ratings/reviews, etc))\r\n- Added: Added inactive \u0026 on hold rules (Auto transition series/books from reading to on hold after x days) (Closes #2447)\r\n- Added: Scrobble Providers can now show information, like username. \r\n\r\n# Changed\r\n- Changed: Improved AniList scrobble speed drastically \r\n- Changed: Scrobble keybind now opens my activity instead\r\n- Changed: Users can now run backfilling of history per provider as many times as they want. Kavita will slowly churn thru it all (note: Re-running multiple times will drastically inflate queue for no reason). \r\n- Changed: (UX) Complete UX overhaul of Scrobble providers (now found under Kavita\u002B \u003E Connections )\r\n\r\n# Fixed\r\n- Fixed: Fixed up token expired warning showing too often (Fixes #4728, Fixes #4720)\r\n- Fixed: Fixed being unable to reset external ids (Fixes #4719)\r\n- Fixed: Fixed getting stuck in a loop if OIDC config is removed while previously being logged in with OIDC\r\n- Fixed: Fixed scrobble events getting marked as processed when hitting the rate limit under some circumstances\r\n- Fixed: Fixed a bug where Rereading a chapter then moving to the next wouldn\u0027t reset the page to 0\r\n\r\nCloses #4710, Closes #4733, Closes #3685",
"Html_Url": "https://github.com/Kareadita/Kavita/pull/4733",
"Merged_At": "2026-06-05T21:45:36Z",
"Number": 4733
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Some files were not shown because too many files have changed in this diff Show more