Initial commit of Dynacat config, assets, and rules

This commit is contained in:
Jonah
2026-07-06 00:19:46 -05:00
commit 8a07b9f589
7 changed files with 1834 additions and 0 deletions
+28
View File
@@ -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"
```
+87
View File
@@ -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 <LXC_IP> with the IP address of your Dynacat LXC (e.g. 192.168.1.146)
# Copy the configuration file:
scp config/dynacat.yml root@<LXC_IP>:/opt/dynacat/config/dynacat.yml
# Copy the news portal asset file:
scp assets/news.html root@<LXC_IP>:/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://<YOUR_DOCKER_HOST_IP>: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:<icon_name>` (e.g., `sh:immich`)
- Dashboard Icons: `di:<icon_name>`
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="27.6 0.18 456.8 511.82"><path d="m416.4 512 68-.8-23.5-414s-45.7-37.7-126.8-45.3c-.4.5 2.8-28.9.8-33.6-1.7-4-32.6-20.2-82.3-17.9v10.5c22.8-.6 46.3 2.4 56.3 7.4 4.7 2.4 5.3 12.8.9 16-4.6 3.3-40.3 1.7-40.3 1.7l-4.2 444.3s79.3-5.8 111.7-26.9c-.6.3 0-70.5 0-70.5l-44.5 9.2-.8-16.8 46.2-7.6 2.5-93.2s8-6.7 16.8-.8c-.3.8 19.2 238.3 19.2 238.3"/><path d="m95.6 512-68-.8 23.5-414s45.7-37.7 126.8-45.3c.4.5-2.8-28.9-.9-33.6 1.7-4 32.6-20.2 82.3-17.9v10.5c-22.8-.6-46.3 2.4-56.3 7.4-4.7 2.4-5.3 12.8-.8 16 4.6 3.3 40.3 1.7 40.3 1.7l4.2 444.3s-79.3-5.8-111.7-26.9c.6.3 0-70.5 0-70.5l44.5 9.2.8-16.8-46.2-7.6-2.5-93.2s-8-6.7-16.8-.8c.3.8-19.2 238.3-19.2 238.3"/></svg>

After

Width:  |  Height:  |  Size: 727 B

+111
View File
@@ -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;
}
+1210
View File
File diff suppressed because it is too large Load Diff
+379
View File
@@ -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: |
<div class="flex flex-col gap-2">
<div class="flex justify-between">
<span class="color-subdue">Chores Configured:</span>
<span class="weight-semibold">{{ len .JSON }}</span>
</div>
<div class="color-subdue text-sm">
Generate tokens in Grocy under Settings ➔ Manage API keys.
</div>
</div>
# 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: |
<div class="flex flex-col gap-2">
<div class="flex justify-between">
<span class="color-subdue">Total Uploads:</span>
<span class="weight-semibold">{{ .JSON.Int "uploads" }}</span>
</div>
<div class="flex justify-between">
<span class="color-subdue">Storage Used:</span>
<span class="weight-semibold">{{ .JSON.String "size" }}</span>
</div>
</div>
# 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: |
<div class="flex flex-col gap-2">
<div class="weight-semibold text-sm">Active Listening Stream:</div>
<ul class="list">
{{ range .JSON.Array "activities" }}
<li class="flex justify-between items-center py-1">
<span>{{ .String "description" }}</span>
<span class="color-subdue text-xs">{{ .String "time" }}</span>
</li>
{{ else }}
<li class="color-subdue py-1 text-center">No active listeners</li>
{{ end }}
</ul>
</div>
# AMP Game Server Monitor
- type: custom-api
title: "🎮 AMP Game Servers"
url: "https://game.jonahlahona.com/api/Core/GetAPISpec"
cache: 1m
template: |
<div class="flex flex-col gap-2">
<div class="flex justify-between">
<span class="color-subdue">Status:</span>
<span class="color-green weight-semibold">Online</span>
</div>
<div class="flex justify-between">
<span class="color-subdue">Active Instances:</span>
<span>Configured via AMP Console</span>
</div>
</div>
# 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: |
<div class="flex flex-col gap-2">
<div class="flex justify-between">
<span class="color-subdue">Total Games:</span>
<span class="weight-semibold">{{ .JSON.Int "total" }}</span>
</div>
<div class="flex justify-between">
<span class="color-subdue">Platforms:</span>
<span>{{ .JSON.Int "platforms" }}</span>
</div>
</div>
# # 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: |
# <div class="flex flex-col gap-2">
# <div class="flex justify-between">
# <span class="color-subdue">Audiobookshelf Memory:</span>
# <span class="weight-semibold">{{ .JSON.String "state" }}%</span>
# </div>
# <div class="color-subdue text-xs">
# Uses Home Assistant variables.
# </div>
# </div>
# 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
+18
View File
@@ -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