From 73abb199ed4c5ea8559ff67d55bd5cdaa38e9aaa Mon Sep 17 00:00:00 2001 From: ayrisdev Date: Mon, 16 Feb 2026 00:41:55 +0300 Subject: [PATCH] initial commit --- .gitignore | 1 + assets/global.css | 48 +++++ assets/images/cloudflare.png | Bin 0 -> 7497 bytes config/bookmarks.yml | 33 ++++ config/glance.yml | 78 ++++++++ config/media-server.yml | 343 +++++++++++++++++++++++++++++++++++ config/plausible.yml | 260 ++++++++++++++++++++++++++ config/raindrop.yml | 103 +++++++++++ config/services.yml | 51 ++++++ config/uptime.yml | 139 ++++++++++++++ services.json | 32 ++++ 11 files changed, 1088 insertions(+) create mode 100644 .gitignore create mode 100644 assets/global.css create mode 100644 assets/images/cloudflare.png create mode 100644 config/bookmarks.yml create mode 100644 config/glance.yml create mode 100644 config/media-server.yml create mode 100644 config/plausible.yml create mode 100644 config/raindrop.yml create mode 100644 config/services.yml create mode 100644 config/uptime.yml create mode 100644 services.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2eea525 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.env \ No newline at end of file diff --git a/assets/global.css b/assets/global.css new file mode 100644 index 0000000..6212406 --- /dev/null +++ b/assets/global.css @@ -0,0 +1,48 @@ +@import url('https://fonts.googleapis.com/css2?family=Outfit:wght@100..900&display=swap'); + +:root { + --color-info: hsl(43, 50%, 70%); + --color-warning: hsl(43, 50%, 70%); + /* Widget background color with alpha */ + --bga: 70%; + --color-widget-background: hsl( + var(--color-widget-background-hsl-values), + var(--bga) + ); +} + +* { + box-sizing: border-box; +} +body { + font-family: 'Outfit', sans-serif; + background-image: url(https://images.pexels.com/photos/2098428/pexels-photo-2098428.jpeg); + /* backdrop-filter: blur(2px); */ + background-repeat: no-repeat; + background-size: cover; +} +/* Blur effect for widget backgrounds */ +.widget-content:not(.widget-content-frameless), +.widget-content-frame { + backdrop-filter: blur(5px); + box-shadow: + rgba(0, 0, 0, 0.02) 0px 1px 3px 0px, + rgba(27, 31, 35, 0.15) 0px 0px 0px 1px; +} + +/* Make widgets same height */ +.widget-type-dns-stats { + height: 100%; +} +.widget-type-dns-stats .widget-content { + height: calc(100% - var(--widget-gap)); +} +.widget-type-dns-stats .widget-content .dns-stats { + height: 100%; + display: flex; + flex-direction: column; + justify-content: space-around; +} +.widget-type-prowlarr-custom .widget-content { + height: calc(100% - var(--widget-gap)); +} diff --git a/assets/images/cloudflare.png b/assets/images/cloudflare.png new file mode 100644 index 0000000000000000000000000000000000000000..ddbaba1dc446a7b6666df885f272c4bef4dc6bf7 GIT binary patch literal 7497 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 literal 0 HcmV?d00001 diff --git a/config/bookmarks.yml b/config/bookmarks.yml new file mode 100644 index 0000000..b48a955 --- /dev/null +++ b/config/bookmarks.yml @@ -0,0 +1,33 @@ +- type: bookmarks + groups: + - links: + - title: Gmail + url: https://mail.google.com/mail/u/0/ + - title: Amazon + url: https://www.amazon.com/ + - title: Github + url: https://github.com/ + - title: Wikipedia + url: https://en.wikipedia.org/ + - title: Entertainment + color: 10 70 50 + links: + - title: Netflix + url: https://www.netflix.com/ + - title: Disney+ + url: https://www.disneyplus.com/ + - title: YouTube + url: https://www.youtube.com/ + - title: Prime Video + url: https://www.primevideo.com/ + - title: Social + color: 200 50 50 + links: + - title: Reddit + url: https://www.reddit.com/ + - title: Twitter + url: https://twitter.com/ + - title: Instagram + url: https://www.instagram.com/ + + diff --git a/config/glance.yml b/config/glance.yml new file mode 100644 index 0000000..e82187f --- /dev/null +++ b/config/glance.yml @@ -0,0 +1,78 @@ +server: + assets-path: /app/assets + +branding: + hide-footer: true + +theme: + background-color: 203 27 9 + contrast-multiplier: 1.2 + primary-color: 165 78 51 + positive-color: 165 78 51 + negative-color: 360 100 71 + disable-picker: true + custom-css-file: /global.css + +pages: + - name: Home + # Optionally, if you only have a single page you can hide the desktop navigation for a cleaner look + hide-desktop-navigation: true + columns: + - size: small + widgets: + - type: calendar + hide-header: true + first-day-of-week: sunday + + - $include: bookmarks.yml + + + + + + - size: full + widgets: + - type: split-column + max-columns: 4 + widgets: + - $include: plausible.yml + css-class: widget-type-plausible-prowlarr-custom + - $include: uptime.yml + css-class: widget-type-uptime-custom + - $include: services.yml + - $include: raindrop.yml + css-class: widget-type-raindrop-custom + + + - size: small + widgets: + - type: clock + hide-header: true + time-format: 24h + date-format: d MMMM yyyy + show-seconds: true + show-timezone: true + timezone: Europe/Istanbul + + - type: weather + hide-header: true + location: ${WEATHER_LOCATION} + units: metric + hour-format: 24h + + + + # Add more pages here: + # - name: Your page name + # columns: + # - size: small + # widgets: + # # Add widgets here + + # - size: full + # widgets: + # # Add widgets here + + # - size: small + # widgets: + # # Add widgets here diff --git a/config/media-server.yml b/config/media-server.yml new file mode 100644 index 0000000..f35dcd2 --- /dev/null +++ b/config/media-server.yml @@ -0,0 +1,343 @@ +- type: custom-api + title: Media Server History + frameless: true + cache: 5m + options: + media-server: '${MEDIA_SERVER_TYPE}' + base-url: ${JELLYFIN_URL} + api-key: ${JELLYFIN_TOKEN} + user-name: ${JELLYFIN_USER} + media-types: '${MEDIA_SERVER_TYPES}' + history-length: '${MEDIA_SERVER_HISTORY_LENGTH}' + small-column: true + compact: true + show-thumbnail: true + thumbnail-aspect-ratio: 'default' + show-user: false + time-absolute: false + time-format: 'Jan 02 15:04' + template: | + {{ $mediaServer := .Options.StringOr "media-server" "" }} + {{ $baseURL := .Options.StringOr "base-url" "" }} + {{ $apiKey := .Options.StringOr "api-key" "" }} + {{ $userName := .Options.StringOr "user-name" "" }} + + {{ define "errorMsg" }} +
+
ERROR
+ + + +
+

{{ . }}

+ {{ end }} + + {{ if or + (eq $mediaServer "") + (eq $baseURL "") + (eq $apiKey "") + (and (eq $mediaServer "jellyfin") (eq $userName "")) + }} + {{ template "errorMsg" "Some required options are not set" }} + {{ else }} + + {{ $historyLength := .Options.StringOr "history-length" "10" }} + {{ $mediaTypes := .Options.StringOr "media-types" "" }} + {{ if eq $mediaServer "tautulli" }} + {{ $mediaTypes = .Options.StringOr "media-types" "movie,episode,track" }} + {{ else if or (eq $mediaServer "jellyfin") (eq $mediaServer "emby") }} + {{ $mediaTypes = .Options.StringOr "media-types" "Movie,Episode,Audio" }} + {{ end }} + {{ $isSmallColumn := .Options.BoolOr "small-column" false }} + {{ $isCompact := .Options.BoolOr "compact" true }} + {{ $showThumbnail := .Options.BoolOr "show-thumbnail" false }} + {{ $thumbAspectRatio := .Options.StringOr "thumbnail-aspect-ratio" "" }} + {{ $showUser := .Options.BoolOr "show-user" true }} + {{ $timeAbsolute := .Options.BoolOr "time-absolute" false }} + {{ $timeFormat := .Options.StringOr "time-format" "Jan 02 15:04" }} + + {{ $userID := "" }} + {{ $historyRequestURL := "" }} + {{ $usersRequestURL := "" }} + {{ $historyCall := "" }} + {{ $usersCall := "" }} + {{ $history := "" }} + {{ $users := "" }} + + {{ if eq $mediaServer "plex" }} + {{ $historyRequestURL = concat $baseURL "/status/sessions/history/all" }} + {{ $historyCall = newRequest $historyRequestURL + | withParameter "limit" $historyLength + | withParameter "sort" "viewedAt:desc" + | withHeader "Accept" "application/json" + | withHeader "X-Plex-Token" $apiKey + | getResponse }} + + {{ if $historyCall.JSON.Exists "MediaContainer" }} + {{ $history = $historyCall.JSON.Array "MediaContainer.Metadata" }} + {{ else }} + {{ template "errorMsg" (concat "Could not fetch " $mediaServer " API.") }} + {{ end }} + + {{ $usersRequestURL = concat $baseURL "/accounts" }} + {{ $usersCall = newRequest $usersRequestURL + | withHeader "Accept" "application/json" + | withHeader "X-Plex-Token" $apiKey + | getResponse }} + {{ $users = $usersCall.JSON.Array "MediaContainer.Account" }} + + {{ else if eq $mediaServer "tautulli" }} + {{ $historyRequestURL = concat $baseURL "/api/v2" }} + {{ $historyCall = newRequest $historyRequestURL + | withParameter "apikey" $apiKey + | withParameter "cmd" "get_history" + | withParameter "length" $historyLength + | withParameter "media_type" $mediaTypes + | withHeader "Accept" "application/json" + | getResponse }} + + {{ if eq $historyCall.Response.StatusCode 200 }} + {{ $history = $historyCall.JSON.Array "response.data.data" }} + {{ else }} + {{ template "errorMsg" (concat "Could not fetch " $mediaServer " API.") }} + {{ end }} + + {{ else if or (eq $mediaServer "jellyfin") (eq $mediaServer "emby") }} + {{ $usersRequestURL = concat $baseURL "/Users" }} + {{ $usersCall = newRequest $usersRequestURL + | withParameter "api_key" $apiKey + | withHeader "Accept" "application/json" + | getResponse }} + + {{ $usersList := $usersCall.JSON.Array "" }} + {{ range $i, $user := $usersList }} + {{ if eq ($user.String "Name") $userName }} + {{ $userID = $user.String "Id" }} + {{ break }} + {{ end }} + {{ end }} + {{ if eq $userID "" }} + {{ template "errorMsg" (concat "User '" $userName "' not found.") }} + {{ end }} + + {{ $historyRequestURL = concat $baseURL "/Users/" $userID "/Items" }} + {{ $historyCall = newRequest $historyRequestURL + | withParameter "api_key" $apiKey + | withParameter "Limit" $historyLength + | withParameter "IncludeItemTypes" $mediaTypes + | withParameter "Recursive" "true" + | withParameter "isPlayed" "true" + | withParameter "sortBy" "DatePlayed" + | withParameter "sortOrder" "Descending" + | withParameter "Fields" "UserDataLastPlayedDate" + | withHeader "Accept" "application/json" + | getResponse }} + + {{ $history = $historyCall.JSON.Array "Items" }} + {{ end }} + + {{ if and (eq $historyCall.Response.StatusCode 200) (eq (len $history) 0) }} +

Nothing has been played. Start streaming something!

+ {{ else }} + + {{ end }} + {{ end }} diff --git a/config/plausible.yml b/config/plausible.yml new file mode 100644 index 0000000..6919149 --- /dev/null +++ b/config/plausible.yml @@ -0,0 +1,260 @@ +- type: custom-api + title: Site Statistics + hide-header: true + cache: 1m + subrequests: + # aveminakarabudak.com + a1: + url: ${PLAUSIBLE_BASE_URL}/api/v1/stats/realtime/visitors?site_id=aveminakarabudak.com + headers: { Authorization: "Bearer ${PLAUSIBLE_TOKEN}" } + s1: + url: ${PLAUSIBLE_BASE_URL}/api/v1/stats/aggregate?site_id=aveminakarabudak.com&period=day&metrics=visitors,pageviews,visits + headers: { Authorization: "Bearer ${PLAUSIBLE_TOKEN}" } + # ayrisapart.com + a2: + url: ${PLAUSIBLE_BASE_URL}/api/v1/stats/realtime/visitors?site_id=ayrisapart.com + headers: { Authorization: "Bearer ${PLAUSIBLE_TOKEN}" } + s2: + url: ${PLAUSIBLE_BASE_URL}/api/v1/stats/aggregate?site_id=ayrisapart.com&period=day&metrics=visitors,pageviews,visits + headers: { Authorization: "Bearer ${PLAUSIBLE_TOKEN}" } + # ayris.tech + a3: + url: ${PLAUSIBLE_BASE_URL}/api/v1/stats/realtime/visitors?site_id=ayris.tech + headers: { Authorization: "Bearer ${PLAUSIBLE_TOKEN}" } + s3: + url: ${PLAUSIBLE_BASE_URL}/api/v1/stats/aggregate?site_id=ayris.tech&period=day&metrics=visitors,pageviews,visits + headers: { Authorization: "Bearer ${PLAUSIBLE_TOKEN}" } + # irisiptv.online + a4: + url: ${PLAUSIBLE_BASE_URL}/api/v1/stats/realtime/visitors?site_id=irisiptv.online + headers: { Authorization: "Bearer ${PLAUSIBLE_TOKEN}" } + s4: + url: ${PLAUSIBLE_BASE_URL}/api/v1/stats/aggregate?site_id=irisiptv.online&period=day&metrics=visitors,pageviews,visits + headers: { Authorization: "Bearer ${PLAUSIBLE_TOKEN}" } + # screencapr.com + a5: + url: ${PLAUSIBLE_BASE_URL}/api/v1/stats/realtime/visitors?site_id=screencapr.com + headers: { Authorization: "Bearer ${PLAUSIBLE_TOKEN}" } + s5: + url: ${PLAUSIBLE_BASE_URL}/api/v1/stats/aggregate?site_id=screencapr.com&period=day&metrics=visitors,pageviews,visits + headers: { Authorization: "Bearer ${PLAUSIBLE_TOKEN}" } + template: | +
+ + + {{ $sites := . }} + + + {{ $a1 := .Subrequest "a1" }} + {{ $s1 := .Subrequest "s1" }} +
+
+ +
+
+ aveminakarabudak.com +
+ {{ if eq $s1.Response.StatusCode 200 }} + Visitors: {{ $s1.JSON.Get "results.visitors.value" }} + Views: {{ $s1.JSON.Get "results.pageviews.value" }} + {{ end }} +
+
+
+ {{ if eq $a1.Response.StatusCode 200 }} + {{ $c1 := $a1.JSON.Raw }} + {{ if ne $c1 "0" }} +
+ + {{ $c1 }} Active +
+ {{ end }} + {{ end }} +
+
+ + + {{ $a2 := .Subrequest "a2" }} + {{ $s2 := .Subrequest "s2" }} +
+
+ +
+
+ ayrisapart.com +
+ {{ if eq $s2.Response.StatusCode 200 }} + Visitors: {{ $s2.JSON.Get "results.visitors.value" }} + Views: {{ $s2.JSON.Get "results.pageviews.value" }} + {{ end }} +
+
+
+ {{ if eq $a2.Response.StatusCode 200 }} + {{ $c2 := $a2.JSON.Raw }} + {{ if ne $c2 "0" }} +
+ + {{ $c2 }} Active +
+ {{ end }} + {{ end }} +
+
+ + + {{ $a3 := .Subrequest "a3" }} + {{ $s3 := .Subrequest "s3" }} +
+
+ +
+
+ ayris.tech +
+ {{ if eq $s3.Response.StatusCode 200 }} + Visitors: {{ $s3.JSON.Get "results.visitors.value" }} + Views: {{ $s3.JSON.Get "results.pageviews.value" }} + {{ end }} +
+
+
+ {{ if eq $a3.Response.StatusCode 200 }} + {{ $c3 := $a3.JSON.Raw }} + {{ if ne $c3 "0" }} +
+ + {{ $c3 }} Active +
+ {{ end }} + {{ end }} +
+
+ + + {{ $a4 := .Subrequest "a4" }} + {{ $s4 := .Subrequest "s4" }} +
+
+ +
+
+ irisiptv.online +
+ {{ if eq $s4.Response.StatusCode 200 }} + Visitors: {{ $s4.JSON.Get "results.visitors.value" }} + Views: {{ $s4.JSON.Get "results.pageviews.value" }} + {{ end }} +
+
+
+ {{ if eq $a4.Response.StatusCode 200 }} + {{ $c4 := $a4.JSON.Raw }} + {{ if ne $c4 "0" }} +
+ + {{ $c4 }} Active +
+ {{ end }} + {{ end }} +
+
+ + + {{ $a5 := .Subrequest "a5" }} + {{ $s5 := .Subrequest "s5" }} +
+
+ +
+
+ screencapr.com +
+ {{ if eq $s5.Response.StatusCode 200 }} + Visitors: {{ $s5.JSON.Get "results.visitors.value" }} + Views: {{ $s5.JSON.Get "results.pageviews.value" }} + {{ end }} +
+
+
+ {{ if eq $a5.Response.StatusCode 200 }} + {{ $c5 := $a5.JSON.Raw }} + {{ if ne $c5 "0" }} +
+ + {{ $c5 }} Active +
+ {{ end }} + {{ end }} +
+
+
diff --git a/config/raindrop.yml b/config/raindrop.yml new file mode 100644 index 0000000..0f2ebf1 --- /dev/null +++ b/config/raindrop.yml @@ -0,0 +1,103 @@ +- type: custom-api + title: Raindrop Latest Links + hide-header: true + cache: 1h + url: https://api.raindrop.io/rest/v1/raindrops/0?perpage=50 + headers: { Authorization: "Bearer ${RAINDROP_TOKEN}" } + template: | + {{ if .JSON.Bool "result" }} +
+ + +
    + {{ range .JSON.Array "items" }} +
  • +
    + {{ $cover := .String "cover" }} + {{ if $cover }} + + {{ else }} + + {{ end }} +
    + +
    + + {{ .String "title" }} + +
    + #{{ .String "domain" }} + + + {{ $tags := .Array "tags" }} + {{ if $tags }} + + #{{ (index $tags 0).String "" }} + {{ end }} +
    +
    +
  • + {{ end }} +
+
+ {{ else }} +
+ No bookmarks found or API error. +
+ {{ end }} \ No newline at end of file diff --git a/config/services.yml b/config/services.yml new file mode 100644 index 0000000..43d251d --- /dev/null +++ b/config/services.yml @@ -0,0 +1,51 @@ +- type: custom-api + title: Services + hide-header: true + cache: 1m + url: ${SERVICES_JSON_URL} + template: | +
+ + + {{ range .JSON.Raw | fromJson }} + +
+ +
+ {{ .title }} +
+ {{ end }} +
\ No newline at end of file diff --git a/config/uptime.yml b/config/uptime.yml new file mode 100644 index 0000000..8610e58 --- /dev/null +++ b/config/uptime.yml @@ -0,0 +1,139 @@ +- type: custom-api + title: Uptime Status + title-url: ${UPTIME_KUMA_URL} + hide-header: true + url: ${UPTIME_KUMA_URL}/api/status-page/${UPTIME_KUMA_STATUS_SLUG} + subrequests: + heartbeats: + url: ${UPTIME_KUMA_URL}/api/status-page/heartbeat/${UPTIME_KUMA_STATUS_SLUG} + cache: 5m + template: | + {{ $hb := .Subrequest "heartbeats" }} + + {{ if not (.JSON.Exists "publicGroupList") }} +

Error reading response

+ {{ else if eq (len (.JSON.Array "publicGroupList")) 0 }} +

No monitors found

+ {{ else }} +
+ + + {{ range .JSON.Array "publicGroupList" }} + {{ range .Array "monitorList" }} + {{ $id := .String "id" }} + {{ $name := .String "name" }} + {{ $hbPath := concat "heartbeatList." $id }} + {{ $hbArray := $hb.JSON.Array $hbPath }} + + {{ $latest := "" }} + {{ range $hbArray }}{{ $latest = . }}{{ end }} + +
+
+ {{ if eq $name "AvEmy" }} + {{ else if eq $name "ayris.tech" }} + {{ else if eq $name "AyrisApart" }} + {{ else if eq $name "irisiptv.online" }} + {{ else if eq $name "screencapr.com" }} + {{ else if eq $name "Portainer" }} + {{ else if eq $name "Backrest" }} + {{ else }} + + {{ end }} +
+ +
+ + {{ $name }} + +
+ {{ if $latest }} + {{ if eq ($latest.String "status") "1" }} + OK + + {{ $latest.Int "ping" }}ms + {{ else }} + DOWN + {{ if $latest.Exists "msg" }} + + {{ $latest.String "msg" }} + {{ end }} + {{ end }} + {{ else }} + No data + {{ end }} +
+
+ +
+ {{ if $latest }} + {{ if eq ($latest.String "status") "1" }} + + + + {{ else }} + + + + {{ end }} + {{ else }} + + + + {{ end }} +
+
+ {{ end }} + {{ end }} +
+ {{ end }} diff --git a/services.json b/services.json new file mode 100644 index 0000000..4793dc6 --- /dev/null +++ b/services.json @@ -0,0 +1,32 @@ +[ + { + "title": "Dashboard", + "url": "https://dash.ayris.tech", + "icon": "https://raw.githubusercontent.com/glance-project/glance/main/assets/logo.png" + }, + { + "title": "Mail", + "url": "https://mail.ayris.tech", + "icon": "https://stalwart.io/img/logo.png" + }, + { + "title": "n8n Automation", + "url": "https://auto.ayris.tech", + "icon": "https://n8n.io/images/press/n8n-logo.png" + }, + { + "title": "Vaultwarden", + "url": "https://vault.ayris.tech", + "icon": "https://raw.githubusercontent.com/dani-garcia/vaultwarden/main/resources/vaultwarden-icon.png" + }, + { + "title": "Analytics", + "url": "https://analytics.ayris.tech", + "icon": "https://plausible.io/assets/images/icon/plausible_logo.png" + }, + { + "title": "Uptime", + "url": "http://uptimekuma-uko00s44cs8cokos4cgwk8oc.65.109.236.58.sslip.io/dashboard", + "icon": "https://uptime.kuma.pet/img/icon.png" + } +] \ No newline at end of file