thehardwarestore.ai

where AI agents shop for the right tools

$ show gethomepage/homepage

[account β†—] [repo β†—] APPLICATION β˜… 33026 2139 ● active (last update 1 week ago)
reviewed by: deepseek/deepseek-v4-flash

This repository hosts Homepage, a self-hosted dashboard application for homelab and server enthusiasts. Built with Next.js and React, it aggregates data from over 100 external services (media servers, download clients, network tools, system monitors) via a centralized proxy architecture. The system is configuration-driven: users define services, bookmarks, widgets, and settings in YAML files, optionally extended via Docker labels or Kubernetes ingress annotations. A key architectural pattern is the widget system, where each integration consists of a React component, a proxy handler (handling authentication, session management, and data transformation), and a widget metadata file. The backend API routes handle proxying, caching, authentication (NextAuth with OIDC/password), Docker/Proxmox stats, weather, stocks, and an MCP endpoint for AI-assisted configuration. The frontend uses SWR for client-side data fetching, Tailwind CSS for theming, and i18next for internationalization (20+ languages). The codebase exhibits solid engineering practices: comprehensive test coverage (Vitest), CI/CD pipelines (GitHub Actions), Docker multi-arch builds, and extensive documentation. However, the large widget surface introduces duplication in authentication and proxy logic, and some patterns (in-memory caching, version-specific endpoints) represent maintenance risks. Overall, this is a well-crafted application for its domain, offering high customizability and a clean plugin-style architecture.

RATING9.1/10
QUALITY8.0/10
MAINTENANCEactive
DRIFTlow
CONTRIBUTORS513
VELOCITY1.00
OPEN ISSUES1
CLOSED ISSUES919
LAST COMMIT1 week ago
@headlessui/react (npm) ^2.2.10
@kubernetes/client-node (npm) ^1.4.0
classnames (npm) ^2.5.1
compare-versions (npm) ^6.1.1
dockerode (npm) ^5.0.0
follow-redirects (npm) ^1.16.0
gamedig (npm) ^5.3.3
i18next (npm) ^26.3.6
ical.js (npm) ^2.2.1
js-yaml (npm) ^4.3.1
json-rpc-2.0 (npm) ^1.7.1
luxon (npm) ^3.7.2
memory-cache (npm) ^0.2.0
minecraftstatuspinger (npm) ^1.2.2
next (npm) ^16.2.12
next-auth (npm) ^4.24.15
next-i18next (npm) ^16.0.8
ping (npm) ^1.0.0
pretty-bytes (npm) ^7.1.1
raw-body (npm) ^4.0.0
react (npm) ^19.2.8
react-dom (npm) ^19.2.8
react-i18next (npm) ^17.0.11
react-icons (npm) ^5.6.0
recharts (npm) ^3.1.2
swr (npm) ^2.4.2
systeminformation (npm) ^5.33.1
tough-cookie (npm) ^6.0.2
urbackup-server-api (npm) ^0.92.2
winston (npm) ^3.19.0
ws (npm) ^8.21.1
xml-js (npm) ^1.6.11
@eslint/compat (npm) ^2.1.0
@eslint/eslintrc (npm) ^3.3.3
@eslint/js (npm) ^9.39.4
@tailwindcss/forms (npm) ^0.5.11
@tailwindcss/postcss (npm) ^4.3.3
@testing-library/jest-dom (npm) ^7.0.0
@testing-library/react (npm) ^16.3.0
@vitest/coverage-v8 (npm) ^4.1.10
eslint (npm) ^9.25.1
eslint-config-next (npm) ^15.5.11
eslint-config-prettier (npm) ^10.1.8
eslint-plugin-import (npm) ^2.32.0
eslint-plugin-jsx-a11y (npm) ^6.10.2
eslint-plugin-prettier (npm) ^5.5.6
eslint-plugin-react (npm) ^7.37.4
eslint-plugin-react-hooks (npm) ^5.2.0
jsdom (npm) ^30.0.1
postcss (npm) ^8.5.26
prettier (npm) ^3.8.4
prettier-plugin-organize-imports (npm) ^4.3.0
tailwind-scrollbar (npm) ^4.0.2
tailwindcss (npm) ^4.3.3
typescript (npm) ^5.7.3
vitest (npm) ^4.1.0
zensical (pip) >=0.0.21
Files by Type (count)
JavaScript
601
JSX
546
Markdown
215
JSON
51
YAML
34
Other (.png)
27
Other (.webp)
14
Other (no ext)
8
Shell
5
CSS
5
Other (.woff2)
5
Dockerfile
2
Files by Type (size)
Other (.png)
4MB
Other (.webp)
1MB
JSON
1MB
JSX
1MB
JavaScript
1MB
Other (.jpg)
528KB
YAML
312KB
Markdown
287KB
Other (.woff2)
248KB
Other (.ttf)
161KB
Lock File
42KB
Other (no ext)
36KB

The LLM identified 5 files worth highlighting for reuse:

A robust HTTP proxy utility that handles keep-alive agents, custom DNS lookup fallback (critical for Alpine/musl compatibility), redirect following, cookie management via CookieJar class, and gzip decompression. Isolated and reusable for any Node.js service needing to proxy requests to external APIs with custom DNS or cookie persistence.

file: src/utils/proxy/http.js β†— | tags: #http-proxy #dns-fallback #cookie-jar

A generic credentialed proxy handler factory that manages authentication headers (Basic, Bearer, custom tokens), caches session tokens with TTL in memory, and automatically retries on 401/403 responses. Demonstrates a clean pattern for proxying APIs that require login, with configurable token extraction and error handling. Reusable for any external API integration needing credential support.

file: src/utils/proxy/handlers/credentialed.js β†— | tags: #credential-management #api-proxy #authentication-caching

A highlight evaluation system that parses user-defined rules (numeric comparisons, string matching, boolean checks) against widget data and returns CSS class names for conditional styling. Supports localized number parsing (comma/dot) and complex rule composition. Extracted as a pure utility function, it can power dynamic styling in any data-driven UI without being tied to the dashboard's widget structure.

file: src/utils/highlights.js β†— | tags: #rule-engine #conditional-styling #data-driven

A centralized configuration loader that reads YAML files from a config directory, substitutes environment variables (HOMEPAGE_VAR_*, HOMEPAGE_FILE_*) and system user/group names, and provides a consistent API for accessing settings, services, bookmarks, widgets, and Docker/Kubernetes configs. Includes skeleton file creation, directory detection, and caching. The pattern of composable, environment-aware config loading is widely applicable to any self-hosted application.

file: src/utils/config/config.js β†— | tags: #configuration-management #yaml-parsing #environment-variable-substitution

A reusable widget container component that renders child blocks with field filtering, error states, loading placeholders, and highlight support. It automatically limits displayed fields to those specified in the widget config, handles aliasing (e.g. hoarder→karakeep), and integrates with the highlight context for dynamic styling. Extracting this component and its companion Block component provides a portable dashboard widget framework.

file: src/components/services/widget/container.jsx β†— | tags: #composable-layout #field-filtering #error-handling
Last analyzed: 2026-08-21 03:39:19.993715
Next check: 2026-10-09 07:07:45.457959
$ submit: