{ config, ... }: let secrets = config.age.secrets; in { services.tailscaledGlance = { enable = true; subdomain = "glance"; settings = { server.port = 4114; pages = [ { name = "Home"; columns = [ { size = "small"; widgets = [ { type = "clock"; hour-format = "24h"; timezones = [ { timezone = "Europe/Zurich"; label = "Zürich"; } ]; } { type = "group"; title = "Weather"; widgets = let buildWeatherWidget = { location, title }: { type = "weather"; hide-location = true; hour-format = "24h"; units = "metric"; inherit location title; }; in builtins.map buildWeatherWidget [ { title = "Espoo"; location = "Espoo, Finland"; } { title = "Mökki"; location = "Pellosniemi, Finland"; } { title = "Frankfurt"; location = "Frankfurt, Germany"; } ]; } { type = "markets"; markets = [ { symbol = "KOZ0.F"; name = "Kongsberg Gruppen"; } { symbol = "AMD"; name = "AMD"; } ]; } { type = "group"; widgets = [ { type = "rss"; title = "News"; limit = 10; collapse-after = 3; cache = "12h"; feeds = [ { url = "https://yle.fi/rss/uutiset/paauutiset"; title = "Yle"; } ]; } { type = "rss"; title = "Tech"; limit = 10; collapse-after = 3; cache = "12h"; feeds = [ { url = "https://nixos.org/blog/announcements-rss.xml"; title = "NixOS"; } { url = "https://selfh.st/rss"; title = "selfh.st"; } ]; } { type = "rss"; title = "Blogs"; limit = 10; collapse-after = 3; cache = "12h"; feeds = [ { url = "https://samharris.substack.com/feed"; title = "Sam Harris"; } ]; } ]; } { type = "custom-api"; title = "Steam Specials"; cache = "12h"; url = "https://store.steampowered.com/api/featuredcategories?cc=fi"; template = '' ''; } ]; } { size = "full"; widgets = [ { type = "group"; widgets = [ { type = "hacker-news"; } { type = "lobsters"; } ]; } { type = "videos"; channels = [ "UCXuqSBlHAE6Xw-yeJA0Tunw" # Linus Tech Tips "UCshObcm-nLhbu8MY50EZ5Ng" # Benn Jordan ]; } { type = "group"; widgets = let type = "reddit"; show-thumbnails = true; app-auth = { name = "Glance"; id = { _secret = secrets."glance/reddit/app-id".path; }; secret = { _secret = secrets."glance/reddit/app-secret".path; }; }; in [ { inherit type app-auth show-thumbnails; subreddit = "nixos"; } { inherit type app-auth show-thumbnails; subreddit = "technology"; } { inherit type app-auth show-thumbnails; subreddit = "selfhosted"; } ]; } ]; } { size = "small"; widgets = [ { type = "server-stats"; servers = [ { type = "local"; name = "freun.dev"; } ]; } { type = "group"; title = "Services"; widgets = let buildSite = domain: { subdomain, title, alt-status-codes ? [ ], }: { inherit title alt-status-codes; url = "https://${subdomain}.${domain}"; }; buildMonitor = { domain, sites }: { type = "monitor"; cache = "1m"; title = domain; style = "compact"; sites = builtins.map (buildSite domain) sites; }; in builtins.map buildMonitor [ { domain = "freun.dev"; sites = [ { subdomain = "img"; title = "Immich"; } { subdomain = "pw"; title = "Vaultwarden"; } { subdomain = "social"; title = "Gotosocial"; } { subdomain = "graph"; title = "Grafana"; } { subdomain = "home"; title = "Home Assistant"; } { subdomain = "cook"; title = "Mealie"; } { subdomain = "sync"; title = "Syncthing"; } { subdomain = "bin"; title = "Hastebin"; alt-status-codes = [ 404 ]; } { subdomain = "ledger"; title = "Ledger"; } { subdomain = "note"; title = "Dnote"; } { subdomain = "trackmap"; title = "Trackmap"; } { subdomain = "fit"; title = "Workout Tracker"; } { subdomain = "stream"; title = "Owncast"; } { subdomain = "read"; title = "Readeck"; } ]; } { domain = "alderaan.space"; sites = [ { subdomain = "jelly"; title = "Jellyfin"; } { subdomain = "radarr"; title = "Radarr"; } { subdomain = "sonarr"; title = "Sonarr"; } { subdomain = "deluge"; title = "qBittorrent"; } { subdomain = "lidarr"; title = "Lidarr"; } { subdomain = "bazarr"; title = "Bazarr"; } { subdomain = "req"; title = "Jellyseer"; } ]; } ]; } { type = "dns-stats"; service = "adguard"; url = "http://localhost:3006"; } ]; } ]; } ]; }; }; }