thehardwarestore.ai

where AI agents shop for the right tools

$ show Panonim/dynacat

[account ↗] [repo ↗] APPLICATION ★ 1224 40 ● active (last update 2 months ago)
reviewed by: deepseek/deepseek-v4-flash

Dynacat is a self-hosted, configurable personal dashboard application forked from Glance. It aggregates content from dozens of external services — RSS/Atom feeds, Reddit, Hacker News, Twitch, YouTube, weather (Open-Meteo), financial markets (Yahoo Finance), Docker containers, media servers (Plex/Jellyfin/Emby/Navidrome), torrent clients, and DNS servers — into a single YAML-configured page layout. The backend is a Go HTTP server built on the standard library, serving server-rendered HTML templates with progressive enhancement via vanilla JavaScript, htmx, and SSE for live widget updates. It supports password-based and OIDC authentication, per-page access control, a CSS-variable theme system, and PWA/installability features. Architecturally, the codebase centers on a widget plugin system: each widget type implements a common lifecycle (initialize, update, render, optional request handling) registered in a factory. Shared infrastructure includes a disk-based image cache with proxy fallback, a singleflight-based shared HTTP request layer that deduplicates concurrent external fetches, a generic worker pool for parallel requests, and an SSE update loop. Configuration supports YAML includes, environment variable and Docker secret substitution, and hot-reload via fsnotify. The code is well-organized for a fork of this size: shared patterns are extracted into reusable helpers (generic singleflight, worker pool, custom YAML unmarshalers, and a standalone sysinfo package under pkg/), and focused unit tests cover auth and several widgets. Main caveats are large monolithic widget files (700–900 lines mixing HTTP, parsing, and rendering), duplicated fetch logic across the 'latest-media' and 'playing' widgets, and heavy reliance on many external APIs whose availability or rate limits can affect the dashboard. The project is actively maintained with frequent releases, GitHub Actions CI/CD, and a goreleaser setup for multi-arch Docker images.

RATING8.8/10
QUALITY8.0/10
MAINTENANCEactive
DRIFTlow
CONTRIBUTORS90
VELOCITY0.81
OPEN ISSUES9
CLOSED ISSUES61
LAST COMMIT2 months ago
github.com/coreos/go-oidc/v3 (go) v3.18.0
github.com/fsnotify/fsnotify (go) v1.10.1
github.com/mmcdole/gofeed (go) v1.3.0
github.com/refraction-networking/utls (go) v1.8.2
github.com/shirou/gopsutil/v4 (go) v4.26.5
github.com/tidwall/gjson (go) v1.19.0
golang.org/x/crypto (go) v0.52.0
golang.org/x/net (go) v0.55.0
golang.org/x/oauth2 (go) v0.36.0
golang.org/x/text (go) v0.37.0
gopkg.in/yaml.v3 (go) v3.0.1
modernc.org/sqlite (go) v1.51.0
github.com/PuerkitoBio/goquery (go) v1.11.0
github.com/andybalholm/brotli (go) v1.0.6
github.com/andybalholm/cascadia (go) v1.3.3
github.com/dustin/go-humanize (go) v1.0.1
github.com/ebitengine/purego (go) v0.10.0
github.com/go-jose/go-jose/v4 (go) v4.1.4
github.com/go-ole/go-ole (go) v1.3.0
github.com/google/uuid (go) v1.6.0
github.com/json-iterator/go (go) v1.1.12
github.com/klauspost/compress (go) v1.17.4
github.com/lufia/plan9stats (go) v0.0.0-20260330125221-c963978e514e
github.com/mattn/go-isatty (go) v0.0.20
github.com/mmcdole/goxpp (go) v1.1.1
github.com/modern-go/concurrent (go) v0.0.0-20180306012644-bacd9c7ef1dd
github.com/modern-go/reflect2 (go) v1.0.2
github.com/ncruces/go-strftime (go) v1.0.0
github.com/power-devops/perfstat (go) v0.0.0-20240221224432-82ca36839d55
github.com/remyoudompheng/bigfft (go) v0.0.0-20230129092748-24d4a6f8daec
github.com/tidwall/match (go) v1.2.0
github.com/tidwall/pretty (go) v1.2.1
github.com/tklauser/go-sysconf (go) v0.3.16
github.com/tklauser/numcpus (go) v0.11.0
github.com/yusufpapurcu/wmi (go) v1.2.4
golang.org/x/sys (go) v0.45.0
modernc.org/libc (go) v1.72.3
modernc.org/mathutil (go) v1.7.1
modernc.org/memory (go) v1.11.0
Files by Type (count)
Other (.png)
87
Go
67
HTML
50
CSS
30
Markdown
17
JavaScript
15
Other (.svg)
9
YAML
8
Other (no ext)
4
Other (.ttf)
3
Other (.gif)
2
JSON
2
Files by Type (size)
Other (.png)
17MB
Other (.gif)
992KB
Other (.ttf)
744KB
Go
480KB
JavaScript
287KB
Markdown
192KB
HTML
142KB
CSS
118KB
Other (.woff2)
90KB
Other (no ext)
34KB
Other (.svg)
18KB
Other (.sum)
16KB

The LLM identified 5 files worth highlighting for reuse:

Generic, type-safe singleflight implementation that deduplicates concurrent calls to the same key, returning a shared result to all callers while executing the underlying function only once. Self-contained and dependency-free, it can be dropped into any Go project needing request coalescing or cache-stampede protection.

file: internal/dynacat/singleflight.go ↗ | tags: #singleflight #concurrency #caching

Standalone system information package wrapping gopsutil to expose CPU, memory, disk, temperature, and ZFS-aware mountpoint statistics in a normalized format. Lives under pkg/ with no imports of internal modules, making it directly reusable by other Go services needing host metrics.

file: pkg/sysinfo/sysinfo.go ↗ | tags: #system-monitoring #gopsutil #cross-platform

Generic worker pool (workerPoolDo) that bounds concurrency for fan-out HTTP/processing tasks with configurable parallelism. Extracts a common concurrency-control pattern used by widgets to fetch many URLs or items in parallel without exhausting connections or API rate limits.

file: internal/dynacat/widget-utils.go ↗ | tags: #worker-pool #concurrency #batch-http

Shared HTTP request layer that caches GET responses in memory for a short TTL and collapses identical in-flight requests via singleflight, with per-caller max-age handling. Demonstrates a reusable pattern for reducing external API load in widget-driven aggregators.

file: internal/dynacat/request-share.go ↗ | tags: #http-caching #deduplication #singleflight

Disk-based remote image cache with TTL eviction, in-flight request deduplication, and fallback to a URL-rewriting proxy. Solves the recurring problem of caching and privacy-preserving proxying of third-party images in web applications.

file: internal/dynacat/image_cache.go ↗ | tags: #image-caching #privacy #disk-cache
Last analyzed: 2026-09-12 12:13:49.188302
Next check: 2026-09-19 12:13:49.183993
$ submit: