server:
proxied: true
branding:
app-name: KalliLab Dashboard
logo-text: KL
hide-footer: true
theme:
background-color: 220 13 11
primary-color: 170 56 58
positive-color: 135 42 52
negative-color: 0 72 62
contrast-multiplier: 1.15
text-saturation-multiplier: 0.8
disable-picker: false
pages:
- name: Homelab
slug: home
width: wide
head-widgets:
- type: search
search-engine: duckduckgo
new-tab: true
autofocus: true
placeholder: Suche im Web oder springe per Bang...
bangs:
- title: Gitea
shortcut: "!git"
url: https://git.kaleschke.info/explore/repos?q={QUERY}
- title: Paperless
shortcut: "!doc"
url: https://paperless.kaleschke.info/documents?query={QUERY}
- title: Nextcloud
shortcut: "!cloud"
url: https://cloud.kaleschke.info/apps/files/?dir=/{QUERY}
- title: Komodo
shortcut: "!komodo"
url: https://komodo.kaleschke.info
columns:
- size: small
widgets:
- type: clock
hour-format: 24h
timezones:
- timezone: Europe/Berlin
label: Berlin
- type: calendar
first-day-of-week: monday
- type: server-stats
title: Host Snapshot
servers:
- type: local
name: Kallilabcore
hide-mountpoints-by-default: false
- type: bookmarks
title: Direkte Einstiege
groups:
- title: Core
color: 170 56 58
links:
- title: Home
url: https://home.kaleschke.info
icon: sh:homepage
- title: Komodo
url: https://komodo.kaleschke.info
icon: sh:komodo
- title: Gitea
url: https://git.kaleschke.info
icon: si:gitea
- title: Monitoring
url: https://monitoring.kaleschke.info
icon: si:grafana
- title: Ops
color: 45 70 55
links:
- title: Borg
url: https://borg.kaleschke.info
icon: mdi:archive
- title: Uptime
url: https://uptime.kaleschke.info
icon: sh:uptime-kuma
- title: Glances
url: https://glances.kaleschke.info
icon: sh:glances
- title: Scrutiny
url: https://scrutiny.kaleschke.info
icon: sh:scrutiny
- size: full
widgets:
- type: group
widgets:
- type: custom-api
title: Immich
title-url: https://immich.kaleschke.info
cache: 10m
url: http://immich_server:2283/api/server/statistics
headers:
x-api-key: ${GLANCE_IMMICH_API_KEY}
subrequests:
storage:
url: http://immich_server:2283/api/server/storage
headers:
x-api-key: ${GLANCE_IMMICH_API_KEY}
template: |
{{ $photos := .JSON.Int "photos" }}
{{ $videos := .JSON.Int "videos" }}
{{ $usageGiB := div (toFloat (.JSON.Int "usage")) 1073741824.0 }}
{{ $storage := .Subrequest "storage" }}
{{ $storageOK := and (ge $storage.Response.StatusCode 200) (le $storage.Response.StatusCode 299) }}
{{ $percentage := 0.0 }}
{{ if $storageOK }}{{ $percentage = $storage.JSON.Float "diskUsagePercentage" }}{{ end }}
{{ $photos | formatNumber }}
Fotos
{{ $videos | formatNumber }}
Videos
{{ printf "%.0f" $usageGiB }} GiB
Medien
{{ if $storageOK }}{{ printf "%.1f" $percentage }}% Speicher belegt{{ else }}Speicher API nicht verfuegbar{{ end }}
- type: custom-api
title: Paperless
title-url: https://paperless.kaleschke.info
cache: 5m
url: http://paperless-ngx:8000/api/statistics/
headers:
Authorization: Token ${GLANCE_PAPERLESS_TOKEN}
Accept: application/json
template: |
{{ .JSON.Int "documents_total" | formatNumber }}
Dokumente
{{ .JSON.Int "documents_inbox" | formatNumber }}
Inbox
{{ .JSON.Int "character_count" | formatNumber }}
Zeichen
- type: group
widgets:
- type: custom-api
title: Internet Speed
title-url: https://speedtest.kaleschke.info
cache: 1h
url: http://speedtest-tracker/api/v1/results/latest
headers:
Authorization: Bearer ${GLANCE_SPEEDTEST_API_TOKEN}
Accept: application/json
subrequests:
stats:
url: http://speedtest-tracker/api/v1/stats
headers:
Authorization: Bearer ${GLANCE_SPEEDTEST_API_TOKEN}
Accept: application/json
template: |
{{ $stats := .Subrequest "stats" }}
{{ $downloadChange := percentChange (.JSON.Float "data.download_bits") ($stats.JSON.Float "data.download.avg_bits") }}
{{ $uploadChange := percentChange (.JSON.Float "data.upload_bits") ($stats.JSON.Float "data.upload.avg_bits") }}
{{ $pingChange := percentChange (.JSON.Float "data.ping") ($stats.JSON.Float "data.ping.avg") }}
{{ $downloadChange | printf "%+.1f%%" }}
{{ .JSON.Float "data.download_bits" | mul 0.000001 | printf "%.1f" }}
Download
{{ $uploadChange | printf "%+.1f%%" }}
{{ .JSON.Float "data.upload_bits" | mul 0.000001 | printf "%.1f" }}
Upload
{{ $pingChange | printf "%+.1f%%" }}
{{ .JSON.Float "data.ping" | printf "%.0f ms" }}
Ping
- type: custom-api
title: Drive Health
title-url: https://scrutiny.kaleschke.info
cache: 1h
url: http://scrutiny:8080/api/summary
method: GET
options:
filter_archived: true
sort_by: device.device_name
sort_order: asc
template: |
{{- $filterArchived := .Options.filter_archived }}
{{- $sortBy := .Options.sort_by }}
{{- $sortOrder := .Options.sort_order }}
{{- $drives := .JSON.Array "data.summary|@values" }}
{{- $sorted := $drives }}
{{- if or (eq $sortBy "device.capacity") (eq $sortBy "smart.power_on_hours") }}
{{- $sorted = sortByInt $sortBy $sortOrder $drives }}
{{- else }}
{{- $sorted = sortByString $sortBy $sortOrder $drives }}
{{- end }}
{{- $total := 0 }}
{{- range $sorted }}
{{- $archived := .Get "device.archived" }}
{{- $archivedBool := false }}
{{- if $archived }}{{- $archivedBool = eq $archived.Raw "true" }}{{- end }}
{{- if and $filterArchived $archivedBool }}{{- continue }}{{- end }}
{{- $total = add $total 1 }}
{{- end }}
{{- $count := 0 }}
{{- range $sorted }}
{{- $archived := .Get "device.archived" }}
{{- $archivedBool := false }}
{{- if $archived }}{{- $archivedBool = eq $archived.Raw "true" }}{{- end }}
{{- if and $filterArchived $archivedBool }}{{- continue }}{{- end }}
{{- $count = add $count 1 }}
{{- $device := .Get "device" }}
{{- $deviceName := $device.String "device_name" }}
{{- $model := $device.String "model_name" }}
{{- $wwn := $device.String "wwn" }}
{{- $days := printf "%.0f" (div (.Get "smart.power_on_hours").Num 24) }}
{{- $capacity := printf "%.0f" (div (.Get "device.capacity").Num 1000000000000) }}
{{- $status := (.Get "device.device_status").Num }}
{{- $latestTemp := index (.Array "temp_history") (sub (len (.Array "temp_history")) 1) }}
{{- $latestTempValue := $latestTemp.Int "temp" }}