{"id":29921397,"url":"https://github.com/muxbh28/server-homepage","last_synced_at":"2026-01-28T20:05:48.527Z","repository":{"id":306813756,"uuid":"1025774990","full_name":"MuxBH28/server-homepage","owner":"MuxBH28","description":"A lightweight dashboard for your home server.","archived":false,"fork":false,"pushed_at":"2025-09-19T19:07:22.000Z","size":34362,"stargazers_count":16,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-19T21:46:05.440Z","etag":null,"topics":["docker","homelab","homepage","minimal","nodejs","personal-server","react","self-hosted","server-dashboard","tailwind","vite"],"latest_commit_sha":null,"homepage":"https://server-homepage.msehic.com/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MuxBH28.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"MuxBH28","patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":null,"thanks_dev":null,"custom":null}},"created_at":"2025-07-24T19:26:52.000Z","updated_at":"2025-09-19T19:07:26.000Z","dependencies_parsed_at":"2025-09-19T21:18:54.327Z","dependency_job_id":null,"html_url":"https://github.com/MuxBH28/server-homepage","commit_stats":null,"previous_names":["muxbh28/server-homepage"],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/MuxBH28/server-homepage","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MuxBH28%2Fserver-homepage","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MuxBH28%2Fserver-homepage/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MuxBH28%2Fserver-homepage/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MuxBH28%2Fserver-homepage/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MuxBH28","download_url":"https://codeload.github.com/MuxBH28/server-homepage/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MuxBH28%2Fserver-homepage/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28850474,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T15:15:36.453Z","status":"ssl_error","status_checked_at":"2026-01-28T15:15:13.020Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","homelab","homepage","minimal","nodejs","personal-server","react","self-hosted","server-dashboard","tailwind","vite"],"created_at":"2025-08-02T07:42:55.534Z","updated_at":"2026-01-28T20:05:48.516Z","avatar_url":"https://github.com/MuxBH28.png","language":"JavaScript","funding_links":["https://github.com/sponsors/MuxBH28"],"categories":[],"sub_categories":[],"readme":"# Server Homepage\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/logo.png\" alt=\"Logo\"/\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cem\u003eA lightweight dashboard for your home server.\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/stars/MuxBH28/server-homepage?color=232323\u0026label=server-homepage\u0026logo=github\u0026labelColor=232323\" alt=\"View server-homepage on GitHub\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Sponsor-b820f9?labelColor=b820f9\u0026logo=githubsponsors\u0026logoColor=fff\" alt=\"Sponsor MuxBH28\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Docker%20Pulls-latest-blue?style=flat-square\u0026logo=docker\u0026link=https%3A%2F%2Fghcr.io%2Fmuxbh28%2Fserver-homepage\" alt=\"Docker Pulls\" /\u003e\n  \u003cimg src=\"https://img.shields.io/github/license/muxbh28/server-homepage\" alt=\"License\" /\u003e\n  \u003cimg src=\"https://img.shields.io/github/v/release/muxbh28/server-homepage\" alt=\"Release\" /\u003e\n  \u003cimg src=\"https://img.shields.io/github/commit-activity/m/MuxBH28/server-homepage\" alt=\"Commit Activity\" /\u003e\n  \u003ca href=\"https://github.com/MuxBH28/server-homepage/pkgs/container/server-homepage\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Download-Docker-blue\" alt=\"Download\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n   \u003ca href=\"https://server-homepage.msehic.com/\" target=\"_blank\"\u003eDemo available here!\u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Demo-old_version-orange\" alt=\"Demo\" /\u003e\n\u003c/p\u003e\n\n---\n\n\n| Section       | Link                                  |\n| --------------- | --------------------------------------- |\n| About         | [Go to About](#about)                 |\n| Preview       | [Go to Preview](#preview)             |\n| Installation  | [Go to Installation](#installation)   |\n| Arduino       | [Go to Arduino](#arduino)             |\n| Scriptable    | [Go to Scriptable](#scriptable)       |\n| Usage         | [Go to Usage](#usage)                 |\n| Customization | [Go to Customization](#customization) |\n| Author        | [Go to Author](#author)               |\n\n---\n\n## About\n\nThis is a minimalist personal homepage project built with **Node.js (Express)** backend and a **React + Vite** frontend styled with Tailwind CSS.\n\nIt serves system monitoring data (CPU, RAM, Disk, uptime), manages custom links via API, and shows network information.\n\nThe project is intended to be deployed on a Linux server and accessed locally or via LAN.\n\n---\n\n## Preview\n\nVersion 1.0:\n![Version 1.0](extra/preview.png)\n[Release v1.0](https://github.com/MuxBH28/server-homepage/releases/tag/v1.0)\n\nVersion 1.1+:\n![Version 1.1](extra/preview2.png)\n\nVersion 1.3.1:\n![Version 1.3.1](extra/preview1.3.1.png)\n\nVersion 1.3.5:\n![Version 1.3.5](extra/preview1.3.5.png)\n\nVersion 1.3.7:\n![Version 1.3.7](extra/preview1.3.7.png)\n\n## Installation\n\u003ca href=\"https://github.com/MuxBH28/server-homepage/pkgs/container/server-homepage\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Download-Docker-blue\" alt=\"Download\" /\u003e\n\u003c/a\u003e\n\nYou have three options to run **Server Homepage**: using Node.js/PM2, building from Dockerfile, or using the prebuilt Docker image. \n\nCloning the repository is only necessary if you want to modify the source code.\n\nIf you get stuck or encounter any issues, feel free to reach out by creating an [issue](https://github.com/MuxBH28/server-homepage/issues) on GitHub.\n\n### Option 1: Using Node.js / PM2\n\n1. Make sure you have [Node.js](https://nodejs.org/) installed (version 16+ recommended).\n2. Clone the repository:\n\n```bash\ngit clone https://github.com/MuxBH28/server-homepage\ncd server-homepage\n```\n\n3. In the project folder, install dependencies:\n\n```bash\nnpm install\nnpm run build\n```\n\n4. Start the server:\n\n```bash\nnode server.js\n```\n\nor better, use [PM2](https://pm2.keymetrics.io/) to manage the process:\n\n```bash\npm2 start server.js\n```\n\n5. Access the homepage via `http://your-server-ip:6969/` in your browser.\n\n### Option 2: Using Dockerfile\n\n1. Make sure you have [Docker](https://www.docker.com/get-started/) installed.\n2. Clone the repository:\n\n```bash\ngit clone https://github.com/MuxBH28/server-homepage\ncd server-homepage\n```\n\n3. Build the Docker image:\n\n```bash\ndocker build -t server-homepage .\n```\n\n4. Run the container:\n\n```bash\ndocker run -d -p 6969:6969 --name server-homepage server-homepage\n```\n\n5. Access the homepage via http://your-server-ip:6969/ in your browser.\n\n### Option 3: Using Prebuilt Docker Image\n\n1. Make sure you have [Docker](https://www.docker.com/get-started/) installed.\n2. Pull the latest image from GitHub Container Registry:\n\n```bash\ndocker pull ghcr.io/muxbh28/server-homepage:latest\n```\n\n3. Run the container:\n\n```bash\ndocker run -d -p 6969:6969 --name server-homepage ghcr.io/muxbh28/server-homepage:latest\n```\n\n4. Access the homepage via http://your-server-ip:6969/ in your browser.\n\n#### Docker stop\n\n1. To stop the container:\n\n```bash\ndocker stop server-homepage\n```\n\n2. To remove the container:\n\n```bash\ndocker rm server-homepage\n```\n\n---\n\n## Arduino\n\n### `arduino.ino` – LED Server Health Monitor\n\nThis sketch runs on an ESP32 and serves as a visual indicator of your home server's overall health. It fetches system metrics—CPU load, temperature, and RAM usage—from a REST API and uses LEDs to represent the status:\n\n- **Green**: Normal operation\n- **Yellow**: Warning thresholds\n- **Red**: Critical condition\n- **White blink**: Successful data fetch\n\nThe ESP32 connects to WiFi and includes error handling for network issues.\nThis project was created as an initial test to evaluate ESP32’s ability to communicate with the server, with future plans to expand into a wireless hub featuring a display, control buttons, and server restart functionality.\n\n### `arduino-gauge.ino` – CPU Temperature Servo Gauge\n\nThis sketch also runs on an ESP32 but focuses solely on visualizing CPU temperature. It retrieves temperature data from the server’s REST API and drives a micro servo to move a needle across a printed gauge face.\n\n- The gauge background (`example_of_gauge_background.png`) is designed for 180° servo rotation and can be printed for physical use.\n- The needle updates every minute, and the sketch includes robust WiFi connectivity and error handling.\n\nThis setup was built to test ESP32’s ability to drive physical indicators based on server data, laying the groundwork for a compact, analog-style temperature monitor.\n\n**Note**: It is recommended to use an external power supply for the servo motor (5VDC), with a shared ground connection to the ESP32 to ensure stable operation and avoid electrical interference.\n\n## Scriptable\n\nServer Homepage now includes **Scriptable widget integration**, allowing you to monitor your server’s status directly from your iOS home screen.\nThe widget displays key real-time metrics, including **CPU usage, RAM usage, CPU temperature, and network speeds (download \u0026 upload)**.\n\nDetailed installation and setup instructions are available in [scriptable/instructions.md](scriptable/instructions.md).\n\n![Scriptable Widget Preview](scriptable/preview.jpg)\n\n---\n\n## Usage\n\n- The system info is updated automatically based on the refresh interval set in the UI.\n- You can add, edit, or delete custom links through the web interface, which are saved in `links.json`.\n- Weather information is fetched from a configured API and cached in localStorage for performance.\n\n---\n\n## Customization\n\n### Background Image\n\nThe easiest way to change the background is to go to the settings and replace the path with your desired image. You can use a local file or an online image URL.\n\nThe default background image is:\n\n```\n./assets/background.jpg\n```\n\nOne more option to change the background is to simply replace this file with your desired image, keeping the same filename and extension or in `index.html` change style of body tag.\n\nCurrent default background is by [Manuela](https://pixabay.com/users/sinnesreich-2779296/?utm_source=link-attribution\u0026utm_medium=referral\u0026utm_campaign=image\u0026utm_content=1759179) from [Pixabay](https://pixabay.com//?utm_source=link-attribution\u0026utm_medium=referral\u0026utm_campaign=image\u0026utm_content=1759179)\n\n### Links\n\nCustom links are stored in `json/links.json` on the server. You can edit this file manually or use the web UI to add/remove links.\n\nThe `extra/premade-links` folder contains predefined JSON files that can be used or copied.\n\n### Settings\n\nSettings are stored in `json/settings.json`. You can edit them manually, but using the web UI is **recommended** to avoid errors.\n\n### Server Port\n\nBy default, the server listens on port `6969`. You can change this by modifying the `PORT` variable in `server.js`. But before that, check [Installation](#installation) if you changed something or used Docker.\n\n### Indicators\n\nThe dashboard includes several indicators to help monitor the server's status:\n\n- **Battery** (./svg/battery.svg) – Shows whether the dashboard is connected to server.\n- **CPU Temperature** (./svg/temperature.svg) – Lights up if the CPU temperature is high.\n- **RAM Usage** (./svg/ram-high.svg) – Indicates high memory usage.\n- **System Warning** (./svg/check-engine.svg) – Alerts about general system issues.\n- **No Links** (./svg/no-links.svg) – Displays when there are no available links.\n- **Storage** (./svg/storage.svg) – Indicates that disk storages are almost full.\n\nThe SVG icons used in this project are proudly sourced from [SVG Repo](https://www.svgrepo.com/collection/car-parts-2/) collection *Car Parts 2*.\n\n### Tools\n\nThe Server Homepage includes a dedicated **Tools** section, accessible separately from the main page. These tools provide various utilities for monitoring, interaction, and customization of your server environment.\n\nCurrently available tools:\n\n- **Process Viewer** – Lists all active server processes with details such as PID, CPU usage, and memory consumption.\n- **Crypto Prices** – Displays real-time prices of selected cryptocurrencies (e.g., Bitcoin, Ethereum), with automatic updates.\n- **Notes** – A simple note-taking tool for storing personal or server-related notes. Changes are saved instantly.\n- **RSS Viewer** – Fetches and displays the latest articles from a configured RSS feed.\n- **Power Options** – Offers essential server commands: Shutdown, Restart, and Sleep.\n- **Hardware Info** – Shows detailed specifications of the server hardware, including CPU, RAM, and storage.\n- **QR Code Maker** – Converts any text or URL into a customizable QR code. You can adjust size, colors, and download the result.\n\n#### Refresh Behavior\n\n- **Process Viewer** and **Crypto Prices** refresh every minute (or based on custom interval).\n- **RSS Viewer** updates every 10 minutes.\n- **Notes** load once and save changes immediately.\n- **Hardware Info** is fetched only on initial load.\n- **Power Options** and **QR Code Maker** do not require automatic refreshing.\n\n### To Do\n\n- [x] Improve mobile responsiveness\n- [x] Fix layout issues on smaller screens\n- [x] Optimize load time (Vite + lazy loading)\n- [x] Add loading indicators for system stats\n- [x] Improve accessibility (ARIA roles, keyboard navigation)\n- [ ] Polish UI animations and transitions\n- [x] Ctrl+V to paste link\n- [ ] Telegram notifications for warnings\n- [ ] Background images from Immich ([ImmichFrame](https://github.com/immichFrame/ImmichFrame))\n\n## Notes\n\n- Ideas and suggestions are welcome! Feel free to share them by creating an [issue](https://github.com/MuxBH28/server-homepage/issues) on GitHub.\n- The available demo is provided for reference purposes and may not reflect the most recent version of the project.\n- The backend makes external requests to the following services:\n  - [ipinfo.io](https://ipinfo.io/json) – for public network information.\n  - [api.coingecko.com](https://api.coingecko.com) – for retrieving cryptocurrency prices.\n  - [hnrss.org](https://hnrss.org) – used as the default RSS feed source.\n  - [github.com](https://github.com) – for checking the latest available version of the project.\n\n---\n\n## Author\n\u003cimg src=\"https://img.shields.io/badge/Sponsor-b820f9?labelColor=b820f9\u0026logo=githubsponsors\u0026logoColor=fff\" alt=\"Sponsor MuxBH28\" /\u003e\n\n- Created by: **MuxBH28**\n- Website: [https://msehic.com](https://msehic.com)\n- Email: [sehicmuhammed7@proton.me](mailto:sehicmuhammed7@proton.me)\n- GitHub: [https://github.com/MuxBH28](https://github.com/MuxBH28)\n\n---\n\nFeel free to customize and extend the project as you like! Pull requests are very **welcome**.\nIf you have any questions or issues, contact me via email or GitHub.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmuxbh28%2Fserver-homepage","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmuxbh28%2Fserver-homepage","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmuxbh28%2Fserver-homepage/lists"}