From 8a07b9f589f7240196da1aae433696741b9b8f66 Mon Sep 17 00:00:00 2001 From: Jonah Date: Mon, 6 Jul 2026 00:19:46 -0500 Subject: [PATCH] Initial commit of Dynacat config, assets, and rules --- .agents/AGENTS.md | 28 + README.md | 87 +++ assets/jackett.svg | 1 + assets/jonah-theme.css | 111 ++++ assets/news.html | 1210 ++++++++++++++++++++++++++++++++++++++++ config/dynacat.yml | 379 +++++++++++++ docker-compose.yml | 18 + 7 files changed, 1834 insertions(+) create mode 100644 .agents/AGENTS.md create mode 100644 README.md create mode 100644 assets/jackett.svg create mode 100644 assets/jonah-theme.css create mode 100644 assets/news.html create mode 100644 config/dynacat.yml create mode 100644 docker-compose.yml diff --git a/.agents/AGENTS.md b/.agents/AGENTS.md new file mode 100644 index 0000000..876227c --- /dev/null +++ b/.agents/AGENTS.md @@ -0,0 +1,28 @@ +# Workspace Agent Rules + +These rules help AI assistants working in this repository understand the project context, infrastructure setup, and how to perform deployments to the hosting server. + +## Infrastructure & Host Info +- **Host Server IP:** `192.168.1.35` (Proxmox VE Host, accessed via SSH as `root`) +- **Service Container ID (LXC):** `103` (Dynacat Service container) +- **Container Application Directory:** `/opt/dynacat` +- **Container Config Path:** `/opt/dynacat/config/dynacat.yml` +- **Container Assets Path:** `/opt/dynacat/assets/` + +## Deployment & Syncing Commands + +Always run these commands from the local workspace root (`c:\Users\mario\OneDrive\Documents\Antigravity\Dynacat`) when changes are made locally. Do not ask for user permission to run these commands, just run them proactively. + +### 1. Deploy Configuration (`dynacat.yml`) +Upload the local configuration file to the Proxmox host `/tmp` directory, push it into the LXC container, and restart the `dynacat` systemd service: +```powershell +scp config/dynacat.yml root@192.168.1.35:/tmp/dynacat.yml +ssh root@192.168.1.35 "pct push 103 /tmp/dynacat.yml /opt/dynacat/config/dynacat.yml; pct exec 103 systemctl restart dynacat" +``` + +### 2. Deploy Assets (e.g. `news.html`, custom themes, SVGs) +When adding or updating assets, use similar scp/push commands (no restart is needed for simple asset/HTML updates): +```powershell +scp assets/news.html root@192.168.1.35:/tmp/news.html +ssh root@192.168.1.35 "pct push 103 /tmp/news.html /opt/dynacat/assets/news.html" +``` diff --git a/README.md b/README.md new file mode 100644 index 0000000..1cfe4f4 --- /dev/null +++ b/README.md @@ -0,0 +1,87 @@ +# Dynacat Proxmox Homelab Dashboard Setup + +This directory contains pre-configured files to deploy and customize the **Dynacat** dashboard (a real-time, self-hosted feed and service aggregator) for your homelab. + +## File Structure + +- `config/dynacat.yml`: The main configuration file, styled in a custom dark HSL theme and pre-loaded with all your 14 active homelab services. +- `assets/news.html`: A custom, Google-News-style news portal that aggregates your RSS feeds into a visual card grid. +- `docker-compose.yml`: A compose template for deploying Dynacat in a Docker environment (such as a Docker-enabled VM or LXC). + +--- + +## How to Apply to Your Proxmox Setup + +Choose the installation method that matches how you deployed Dynacat: + +### Option A: If using Proxmox LXC (Helper Script) +If you installed Dynacat directly as an LXC container using a Proxmox VE Helper Script (e.g. from Community Scripts / tteck): + +1. **Locate the Target Paths:** Inside the container, Dynacat looks for configuration and assets at: + - Config file: `/opt/dynacat/config/dynacat.yml` + - Assets folder: `/opt/dynacat/assets/news.html` +2. **Transfer the Files:** + You can copy the local files to your LXC container using SCP: + ```bash + # Replace with the IP address of your Dynacat LXC (e.g. 192.168.1.146) + # Copy the configuration file: + scp config/dynacat.yml root@:/opt/dynacat/config/dynacat.yml + + # Copy the news portal asset file: + scp assets/news.html root@:/opt/dynacat/assets/news.html + ``` + *Alternatively*, you can edit the file directly inside the LXC container's terminal using `nano /opt/dynacat/config/dynacat.yml` and paste the contents of the generated `dynacat.yml`. +3. **Apply Changes:** + Dynacat supports **live config reloading** and will detect updates automatically upon saving. If you need to manually restart the service, run: + ```bash + systemctl restart dynacat + ``` +4. **Set Up API Tokens (Inline Configuration):** + Instead of setting systemd environment variables, you can input your API keys directly inside the `dynacat.yml` file on your server (by replacing `"your_grocy_token_here"`, etc.): + * Edit the file on your server: + ```bash + nano /opt/dynacat/config/dynacat.yml + ``` + * Replace the placeholder string values with your actual API keys/tokens. + * Save and close the file. Dynacat will automatically pick up the new configuration! + +--- + +### Option B: If using Docker Compose (VM or LXC with Docker) +If you are running Dynacat inside a VM or LXC that runs Docker: + +1. Copy both `docker-compose.yml` and the `config/` directory to your target folder on Proxmox. +2. Spin up the container: + ```bash + docker compose up -d + ``` +3. Open your browser and navigate to `http://:8080`. + +--- + +## Customization Guide + +### 1. Weather Location +Open `config/dynacat.yml` and locate the `weather` widget: +```yaml +- type: weather + location: "La Crosse, Wisconsin" # Set to your location + units: imperial # Change to 'metric' for Celsius +``` + +### 2. Dashboard Icons +We have pre-configured icons for your services using two libraries: +- **Simple Icons (`si:`)**: High-quality vector icons for popular brands. +- **Material Design Icons (`mdi:`)**: General icons (like gamepad, cloud, trash can). + +Example of a custom link with an icon: +```yaml +- title: Audiobookshelf + url: https://books.jonahlahona.com + icon: si:audiobookshelf +``` +You can search for more icons on: +- Simple Icons: [simpleicons.org](https://simpleicons.org/) +- Material Design Icons: [pictogrammers.com/library/mdi/](https://pictogrammers.com/library/mdi/) +- Selfh.st Icons: `sh:` (e.g., `sh:immich`) +- Dashboard Icons: `di:` diff --git a/assets/jackett.svg b/assets/jackett.svg new file mode 100644 index 0000000..6f8591a --- /dev/null +++ b/assets/jackett.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/jonah-theme.css b/assets/jonah-theme.css new file mode 100644 index 0000000..ef2e1e7 --- /dev/null +++ b/assets/jonah-theme.css @@ -0,0 +1,111 @@ +/* Override the default-dark theme (the middle option) with Jonahlahona colors */ +html[data-theme="default-dark"] { + --bgh: 0 !important; + --bgs: 39% !important; + --bgl: 8% !important; + + --color-primary: #5d4646 !important; + --color-negative: #cdbcbc !important; + --color-positive: hsl(145, 63%, 42%) !important; +} + +/* Add custom gradients to the whole dashboard when this theme is active */ +html[data-theme="default-dark"] body { + background: radial-gradient(circle at top left, #281111 0%, #0d0505 100%) !important; + color: #cdbcbc !important; +} + +/* Card backgrounds */ +html[data-theme="default-dark"] .box, +html[data-theme="default-dark"] .panel, +html[data-theme="default-dark"] .card { + background: linear-gradient(145deg, #1b0d0d 0%, #0c0505 100%) !important; + border-color: #3a2221 !important; +} + +/* Update the Theme Picker preview colors to show our custom colors! */ +.theme-preset[data-key="default-dark"] { + --color: #0d0505 !important; +} +.theme-preset[data-key="default-dark"] .theme-color:nth-child(1) { + --color: #5d4646 !important; +} +.theme-preset[data-key="default-dark"] .theme-color:nth-child(2) { + --color: #5d4646 !important; +} +.theme-preset[data-key="default-dark"] .theme-color:nth-child(3) { + --color: #cdbcbc !important; +} + +/* ============================================================================ + UI Spacing & Layout Compaction + ============================================================================ */ +:root { + --widget-gap: 12px !important; + --widget-content-vertical-padding: 8px !important; + --widget-content-horizontal-padding: 12px !important; + --border-radius: 4px !important; + --content-bounds-padding: 10px !important; + + /* Tighter text scale */ + --font-size-h1: 1.65rem !important; + --font-size-h2: 1.55rem !important; + --font-size-h3: 1.45rem !important; + --font-size-h4: 1.35rem !important; + --font-size-base: 1.28rem !important; + --font-size-h5: 1.18rem !important; + --font-size-h6: 1.08rem !important; +} + +/* Compact header and tabs */ +.header-container { + --header-height: 38px !important; + --header-items-gap: 1.5rem !important; +} + +/* Tighter search input box */ +.search-input { + height: 4.2rem !important; +} + +/* Compact spacing between bookmark list items */ +.bookmarks-group .list > *:not(:first-child) { + margin-top: 3px !important; +} + +/* Compact bookmark icon sizing and background padding */ +.bookmarks-icon-container { + padding: 0.35rem !important; +} +.bookmarks-icon { + width: 16px !important; + height: 16px !important; +} + +/* Tighter grid for bookmark groups */ +.dynamic-columns { + gap: 10px 15px !important; +} + +/* Tighter margin below card headers */ +.widget-header { + margin-bottom: 0.5rem !important; +} + +/* Compact calendar spacing */ +.calendar-dates { + gap: 1px !important; +} +.calendar-date { + padding: 0.2rem 0 !important; +} +.old-calendar-day { + padding: 0.3rem 0 !important; +} + +/* Compact server stats block margin */ +.server-stats { + margin-top: 0.25rem !important; + gap: 1rem !important; +} + diff --git a/assets/news.html b/assets/news.html new file mode 100644 index 0000000..8035a63 --- /dev/null +++ b/assets/news.html @@ -0,0 +1,1210 @@ + + + + + + Tech News Hub + + + + + + + + + +
+
+ 📰 +

Tech News Hub

+
+
+ + + +
+
+ +
+ +
+ + + +
+ +
+ + + + + +
+ + + + diff --git a/config/dynacat.yml b/config/dynacat.yml new file mode 100644 index 0000000..3ca7452 --- /dev/null +++ b/config/dynacat.yml @@ -0,0 +1,379 @@ +# ============================================================================== +# Dynacat Homelab Dashboard Configuration +# ============================================================================== +# Place this file at: /opt/dynacat/config/dynacat.yml +# ============================================================================== + +server: + host: 0.0.0.0 + port: 8080 + assets-path: /opt/dynacat/assets + db-path: /opt/dynacat/data/dynacat.db + +theme: + background-color: 50 1 6 + primary-color: 24 97 58 + negative-color: 209 88 54 + custom-css-file: /assets/jonah-theme.css + +pages: + # ============================================================================ + # PAGE 1: NAVIGATOR & BOOKMARKS (Restructured to 3 columns using split layout) + # ============================================================================ + - name: Home + columns: + # Column 1: Calendar, Weather, and Wastebin + - size: small + widgets: + - type: calendar + first-day-of-week: sunday + + - type: weather + location: "La Crosse" + units: imperial + + - type: iframe + title: "📝 Wastebin Quick Paste" + source: "https://scratch.jonahlahona.com" + height: 250 + + # Column 2: Search and Bookmarks + - size: full + widgets: + - type: search + autofocus: true + placeholder: Search... + search-engine: google + bangs: + - title: YouTube + shortcut: "!yt" + url: https://www.youtube.com/results?search_query={QUERY} + - title: GitHub + shortcut: "!gh" + url: https://github.com/search?q={QUERY} + + - type: split-column + max-columns: 2 + widgets: + - type: bookmarks + groups: + - title: 🌐 Core Infrastructure + links: + - title: Proxmox VE + url: https://192.168.1.35:8006 + icon: si:proxmox + same-tab: true + - title: NGINX Proxy Manager + url: http://192.168.1.44:81 + icon: si:nginx + same-tab: true + - title: Home Assistant + url: https://6avbbjjhs3egemnj8kibuebv2bo7qr2q.ui.nabu.casa/ + icon: si:homeassistant + same-tab: true + - title: Pi-hole + url: http://192.168.1.37/admin + icon: si:pihole + same-tab: true + + - title: 📚 Media & Entertainment + links: + - title: Audiobookshelf + url: https://books.jonahlahona.com + icon: si:audiobookshelf + same-tab: true + - title: RomM (Retro ROMs) + url: https://retro.jonahlahona.com + icon: mdi:controller-classic + same-tab: true + - title: Pixelfed + url: https://family.jonahlahona.com + icon: si:pixelfed + same-tab: true + - title: Jackett + url: http://192.168.1.93:9117 + icon: /assets/jackett.svg + same-tab: true + + - title: 🎮 Gaming + links: + - title: AMP Game Panel + url: https://game.jonahlahona.com + icon: mdi:gamepad-variant + same-tab: true + + - title: 📁 Files & Storage + links: + - title: OxiCloud + url: https://file.jonahlahona.com + icon: mdi:cloud + same-tab: true + - title: Gitea + url: https://git.jonahlahona.com + icon: si:gitea + same-tab: true + + - type: bookmarks + groups: + - title: đŸ› ī¸ Utilities & Pantry + links: + - title: Grocy Pantry + url: https://pantry.jonahlahona.com + icon: mdi:food-apple + same-tab: true + - title: KaraKeep Notes + url: https://keep.jonahlahona.com + icon: si:googlekeep + same-tab: true + - title: Vaultwarden + url: https://key.jonahlahona.com + icon: si:vaultwarden + same-tab: true + - title: Zipline Uploads + url: https://zip.jonahlahona.com + icon: si:sharex + same-tab: true + - title: Wastebin Paste + url: https://scratch.jonahlahona.com + icon: mdi:trash-can-outline + same-tab: true + - title: MyIP + url: http://192.168.1.168:11966 + icon: mdi:ip-network + same-tab: true + - title: Transmute Converter + url: https://convert.jonahlahona.com + icon: mdi:swap-horizontal + same-tab: true + + - title: 🌐 Web & Social + links: + - title: YouTube + url: https://www.youtube.com + icon: si:youtube + same-tab: true + - title: Reddit + url: https://www.reddit.com + icon: si:reddit + same-tab: true + - title: Twitter / X + url: https://x.com + icon: si:x + same-tab: true + - title: Gmail + url: https://mail.google.com + icon: si:gmail + same-tab: true + - title: Google Keep + url: https://keep.google.com + icon: si:googlekeep + same-tab: true + - title: Google Gemini + url: https://gemini.google.com + icon: si:googlegemini + same-tab: true + - title: Humble Bundle + url: https://www.humblebundle.com + icon: si:humblebundle + same-tab: true + - title: Mega.nz + url: https://mega.nz + icon: si:mega + same-tab: true + - title: Associated Bank + url: https://www.associatedbank.com + icon: mdi:bank + same-tab: true + + # Column 3: Information Feeds + - size: small + widgets: + # - type: iframe + # title: "âš™ī¸ LXC Container Controls" + # source: "https://6avbbjjhs3egemnj8kibuebv2bo7qr2q.ui.nabu.casa/lovelace-lxc/default_view?kiosk" + # height: 280 + + - type: rss + title: Tech News + limit: 10 + animate: true + feeds: + - url: https://selfh.st/rss/ + title: Selfh.st + - url: https://www.howtogeek.com/feed/news/ + title: How-To Geek + - url: https://www.xda-developers.com/feed/news/ + title: XDA Developers + - url: https://www.makeuseof.com/feed/category/news/ + title: MakeUseOf + - url: https://hackaday.com/blog/feed/ + title: Hackaday + + + - type: rss + title: World & US News + limit: 12 + animate: true + feeds: + - url: https://feeds.bbci.co.uk/news/world/rss.xml + title: BBC World News + - url: https://feeds.npr.org/1001/rss.xml + title: NPR News + - url: https://feeds.reuters.com/reuters/topNews + title: Reuters + - url: https://feeds.npr.org/1014/rss.xml + title: NPR Politics + - url: https://thehill.com/rss/syndicator/19109 + title: The Hill + + # ============================================================================ + # PAGE 2: APPLICATION ANALYTICS & MONITORING + # ============================================================================ + - name: Status & Analytics + columns: + # Left Column: Storage & Pantry Stats + - size: small + widgets: + # Grocy API Stats + - type: custom-api + title: "🛒 Grocy Pantry Overview" + url: "https://pantry.jonahlahona.com/api/chores" + cache: 5m + headers: + GROCY-API-KEY: "your_grocy_token_here" + template: | +
+
+ Chores Configured: + {{ len .JSON }} +
+
+ Generate tokens in Grocy under Settings ➔ Manage API keys. +
+
+ + # Zipline API Stats + - type: custom-api + title: "📁 Zipline Upload Stats" + url: "https://zip.jonahlahona.com/api/user/statistics" + cache: 10m + headers: + authorization: "your_zipline_token_here" + template: | +
+
+ Total Uploads: + {{ .JSON.Int "uploads" }} +
+
+ Storage Used: + {{ .JSON.String "size" }} +
+
+ + # Middle Column: Active Media & Game Servers + - size: full + widgets: + # Audiobookshelf API Stats + - type: custom-api + title: "📚 Audiobookshelf Sessions" + url: "https://books.jonahlahona.com/api/activity" + cache: 30s + headers: + Authorization: "Bearer your_audiobookshelf_token_here" + template: | +
+
Active Listening Stream:
+
    + {{ range .JSON.Array "activities" }} +
  • + {{ .String "description" }} + {{ .String "time" }} +
  • + {{ else }} +
  • No active listeners
  • + {{ end }} +
+
+ + # AMP Game Server Monitor + - type: custom-api + title: "🎮 AMP Game Servers" + url: "https://game.jonahlahona.com/api/Core/GetAPISpec" + cache: 1m + template: | +
+
+ Status: + Online +
+
+ Active Instances: + Configured via AMP Console +
+
+ + # Right Column: Server Stats, Retro Gaming & Proxmox Health + - size: small + widgets: + - type: server-stats + servers: + - type: local + name: Dynacat LXC + + # RomM API Stats + - type: custom-api + title: "đŸ•šī¸ RomM Library Metrics" + url: "https://retro.jonahlahona.com/api/v1/games/stats" + cache: 10m + headers: + Authorization: "Bearer your_romm_token_here" + template: | +
+
+ Total Games: + {{ .JSON.Int "total" }} +
+
+ Platforms: + {{ .JSON.Int "platforms" }} +
+
+ + # # Home Assistant - Proxmox LXC Health Check + # - type: custom-api + # title: "🔌 Proxmox LXC Memory" + # url: "https://6avbbjjhs3egemnj8kibuebv2bo7qr2q.ui.nabu.casa/api/states/sensor.proxmox_lxc_audiobookshelf_memory_usage" + # cache: 1m + # headers: + # Authorization: "Bearer your_home_assistant_token_here" + # template: | + #
+ #
+ # Audiobookshelf Memory: + # {{ .JSON.String "state" }}% + #
+ #
+ # Uses Home Assistant variables. + #
+ #
+ + # Pi-hole Ad-blocking Stats + - type: dns-stats + title: "đŸ›Ąī¸ Pi-hole Stats" + service: pihole + url: "http://192.168.1.37" + token: "your_pihole_token_here" + + # ============================================================================ + # PAGE 3: PORTAL NEWS + # ============================================================================ + - name: News + columns: + - size: full + widgets: + - type: iframe + title: "📰 Tech News Portal" + source: "/assets/news.html?v=10" + height: 720 + diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..389a388 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,18 @@ +version: "3.8" + +services: + dynacat: + image: panonim/dynacat:latest + container_name: dynacat + restart: unless-stopped + ports: + - "8080:8080" + environment: + - GROCY_API_TOKEN=${GROCY_API_TOKEN} + - ZIPLINE_API_TOKEN=${ZIPLINE_API_TOKEN} + - AUDIOBOOKSHELF_API_TOKEN=${AUDIOBOOKSHELF_API_TOKEN} + - ROMM_API_TOKEN=${ROMM_API_TOKEN} + - HA_LONG_LIVED_TOKEN=${HA_LONG_LIVED_TOKEN} + volumes: + - ./config:/app/config:rw + - ./assets:/app/assets:rw