mirror of
https://github.com/prdlk/glance.git
synced 2026-08-02 17:31:40 +00:00
fix(config): remove old developer configs
This commit is contained in:
@@ -1,13 +0,0 @@
|
|||||||
- size: small
|
|
||||||
widgets:
|
|
||||||
- type: twitch-top-games
|
|
||||||
limit: 20
|
|
||||||
collapse-after: 13
|
|
||||||
exclude:
|
|
||||||
- just-chatting
|
|
||||||
- pools-hot-tubs-and-beaches
|
|
||||||
- music
|
|
||||||
- art
|
|
||||||
- asmr
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
- size: full
|
|
||||||
widgets:
|
|
||||||
- type: group
|
|
||||||
widgets:
|
|
||||||
- type: reddit
|
|
||||||
show-thumbnails: true
|
|
||||||
subreddit: commandline
|
|
||||||
- type: reddit
|
|
||||||
subreddit: selfhosted
|
|
||||||
- type: reddit
|
|
||||||
subreddit: tui
|
|
||||||
|
|
||||||
- type: videos
|
|
||||||
style: grid-cards
|
|
||||||
collapse-after-rows: 3
|
|
||||||
channels:
|
|
||||||
- UCNvzD7Z-g64bPXxGzaQaa4g # gameranx
|
|
||||||
- UCZ7AeeVbyslLM_8-nVy2B8Q # Skill Up
|
|
||||||
- UCHDxYLv8iovIbhrfl16CNyg # GameLinked
|
|
||||||
- UC9PBzalIcEQCsiIkq36PyUA # Digital Foundry
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
- size: small
|
|
||||||
widgets:
|
|
||||||
- type: reddit
|
|
||||||
subreddit: gamingnews
|
|
||||||
limit: 7
|
|
||||||
style: vertical-cards
|
|
||||||
@@ -0,0 +1,494 @@
|
|||||||
|
- size: full
|
||||||
|
widgets:
|
||||||
|
- type: custom-api
|
||||||
|
title: Latest Movies
|
||||||
|
frameless: true
|
||||||
|
cache: 5m
|
||||||
|
options:
|
||||||
|
base-url: http://umbrel.tail51ffca.ts.net:8096
|
||||||
|
api-key: df9e869fec0b460bb6577302f5efd049
|
||||||
|
user-name: "prad"
|
||||||
|
library-name: "Movies"
|
||||||
|
mode: "latest"
|
||||||
|
item-count: "10"
|
||||||
|
small-column: false
|
||||||
|
show-thumbnail: true
|
||||||
|
thumbnail-aspect-ratio: "default"
|
||||||
|
template: |
|
||||||
|
{{/* Required config options */}}
|
||||||
|
{{ $baseURL := .Options.StringOr "base-url" "" }}
|
||||||
|
{{ $apiKey := .Options.StringOr "api-key" "" }}
|
||||||
|
{{ $userName := .Options.StringOr "user-name" "" }}
|
||||||
|
|
||||||
|
{{/* Required config options for "latest" mode */}}
|
||||||
|
{{ $libraryName := .Options.StringOr "library-name" "" }}
|
||||||
|
|
||||||
|
{{/* Optional config options */}}
|
||||||
|
{{ $mode := .Options.StringOr "mode" "latest" }}
|
||||||
|
{{ $itemCount := .Options.StringOr "item-count" "10" }}
|
||||||
|
{{ $mediaTypes := .Options.StringOr "media-types" "Movie,Episode,MusicAlbum" }}
|
||||||
|
{{ $thumbAspectRatio := .Options.StringOr "thumbnail-aspect-ratio" "" }}
|
||||||
|
{{ $isSmallColumn:= .Options.BoolOr "small-column" false }}
|
||||||
|
{{ $showThumbnail := .Options.BoolOr "show-thumbnail" false }}
|
||||||
|
{{ $showProgressBar := .Options.BoolOr "progress-bar" true }}
|
||||||
|
|
||||||
|
{{/* Error message template */}}
|
||||||
|
{{ define "errorMsg" }}
|
||||||
|
<div class="widget-error-header">
|
||||||
|
<div class="color-negative size-h3">ERROR</div>
|
||||||
|
<svg class="widget-error-icon" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z"></path>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<p class="break-all">{{ . }}</p>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{/* Check required fields */}}
|
||||||
|
{{ if or (eq $baseURL "") (eq $apiKey "") (eq $userName "") (eq $mode "") (and (eq $mode "latest") (eq $libraryName "")) }}
|
||||||
|
{{ template "errorMsg" "Some required options are not set." }}
|
||||||
|
{{ else }}
|
||||||
|
|
||||||
|
{{/* Fetch user ID */}}
|
||||||
|
{{ $userID := "" }}
|
||||||
|
{{ $usersCall := newRequest (print $baseURL "/Users")
|
||||||
|
| withParameter "api_key" $apiKey
|
||||||
|
| withHeader "Accept" "application/json"
|
||||||
|
| getResponse }}
|
||||||
|
|
||||||
|
{{ range $i, $user := $usersCall.JSON.Array "" }}
|
||||||
|
{{ if eq ($user.String "Name") $userName }}
|
||||||
|
{{ $userID = $user.String "Id" }}
|
||||||
|
{{ break }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ if eq $userID "" }}
|
||||||
|
{{ template "errorMsg" (printf "User '%s' not found." $userName) }}
|
||||||
|
{{ else }}
|
||||||
|
|
||||||
|
{{ $items := "" }}
|
||||||
|
|
||||||
|
{{ if eq $mode "latest" }}
|
||||||
|
|
||||||
|
{{/* Fetch library ID */}}
|
||||||
|
{{ $libraryID := "" }}
|
||||||
|
{{ $userViewsCall := newRequest (print $baseURL "/UserViews")
|
||||||
|
| withParameter "api_key" $apiKey
|
||||||
|
| withParameter "userId" $userID
|
||||||
|
| withHeader "Accept" "application/json"
|
||||||
|
| getResponse }}
|
||||||
|
|
||||||
|
{{ range $i, $item := $userViewsCall.JSON.Array "Items" }}
|
||||||
|
{{ if eq ($item.String "Name") $libraryName }}
|
||||||
|
{{ $libraryID = $item.String "Id" }}
|
||||||
|
{{ break }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ if eq $libraryID "" }}
|
||||||
|
{{ template "errorMsg" (printf "Library '%s' not found." $libraryName) }}
|
||||||
|
{{ else }}
|
||||||
|
{{/* Fetch latest items */}}
|
||||||
|
{{ $latestCall := newRequest (print $baseURL "/Users/" $userID "/Items/Latest")
|
||||||
|
| withParameter "api_key" $apiKey
|
||||||
|
| withParameter "Limit" $itemCount
|
||||||
|
| withParameter "ParentId" $libraryID
|
||||||
|
| withParameter "IncludeItemTypes" $mediaTypes
|
||||||
|
| withParameter "GroupItems" "true"
|
||||||
|
| withHeader "Accept" "application/json"
|
||||||
|
| getResponse }}
|
||||||
|
{{ $items = $latestCall.JSON.Array "" }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ else if eq $mode "nextup" }}
|
||||||
|
|
||||||
|
{{/* Fetch next up items */}}
|
||||||
|
{{ $nextUpCall := newRequest (print $baseURL "/Shows/NextUp")
|
||||||
|
| withParameter "api_key" $apiKey
|
||||||
|
| withParameter "UserId" $userID
|
||||||
|
| withParameter "Limit" $itemCount
|
||||||
|
| withParameter "EnableResumable" "true"
|
||||||
|
| withHeader "Accept" "application/json"
|
||||||
|
| getResponse }}
|
||||||
|
{{ $items = $nextUpCall.JSON.Array "Items" }}
|
||||||
|
|
||||||
|
{{ else }}
|
||||||
|
{{ template "errorMsg" "Unknown mode, expected 'latest' or 'nextup'" }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ if eq (len $items) 0 }}
|
||||||
|
<p>No items found, start streaming something!</p>
|
||||||
|
{{ else }}
|
||||||
|
|
||||||
|
{{/* Display the item carousel */}}
|
||||||
|
<div class="carousel-container show-right-cutoff">
|
||||||
|
<div class="cards-horizontal carousel-items-container">
|
||||||
|
{{ range $n, $item := $items }}
|
||||||
|
{{/* Common item variables */}}
|
||||||
|
{{ $mediaType := $item.String "Type" }}
|
||||||
|
{{ $title := $item.String "Name" }}
|
||||||
|
{{ $itemID := $item.String "Id" }}
|
||||||
|
|
||||||
|
{{/* Media type specific variables */}}
|
||||||
|
{{ $seriesTitle := "" }}
|
||||||
|
{{ $artist := "" }}
|
||||||
|
{{ $seriesID := "" }}
|
||||||
|
{{ $season := "" }}
|
||||||
|
{{ $episode := "" }}
|
||||||
|
{{ $playPercentage := "" }}
|
||||||
|
{{ $unwatchedEpisodeCount := "" }}
|
||||||
|
|
||||||
|
{{ if eq $mediaType "Movie" }}
|
||||||
|
{{ else if eq $mediaType "Series" }}
|
||||||
|
{{ $unwatchedEpisodeCount = $item.Int "UserData.UnplayedItemCount" }}
|
||||||
|
{{ else if eq $mediaType "Episode" }}
|
||||||
|
{{ $unwatchedEpisodeCount = 1 }}
|
||||||
|
{{ $seriesTitle = $item.String "SeriesName" }}
|
||||||
|
{{ $seriesID = $item.String "SeriesId" }}
|
||||||
|
{{ $season = $item.Int "ParentIndexNumber" }}
|
||||||
|
{{ $episode = $item.Int "IndexNumber" }}
|
||||||
|
|
||||||
|
{{ if $item.Exists "UserData.PlayedPercentage" }}
|
||||||
|
{{ $playPercentage = $item.String "UserData.PlayedPercentage" }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{/* For latest always refer to the series not individual episodes */}}
|
||||||
|
{{ if eq $mode "latest" }}
|
||||||
|
{{ $itemID = $seriesID }}
|
||||||
|
{{ $title = $seriesTitle }}
|
||||||
|
{{ end }}
|
||||||
|
{{ else if eq $mediaType "MusicAlbum" }}
|
||||||
|
{{ $artist = $item.String "AlbumArtist" }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ $linkURL := print $baseURL "/web/#/details?id=" $itemID }}
|
||||||
|
{{ $thumbURL := "" }}
|
||||||
|
{{ if not (eq $playPercentage "") }}
|
||||||
|
{{/* $thumbURL = concat $baseURL "/Items/" $itemID "/Images/Primary?api_key=" $apiKey "&percentPlayed=" $playPercentage */}}
|
||||||
|
{{ $thumbURL = concat $baseURL "/Items/" $itemID "/Images/Primary?api_key=" $apiKey }}
|
||||||
|
{{ else }}
|
||||||
|
{{ $thumbURL = concat $baseURL "/Items/" $itemID "/Images/Primary?api_key=" $apiKey }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<a class="card widget-content-frame" href="{{ $linkURL | safeURL }}">
|
||||||
|
{{ if $showThumbnail }}
|
||||||
|
<div style="position: relative;">
|
||||||
|
<img src="{{ $thumbURL | safeURL }}"
|
||||||
|
alt="{{ $title }} thumbnail"
|
||||||
|
loading="lazy"
|
||||||
|
class="media-server-thumbnail shrink-0"
|
||||||
|
style="
|
||||||
|
object-fit: fill;
|
||||||
|
border-radius: var(--border-radius) var(--border-radius) 0 0;
|
||||||
|
width: 100%;
|
||||||
|
display: block;
|
||||||
|
{{ if eq $thumbAspectRatio "square" }}aspect-ratio: 1;
|
||||||
|
{{ else if eq $thumbAspectRatio "portrait" }}aspect-ratio: 2/3;
|
||||||
|
{{ else if eq $thumbAspectRatio "landscape" }}aspect-ratio: 16/9;
|
||||||
|
{{ else }}aspect-ratio: initial;
|
||||||
|
{{ end }}
|
||||||
|
"
|
||||||
|
/>
|
||||||
|
|
||||||
|
{{ if and ($showProgressBar) (not (eq $playPercentage "")) }}
|
||||||
|
<div style="
|
||||||
|
position: absolute;
|
||||||
|
bottom: 8px;
|
||||||
|
left: 8px;
|
||||||
|
right: 8px;
|
||||||
|
height: 6px;
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
overflow: hidden;
|
||||||
|
background-color: rgba(255, 255, 255, 0.2);
|
||||||
|
">
|
||||||
|
<div style="
|
||||||
|
width: {{ print $playPercentage "%" }};
|
||||||
|
height: 100%;
|
||||||
|
border-radius: var(--border-radius) 0 0 var(--border-radius);
|
||||||
|
background-color: var(--color-primary)
|
||||||
|
"></div>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<div class="grow padding-inline-widget margin-top-10 margin-bottom-10">
|
||||||
|
<ul class="flex flex-column justify-evenly margin-bottom-3 {{ if $isSmallColumn }}size-h6{{ end }}" style="height: 100%;">
|
||||||
|
{{ if eq $mode "latest" }}
|
||||||
|
{{ if or (eq $mediaType "Series") (eq $mediaType "Episode") }}
|
||||||
|
<ul class="list-horizontal-text flex-nowrap">
|
||||||
|
<li class="color-primary shrink-0">{{ $unwatchedEpisodeCount }}</li>
|
||||||
|
<li class="text-truncate">{{ $title }}</li>
|
||||||
|
</ul>
|
||||||
|
{{ else if eq $mediaType "MusicAlbum" }}
|
||||||
|
<ul class="list-horizontal-text flex-nowrap">
|
||||||
|
<li class="color-primary text-truncate">{{ $artist }}</li>
|
||||||
|
<li class="text-truncate">{{ $title }}</li>
|
||||||
|
</ul>
|
||||||
|
{{ else }}
|
||||||
|
<li class="text-truncate">{{ $title }}</li>
|
||||||
|
{{ end }}
|
||||||
|
{{ else if eq $mode "nextup" }}
|
||||||
|
<ul class="list-horizontal-text flex-nowrap">
|
||||||
|
<li class="color-primary shrink-0">S{{ $season }}E{{ $episode }}</li>
|
||||||
|
<li class="text-truncate">{{ $seriesTitle }}</li>
|
||||||
|
</ul>
|
||||||
|
<li class="text-truncate">{{ $title }}</li>
|
||||||
|
{{ end }}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ end }}
|
||||||
|
- type: custom-api
|
||||||
|
title: Up Next Movies
|
||||||
|
frameless: true
|
||||||
|
cache: 5m
|
||||||
|
options:
|
||||||
|
base-url: http://umbrel.tail51ffca.ts.net:8096
|
||||||
|
api-key: df9e869fec0b460bb6577302f5efd049
|
||||||
|
user-name: "prad"
|
||||||
|
library-name: "Movies"
|
||||||
|
mode: "nextup"
|
||||||
|
item-count: "10"
|
||||||
|
small-column: false
|
||||||
|
show-thumbnail: true
|
||||||
|
thumbnail-aspect-ratio: "default"
|
||||||
|
template: |
|
||||||
|
{{/* Required config options */}}
|
||||||
|
{{ $baseURL := .Options.StringOr "base-url" "" }}
|
||||||
|
{{ $apiKey := .Options.StringOr "api-key" "" }}
|
||||||
|
{{ $userName := .Options.StringOr "user-name" "" }}
|
||||||
|
|
||||||
|
{{/* Required config options for "latest" mode */}}
|
||||||
|
{{ $libraryName := .Options.StringOr "library-name" "" }}
|
||||||
|
|
||||||
|
{{/* Optional config options */}}
|
||||||
|
{{ $mode := .Options.StringOr "mode" "latest" }}
|
||||||
|
{{ $itemCount := .Options.StringOr "item-count" "10" }}
|
||||||
|
{{ $mediaTypes := .Options.StringOr "media-types" "Movie,Episode,MusicAlbum" }}
|
||||||
|
{{ $thumbAspectRatio := .Options.StringOr "thumbnail-aspect-ratio" "" }}
|
||||||
|
{{ $isSmallColumn:= .Options.BoolOr "small-column" false }}
|
||||||
|
{{ $showThumbnail := .Options.BoolOr "show-thumbnail" false }}
|
||||||
|
{{ $showProgressBar := .Options.BoolOr "progress-bar" true }}
|
||||||
|
|
||||||
|
{{/* Error message template */}}
|
||||||
|
{{ define "errorMsg" }}
|
||||||
|
<div class="widget-error-header">
|
||||||
|
<div class="color-negative size-h3">ERROR</div>
|
||||||
|
<svg class="widget-error-icon" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z"></path>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<p class="break-all">{{ . }}</p>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{/* Check required fields */}}
|
||||||
|
{{ if or (eq $baseURL "") (eq $apiKey "") (eq $userName "") (eq $mode "") (and (eq $mode "latest") (eq $libraryName "")) }}
|
||||||
|
{{ template "errorMsg" "Some required options are not set." }}
|
||||||
|
{{ else }}
|
||||||
|
|
||||||
|
{{/* Fetch user ID */}}
|
||||||
|
{{ $userID := "" }}
|
||||||
|
{{ $usersCall := newRequest (print $baseURL "/Users")
|
||||||
|
| withParameter "api_key" $apiKey
|
||||||
|
| withHeader "Accept" "application/json"
|
||||||
|
| getResponse }}
|
||||||
|
|
||||||
|
{{ range $i, $user := $usersCall.JSON.Array "" }}
|
||||||
|
{{ if eq ($user.String "Name") $userName }}
|
||||||
|
{{ $userID = $user.String "Id" }}
|
||||||
|
{{ break }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ if eq $userID "" }}
|
||||||
|
{{ template "errorMsg" (printf "User '%s' not found." $userName) }}
|
||||||
|
{{ else }}
|
||||||
|
|
||||||
|
{{ $items := "" }}
|
||||||
|
|
||||||
|
{{ if eq $mode "latest" }}
|
||||||
|
|
||||||
|
{{/* Fetch library ID */}}
|
||||||
|
{{ $libraryID := "" }}
|
||||||
|
{{ $userViewsCall := newRequest (print $baseURL "/UserViews")
|
||||||
|
| withParameter "api_key" $apiKey
|
||||||
|
| withParameter "userId" $userID
|
||||||
|
| withHeader "Accept" "application/json"
|
||||||
|
| getResponse }}
|
||||||
|
|
||||||
|
{{ range $i, $item := $userViewsCall.JSON.Array "Items" }}
|
||||||
|
{{ if eq ($item.String "Name") $libraryName }}
|
||||||
|
{{ $libraryID = $item.String "Id" }}
|
||||||
|
{{ break }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ if eq $libraryID "" }}
|
||||||
|
{{ template "errorMsg" (printf "Library '%s' not found." $libraryName) }}
|
||||||
|
{{ else }}
|
||||||
|
{{/* Fetch latest items */}}
|
||||||
|
{{ $latestCall := newRequest (print $baseURL "/Users/" $userID "/Items/Latest")
|
||||||
|
| withParameter "api_key" $apiKey
|
||||||
|
| withParameter "Limit" $itemCount
|
||||||
|
| withParameter "ParentId" $libraryID
|
||||||
|
| withParameter "IncludeItemTypes" $mediaTypes
|
||||||
|
| withParameter "GroupItems" "true"
|
||||||
|
| withHeader "Accept" "application/json"
|
||||||
|
| getResponse }}
|
||||||
|
{{ $items = $latestCall.JSON.Array "" }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ else if eq $mode "nextup" }}
|
||||||
|
|
||||||
|
{{/* Fetch next up items */}}
|
||||||
|
{{ $nextUpCall := newRequest (print $baseURL "/Shows/NextUp")
|
||||||
|
| withParameter "api_key" $apiKey
|
||||||
|
| withParameter "UserId" $userID
|
||||||
|
| withParameter "Limit" $itemCount
|
||||||
|
| withParameter "EnableResumable" "true"
|
||||||
|
| withHeader "Accept" "application/json"
|
||||||
|
| getResponse }}
|
||||||
|
{{ $items = $nextUpCall.JSON.Array "Items" }}
|
||||||
|
|
||||||
|
{{ else }}
|
||||||
|
{{ template "errorMsg" "Unknown mode, expected 'latest' or 'nextup'" }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ if eq (len $items) 0 }}
|
||||||
|
<p>No items found, start streaming something!</p>
|
||||||
|
{{ else }}
|
||||||
|
|
||||||
|
{{/* Display the item carousel */}}
|
||||||
|
<div class="carousel-container show-right-cutoff">
|
||||||
|
<div class="cards-horizontal carousel-items-container">
|
||||||
|
{{ range $n, $item := $items }}
|
||||||
|
{{/* Common item variables */}}
|
||||||
|
{{ $mediaType := $item.String "Type" }}
|
||||||
|
{{ $title := $item.String "Name" }}
|
||||||
|
{{ $itemID := $item.String "Id" }}
|
||||||
|
|
||||||
|
{{/* Media type specific variables */}}
|
||||||
|
{{ $seriesTitle := "" }}
|
||||||
|
{{ $artist := "" }}
|
||||||
|
{{ $seriesID := "" }}
|
||||||
|
{{ $season := "" }}
|
||||||
|
{{ $episode := "" }}
|
||||||
|
{{ $playPercentage := "" }}
|
||||||
|
{{ $unwatchedEpisodeCount := "" }}
|
||||||
|
|
||||||
|
{{ if eq $mediaType "Movie" }}
|
||||||
|
{{ else if eq $mediaType "Series" }}
|
||||||
|
{{ $unwatchedEpisodeCount = $item.Int "UserData.UnplayedItemCount" }}
|
||||||
|
{{ else if eq $mediaType "Episode" }}
|
||||||
|
{{ $unwatchedEpisodeCount = 1 }}
|
||||||
|
{{ $seriesTitle = $item.String "SeriesName" }}
|
||||||
|
{{ $seriesID = $item.String "SeriesId" }}
|
||||||
|
{{ $season = $item.Int "ParentIndexNumber" }}
|
||||||
|
{{ $episode = $item.Int "IndexNumber" }}
|
||||||
|
|
||||||
|
{{ if $item.Exists "UserData.PlayedPercentage" }}
|
||||||
|
{{ $playPercentage = $item.String "UserData.PlayedPercentage" }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{/* For latest always refer to the series not individual episodes */}}
|
||||||
|
{{ if eq $mode "latest" }}
|
||||||
|
{{ $itemID = $seriesID }}
|
||||||
|
{{ $title = $seriesTitle }}
|
||||||
|
{{ end }}
|
||||||
|
{{ else if eq $mediaType "MusicAlbum" }}
|
||||||
|
{{ $artist = $item.String "AlbumArtist" }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ $linkURL := print $baseURL "/web/#/details?id=" $itemID }}
|
||||||
|
{{ $thumbURL := "" }}
|
||||||
|
{{ if not (eq $playPercentage "") }}
|
||||||
|
{{/* $thumbURL = concat $baseURL "/Items/" $itemID "/Images/Primary?api_key=" $apiKey "&percentPlayed=" $playPercentage */}}
|
||||||
|
{{ $thumbURL = concat $baseURL "/Items/" $itemID "/Images/Primary?api_key=" $apiKey }}
|
||||||
|
{{ else }}
|
||||||
|
{{ $thumbURL = concat $baseURL "/Items/" $itemID "/Images/Primary?api_key=" $apiKey }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<a class="card widget-content-frame" href="{{ $linkURL | safeURL }}">
|
||||||
|
{{ if $showThumbnail }}
|
||||||
|
<div style="position: relative;">
|
||||||
|
<img src="{{ $thumbURL | safeURL }}"
|
||||||
|
alt="{{ $title }} thumbnail"
|
||||||
|
loading="lazy"
|
||||||
|
class="media-server-thumbnail shrink-0"
|
||||||
|
style="
|
||||||
|
object-fit: fill;
|
||||||
|
border-radius: var(--border-radius) var(--border-radius) 0 0;
|
||||||
|
width: 100%;
|
||||||
|
display: block;
|
||||||
|
{{ if eq $thumbAspectRatio "square" }}aspect-ratio: 1;
|
||||||
|
{{ else if eq $thumbAspectRatio "portrait" }}aspect-ratio: 2/3;
|
||||||
|
{{ else if eq $thumbAspectRatio "landscape" }}aspect-ratio: 16/9;
|
||||||
|
{{ else }}aspect-ratio: initial;
|
||||||
|
{{ end }}
|
||||||
|
"
|
||||||
|
/>
|
||||||
|
|
||||||
|
{{ if and ($showProgressBar) (not (eq $playPercentage "")) }}
|
||||||
|
<div style="
|
||||||
|
position: absolute;
|
||||||
|
bottom: 8px;
|
||||||
|
left: 8px;
|
||||||
|
right: 8px;
|
||||||
|
height: 6px;
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
overflow: hidden;
|
||||||
|
background-color: rgba(255, 255, 255, 0.2);
|
||||||
|
">
|
||||||
|
<div style="
|
||||||
|
width: {{ print $playPercentage "%" }};
|
||||||
|
height: 100%;
|
||||||
|
border-radius: var(--border-radius) 0 0 var(--border-radius);
|
||||||
|
background-color: var(--color-primary)
|
||||||
|
"></div>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<div class="grow padding-inline-widget margin-top-10 margin-bottom-10">
|
||||||
|
<ul class="flex flex-column justify-evenly margin-bottom-3 {{ if $isSmallColumn }}size-h6{{ end }}" style="height: 100%;">
|
||||||
|
{{ if eq $mode "latest" }}
|
||||||
|
{{ if or (eq $mediaType "Series") (eq $mediaType "Episode") }}
|
||||||
|
<ul class="list-horizontal-text flex-nowrap">
|
||||||
|
<li class="color-primary shrink-0">{{ $unwatchedEpisodeCount }}</li>
|
||||||
|
<li class="text-truncate">{{ $title }}</li>
|
||||||
|
</ul>
|
||||||
|
{{ else if eq $mediaType "MusicAlbum" }}
|
||||||
|
<ul class="list-horizontal-text flex-nowrap">
|
||||||
|
<li class="color-primary text-truncate">{{ $artist }}</li>
|
||||||
|
<li class="text-truncate">{{ $title }}</li>
|
||||||
|
</ul>
|
||||||
|
{{ else }}
|
||||||
|
<li class="text-truncate">{{ $title }}</li>
|
||||||
|
{{ end }}
|
||||||
|
{{ else if eq $mode "nextup" }}
|
||||||
|
<ul class="list-horizontal-text flex-nowrap">
|
||||||
|
<li class="color-primary shrink-0">S{{ $season }}E{{ $episode }}</li>
|
||||||
|
<li class="text-truncate">{{ $seriesTitle }}</li>
|
||||||
|
</ul>
|
||||||
|
<li class="text-truncate">{{ $title }}</li>
|
||||||
|
{{ end }}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
# Entertainment side rail — gaming news, podcasts, gaming videos
|
||||||
|
- size: small
|
||||||
|
widgets:
|
||||||
|
- type: reddit
|
||||||
|
subreddit: gamingnews
|
||||||
|
limit: 7
|
||||||
|
style: vertical-cards
|
||||||
|
- type: videos
|
||||||
|
style: vertical-list
|
||||||
|
collapse-after: 4
|
||||||
|
title: Pop-Culture
|
||||||
|
channels:
|
||||||
|
- UCzQUP1qoWDoEbmsQxvdjxgQ # PowerfulJRE
|
||||||
|
- UCJIfeSCssxSC_Dhc5s7woww # Lex Clips
|
||||||
|
- UC5PstSsGrRwj2o6asQpC4Rg # Flagrant 2
|
||||||
|
- UCKrpnfpTwncQ050VFXcVkuQ # Network State Podcast
|
||||||
|
- UC7oPkqeHTwuOZ5CZ-R9f-6w # Triggernometry
|
||||||
|
- UCIHdDJ0tjn_3j-FS7s_X1kQ # Valuetainment
|
||||||
|
- type: videos
|
||||||
|
style: vertical-list
|
||||||
|
collapse-after: 4
|
||||||
|
title: Gaming
|
||||||
|
channels:
|
||||||
|
- UCNvzD7Z-g64bPXxGzaQaa4g # gameranx
|
||||||
|
- UCZ7AeeVbyslLM_8-nVy2B8Q # Skill Up
|
||||||
|
- UCHDxYLv8iovIbhrfl16CNyg # GameLinked
|
||||||
|
- UC9PBzalIcEQCsiIkq36PyUA # Digital Foundry
|
||||||
@@ -0,0 +1,494 @@
|
|||||||
|
- size: full
|
||||||
|
widgets:
|
||||||
|
- type: custom-api
|
||||||
|
title: Latest TV
|
||||||
|
frameless: true
|
||||||
|
cache: 5m
|
||||||
|
options:
|
||||||
|
base-url: http://umbrel.tail51ffca.ts.net:8096
|
||||||
|
api-key: df9e869fec0b460bb6577302f5efd049
|
||||||
|
user-name: "prad"
|
||||||
|
library-name: "TV"
|
||||||
|
mode: "latest"
|
||||||
|
item-count: "10"
|
||||||
|
small-column: false
|
||||||
|
show-thumbnail: true
|
||||||
|
thumbnail-aspect-ratio: "default"
|
||||||
|
template: |
|
||||||
|
{{/* Required config options */}}
|
||||||
|
{{ $baseURL := .Options.StringOr "base-url" "" }}
|
||||||
|
{{ $apiKey := .Options.StringOr "api-key" "" }}
|
||||||
|
{{ $userName := .Options.StringOr "user-name" "" }}
|
||||||
|
|
||||||
|
{{/* Required config options for "latest" mode */}}
|
||||||
|
{{ $libraryName := .Options.StringOr "library-name" "" }}
|
||||||
|
|
||||||
|
{{/* Optional config options */}}
|
||||||
|
{{ $mode := .Options.StringOr "mode" "latest" }}
|
||||||
|
{{ $itemCount := .Options.StringOr "item-count" "10" }}
|
||||||
|
{{ $mediaTypes := .Options.StringOr "media-types" "Movie,Episode,MusicAlbum" }}
|
||||||
|
{{ $thumbAspectRatio := .Options.StringOr "thumbnail-aspect-ratio" "" }}
|
||||||
|
{{ $isSmallColumn:= .Options.BoolOr "small-column" false }}
|
||||||
|
{{ $showThumbnail := .Options.BoolOr "show-thumbnail" false }}
|
||||||
|
{{ $showProgressBar := .Options.BoolOr "progress-bar" true }}
|
||||||
|
|
||||||
|
{{/* Error message template */}}
|
||||||
|
{{ define "errorMsg" }}
|
||||||
|
<div class="widget-error-header">
|
||||||
|
<div class="color-negative size-h3">ERROR</div>
|
||||||
|
<svg class="widget-error-icon" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z"></path>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<p class="break-all">{{ . }}</p>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{/* Check required fields */}}
|
||||||
|
{{ if or (eq $baseURL "") (eq $apiKey "") (eq $userName "") (eq $mode "") (and (eq $mode "latest") (eq $libraryName "")) }}
|
||||||
|
{{ template "errorMsg" "Some required options are not set." }}
|
||||||
|
{{ else }}
|
||||||
|
|
||||||
|
{{/* Fetch user ID */}}
|
||||||
|
{{ $userID := "" }}
|
||||||
|
{{ $usersCall := newRequest (print $baseURL "/Users")
|
||||||
|
| withParameter "api_key" $apiKey
|
||||||
|
| withHeader "Accept" "application/json"
|
||||||
|
| getResponse }}
|
||||||
|
|
||||||
|
{{ range $i, $user := $usersCall.JSON.Array "" }}
|
||||||
|
{{ if eq ($user.String "Name") $userName }}
|
||||||
|
{{ $userID = $user.String "Id" }}
|
||||||
|
{{ break }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ if eq $userID "" }}
|
||||||
|
{{ template "errorMsg" (printf "User '%s' not found." $userName) }}
|
||||||
|
{{ else }}
|
||||||
|
|
||||||
|
{{ $items := "" }}
|
||||||
|
|
||||||
|
{{ if eq $mode "latest" }}
|
||||||
|
|
||||||
|
{{/* Fetch library ID */}}
|
||||||
|
{{ $libraryID := "" }}
|
||||||
|
{{ $userViewsCall := newRequest (print $baseURL "/UserViews")
|
||||||
|
| withParameter "api_key" $apiKey
|
||||||
|
| withParameter "userId" $userID
|
||||||
|
| withHeader "Accept" "application/json"
|
||||||
|
| getResponse }}
|
||||||
|
|
||||||
|
{{ range $i, $item := $userViewsCall.JSON.Array "Items" }}
|
||||||
|
{{ if eq ($item.String "Name") $libraryName }}
|
||||||
|
{{ $libraryID = $item.String "Id" }}
|
||||||
|
{{ break }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ if eq $libraryID "" }}
|
||||||
|
{{ template "errorMsg" (printf "Library '%s' not found." $libraryName) }}
|
||||||
|
{{ else }}
|
||||||
|
{{/* Fetch latest items */}}
|
||||||
|
{{ $latestCall := newRequest (print $baseURL "/Users/" $userID "/Items/Latest")
|
||||||
|
| withParameter "api_key" $apiKey
|
||||||
|
| withParameter "Limit" $itemCount
|
||||||
|
| withParameter "ParentId" $libraryID
|
||||||
|
| withParameter "IncludeItemTypes" $mediaTypes
|
||||||
|
| withParameter "GroupItems" "true"
|
||||||
|
| withHeader "Accept" "application/json"
|
||||||
|
| getResponse }}
|
||||||
|
{{ $items = $latestCall.JSON.Array "" }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ else if eq $mode "nextup" }}
|
||||||
|
|
||||||
|
{{/* Fetch next up items */}}
|
||||||
|
{{ $nextUpCall := newRequest (print $baseURL "/Shows/NextUp")
|
||||||
|
| withParameter "api_key" $apiKey
|
||||||
|
| withParameter "UserId" $userID
|
||||||
|
| withParameter "Limit" $itemCount
|
||||||
|
| withParameter "EnableResumable" "true"
|
||||||
|
| withHeader "Accept" "application/json"
|
||||||
|
| getResponse }}
|
||||||
|
{{ $items = $nextUpCall.JSON.Array "Items" }}
|
||||||
|
|
||||||
|
{{ else }}
|
||||||
|
{{ template "errorMsg" "Unknown mode, expected 'latest' or 'nextup'" }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ if eq (len $items) 0 }}
|
||||||
|
<p>No items found, start streaming something!</p>
|
||||||
|
{{ else }}
|
||||||
|
|
||||||
|
{{/* Display the item carousel */}}
|
||||||
|
<div class="carousel-container show-right-cutoff">
|
||||||
|
<div class="cards-horizontal carousel-items-container">
|
||||||
|
{{ range $n, $item := $items }}
|
||||||
|
{{/* Common item variables */}}
|
||||||
|
{{ $mediaType := $item.String "Type" }}
|
||||||
|
{{ $title := $item.String "Name" }}
|
||||||
|
{{ $itemID := $item.String "Id" }}
|
||||||
|
|
||||||
|
{{/* Media type specific variables */}}
|
||||||
|
{{ $seriesTitle := "" }}
|
||||||
|
{{ $artist := "" }}
|
||||||
|
{{ $seriesID := "" }}
|
||||||
|
{{ $season := "" }}
|
||||||
|
{{ $episode := "" }}
|
||||||
|
{{ $playPercentage := "" }}
|
||||||
|
{{ $unwatchedEpisodeCount := "" }}
|
||||||
|
|
||||||
|
{{ if eq $mediaType "Movie" }}
|
||||||
|
{{ else if eq $mediaType "Series" }}
|
||||||
|
{{ $unwatchedEpisodeCount = $item.Int "UserData.UnplayedItemCount" }}
|
||||||
|
{{ else if eq $mediaType "Episode" }}
|
||||||
|
{{ $unwatchedEpisodeCount = 1 }}
|
||||||
|
{{ $seriesTitle = $item.String "SeriesName" }}
|
||||||
|
{{ $seriesID = $item.String "SeriesId" }}
|
||||||
|
{{ $season = $item.Int "ParentIndexNumber" }}
|
||||||
|
{{ $episode = $item.Int "IndexNumber" }}
|
||||||
|
|
||||||
|
{{ if $item.Exists "UserData.PlayedPercentage" }}
|
||||||
|
{{ $playPercentage = $item.String "UserData.PlayedPercentage" }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{/* For latest always refer to the series not individual episodes */}}
|
||||||
|
{{ if eq $mode "latest" }}
|
||||||
|
{{ $itemID = $seriesID }}
|
||||||
|
{{ $title = $seriesTitle }}
|
||||||
|
{{ end }}
|
||||||
|
{{ else if eq $mediaType "MusicAlbum" }}
|
||||||
|
{{ $artist = $item.String "AlbumArtist" }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ $linkURL := print $baseURL "/web/#/details?id=" $itemID }}
|
||||||
|
{{ $thumbURL := "" }}
|
||||||
|
{{ if not (eq $playPercentage "") }}
|
||||||
|
{{/* $thumbURL = concat $baseURL "/Items/" $itemID "/Images/Primary?api_key=" $apiKey "&percentPlayed=" $playPercentage */}}
|
||||||
|
{{ $thumbURL = concat $baseURL "/Items/" $itemID "/Images/Primary?api_key=" $apiKey }}
|
||||||
|
{{ else }}
|
||||||
|
{{ $thumbURL = concat $baseURL "/Items/" $itemID "/Images/Primary?api_key=" $apiKey }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<a class="card widget-content-frame" href="{{ $linkURL | safeURL }}">
|
||||||
|
{{ if $showThumbnail }}
|
||||||
|
<div style="position: relative;">
|
||||||
|
<img src="{{ $thumbURL | safeURL }}"
|
||||||
|
alt="{{ $title }} thumbnail"
|
||||||
|
loading="lazy"
|
||||||
|
class="media-server-thumbnail shrink-0"
|
||||||
|
style="
|
||||||
|
object-fit: fill;
|
||||||
|
border-radius: var(--border-radius) var(--border-radius) 0 0;
|
||||||
|
width: 100%;
|
||||||
|
display: block;
|
||||||
|
{{ if eq $thumbAspectRatio "square" }}aspect-ratio: 1;
|
||||||
|
{{ else if eq $thumbAspectRatio "portrait" }}aspect-ratio: 2/3;
|
||||||
|
{{ else if eq $thumbAspectRatio "landscape" }}aspect-ratio: 16/9;
|
||||||
|
{{ else }}aspect-ratio: initial;
|
||||||
|
{{ end }}
|
||||||
|
"
|
||||||
|
/>
|
||||||
|
|
||||||
|
{{ if and ($showProgressBar) (not (eq $playPercentage "")) }}
|
||||||
|
<div style="
|
||||||
|
position: absolute;
|
||||||
|
bottom: 8px;
|
||||||
|
left: 8px;
|
||||||
|
right: 8px;
|
||||||
|
height: 6px;
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
overflow: hidden;
|
||||||
|
background-color: rgba(255, 255, 255, 0.2);
|
||||||
|
">
|
||||||
|
<div style="
|
||||||
|
width: {{ print $playPercentage "%" }};
|
||||||
|
height: 100%;
|
||||||
|
border-radius: var(--border-radius) 0 0 var(--border-radius);
|
||||||
|
background-color: var(--color-primary)
|
||||||
|
"></div>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<div class="grow padding-inline-widget margin-top-10 margin-bottom-10">
|
||||||
|
<ul class="flex flex-column justify-evenly margin-bottom-3 {{ if $isSmallColumn }}size-h6{{ end }}" style="height: 100%;">
|
||||||
|
{{ if eq $mode "latest" }}
|
||||||
|
{{ if or (eq $mediaType "Series") (eq $mediaType "Episode") }}
|
||||||
|
<ul class="list-horizontal-text flex-nowrap">
|
||||||
|
<li class="color-primary shrink-0">{{ $unwatchedEpisodeCount }}</li>
|
||||||
|
<li class="text-truncate">{{ $title }}</li>
|
||||||
|
</ul>
|
||||||
|
{{ else if eq $mediaType "MusicAlbum" }}
|
||||||
|
<ul class="list-horizontal-text flex-nowrap">
|
||||||
|
<li class="color-primary text-truncate">{{ $artist }}</li>
|
||||||
|
<li class="text-truncate">{{ $title }}</li>
|
||||||
|
</ul>
|
||||||
|
{{ else }}
|
||||||
|
<li class="text-truncate">{{ $title }}</li>
|
||||||
|
{{ end }}
|
||||||
|
{{ else if eq $mode "nextup" }}
|
||||||
|
<ul class="list-horizontal-text flex-nowrap">
|
||||||
|
<li class="color-primary shrink-0">S{{ $season }}E{{ $episode }}</li>
|
||||||
|
<li class="text-truncate">{{ $seriesTitle }}</li>
|
||||||
|
</ul>
|
||||||
|
<li class="text-truncate">{{ $title }}</li>
|
||||||
|
{{ end }}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ end }}
|
||||||
|
- type: custom-api
|
||||||
|
title: Up Next TV
|
||||||
|
frameless: true
|
||||||
|
cache: 5m
|
||||||
|
options:
|
||||||
|
base-url: http://umbrel.tail51ffca.ts.net:8096
|
||||||
|
api-key: df9e869fec0b460bb6577302f5efd049
|
||||||
|
user-name: "prad"
|
||||||
|
library-name: "TV"
|
||||||
|
mode: "nextup"
|
||||||
|
item-count: "10"
|
||||||
|
small-column: false
|
||||||
|
show-thumbnail: true
|
||||||
|
thumbnail-aspect-ratio: "default"
|
||||||
|
template: |
|
||||||
|
{{/* Required config options */}}
|
||||||
|
{{ $baseURL := .Options.StringOr "base-url" "" }}
|
||||||
|
{{ $apiKey := .Options.StringOr "api-key" "" }}
|
||||||
|
{{ $userName := .Options.StringOr "user-name" "" }}
|
||||||
|
|
||||||
|
{{/* Required config options for "latest" mode */}}
|
||||||
|
{{ $libraryName := .Options.StringOr "library-name" "" }}
|
||||||
|
|
||||||
|
{{/* Optional config options */}}
|
||||||
|
{{ $mode := .Options.StringOr "mode" "latest" }}
|
||||||
|
{{ $itemCount := .Options.StringOr "item-count" "10" }}
|
||||||
|
{{ $mediaTypes := .Options.StringOr "media-types" "Movie,Episode,MusicAlbum" }}
|
||||||
|
{{ $thumbAspectRatio := .Options.StringOr "thumbnail-aspect-ratio" "" }}
|
||||||
|
{{ $isSmallColumn:= .Options.BoolOr "small-column" false }}
|
||||||
|
{{ $showThumbnail := .Options.BoolOr "show-thumbnail" false }}
|
||||||
|
{{ $showProgressBar := .Options.BoolOr "progress-bar" true }}
|
||||||
|
|
||||||
|
{{/* Error message template */}}
|
||||||
|
{{ define "errorMsg" }}
|
||||||
|
<div class="widget-error-header">
|
||||||
|
<div class="color-negative size-h3">ERROR</div>
|
||||||
|
<svg class="widget-error-icon" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z"></path>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<p class="break-all">{{ . }}</p>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{/* Check required fields */}}
|
||||||
|
{{ if or (eq $baseURL "") (eq $apiKey "") (eq $userName "") (eq $mode "") (and (eq $mode "latest") (eq $libraryName "")) }}
|
||||||
|
{{ template "errorMsg" "Some required options are not set." }}
|
||||||
|
{{ else }}
|
||||||
|
|
||||||
|
{{/* Fetch user ID */}}
|
||||||
|
{{ $userID := "" }}
|
||||||
|
{{ $usersCall := newRequest (print $baseURL "/Users")
|
||||||
|
| withParameter "api_key" $apiKey
|
||||||
|
| withHeader "Accept" "application/json"
|
||||||
|
| getResponse }}
|
||||||
|
|
||||||
|
{{ range $i, $user := $usersCall.JSON.Array "" }}
|
||||||
|
{{ if eq ($user.String "Name") $userName }}
|
||||||
|
{{ $userID = $user.String "Id" }}
|
||||||
|
{{ break }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ if eq $userID "" }}
|
||||||
|
{{ template "errorMsg" (printf "User '%s' not found." $userName) }}
|
||||||
|
{{ else }}
|
||||||
|
|
||||||
|
{{ $items := "" }}
|
||||||
|
|
||||||
|
{{ if eq $mode "latest" }}
|
||||||
|
|
||||||
|
{{/* Fetch library ID */}}
|
||||||
|
{{ $libraryID := "" }}
|
||||||
|
{{ $userViewsCall := newRequest (print $baseURL "/UserViews")
|
||||||
|
| withParameter "api_key" $apiKey
|
||||||
|
| withParameter "userId" $userID
|
||||||
|
| withHeader "Accept" "application/json"
|
||||||
|
| getResponse }}
|
||||||
|
|
||||||
|
{{ range $i, $item := $userViewsCall.JSON.Array "Items" }}
|
||||||
|
{{ if eq ($item.String "Name") $libraryName }}
|
||||||
|
{{ $libraryID = $item.String "Id" }}
|
||||||
|
{{ break }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ if eq $libraryID "" }}
|
||||||
|
{{ template "errorMsg" (printf "Library '%s' not found." $libraryName) }}
|
||||||
|
{{ else }}
|
||||||
|
{{/* Fetch latest items */}}
|
||||||
|
{{ $latestCall := newRequest (print $baseURL "/Users/" $userID "/Items/Latest")
|
||||||
|
| withParameter "api_key" $apiKey
|
||||||
|
| withParameter "Limit" $itemCount
|
||||||
|
| withParameter "ParentId" $libraryID
|
||||||
|
| withParameter "IncludeItemTypes" $mediaTypes
|
||||||
|
| withParameter "GroupItems" "true"
|
||||||
|
| withHeader "Accept" "application/json"
|
||||||
|
| getResponse }}
|
||||||
|
{{ $items = $latestCall.JSON.Array "" }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ else if eq $mode "nextup" }}
|
||||||
|
|
||||||
|
{{/* Fetch next up items */}}
|
||||||
|
{{ $nextUpCall := newRequest (print $baseURL "/Shows/NextUp")
|
||||||
|
| withParameter "api_key" $apiKey
|
||||||
|
| withParameter "UserId" $userID
|
||||||
|
| withParameter "Limit" $itemCount
|
||||||
|
| withParameter "EnableResumable" "true"
|
||||||
|
| withHeader "Accept" "application/json"
|
||||||
|
| getResponse }}
|
||||||
|
{{ $items = $nextUpCall.JSON.Array "Items" }}
|
||||||
|
|
||||||
|
{{ else }}
|
||||||
|
{{ template "errorMsg" "Unknown mode, expected 'latest' or 'nextup'" }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ if eq (len $items) 0 }}
|
||||||
|
<p>No items found, start streaming something!</p>
|
||||||
|
{{ else }}
|
||||||
|
|
||||||
|
{{/* Display the item carousel */}}
|
||||||
|
<div class="carousel-container show-right-cutoff">
|
||||||
|
<div class="cards-horizontal carousel-items-container">
|
||||||
|
{{ range $n, $item := $items }}
|
||||||
|
{{/* Common item variables */}}
|
||||||
|
{{ $mediaType := $item.String "Type" }}
|
||||||
|
{{ $title := $item.String "Name" }}
|
||||||
|
{{ $itemID := $item.String "Id" }}
|
||||||
|
|
||||||
|
{{/* Media type specific variables */}}
|
||||||
|
{{ $seriesTitle := "" }}
|
||||||
|
{{ $artist := "" }}
|
||||||
|
{{ $seriesID := "" }}
|
||||||
|
{{ $season := "" }}
|
||||||
|
{{ $episode := "" }}
|
||||||
|
{{ $playPercentage := "" }}
|
||||||
|
{{ $unwatchedEpisodeCount := "" }}
|
||||||
|
|
||||||
|
{{ if eq $mediaType "Movie" }}
|
||||||
|
{{ else if eq $mediaType "Series" }}
|
||||||
|
{{ $unwatchedEpisodeCount = $item.Int "UserData.UnplayedItemCount" }}
|
||||||
|
{{ else if eq $mediaType "Episode" }}
|
||||||
|
{{ $unwatchedEpisodeCount = 1 }}
|
||||||
|
{{ $seriesTitle = $item.String "SeriesName" }}
|
||||||
|
{{ $seriesID = $item.String "SeriesId" }}
|
||||||
|
{{ $season = $item.Int "ParentIndexNumber" }}
|
||||||
|
{{ $episode = $item.Int "IndexNumber" }}
|
||||||
|
|
||||||
|
{{ if $item.Exists "UserData.PlayedPercentage" }}
|
||||||
|
{{ $playPercentage = $item.String "UserData.PlayedPercentage" }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{/* For latest always refer to the series not individual episodes */}}
|
||||||
|
{{ if eq $mode "latest" }}
|
||||||
|
{{ $itemID = $seriesID }}
|
||||||
|
{{ $title = $seriesTitle }}
|
||||||
|
{{ end }}
|
||||||
|
{{ else if eq $mediaType "MusicAlbum" }}
|
||||||
|
{{ $artist = $item.String "AlbumArtist" }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ $linkURL := print $baseURL "/web/#/details?id=" $itemID }}
|
||||||
|
{{ $thumbURL := "" }}
|
||||||
|
{{ if not (eq $playPercentage "") }}
|
||||||
|
{{/* $thumbURL = concat $baseURL "/Items/" $itemID "/Images/Primary?api_key=" $apiKey "&percentPlayed=" $playPercentage */}}
|
||||||
|
{{ $thumbURL = concat $baseURL "/Items/" $itemID "/Images/Primary?api_key=" $apiKey }}
|
||||||
|
{{ else }}
|
||||||
|
{{ $thumbURL = concat $baseURL "/Items/" $itemID "/Images/Primary?api_key=" $apiKey }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<a class="card widget-content-frame" href="{{ $linkURL | safeURL }}">
|
||||||
|
{{ if $showThumbnail }}
|
||||||
|
<div style="position: relative;">
|
||||||
|
<img src="{{ $thumbURL | safeURL }}"
|
||||||
|
alt="{{ $title }} thumbnail"
|
||||||
|
loading="lazy"
|
||||||
|
class="media-server-thumbnail shrink-0"
|
||||||
|
style="
|
||||||
|
object-fit: fill;
|
||||||
|
border-radius: var(--border-radius) var(--border-radius) 0 0;
|
||||||
|
width: 100%;
|
||||||
|
display: block;
|
||||||
|
{{ if eq $thumbAspectRatio "square" }}aspect-ratio: 1;
|
||||||
|
{{ else if eq $thumbAspectRatio "portrait" }}aspect-ratio: 2/3;
|
||||||
|
{{ else if eq $thumbAspectRatio "landscape" }}aspect-ratio: 16/9;
|
||||||
|
{{ else }}aspect-ratio: initial;
|
||||||
|
{{ end }}
|
||||||
|
"
|
||||||
|
/>
|
||||||
|
|
||||||
|
{{ if and ($showProgressBar) (not (eq $playPercentage "")) }}
|
||||||
|
<div style="
|
||||||
|
position: absolute;
|
||||||
|
bottom: 8px;
|
||||||
|
left: 8px;
|
||||||
|
right: 8px;
|
||||||
|
height: 6px;
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
overflow: hidden;
|
||||||
|
background-color: rgba(255, 255, 255, 0.2);
|
||||||
|
">
|
||||||
|
<div style="
|
||||||
|
width: {{ print $playPercentage "%" }};
|
||||||
|
height: 100%;
|
||||||
|
border-radius: var(--border-radius) 0 0 var(--border-radius);
|
||||||
|
background-color: var(--color-primary)
|
||||||
|
"></div>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<div class="grow padding-inline-widget margin-top-10 margin-bottom-10">
|
||||||
|
<ul class="flex flex-column justify-evenly margin-bottom-3 {{ if $isSmallColumn }}size-h6{{ end }}" style="height: 100%;">
|
||||||
|
{{ if eq $mode "latest" }}
|
||||||
|
{{ if or (eq $mediaType "Series") (eq $mediaType "Episode") }}
|
||||||
|
<ul class="list-horizontal-text flex-nowrap">
|
||||||
|
<li class="color-primary shrink-0">{{ $unwatchedEpisodeCount }}</li>
|
||||||
|
<li class="text-truncate">{{ $title }}</li>
|
||||||
|
</ul>
|
||||||
|
{{ else if eq $mediaType "MusicAlbum" }}
|
||||||
|
<ul class="list-horizontal-text flex-nowrap">
|
||||||
|
<li class="color-primary text-truncate">{{ $artist }}</li>
|
||||||
|
<li class="text-truncate">{{ $title }}</li>
|
||||||
|
</ul>
|
||||||
|
{{ else }}
|
||||||
|
<li class="text-truncate">{{ $title }}</li>
|
||||||
|
{{ end }}
|
||||||
|
{{ else if eq $mode "nextup" }}
|
||||||
|
<ul class="list-horizontal-text flex-nowrap">
|
||||||
|
<li class="color-primary shrink-0">S{{ $season }}E{{ $episode }}</li>
|
||||||
|
<li class="text-truncate">{{ $seriesTitle }}</li>
|
||||||
|
</ul>
|
||||||
|
<li class="text-truncate">{{ $title }}</li>
|
||||||
|
{{ end }}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
- type: split-column
|
|
||||||
max-columns: 5
|
|
||||||
widgets:
|
|
||||||
- type: custom-api
|
|
||||||
title: Secured Financing Rate
|
|
||||||
cache: 12h
|
|
||||||
url: https://api.stlouisfed.org/fred/series/observations?series_id=SOFR&api_key=46fd446049e6ad0cbd6e019584fe36bf&file_type=json&sort_order=desc&limit=2
|
|
||||||
template: |
|
|
||||||
{{ $latest := .JSON.Float "observations.0.value" }}
|
|
||||||
{{ $previous := .JSON.Float "observations.1.value" }}
|
|
||||||
{{ $lastObserve := .JSON.String "observations.0.date" }}
|
|
||||||
{{ $change := sub $latest $previous }}
|
|
||||||
<div class="flex justify-between items-center gap-15">
|
|
||||||
<div class="min-width-0">
|
|
||||||
<a class="size-h3 block color-highlight" href="https://fred.stlouisfed.org/series/MORTGAGE30US" target="_blank" rel="noreferrer">
|
|
||||||
{{ .JSON.String "observations.0.value" }}%
|
|
||||||
</a>
|
|
||||||
<div class="text-truncate">St. Louis Federal Reserve</div>
|
|
||||||
</div>
|
|
||||||
<div class="shrink-0">
|
|
||||||
<div class="size-h3 text-right {{ if lt $change 0.0 }}color-positive{{ else if gt $change 0.0 }}color-negative{{ end }}">
|
|
||||||
{{ printf "%+.2f" $change }}%
|
|
||||||
</div>
|
|
||||||
<div class="text-right" title="Last change: {{ $lastObserve }}" {{ $lastObserve | parseRelativeTime "DateOnly" }}>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
- type: custom-api
|
|
||||||
title: Federal Funds Rate
|
|
||||||
cache: 12h
|
|
||||||
url: https://api.stlouisfed.org/fred/series/observations?series_id=FEDFUNDS&api_key=46fd446049e6ad0cbd6e019584fe36bf&file_type=json&sort_order=desc&limit=2
|
|
||||||
template: |
|
|
||||||
{{ $latest := .JSON.Float "observations.0.value" }}
|
|
||||||
{{ $previous := .JSON.Float "observations.1.value" }}
|
|
||||||
{{ $lastObserve := .JSON.String "observations.0.date" }}
|
|
||||||
{{ $change := sub $latest $previous }}
|
|
||||||
<div class="flex justify-between items-center gap-15">
|
|
||||||
<div class="min-width-0">
|
|
||||||
<a class="size-h3 block color-highlight" href="https://fred.stlouisfed.org/series/MORTGAGE30US" target="_blank" rel="noreferrer">
|
|
||||||
{{ .JSON.String "observations.0.value" }}%
|
|
||||||
</a>
|
|
||||||
<div class="text-truncate">St. Louis Federal Reserve</div>
|
|
||||||
</div>
|
|
||||||
<div class="shrink-0">
|
|
||||||
<div class="size-h3 text-right {{ if lt $change 0.0 }}color-positive{{ else if gt $change 0.0 }}color-negative{{ end }}">
|
|
||||||
{{ printf "%+.2f" $change }}%
|
|
||||||
</div>
|
|
||||||
<div class="text-right" title="Last change: {{ $lastObserve }}" {{ $lastObserve | parseRelativeTime "DateOnly" }}>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
- type: custom-api
|
|
||||||
title: Real GDP
|
|
||||||
cache: 12h
|
|
||||||
url: https://api.stlouisfed.org/fred/series/observations?series_id=A191RL1Q225SBEA&api_key=46fd446049e6ad0cbd6e019584fe36bf&file_type=json&sort_order=desc&limit=2
|
|
||||||
template: |
|
|
||||||
{{ $latest := .JSON.Float "observations.0.value" }}
|
|
||||||
{{ $previous := .JSON.Float "observations.1.value" }}
|
|
||||||
{{ $lastObserve := .JSON.String "observations.0.date" }}
|
|
||||||
{{ $change := sub $latest $previous }}
|
|
||||||
<div class="flex justify-between items-center gap-15">
|
|
||||||
<div class="min-width-0">
|
|
||||||
<a class="size-h3 block color-highlight" href="https://fred.stlouisfed.org/series/MORTGAGE30US" target="_blank" rel="noreferrer">
|
|
||||||
{{ .JSON.String "observations.0.value" }}%
|
|
||||||
</a>
|
|
||||||
<div class="text-truncate">St. Louis Federal Reserve</div>
|
|
||||||
</div>
|
|
||||||
<div class="shrink-0">
|
|
||||||
<div class="size-h3 text-right {{ if lt $change 0.0 }}color-positive{{ else if gt $change 0.0 }}color-negative{{ end }}">
|
|
||||||
{{ printf "%+.2f" $change }}%
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
- size: small
|
|
||||||
widgets:
|
|
||||||
- type: twitch-top-games
|
|
||||||
limit: 20
|
|
||||||
collapse-after: 13
|
|
||||||
exclude:
|
|
||||||
- just-chatting
|
|
||||||
- pools-hot-tubs-and-beaches
|
|
||||||
- music
|
|
||||||
- art
|
|
||||||
- asmr
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
- size: full
|
|
||||||
widgets:
|
|
||||||
- type: group
|
|
||||||
widgets:
|
|
||||||
- type: reddit
|
|
||||||
show-thumbnails: true
|
|
||||||
subreddit: technology
|
|
||||||
- type: reddit
|
|
||||||
show-thumbnails: true
|
|
||||||
subreddit: wallstreetbets
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
- size: small
|
|
||||||
widgets:
|
|
||||||
- type: reddit
|
|
||||||
subreddit: gamingnews
|
|
||||||
limit: 7
|
|
||||||
style: vertical-cards
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
- type: split-column
|
|
||||||
max-columns: 5
|
|
||||||
widgets:
|
|
||||||
- type: custom-api
|
|
||||||
title: Secured Financing Rate
|
|
||||||
cache: 12h
|
|
||||||
url: https://api.stlouisfed.org/fred/series/observations?series_id=SOFR&api_key=46fd446049e6ad0cbd6e019584fe36bf&file_type=json&sort_order=desc&limit=2
|
|
||||||
template: |
|
|
||||||
{{ $latest := .JSON.Float "observations.0.value" }}
|
|
||||||
{{ $previous := .JSON.Float "observations.1.value" }}
|
|
||||||
{{ $lastObserve := .JSON.String "observations.0.date" }}
|
|
||||||
{{ $change := sub $latest $previous }}
|
|
||||||
<div class="flex justify-between items-center gap-15">
|
|
||||||
<div class="min-width-0">
|
|
||||||
<a class="size-h3 block color-highlight" href="https://fred.stlouisfed.org/series/MORTGAGE30US" target="_blank" rel="noreferrer">
|
|
||||||
{{ .JSON.String "observations.0.value" }}%
|
|
||||||
</a>
|
|
||||||
<div class="text-truncate">St. Louis Federal Reserve</div>
|
|
||||||
</div>
|
|
||||||
<div class="shrink-0">
|
|
||||||
<div class="size-h3 text-right {{ if lt $change 0.0 }}color-positive{{ else if gt $change 0.0 }}color-negative{{ end }}">
|
|
||||||
{{ printf "%+.2f" $change }}%
|
|
||||||
</div>
|
|
||||||
<div class="text-right" title="Last change: {{ $lastObserve }}" {{ $lastObserve | parseRelativeTime "DateOnly" }}>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
- type: custom-api
|
|
||||||
title: Federal Funds Rate
|
|
||||||
cache: 12h
|
|
||||||
url: https://api.stlouisfed.org/fred/series/observations?series_id=FEDFUNDS&api_key=46fd446049e6ad0cbd6e019584fe36bf&file_type=json&sort_order=desc&limit=2
|
|
||||||
template: |
|
|
||||||
{{ $latest := .JSON.Float "observations.0.value" }}
|
|
||||||
{{ $previous := .JSON.Float "observations.1.value" }}
|
|
||||||
{{ $lastObserve := .JSON.String "observations.0.date" }}
|
|
||||||
{{ $change := sub $latest $previous }}
|
|
||||||
<div class="flex justify-between items-center gap-15">
|
|
||||||
<div class="min-width-0">
|
|
||||||
<a class="size-h3 block color-highlight" href="https://fred.stlouisfed.org/series/MORTGAGE30US" target="_blank" rel="noreferrer">
|
|
||||||
{{ .JSON.String "observations.0.value" }}%
|
|
||||||
</a>
|
|
||||||
<div class="text-truncate">St. Louis Federal Reserve</div>
|
|
||||||
</div>
|
|
||||||
<div class="shrink-0">
|
|
||||||
<div class="size-h3 text-right {{ if lt $change 0.0 }}color-positive{{ else if gt $change 0.0 }}color-negative{{ end }}">
|
|
||||||
{{ printf "%+.2f" $change }}%
|
|
||||||
</div>
|
|
||||||
<div class="text-right" title="Last change: {{ $lastObserve }}" {{ $lastObserve | parseRelativeTime "DateOnly" }}>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
- type: custom-api
|
|
||||||
title: Real GDP
|
|
||||||
cache: 12h
|
|
||||||
url: https://api.stlouisfed.org/fred/series/observations?series_id=A191RL1Q225SBEA&api_key=46fd446049e6ad0cbd6e019584fe36bf&file_type=json&sort_order=desc&limit=2
|
|
||||||
template: |
|
|
||||||
{{ $latest := .JSON.Float "observations.0.value" }}
|
|
||||||
{{ $previous := .JSON.Float "observations.1.value" }}
|
|
||||||
{{ $lastObserve := .JSON.String "observations.0.date" }}
|
|
||||||
{{ $change := sub $latest $previous }}
|
|
||||||
<div class="flex justify-between items-center gap-15">
|
|
||||||
<div class="min-width-0">
|
|
||||||
<a class="size-h3 block color-highlight" href="https://fred.stlouisfed.org/series/MORTGAGE30US" target="_blank" rel="noreferrer">
|
|
||||||
{{ .JSON.String "observations.0.value" }}%
|
|
||||||
</a>
|
|
||||||
<div class="text-truncate">St. Louis Federal Reserve</div>
|
|
||||||
</div>
|
|
||||||
<div class="shrink-0">
|
|
||||||
<div class="size-h3 text-right {{ if lt $change 0.0 }}color-positive{{ else if gt $change 0.0 }}color-negative{{ end }}">
|
|
||||||
{{ printf "%+.2f" $change }}%
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
- type: group
|
|
||||||
widgets:
|
|
||||||
# Podcasts & Commentary
|
|
||||||
- type: videos
|
|
||||||
style: grid-cards
|
|
||||||
collapse-after-rows: 2
|
|
||||||
title: Pop-Culture
|
|
||||||
channels:
|
|
||||||
- UCzQUP1qoWDoEbmsQxvdjxgQ # PowerfulJRE
|
|
||||||
- UCJIfeSCssxSC_Dhc5s7woww # Lex Clips
|
|
||||||
- UC5PstSsGrRwj2o6asQpC4Rg # Flagrant 2
|
|
||||||
- UCKrpnfpTwncQ050VFXcVkuQ # Network State Podcast
|
|
||||||
- UC7oPkqeHTwuOZ5CZ-R9f-6w # Triggernometry
|
|
||||||
- UCIHdDJ0tjn_3j-FS7s_X1kQ # Valuetainment
|
|
||||||
|
|
||||||
# Programming & Tech
|
|
||||||
- type: videos
|
|
||||||
style: grid-cards
|
|
||||||
collapse-after-rows: 2
|
|
||||||
title: Programming
|
|
||||||
channels:
|
|
||||||
- UCUyeluBRhGPCW4rPe_UvBZQ # ThePrimeTime
|
|
||||||
- UCjSEJkpGbcZhvo0lr-44X_w # TechHut
|
|
||||||
- UCXuqSBlHAE6Xw-yeJA0Tunw # Linus Tech Tips
|
|
||||||
- UCs6KfncB4OV6Vug4o_bzijg # Techlore
|
|
||||||
- UCTwxaBjziKfy6y_uWu30orAby # BugBytes
|
|
||||||
- UCYeiozh-4QwuC1sjgCmB92w # DevOps Toolbox
|
|
||||||
- UCsBjURrPoezykLs9EqgamOA # Angular Firebase
|
|
||||||
- UC-mTIBh__DzAqW495JHXy5A # The Coding Gopher
|
|
||||||
- UC2WHjPDvbE6O328n17ZGcfg # ForrestKnight
|
|
||||||
- UCsUalyRg43M8D60mtHe6YcAD # Honeypot
|
|
||||||
- UCgfe2ooZD3VJPB6aJAnuQng # cloud
|
|
||||||
- UCdjsUXJ3QawK4O5L1kqqsew # IPFS
|
|
||||||
- UC3Wn3dABlgESm8Bzn8Vamgg # Sideprojects
|
|
||||||
- UCtMVHI3AJD4Qk4hcbZnI9ZQ # SomeOrdinaryGamers
|
|
||||||
- UCNJ1Ymd5yFuUPtn21xtRbbw # AI Explained
|
|
||||||
- UCutCcajxhR33k9UR-DdLsAQ # Systems Innovation
|
|
||||||
|
|
||||||
# Startups & Business
|
|
||||||
- type: videos
|
|
||||||
style: grid-cards
|
|
||||||
collapse-after-rows: 2
|
|
||||||
title: Startups
|
|
||||||
channels:
|
|
||||||
- UCcefcZRL2oaA_uBNeo5UOWg # Y Combinator
|
|
||||||
- UCllx7jOjBL794FK67jtb5Og # Dalton + Michael
|
|
||||||
- UCxIJaCMEptJjxmmQgGFsnCg # How to Start a Startup
|
|
||||||
- UCQrZfl1FeCN9c71yjOzWVRw # Startup Archive
|
|
||||||
- UCtieZ1nS_tpjGEama6Kjxcg # Steve Jobs Archive
|
|
||||||
- UCm_WkN0wg49-eG4SymAQ_4g # Harvard Innovation Labs
|
|
||||||
- UCSGc7c1yKxo-Uhz5_oivrfg # The Startup Club by Slidebean
|
|
||||||
- UCGq-a57w-aPwyi3pW7XLiHw # The Diary Of A CEO
|
|
||||||
|
|
||||||
# AI & Futurism
|
|
||||||
- type: videos
|
|
||||||
style: grid-cards
|
|
||||||
collapse-after-rows: 2
|
|
||||||
title: Futurism
|
|
||||||
channels:
|
|
||||||
- UCawZsQWqfGSbCI5yjkdVkTA # Matthew Berman
|
|
||||||
- UCZFipeZtQM5CKUjx6grh54g # Isaac Arthur
|
|
||||||
- UCR9sFzaG9Ia_kXJhfxtFMB # melodysheep
|
|
||||||
- UCSeuZvDGosq1zC6NqgqGo-Q # merlin
|
|
||||||
# Finance
|
|
||||||
- type: videos
|
|
||||||
style: grid-cards
|
|
||||||
collapse-after-rows: 2
|
|
||||||
title: Finance
|
|
||||||
channels:
|
|
||||||
- UCAeAB8ABXGoGMbXuYPmiu2A # The Swedish Investor
|
|
||||||
- UCvSXMi2LebwJEM1s4bz5IBA # New Money
|
|
||||||
- UCV6KDgJskWaEckne5aPA0aQ # Graham Stephan
|
|
||||||
- UCAzhpt9DmG6PnHXjmJTvRGQ # Federal Reserve
|
|
||||||
|
|
||||||
|
|
||||||
# Science, History & Education
|
|
||||||
- type: videos
|
|
||||||
style: grid-cards
|
|
||||||
collapse-after-rows: 2
|
|
||||||
title: Education
|
|
||||||
channels:
|
|
||||||
- UCHnyfMqiRRG1u-2MsSQLbXA # Veritasium
|
|
||||||
- UCsXVk37bltHxD1rDPwtNM8QL # Kurzgesagt – In a Nutshell
|
|
||||||
- UCxqAWLTk1CmBvZFPzeZMd9A # Domain of Science
|
|
||||||
- UCR2uRTQ53V_egXKFflMMaaw # Artem Kirsanov
|
|
||||||
- UCeUJFQ0D9qs6aVNyUt9fkeQ # The Armchair Historian
|
|
||||||
- UC5Dw9TFdbPJoTDMSiJdIQT # Whatifalthist
|
|
||||||
- UC0NCSdGglnmdWg-qHALhu1w # History102
|
|
||||||
- UCpCSAcbqs-sjEVfk_hMfY9w # MajorPrep
|
|
||||||
- UCmdugCMpC7BawYGwkRs5drQ # PhiloNautica
|
|
||||||
- UC4gHARRmw40kcLZgINlTK_g # Religion Camp
|
|
||||||
- UCPPrhcXtGR2aMoxrPJRKPLg # Para Bellum
|
|
||||||
- UCQUnqaW8Q33siyLYhisN7HQ # Antidote
|
|
||||||
- UCXzw-OdotBUcNA9yhuYQBw # Awesome
|
|
||||||
+24
-27
@@ -1,15 +1,6 @@
|
|||||||
server:
|
server:
|
||||||
assets-path: /app/assets
|
assets-path: /app/assets
|
||||||
|
|
||||||
branding:
|
|
||||||
custom-footer: |
|
|
||||||
<p>Powered by <a href="https://github.com/glanceapp/glance">Glance</a></p>
|
|
||||||
logo-url: /assets/logo.png
|
|
||||||
favicon-url: /assets/logo.png
|
|
||||||
app-name: "My Dashboard"
|
|
||||||
app-icon-url: "/assets/app-icon.png"
|
|
||||||
app-background-color: "#151519"
|
|
||||||
|
|
||||||
theme:
|
theme:
|
||||||
custom-css-file: /assets/newspaper.css
|
custom-css-file: /assets/newspaper.css
|
||||||
background-color: 240 27 11
|
background-color: 240 27 11
|
||||||
@@ -19,30 +10,36 @@ theme:
|
|||||||
negative-color: 360 100 71
|
negative-color: 360 100 71
|
||||||
|
|
||||||
pages:
|
pages:
|
||||||
- name: News
|
- name: Headlines
|
||||||
width: wide
|
width: wide
|
||||||
head-widgets:
|
head-widgets:
|
||||||
- $include: ./news/header.yml
|
- $include: ./headlines/header.yml
|
||||||
columns:
|
columns:
|
||||||
- $include: ./news/left.yml
|
- $include: ./headlines/left.yml
|
||||||
- $include: ./news/main.yml
|
- $include: ./headlines/main.yml
|
||||||
- $include: ./news/right.yml
|
- $include: ./headlines/right.yml
|
||||||
|
|
||||||
- name: Finance
|
- name: Markets
|
||||||
head-widgets:
|
|
||||||
- $include: ./finance/header.yml
|
|
||||||
columns:
|
columns:
|
||||||
- $include: ./finance/left.yml
|
- $include: ./markets/left.yml
|
||||||
- $include: ./finance/main.yml
|
- $include: ./markets/main.yml
|
||||||
- $include: ./finance/right.yml
|
- $include: ./markets/right.yml
|
||||||
|
|
||||||
- name: Developer
|
- name: Technology
|
||||||
|
width: wide
|
||||||
columns:
|
columns:
|
||||||
- $include: ./developer/left.yml
|
- $include: ./technology/left.yml
|
||||||
- $include: ./developer/main.yml
|
- $include: ./technology/main.yml
|
||||||
- $include: ./developer/right.yml
|
- $include: ./technology/right.yml
|
||||||
|
|
||||||
- name: Media
|
- name: Schedule
|
||||||
columns:
|
columns:
|
||||||
- $include: ./media/movies.yml
|
- $include: ./schedule/left.yml
|
||||||
- $include: ./media/tv.yml
|
- $include: ./schedule/main.yml
|
||||||
|
- $include: ./schedule/right.yml
|
||||||
|
|
||||||
|
- name: Entertainment
|
||||||
|
columns:
|
||||||
|
- $include: ./entertainment/side.yml
|
||||||
|
- $include: ./entertainment/movies.yml
|
||||||
|
- $include: ./entertainment/tv.yml
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
# Masthead + markets ticker — the newspaper banner
|
||||||
|
- type: html
|
||||||
|
source: |
|
||||||
|
<div class="masthead">
|
||||||
|
<div class="masthead-rule"></div>
|
||||||
|
<div class="masthead-title">The Daily Glance</div>
|
||||||
|
<div class="masthead-sub">Tech · Markets · Crypto</div>
|
||||||
|
<div class="masthead-rule"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
- type: markets
|
||||||
|
hide-header: true
|
||||||
|
markets:
|
||||||
|
- symbol: BTC-USD
|
||||||
|
name: Bitcoin
|
||||||
|
- symbol: ETH-USD
|
||||||
|
name: Ethereum
|
||||||
|
- symbol: MAGS
|
||||||
|
name: Mag7
|
||||||
|
- symbol: QQQ
|
||||||
|
name: Nasdaq
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
# Headlines left rail — weather, clocks, deals wire
|
||||||
|
- size: small
|
||||||
|
widgets:
|
||||||
|
- type: weather
|
||||||
|
location: Ashburn, Virginia, United States
|
||||||
|
units: imperial
|
||||||
|
hour-format: 12h
|
||||||
|
- type: clock
|
||||||
|
hour-format: 12h
|
||||||
|
timezones:
|
||||||
|
- timezone: America/Los_Angeles
|
||||||
|
label: Los Angeles
|
||||||
|
- timezone: Asia/Singapore
|
||||||
|
label: Singapore
|
||||||
|
- timezone: Europe/London
|
||||||
|
label: London
|
||||||
|
- type: rss
|
||||||
|
title: Deals
|
||||||
|
limit: 10
|
||||||
|
collapse-after: 3
|
||||||
|
feeds:
|
||||||
|
- url: https://rss.app/feeds/rb0smDdeyhIkusel.xml
|
||||||
|
title: Crypto Fundraising
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
# Headlines main — the front page, all cards (curated feeds only)
|
||||||
|
- size: full
|
||||||
|
widgets:
|
||||||
|
- type: rss
|
||||||
|
title: Top Stories
|
||||||
|
style: horizontal-cards
|
||||||
|
limit: 12
|
||||||
|
feeds:
|
||||||
|
- url: https://www.techmeme.com/feed.xml
|
||||||
|
title: Techmeme
|
||||||
|
- url: https://www.coindesk.com/arc/outboundfeeds/rss
|
||||||
|
title: CoinDesk
|
||||||
|
- url: "https://rsshub.app/twitter/user/realdonaldtrump/readable=1&showRetweetTextInTitle=0&addLinkForPics=1&showQuotedInTitle=1&heightOfPics=150&includeRts=0&forceWebApi=true"
|
||||||
|
title: Donald Trump
|
||||||
|
|
||||||
|
- type: rss
|
||||||
|
title: World & Business
|
||||||
|
style: detailed-list
|
||||||
|
limit: 20
|
||||||
|
collapse-after: 8
|
||||||
|
feeds:
|
||||||
|
- url: https://rss.app/feeds/adBHvrEfXuYMNzbH.xml
|
||||||
|
title: Stripe Newsroom
|
||||||
|
- url: https://rsshub.app/twitter/user/geiger_capital
|
||||||
|
title: Geiger Capital
|
||||||
|
- url: https://rss.app/feeds/z2Pt6cHtQq9aKZDy.xml
|
||||||
|
title: "@Polymarket"
|
||||||
|
- url: https://rss.app/feeds/gZnrKzLOWG8nhajs.xml
|
||||||
|
title: "@SenLummis"
|
||||||
|
|
||||||
|
- type: rss
|
||||||
|
title: Crypto
|
||||||
|
style: horizontal-cards-2
|
||||||
|
limit: 12
|
||||||
|
feeds:
|
||||||
|
- url: https://rss.app/feeds/wiGtpLZuOjLgKlC4.xml
|
||||||
|
title: Watcher Guru
|
||||||
|
- url: https://rss.app/feeds/rb0smDdeyhIkusel.xml
|
||||||
|
title: Crypto Fundraising
|
||||||
@@ -1,14 +1,11 @@
|
|||||||
# Right rail — datebook, macro rates box, and the news wire
|
# Headlines right rail — macro rates + crypto wire
|
||||||
- size: small
|
- size: small
|
||||||
widgets:
|
widgets:
|
||||||
- type: calendar
|
- $include: ../shared/rates.yml
|
||||||
first-day-of-week: sunday
|
|
||||||
- $include: ./widgets/ical-personal.yml
|
|
||||||
- $include: ./widgets/rates.yml
|
|
||||||
- type: rss
|
- type: rss
|
||||||
title: The Wire
|
title: The Wire
|
||||||
limit: 20
|
limit: 20
|
||||||
collapse-after: 5
|
collapse-after: 6
|
||||||
feeds:
|
feeds:
|
||||||
- url: https://rss.app/feeds/wiGtpLZuOjLgKlC4.xml
|
- url: https://rss.app/feeds/wiGtpLZuOjLgKlC4.xml
|
||||||
title: Watcher Guru
|
title: Watcher Guru
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
# Markets left rail — tickers and macro rates
|
||||||
|
- size: small
|
||||||
|
widgets:
|
||||||
|
- type: markets
|
||||||
|
title: Indices
|
||||||
|
markets:
|
||||||
|
- symbol: SPY
|
||||||
|
name: S&P 500
|
||||||
|
- symbol: QQQ
|
||||||
|
name: Nasdaq
|
||||||
|
- symbol: DX-Y.NYB
|
||||||
|
name: Dollar Index
|
||||||
|
|
||||||
|
- type: markets
|
||||||
|
title: Crypto
|
||||||
|
markets:
|
||||||
|
- symbol: BTC-USD
|
||||||
|
name: Bitcoin
|
||||||
|
- symbol: ETH-USD
|
||||||
|
name: Ethereum
|
||||||
|
|
||||||
|
- type: markets
|
||||||
|
title: Stocks
|
||||||
|
sort-by: absolute-change
|
||||||
|
markets:
|
||||||
|
- symbol: NVDA
|
||||||
|
name: NVIDIA
|
||||||
|
- symbol: AAPL
|
||||||
|
name: Apple
|
||||||
|
- symbol: MSFT
|
||||||
|
name: Microsoft
|
||||||
|
- symbol: GOOGL
|
||||||
|
name: Google
|
||||||
|
- symbol: AMD
|
||||||
|
name: AMD
|
||||||
|
- symbol: RDDT
|
||||||
|
name: Reddit
|
||||||
|
- symbol: AMZN
|
||||||
|
name: Amazon
|
||||||
|
- symbol: TSLA
|
||||||
|
name: Tesla
|
||||||
|
- symbol: INTC
|
||||||
|
name: Intel
|
||||||
|
- symbol: META
|
||||||
|
name: Meta
|
||||||
|
|
||||||
|
- $include: ../shared/rates.yml
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
# Markets main — news cards, market communities, finance & startup videos
|
||||||
|
- size: full
|
||||||
|
widgets:
|
||||||
|
- type: rss
|
||||||
|
title: Markets News
|
||||||
|
style: horizontal-cards
|
||||||
|
limit: 12
|
||||||
|
feeds:
|
||||||
|
- url: https://www.coindesk.com/arc/outboundfeeds/rss
|
||||||
|
title: CoinDesk
|
||||||
|
- url: https://rss.app/feeds/adBHvrEfXuYMNzbH.xml
|
||||||
|
title: Stripe Newsroom
|
||||||
|
- url: https://rss.app/feeds/jDOEbpJeIbZTukgR.xml
|
||||||
|
title: Web3 News
|
||||||
|
|
||||||
|
- type: rss
|
||||||
|
title: Crypto & Web3
|
||||||
|
style: detailed-list
|
||||||
|
limit: 25
|
||||||
|
collapse-after: 8
|
||||||
|
feeds:
|
||||||
|
- url: https://rss.app/feeds/wiGtpLZuOjLgKlC4.xml
|
||||||
|
title: Watcher Guru
|
||||||
|
- url: https://rss.app/feeds/FXaMUoJgdqhPAKaV.xml
|
||||||
|
title: "@AltcoinDaily"
|
||||||
|
- url: https://rss.app/feeds/pci0tnfa7vBgkJmm.xml
|
||||||
|
title: "@coinbureau"
|
||||||
|
- url: https://rss.app/feeds/BlE1VwSSmicg51Y7.xml
|
||||||
|
title: "@naruto11eth"
|
||||||
|
- url: https://rss.app/feeds/zpBYRBsqtN6cVBe7.xml
|
||||||
|
title: "@onechancefreedm"
|
||||||
|
- url: https://rss.app/feeds/DFPARMmEVkKY3q67.xml
|
||||||
|
title: "@Pirat_Nation"
|
||||||
|
|
||||||
|
- type: group
|
||||||
|
widgets:
|
||||||
|
- type: reddit
|
||||||
|
show-thumbnails: true
|
||||||
|
subreddit: wallstreetbets
|
||||||
|
- type: reddit
|
||||||
|
show-thumbnails: true
|
||||||
|
subreddit: technology
|
||||||
|
|
||||||
|
- type: videos
|
||||||
|
style: grid-cards
|
||||||
|
collapse-after-rows: 2
|
||||||
|
title: Finance
|
||||||
|
channels:
|
||||||
|
- UCAeAB8ABXGoGMbXuYPmiu2A # The Swedish Investor
|
||||||
|
- UCvSXMi2LebwJEM1s4bz5IBA # New Money
|
||||||
|
- UCV6KDgJskWaEckne5aPA0aQ # Graham Stephan
|
||||||
|
- UCAzhpt9DmG6PnHXjmJTvRGQ # Federal Reserve
|
||||||
|
|
||||||
|
- type: videos
|
||||||
|
style: grid-cards
|
||||||
|
collapse-after-rows: 2
|
||||||
|
title: Startups
|
||||||
|
channels:
|
||||||
|
- UCcefcZRL2oaA_uBNeo5UOWg # Y Combinator
|
||||||
|
- UCllx7jOjBL794FK67jtb5Og # Dalton + Michael
|
||||||
|
- UCxIJaCMEptJjxmmQgGFsnCg # How to Start a Startup
|
||||||
|
- UCQrZfl1FeCN9c71yjOzWVRw # Startup Archive
|
||||||
|
- UCtieZ1nS_tpjGEama6Kjxcg # Steve Jobs Archive
|
||||||
|
- UCm_WkN0wg49-eG4SymAQ_4g # Harvard Innovation Labs
|
||||||
|
- UCSGc7c1yKxo-Uhz5_oivrfg # The Startup Club by Slidebean
|
||||||
|
- UCGq-a57w-aPwyi3pW7XLiHw # The Diary Of A CEO
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
# Markets right rail — the financial press, chatter, and founder pods
|
||||||
|
- size: small
|
||||||
|
widgets:
|
||||||
|
- type: rss
|
||||||
|
title: Press
|
||||||
|
limit: 30
|
||||||
|
collapse-after: 10
|
||||||
|
feeds:
|
||||||
|
- url: https://www.ft.com/technology?format=rss
|
||||||
|
title: Financial Times
|
||||||
|
- url: https://feeds.a.dj.com/rss/RSSMarketsMain.xml
|
||||||
|
title: Wall Street Journal
|
||||||
|
- url: https://rss.app/feeds/adBHvrEfXuYMNzbH.xml
|
||||||
|
title: Stripe Newsroom
|
||||||
|
|
||||||
|
- type: rss
|
||||||
|
title: Chatter
|
||||||
|
limit: 15
|
||||||
|
collapse-after: 5
|
||||||
|
feeds:
|
||||||
|
- url: https://rsshub.app/twitter/user/geiger_capital
|
||||||
|
title: Geiger Capital
|
||||||
|
- url: https://rsshub.app/twitter/user/autismcapital
|
||||||
|
title: "@autismcapital"
|
||||||
|
|
||||||
|
- type: rss
|
||||||
|
title: Founder Pods
|
||||||
|
limit: 12
|
||||||
|
collapse-after: 4
|
||||||
|
feeds:
|
||||||
|
- url: https://rsshub.app/youtube/user/%40AcquiredFM
|
||||||
|
title: Acquired
|
||||||
|
- url: https://rsshub.app/youtube/user/@20vc
|
||||||
|
title: 20VC
|
||||||
|
- url: https://rsshub.app/youtube/user/@founderspodcast1
|
||||||
|
title: Founders
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
- size: full
|
|
||||||
widgets:
|
|
||||||
# Top Headlines
|
|
||||||
- $include: ./widgets/headlines.yml
|
|
||||||
# Community Discussions
|
|
||||||
- $include: ./widgets/reddit.yml
|
|
||||||
# Videos
|
|
||||||
- $include: ./widgets/youtube.yml
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
# Front page — newspaper sections as clean tabs.
|
|
||||||
# detailed-list gives the headline + blurb + section look of a printed page.
|
|
||||||
- type: group
|
|
||||||
widgets:
|
|
||||||
- type: rss
|
|
||||||
title: Front Page
|
|
||||||
style: detailed-list
|
|
||||||
limit: 15
|
|
||||||
collapse-after: 6
|
|
||||||
feeds:
|
|
||||||
- url: https://www.techmeme.com/feed.xml
|
|
||||||
title: Techmeme
|
|
||||||
- url: https://www.ft.com/technology?format=rss
|
|
||||||
title: Financial Times
|
|
||||||
- url: https://feeds.a.dj.com/rss/RSSMarketsMain.xml
|
|
||||||
title: Wall Street Journal
|
|
||||||
|
|
||||||
- type: rss
|
|
||||||
title: Tech
|
|
||||||
style: detailed-list
|
|
||||||
limit: 20
|
|
||||||
collapse-after: 6
|
|
||||||
feeds:
|
|
||||||
- url: https://www.techmeme.com/feed.xml
|
|
||||||
title: Techmeme
|
|
||||||
- url: https://terminaltrove.com/new.xml
|
|
||||||
title: Terminal Trove
|
|
||||||
- url: https://rss.app/feeds/_tBKt0Q2vzII4baWl.xml
|
|
||||||
title: Product Hunt
|
|
||||||
|
|
||||||
- type: rss
|
|
||||||
title: Markets
|
|
||||||
style: detailed-list
|
|
||||||
limit: 20
|
|
||||||
collapse-after: 6
|
|
||||||
feeds:
|
|
||||||
- url: https://feeds.a.dj.com/rss/RSSMarketsMain.xml
|
|
||||||
title: Wall Street Journal
|
|
||||||
- url: https://www.ft.com/technology?format=rss
|
|
||||||
title: Financial Times
|
|
||||||
|
|
||||||
- type: rss
|
|
||||||
title: Crypto
|
|
||||||
style: detailed-list
|
|
||||||
limit: 20
|
|
||||||
collapse-after: 6
|
|
||||||
feeds:
|
|
||||||
- url: https://rss.app/feeds/wiGtpLZuOjLgKlC4.xml
|
|
||||||
title: Watcher Guru
|
|
||||||
- url: https://rss.app/feeds/rb0smDdeyhIkusel.xml
|
|
||||||
title: Crypto Fundraising
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
# Community Discussions
|
|
||||||
- type: split-column
|
|
||||||
max-columns: 3
|
|
||||||
widgets:
|
|
||||||
- type: reddit
|
|
||||||
show-thumbnails: true
|
|
||||||
subreddit: commandline
|
|
||||||
- type: reddit
|
|
||||||
show-thumbnails: true
|
|
||||||
subreddit: ethereum
|
|
||||||
- type: reddit
|
|
||||||
show-thumbnails: true
|
|
||||||
subreddit: golang
|
|
||||||
- type: reddit
|
|
||||||
show-thumbnails: true
|
|
||||||
subreddit: hyprland
|
|
||||||
- type: reddit
|
|
||||||
show-thumbnails: true
|
|
||||||
subreddit: ipfs
|
|
||||||
- type: reddit
|
|
||||||
show-thumbnails: true
|
|
||||||
subreddit: libp2p
|
|
||||||
- type: reddit
|
|
||||||
show-thumbnails: true
|
|
||||||
subreddit: LinuxCirclejerk
|
|
||||||
- type: reddit
|
|
||||||
show-thumbnails: true
|
|
||||||
subreddit: niri
|
|
||||||
- type: reddit
|
|
||||||
show-thumbnails: true
|
|
||||||
subreddit: omarchy
|
|
||||||
- type: reddit
|
|
||||||
show-thumbnails: true
|
|
||||||
subreddit: selfhosted
|
|
||||||
- type: reddit
|
|
||||||
show-thumbnails: true
|
|
||||||
subreddit: termux
|
|
||||||
- type: reddit
|
|
||||||
show-thumbnails: true
|
|
||||||
subreddit: unixporn
|
|
||||||
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
- type: group
|
|
||||||
widgets:
|
|
||||||
# Podcasts & Commentary
|
|
||||||
- type: videos
|
|
||||||
style: grid-cards
|
|
||||||
collapse-after-rows: 2
|
|
||||||
title: Pop-Culture
|
|
||||||
channels:
|
|
||||||
- UCzQUP1qoWDoEbmsQxvdjxgQ # PowerfulJRE
|
|
||||||
- UCJIfeSCssxSC_Dhc5s7woww # Lex Clips
|
|
||||||
- UC5PstSsGrRwj2o6asQpC4Rg # Flagrant 2
|
|
||||||
- UCKrpnfpTwncQ050VFXcVkuQ # Network State Podcast
|
|
||||||
- UC7oPkqeHTwuOZ5CZ-R9f-6w # Triggernometry
|
|
||||||
- UCIHdDJ0tjn_3j-FS7s_X1kQ # Valuetainment
|
|
||||||
|
|
||||||
# Programming & Tech
|
|
||||||
- type: videos
|
|
||||||
style: grid-cards
|
|
||||||
collapse-after-rows: 2
|
|
||||||
title: Programming
|
|
||||||
channels:
|
|
||||||
- UCUyeluBRhGPCW4rPe_UvBZQ # ThePrimeTime
|
|
||||||
- UCjSEJkpGbcZhvo0lr-44X_w # TechHut
|
|
||||||
- UCXuqSBlHAE6Xw-yeJA0Tunw # Linus Tech Tips
|
|
||||||
- UCs6KfncB4OV6Vug4o_bzijg # Techlore
|
|
||||||
- UCTwxaBjziKfy6y_uWu30orAby # BugBytes
|
|
||||||
- UCYeiozh-4QwuC1sjgCmB92w # DevOps Toolbox
|
|
||||||
- UCsBjURrPoezykLs9EqgamOA # Angular Firebase
|
|
||||||
- UC-mTIBh__DzAqW495JHXy5A # The Coding Gopher
|
|
||||||
- UC2WHjPDvbE6O328n17ZGcfg # ForrestKnight
|
|
||||||
- UCsUalyRg43M8D60mtHe6YcAD # Honeypot
|
|
||||||
- UCgfe2ooZD3VJPB6aJAnuQng # cloud
|
|
||||||
- UCdjsUXJ3QawK4O5L1kqqsew # IPFS
|
|
||||||
- UC3Wn3dABlgESm8Bzn8Vamgg # Sideprojects
|
|
||||||
- UCtMVHI3AJD4Qk4hcbZnI9ZQ # SomeOrdinaryGamers
|
|
||||||
- UCNJ1Ymd5yFuUPtn21xtRbbw # AI Explained
|
|
||||||
- UCutCcajxhR33k9UR-DdLsAQ # Systems Innovation
|
|
||||||
|
|
||||||
# Startups & Business
|
|
||||||
- type: videos
|
|
||||||
style: grid-cards
|
|
||||||
collapse-after-rows: 2
|
|
||||||
title: Startups
|
|
||||||
channels:
|
|
||||||
- UCcefcZRL2oaA_uBNeo5UOWg # Y Combinator
|
|
||||||
- UCllx7jOjBL794FK67jtb5Og # Dalton + Michael
|
|
||||||
- UCxIJaCMEptJjxmmQgGFsnCg # How to Start a Startup
|
|
||||||
- UCQrZfl1FeCN9c71yjOzWVRw # Startup Archive
|
|
||||||
- UCtieZ1nS_tpjGEama6Kjxcg # Steve Jobs Archive
|
|
||||||
- UCm_WkN0wg49-eG4SymAQ_4g # Harvard Innovation Labs
|
|
||||||
- UCSGc7c1yKxo-Uhz5_oivrfg # The Startup Club by Slidebean
|
|
||||||
- UCGq-a57w-aPwyi3pW7XLiHw # The Diary Of A CEO
|
|
||||||
|
|
||||||
# AI & Futurism
|
|
||||||
- type: videos
|
|
||||||
style: grid-cards
|
|
||||||
collapse-after-rows: 2
|
|
||||||
title: Futurism
|
|
||||||
channels:
|
|
||||||
- UCawZsQWqfGSbCI5yjkdVkTA # Matthew Berman
|
|
||||||
- UCZFipeZtQM5CKUjx6grh54g # Isaac Arthur
|
|
||||||
- UCR9sFzaG9Ia_kXJhfxtFMB # melodysheep
|
|
||||||
- UCSeuZvDGosq1zC6NqgqGo-Q # merlin
|
|
||||||
# Finance
|
|
||||||
- type: videos
|
|
||||||
style: grid-cards
|
|
||||||
collapse-after-rows: 2
|
|
||||||
title: Finance
|
|
||||||
channels:
|
|
||||||
- UCAeAB8ABXGoGMbXuYPmiu2A # The Swedish Investor
|
|
||||||
- UCvSXMi2LebwJEM1s4bz5IBA # New Money
|
|
||||||
- UCV6KDgJskWaEckne5aPA0aQ # Graham Stephan
|
|
||||||
- UCAzhpt9DmG6PnHXjmJTvRGQ # Federal Reserve
|
|
||||||
|
|
||||||
|
|
||||||
# Science, History & Education
|
|
||||||
- type: videos
|
|
||||||
style: grid-cards
|
|
||||||
collapse-after-rows: 2
|
|
||||||
title: Education
|
|
||||||
channels:
|
|
||||||
- UCHnyfMqiRRG1u-2MsSQLbXA # Veritasium
|
|
||||||
- UCsXVk37bltHxD1rDPwtNM8QL # Kurzgesagt – In a Nutshell
|
|
||||||
- UCxqAWLTk1CmBvZFPzeZMd9A # Domain of Science
|
|
||||||
- UCR2uRTQ53V_egXKFflMMaaw # Artem Kirsanov
|
|
||||||
- UCeUJFQ0D9qs6aVNyUt9fkeQ # The Armchair Historian
|
|
||||||
- UC5Dw9TFdbPJoTDMSiJdIQT # Whatifalthist
|
|
||||||
- UC0NCSdGglnmdWg-qHALhu1w # History102
|
|
||||||
- UCpCSAcbqs-sjEVfk_hMfY9w # MajorPrep
|
|
||||||
- UCmdugCMpC7BawYGwkRs5drQ # PhiloNautica
|
|
||||||
- UC4gHARRmw40kcLZgINlTK_g # Religion Camp
|
|
||||||
- UCPPrhcXtGR2aMoxrPJRKPLg # Para Bellum
|
|
||||||
- UCQUnqaW8Q33siyLYhisN7HQ # Antidote
|
|
||||||
- UCXzw-OdotBUcNA9yhuYQBw # Awesome
|
|
||||||
@@ -1,11 +1,12 @@
|
|||||||
# Left rail — weather corner, work agenda, world clocks
|
# Schedule left rail — the day at a glance
|
||||||
- size: small
|
- size: small
|
||||||
widgets:
|
widgets:
|
||||||
|
- type: calendar
|
||||||
|
first-day-of-week: sunday
|
||||||
- type: weather
|
- type: weather
|
||||||
location: Ashburn, Virginia, United States
|
location: Ashburn, Virginia, United States
|
||||||
units: imperial # alternatively "metric"
|
units: imperial
|
||||||
hour-format: 12h # alternatively "24h"
|
hour-format: 12h
|
||||||
- $include: ./widgets/ical-work.yml
|
|
||||||
- type: clock
|
- type: clock
|
||||||
hour-format: 12h
|
hour-format: 12h
|
||||||
timezones:
|
timezones:
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
# Schedule main — agenda side by side, then active project activity
|
||||||
|
- size: full
|
||||||
|
widgets:
|
||||||
|
- type: split-column
|
||||||
|
widgets:
|
||||||
|
- $include: ./widgets/ical-work.yml
|
||||||
|
- $include: ./widgets/ical-personal.yml
|
||||||
|
- $include: ./widgets/graph.yml
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
# Schedule right rail — running task lists
|
||||||
|
- size: small
|
||||||
|
widgets:
|
||||||
|
- type: to-do
|
||||||
|
title: Today
|
||||||
|
id: today
|
||||||
|
- type: to-do
|
||||||
|
title: Projects
|
||||||
|
id: projects
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
# GitHub contribution graph (served by the glance-github-graph compose service).
|
||||||
|
# ponytail: must use the service name, not localhost, from inside the container.
|
||||||
|
- type: extension
|
||||||
|
title: Active Projects
|
||||||
|
url: http://glance-github-graph:8080/graph/prdlk
|
||||||
|
allow-potentially-dangerous-html: true
|
||||||
|
parameters:
|
||||||
|
background-color: "#1d2025" # cell background
|
||||||
|
primary-color: "#f3afaf" # cell foreground
|
||||||
|
svg-height: 150 # height for graph svg
|
||||||
|
show-months: true # show months on the graph
|
||||||
|
show-weekdays: true # show weekdays on the graph
|
||||||
|
font-size: 9 # size of weekdays & months text on graph
|
||||||
|
|
||||||
|
# if true, it will transition the hue from background
|
||||||
|
# to primary color per the number of commits.
|
||||||
|
# otherwise it will just use the background hue for
|
||||||
|
# 0 commits and the foreground hue for all others
|
||||||
|
transition-hue: false
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
- type: custom-api
|
||||||
|
title: Personal Events
|
||||||
|
cache: 15m
|
||||||
|
url: http://glances-ical-api:8076/events
|
||||||
|
parameters:
|
||||||
|
url: https://calendar.google.com/calendar/ical/prnk28%40gmail.com/public/basic.ics
|
||||||
|
limit: 5
|
||||||
|
template: |
|
||||||
|
{{ $events := .JSON.Array "events" }}
|
||||||
|
{{ $count := len $events }}
|
||||||
|
{{ $limit := 3 }} <!-- how many upcoming to show before collapse -->
|
||||||
|
|
||||||
|
{{ if eq $count 0 }}
|
||||||
|
<div style="padding:8px 10px; border-radius:10px; background:var(--surface-2);">
|
||||||
|
No entries found.
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<!-- 1) Ongoing first (never collapsible) -->
|
||||||
|
<ul class="list list-gap-10">
|
||||||
|
{{ range $i, $e := $events }}
|
||||||
|
{{ $ongoing := $e.Bool "ongoing" }}
|
||||||
|
{{ if $ongoing }}
|
||||||
|
{{ $start := $e.String "start" | parseTime "rfc3339" }}
|
||||||
|
{{ $end := $e.String "end" | parseTime "rfc3339" }}
|
||||||
|
{{ $name := $e.String "name" }}
|
||||||
|
{{ $url := $e.String "url" }}
|
||||||
|
<li>
|
||||||
|
<div class="flex items-center justify-between gap-10">
|
||||||
|
<!-- Left: name (highlight) + absolute date -->
|
||||||
|
<div class="min-width-0">
|
||||||
|
{{ if $url }}
|
||||||
|
<a class="size-h3 color-highlight block text-truncate" href="{{ $url }}" target="_blank" rel="noreferrer" title="{{ $name }}">{{ $name }}</a>
|
||||||
|
{{ else }}
|
||||||
|
<span class="size-h3 color-highlight block text-truncate" title="{{ $name }}">{{ $name }}</span>
|
||||||
|
{{ end }}
|
||||||
|
<div style="font-size:.85em;">{{ $start | formatTime "Mon, 02 Jan 2006" }}</div>
|
||||||
|
</div>
|
||||||
|
<!-- Right: relative time until END -->
|
||||||
|
<div class="size-h3 color-primary shrink-0" style="white-space:nowrap;">
|
||||||
|
ends <span {{ $end | toRelativeTime }}></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<!-- 2) Upcoming, collapsible after $limit -->
|
||||||
|
{{ $shown := 0 }}
|
||||||
|
<ul class="list list-gap-10 collapsible-container" data-collapse-after="{{ $limit }}">
|
||||||
|
{{ range $i, $e := $events }}
|
||||||
|
{{ $ongoing := $e.Bool "ongoing" }}
|
||||||
|
{{ if not $ongoing }}
|
||||||
|
{{ $start := $e.String "start" | parseTime "rfc3339" }}
|
||||||
|
{{ $name := $e.String "name" }}
|
||||||
|
{{ $url := $e.String "url" }}
|
||||||
|
<li {{ if ge $shown $limit }}class="collapsible-item"{{ end }}>
|
||||||
|
<div class="flex items-center justify-between gap-10">
|
||||||
|
<!-- Left: name (highlight) + absolute date -->
|
||||||
|
<div class="min-width-0">
|
||||||
|
{{ if $url }}
|
||||||
|
<a class="size-h3 color-highlight block text-truncate" href="{{ $url }}" target="_blank" rel="noreferrer" title="{{ $name }}">{{ $name }}</a>
|
||||||
|
{{ else }}
|
||||||
|
<span class="size-h3 color-highlight block text-truncate" title="{{ $name }}">{{ $name }}</span>
|
||||||
|
{{ end }}
|
||||||
|
<div style="font-size:.85em;">{{ $start | formatTime "Mon, 02 Jan 2006" }}</div>
|
||||||
|
</div>
|
||||||
|
<!-- Right: relative time until START -->
|
||||||
|
<div class="size-h3 color-primary shrink-0" style="white-space:nowrap;" {{ $start | toRelativeTime }}></div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{{ $shown = add $shown 1 }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
</ul>
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
- type: custom-api
|
||||||
|
title: Work Schedule
|
||||||
|
cache: 15m
|
||||||
|
url: http://glances-ical-api:8076/events
|
||||||
|
parameters:
|
||||||
|
url: https://calendar.google.com/calendar/ical/prad%40sonr.io/public/basic.ics
|
||||||
|
limit: 5
|
||||||
|
template: |
|
||||||
|
{{ $events := .JSON.Array "events" }}
|
||||||
|
{{ $count := len $events }}
|
||||||
|
{{ $limit := 3 }} <!-- how many upcoming to show before collapse -->
|
||||||
|
|
||||||
|
{{ if eq $count 0 }}
|
||||||
|
<div style="padding:8px 10px; border-radius:10px; background:var(--surface-2);">
|
||||||
|
No entries found.
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<!-- 1) Ongoing first (never collapsible) -->
|
||||||
|
<ul class="list list-gap-10">
|
||||||
|
{{ range $i, $e := $events }}
|
||||||
|
{{ $ongoing := $e.Bool "ongoing" }}
|
||||||
|
{{ if $ongoing }}
|
||||||
|
{{ $start := $e.String "start" | parseTime "rfc3339" }}
|
||||||
|
{{ $end := $e.String "end" | parseTime "rfc3339" }}
|
||||||
|
{{ $name := $e.String "name" }}
|
||||||
|
{{ $url := $e.String "url" }}
|
||||||
|
<li>
|
||||||
|
<div class="flex items-center justify-between gap-10">
|
||||||
|
<!-- Left: name (highlight) + absolute date -->
|
||||||
|
<div class="min-width-0">
|
||||||
|
{{ if $url }}
|
||||||
|
<a class="size-h3 color-highlight block text-truncate" href="{{ $url }}" target="_blank" rel="noreferrer" title="{{ $name }}">{{ $name }}</a>
|
||||||
|
{{ else }}
|
||||||
|
<span class="size-h3 color-highlight block text-truncate" title="{{ $name }}">{{ $name }}</span>
|
||||||
|
{{ end }}
|
||||||
|
<div style="font-size:.85em;">{{ $start | formatTime "Mon, 02 Jan 2006" }}</div>
|
||||||
|
</div>
|
||||||
|
<!-- Right: relative time until END -->
|
||||||
|
<div class="size-h3 color-primary shrink-0" style="white-space:nowrap;">
|
||||||
|
ends <span {{ $end | toRelativeTime }}></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<!-- 2) Upcoming, collapsible after $limit -->
|
||||||
|
{{ $shown := 0 }}
|
||||||
|
<ul class="list list-gap-10 collapsible-container" data-collapse-after="{{ $limit }}">
|
||||||
|
{{ range $i, $e := $events }}
|
||||||
|
{{ $ongoing := $e.Bool "ongoing" }}
|
||||||
|
{{ if not $ongoing }}
|
||||||
|
{{ $start := $e.String "start" | parseTime "rfc3339" }}
|
||||||
|
{{ $name := $e.String "name" }}
|
||||||
|
{{ $url := $e.String "url" }}
|
||||||
|
<li {{ if ge $shown $limit }}class="collapsible-item"{{ end }}>
|
||||||
|
<div class="flex items-center justify-between gap-10">
|
||||||
|
<!-- Left: name (highlight) + absolute date -->
|
||||||
|
<div class="min-width-0">
|
||||||
|
{{ if $url }}
|
||||||
|
<a class="size-h3 color-highlight block text-truncate" href="{{ $url }}" target="_blank" rel="noreferrer" title="{{ $name }}">{{ $name }}</a>
|
||||||
|
{{ else }}
|
||||||
|
<span class="size-h3 color-highlight block text-truncate" title="{{ $name }}">{{ $name }}</span>
|
||||||
|
{{ end }}
|
||||||
|
<div style="font-size:.85em;">{{ $start | formatTime "Mon, 02 Jan 2006" }}</div>
|
||||||
|
</div>
|
||||||
|
<!-- Right: relative time until START -->
|
||||||
|
<div class="size-h3 color-primary shrink-0" style="white-space:nowrap;" {{ $start | toRelativeTime }}></div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{{ $shown = add $shown 1 }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
</ul>
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
# Macro rates box (St. Louis Fed / FRED).
|
||||||
|
# ponytail: an $include'd file must be a bare YAML sequence, so no shared anchor
|
||||||
|
# here — the three widgets repeat a static template. Don't add a `define:` key.
|
||||||
|
- type: custom-api
|
||||||
|
title: Secured Financing Rate
|
||||||
|
cache: 12h
|
||||||
|
url: https://api.stlouisfed.org/fred/series/observations?series_id=SOFR&api_key=${FRED_API_KEY}&file_type=json&sort_order=desc&limit=2
|
||||||
|
template: |
|
||||||
|
{{ $latest := .JSON.Float "observations.0.value" }}
|
||||||
|
{{ $previous := .JSON.Float "observations.1.value" }}
|
||||||
|
{{ $lastObserve := .JSON.String "observations.0.date" }}
|
||||||
|
{{ $change := sub $latest $previous }}
|
||||||
|
<div class="flex justify-between items-center gap-15">
|
||||||
|
<div class="min-width-0">
|
||||||
|
<a class="size-h3 block color-highlight" href="https://fred.stlouisfed.org/" target="_blank" rel="noreferrer">{{ .JSON.String "observations.0.value" }}%</a>
|
||||||
|
<div class="text-truncate">St. Louis Federal Reserve</div>
|
||||||
|
</div>
|
||||||
|
<div class="shrink-0">
|
||||||
|
<div class="size-h3 text-right {{ if lt $change 0.0 }}color-positive{{ else if gt $change 0.0 }}color-negative{{ end }}">{{ printf "%+.2f" $change }}%</div>
|
||||||
|
<div class="text-right" title="As of {{ $lastObserve }}" {{ $lastObserve | parseRelativeTime "DateOnly" }}></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
- type: custom-api
|
||||||
|
title: Federal Funds Rate
|
||||||
|
cache: 12h
|
||||||
|
url: https://api.stlouisfed.org/fred/series/observations?series_id=FEDFUNDS&api_key=${FRED_API_KEY}&file_type=json&sort_order=desc&limit=2
|
||||||
|
template: |
|
||||||
|
{{ $latest := .JSON.Float "observations.0.value" }}
|
||||||
|
{{ $previous := .JSON.Float "observations.1.value" }}
|
||||||
|
{{ $lastObserve := .JSON.String "observations.0.date" }}
|
||||||
|
{{ $change := sub $latest $previous }}
|
||||||
|
<div class="flex justify-between items-center gap-15">
|
||||||
|
<div class="min-width-0">
|
||||||
|
<a class="size-h3 block color-highlight" href="https://fred.stlouisfed.org/" target="_blank" rel="noreferrer">{{ .JSON.String "observations.0.value" }}%</a>
|
||||||
|
<div class="text-truncate">St. Louis Federal Reserve</div>
|
||||||
|
</div>
|
||||||
|
<div class="shrink-0">
|
||||||
|
<div class="size-h3 text-right {{ if lt $change 0.0 }}color-positive{{ else if gt $change 0.0 }}color-negative{{ end }}">{{ printf "%+.2f" $change }}%</div>
|
||||||
|
<div class="text-right" title="As of {{ $lastObserve }}" {{ $lastObserve | parseRelativeTime "DateOnly" }}></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
- type: custom-api
|
||||||
|
title: Real GDP
|
||||||
|
cache: 12h
|
||||||
|
url: https://api.stlouisfed.org/fred/series/observations?series_id=A191RL1Q225SBEA&api_key=${FRED_API_KEY}&file_type=json&sort_order=desc&limit=2
|
||||||
|
template: |
|
||||||
|
{{ $latest := .JSON.Float "observations.0.value" }}
|
||||||
|
{{ $previous := .JSON.Float "observations.1.value" }}
|
||||||
|
{{ $lastObserve := .JSON.String "observations.0.date" }}
|
||||||
|
{{ $change := sub $latest $previous }}
|
||||||
|
<div class="flex justify-between items-center gap-15">
|
||||||
|
<div class="min-width-0">
|
||||||
|
<a class="size-h3 block color-highlight" href="https://fred.stlouisfed.org/" target="_blank" rel="noreferrer">{{ .JSON.String "observations.0.value" }}%</a>
|
||||||
|
<div class="text-truncate">St. Louis Federal Reserve</div>
|
||||||
|
</div>
|
||||||
|
<div class="shrink-0">
|
||||||
|
<div class="size-h3 text-right {{ if lt $change 0.0 }}color-positive{{ else if gt $change 0.0 }}color-negative{{ end }}">{{ printf "%+.2f" $change }}%</div>
|
||||||
|
<div class="text-right" title="As of {{ $lastObserve }}" {{ $lastObserve | parseRelativeTime "DateOnly" }}></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
# Technology left rail — tools & launches
|
||||||
|
- size: small
|
||||||
|
widgets:
|
||||||
|
- type: rss
|
||||||
|
title: Terminal Trove
|
||||||
|
limit: 15
|
||||||
|
collapse-after: 6
|
||||||
|
feeds:
|
||||||
|
- url: https://terminaltrove.com/new.xml
|
||||||
|
title: Terminal Trove
|
||||||
|
- type: rss
|
||||||
|
title: Product Hunt
|
||||||
|
limit: 15
|
||||||
|
collapse-after: 6
|
||||||
|
feeds:
|
||||||
|
- url: https://rss.app/feeds/_tBKt0Q2vzII4baWl.xml
|
||||||
|
title: Product Hunt
|
||||||
|
- type: rss
|
||||||
|
title: Dev Blogs
|
||||||
|
limit: 15
|
||||||
|
collapse-after: 6
|
||||||
|
feeds:
|
||||||
|
- url: https://github.blog/feed/
|
||||||
|
title: GitHub Blog
|
||||||
|
- url: https://rsshub.app/anthropic/research
|
||||||
|
title: Anthropic Research
|
||||||
|
- url: https://openai.com/news/rss.xml
|
||||||
|
title: OpenAI News
|
||||||
|
- url: https://rss.app/feeds/Q5ElsNVbwLHZhUPm.xml
|
||||||
|
title: Cloudflare Blog
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
# Technology main — Techmeme cards, community tabs, programming videos
|
||||||
|
- size: full
|
||||||
|
widgets:
|
||||||
|
- type: rss
|
||||||
|
title: Techmeme
|
||||||
|
style: horizontal-cards
|
||||||
|
limit: 12
|
||||||
|
feeds:
|
||||||
|
- url: https://www.techmeme.com/feed.xml
|
||||||
|
title: Techmeme
|
||||||
|
hide-description: true
|
||||||
|
|
||||||
|
- type: rss
|
||||||
|
title: Ship Log
|
||||||
|
style: detailed-list
|
||||||
|
limit: 20
|
||||||
|
collapse-after: 6
|
||||||
|
feeds:
|
||||||
|
- url: https://hnrss.org/show
|
||||||
|
title: Show HN
|
||||||
|
- url: https://rsshub.app/github/trending/daily/any
|
||||||
|
title: GitHub Trending
|
||||||
|
- url: https://rss.app/feeds/y4Wby7sxFhCINQvr.xml
|
||||||
|
title: Starred Repos
|
||||||
|
- url: https://rss.app/feeds/Nw0aq77nQjy57K2X.xml
|
||||||
|
title: "@thdxr"
|
||||||
|
|
||||||
|
- type: group
|
||||||
|
define: &sub
|
||||||
|
type: reddit
|
||||||
|
show-thumbnails: true
|
||||||
|
collapse-after: 8
|
||||||
|
widgets:
|
||||||
|
- subreddit: commandline
|
||||||
|
<<: *sub
|
||||||
|
- subreddit: golang
|
||||||
|
<<: *sub
|
||||||
|
- subreddit: selfhosted
|
||||||
|
<<: *sub
|
||||||
|
- subreddit: tui
|
||||||
|
<<: *sub
|
||||||
|
- subreddit: hyprland
|
||||||
|
<<: *sub
|
||||||
|
- subreddit: niri
|
||||||
|
<<: *sub
|
||||||
|
- subreddit: omarchy
|
||||||
|
<<: *sub
|
||||||
|
- subreddit: unixporn
|
||||||
|
<<: *sub
|
||||||
|
- subreddit: termux
|
||||||
|
<<: *sub
|
||||||
|
- subreddit: LinuxCirclejerk
|
||||||
|
<<: *sub
|
||||||
|
- subreddit: ethereum
|
||||||
|
<<: *sub
|
||||||
|
- subreddit: ipfs
|
||||||
|
<<: *sub
|
||||||
|
- subreddit: libp2p
|
||||||
|
<<: *sub
|
||||||
|
|
||||||
|
- type: videos
|
||||||
|
style: grid-cards
|
||||||
|
collapse-after-rows: 2
|
||||||
|
title: Programming
|
||||||
|
channels:
|
||||||
|
- UCUyeluBRhGPCW4rPe_UvBZQ # ThePrimeTime
|
||||||
|
- UCjSEJkpGbcZhvo0lr-44X_w # TechHut
|
||||||
|
- UCXuqSBlHAE6Xw-yeJA0Tunw # Linus Tech Tips
|
||||||
|
- UCs6KfncB4OV6Vug4o_bzijg # Techlore
|
||||||
|
- UCTwxaBjziKfy6y_uWu30orAby # BugBytes
|
||||||
|
- UCYeiozh-4QwuC1sjgCmB92w # DevOps Toolbox
|
||||||
|
- UCsBjURrPoezykLs9EqgamOA # Angular Firebase
|
||||||
|
- UC-mTIBh__DzAqW495JHXy5A # The Coding Gopher
|
||||||
|
- UC2WHjPDvbE6O328n17ZGcfg # ForrestKnight
|
||||||
|
- UCsUalyRg43M8D60mtHe6YcAD # Honeypot
|
||||||
|
- UCgfe2ooZD3VJPB6aJAnuQng # cloud
|
||||||
|
- UCdjsUXJ3QawK4O5L1kqqsew # IPFS
|
||||||
|
- UC3Wn3dABlgESm8Bzn8Vamgg # Sideprojects
|
||||||
|
- UCNJ1Ymd5yFuUPtn21xtRbbw # AI Explained
|
||||||
|
- UCutCcajxhR33k9UR-DdLsAQ # Systems Innovation
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# Technology right rail — self-hosting board + futurism deep dives
|
||||||
|
- size: small
|
||||||
|
widgets:
|
||||||
|
- type: reddit
|
||||||
|
subreddit: selfhosted
|
||||||
|
limit: 7
|
||||||
|
style: vertical-cards
|
||||||
|
- type: videos
|
||||||
|
style: vertical-list
|
||||||
|
collapse-after: 4
|
||||||
|
title: Futurism
|
||||||
|
channels:
|
||||||
|
- UCawZsQWqfGSbCI5yjkdVkTA # Matthew Berman
|
||||||
|
- UCZFipeZtQM5CKUjx6grh54g # Isaac Arthur
|
||||||
|
- UCR9sFzaG9Ia_kXJhfxtFMB # melodysheep
|
||||||
|
- UCSeuZvDGosq1zC6NqgqGo-Q # merlin
|
||||||
Reference in New Issue
Block a user