$ show lissy93/dashy
Dashy is a self-hosted dashboard application that serves as a customizable startpage and service monitor for homelabs and server infrastructure. In production, it aggregates links to internal and external services, displays live widgets (weather, system metrics, crypto prices, news, etc.), and performs HTTP/ICMP status checks to indicate service health. The application is configured entirely via a YAML file (conf.yml) that defines pages, sections, items, widgets, authentication providers, themes, and layout options. Users can interact through multiple views: a default grid, a workspace with sidebar and iframe content, and a minimal tabbed view. The system also includes an interactive configuration editor, cloud backup/restore with AES encryption, and full REST API for programmatic management. Architecturally, Dashy is a full-stack web application with a Vue 3 frontend (built with Vite) and a Node.js Express backend. The frontend handles rendering, theming, localization (30+ languages), and client-side authentication flows (OIDC, Keycloak, header auth, built-in users). The backend provides endpoints for config saving, CORS proxying (with SSRF protection), status/ping checks, and optional REST API. Deployment is Docker-first, but bare-metal, cloud (Netlify, Render), and static hosting are also supported. The codebase is organized into reusable mixins (WidgetMixin, ThemingMixin, HomeMixin), custom Vue directives (DragSort, Tooltip, LongPress), and a schema-driven configuration system that powers both validation and the CodeMirror-based YAML editor. Key data flows include: (1) configuration loading from file and localStorage, merged by the ConfigAccumulator; (2) widget data fetching via the CORS proxy or direct API calls, with standardized error handling and update intervals; (3) authentication token exchange and session management across client and server; (4) status checks that update item indicators in real-time. External dependencies are limited to Node.js, Vue 3, Express, and a handful of widget-specific APIs (OpenWeatherMap, CoinGecko, etc.), all of which are optional and configurable. The project is purely an application with no data research or analytics components.
The LLM identified 8 files worth highlighting for reuse:
Provides a standardized lifecycle for all widgets (fetchData, update, error handling, loading state). Reduces boilerplate across 50+ widget implementations and can be extracted for any Vue 3 project needing reusable data-fetching components.
Merges configuration from file, localStorage overrides, and defaults, supporting multi-page sub-configs. Implements a layered config pattern that is reusable in any application requiring hierarchical, overridable settings.
Lightweight HTTP client with automatic Bearer/Basic auth header injection, SSRF protection, and error handling. Can be extracted for any Node.js or Vue app needing authenticated API calls with minimal dependencies.
Custom Vue directive for drag-and-drop reordering using SortableJS. Handles DOM state reversion and fires an onSorted callback. Reusable in any Vue 3 project requiring sortable lists with minimal coupling.
RFC 5545 iCalendar parser using browser DOMParser. Handles recurrence rules, timezones, and date parsing without external dependencies. Reusable in any application needing calendar event parsing from .ics sources.
Search utility with multi-field matching, URL detection, and bang syntax (e.g., !g search). Provides a generic search algorithm that can be extracted for any application needing instant search with custom shortcuts.
Server endpoint for proxying widget API requests with SSRF protection (blocks cloud metadata IPs, non-HTTP schemes) and configurable allowInsecure flag. Reusable pattern for any application needing a secure CORS proxy for third-party API calls.
Base authentication module with login/logout, token generation, and user state management. Designed to be extended by OIDC, Keycloak, header, and basic auth providers. Reusable auth pattern for Vue applications requiring multiple auth strategies.