{"id":49349755,"url":"https://github.com/doanlong1412/sys-desk","last_synced_at":"2026-05-03T15:02:02.568Z","repository":{"id":354064599,"uuid":"1221990979","full_name":"doanlong1412/Sys-desk","owner":"doanlong1412","description":"SysDesk — Server Monitor with Live2D Girls' Frontline","archived":false,"fork":false,"pushed_at":"2026-04-26T23:59:28.000Z","size":10835,"stargazers_count":6,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-29T11:28:40.665Z","etag":null,"topics":["custom-card","dashboard","home-assistant","homeassistant","lovelace","lovelace-card","mornitoring","network","server"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/doanlong1412.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"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}},"created_at":"2026-04-26T23:50:04.000Z","updated_at":"2026-04-27T15:46:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/doanlong1412/Sys-desk","commit_stats":null,"previous_names":["doanlong1412/sys-desk"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/doanlong1412/Sys-desk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doanlong1412%2FSys-desk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doanlong1412%2FSys-desk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doanlong1412%2FSys-desk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doanlong1412%2FSys-desk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/doanlong1412","download_url":"https://codeload.github.com/doanlong1412/Sys-desk/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doanlong1412%2FSys-desk/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32463895,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T22:27:22.272Z","status":"online","status_checked_at":"2026-04-30T02:00:05.929Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["custom-card","dashboard","home-assistant","homeassistant","lovelace","lovelace-card","mornitoring","network","server"],"created_at":"2026-04-27T09:30:54.571Z","updated_at":"2026-04-30T12:01:00.595Z","avatar_url":"https://github.com/doanlong1412.png","language":"JavaScript","funding_links":["https://www.paypal.com/paypalme/doanlong1412"],"categories":[],"sub_categories":[],"readme":"# 🖥️ SysDesk\n\n[![hacs_badge](https://img.shields.io/badge/HACS-Custom-orange.svg)](https://github.com/hacs/integration)\n![version](https://img.shields.io/badge/version-1.0-blue)\n![HA](https://img.shields.io/badge/Home%20Assistant-2023.1+-green)\n![license](https://img.shields.io/badge/license-MIT-lightgrey)\n\n\u003e 🇻🇳 **Phiên bản tiếng Việt:** [README.vi.md](README.vi.md)\n\n**Your server room now has a guardian.** An anime Live2D character lives inside your Home Assistant card, watches your CPU, RAM, disk, and temperatures in real time, alerts you the moment anything spikes — and speaks every warning out loud. Pin her to a corner and she floats above your entire dashboard, always watching, always present.\n\nOne card. Zero dependencies. Drops straight into Home Assistant.\n\n\u003e 🌐 **Currently available in Vietnamese 🇻🇳 and English 🇬🇧 only.**\n\u003e If you find SysDesk useful, please ⭐ **star the repo** or [☕ buy me a coffee](https://www.paypal.com/paypalme/doanlong1412) to keep the project going!\n\n---\n\n## 📸 Preview\n\n![SysDesk Preview](assets/preview1.png)\n\n![SysDesk Preview](assets/preview2.png)\n\n---\n\n## ✨ What makes this different\n\nMost server dashboards throw raw numbers at you. SysDesk gives those numbers **a voice and a face**. UMP45 warns you the moment CPU crosses 70%. HK416 reports disk is nearly full before your services crash. SOPMOD shouts when a WiFi AP goes offline. The character cycles her speech bubble automatically, and everything — the greeting, the reaction, the voice — is driven by your actual Home Assistant sensors, in real time.\n\n---\n\n## 🚀 Features\n\n---\n\n### 💜 9 Girls' Frontline Characters — switchable in one tap\n\nNine hand-picked Live2D characters from Girls' Frontline, each with her own personality and greeting. Switch between them directly on the card — the character loads instantly from a CDN with no local files needed.\n\n| Character | Personality |\n|-----------|-------------|\n| **UMP45 🔫** | Sharp and vigilant, always on duty |\n| **M4A1 🛡️** | Calm, reliable, built to protect |\n| **SOPMOD-II 🔥** | Energetic and explosive, catches everything |\n| **HK416 🎯** | Disciplined and precise, zero tolerance for anomalies |\n| **K2 🌸** | Gentle and reassuring, always here for you |\n| **PKP 🍵** | Laid-back but thorough — servers stable, go have tea |\n| **RFB 🎄** | Watchful and steady, nothing slips past her sights |\n| **Lewis 🌼** | Warm and dependable, quietly guards everything |\n| **DSR-50 🔭** | Hawk-eyed, no anomaly escapes her observation |\n| **Gelina ⚙️** | Methodical and precise, all sensors online |\n\nThe ◀ ▶ buttons on the card cycle through all characters. The last chosen character is remembered via `localStorage` — she'll be there when you come back.\n\n---\n\n### 📌 Mini Mode + Pin — floats above your entire dashboard\n\nTap **Mini** and the character shrinks into a floating widget anchored to the bottom-right corner of your screen. Tap **Pin** and she stays visible across every Lovelace view, every subpage, every dashboard — she follows you everywhere.\n\n**What Mini / Pin Mode does:**\n- Character floats to the bottom-right corner of the browser window\n- Persists across all Lovelace views — she follows you everywhere\n- Speech bubble still pops up with reactions and alerts\n- TTS still speaks — you'll hear her even when she's minimized\n- Double-click the floating character to snap back to full card mode\n\nThis is the feature that makes SysDesk feel like a real NOC companion rather than just a card.\n\n---\n\n### 🚨 Intelligent Alert System — threshold-based, auto-TTS loop\n\nWire up your server sensors and the character reacts the moment any metric crosses a threshold — with a full spoken alert that **repeats on a loop** until the issue resolves.\n\n| Metric | Warn | Critical |\n|--------|------|----------|\n| CPU | ≥ 70% | ≥ 90% |\n| RAM | ≥ 75% | ≥ 90% |\n| Disk | ≥ 70% | ≥ 85% |\n| CPU Temp | ≥ 70°C | ≥ 85°C |\n| Drive Temp | ≥ 40°C | ≥ 55°C |\n\n- **Warning** — character explains the issue with actionable advice (check logs, restart services, clean up disk…)\n- **Critical** — urgent, emphatic alert, demands immediate action\n- **Service down** — instant notification when any monitored service or AP goes offline\n- **Auto-TTS loop** — the spoken warning keeps repeating at intervals until the metric returns to safe range — you won't miss it\n\n---\n\n### 🖥️ Multi-Server Monitoring — HA, pfSense, Frigate, NAS\n\nSysDesk monitors sensors across your entire homelab out of the box:\n\n| Server | Metrics |\n|--------|---------|\n| 🏠 **Home Assistant** | CPU · Disk · RAM · CPU Temp |\n| 🔒 **pfSense** | CPU · RAM |\n| 📷 **Frigate (VM)** | CPU · RAM |\n| 💽 **NAS** | CPU · RAM · Drive Temp |\n\nAdd any custom sensors on top — the sensor list is fully expandable from the visual editor.\n\n---\n\n### 📡 Service \u0026 AP Health Monitoring\n\nConnect any switch, sensor, or binary sensor — AdGuard, WiFi access points, network devices — and the character alerts you the moment state drops to `off` or `unavailable`.\n\n```yaml\nadguard: switch.adguard_home_protection\nwifi_5:  sensor.5_office_state\nwifi_6:  sensor.6_living_state\nnano_hd: sensor.nano_hd_state\n```\n\n---\n\n### 💬 Smart Status Bubbles — context-aware, always fresh\n\nThe speech bubble doesn't just display raw numbers. It knows what time it is, what's currently wrong, and greets you accordingly.\n\n**Bubble logic:**\n- **Time-of-day greeting** — dawn 🌅, morning ☀️, noon 🍱, afternoon ⛅, evening 🌙, night 😴\n- **System status summary** — all OK ✅, or lists active problems\n- **Character idle quotes** — each character has 6 unique idle lines, rotated automatically\n- **Owner name** — the character calls you by the name you set in config\n- **Character nickname** — fully customisable (`{c}` resolves to her name in every message)\n\n---\n\n### 🔊 TTS — 4 engines, fully configurable\n\nThe character speaks every alert and greeting out loud. Four TTS engines are supported.\n\n| Engine | Description |\n|--------|-------------|\n| **Web Speech** | Browser built-in voices — works everywhere, zero setup |\n| **Google Translate** | Crisp Google voices via audio tag — no HA addon required |\n| **HA Service (tts.speak)** | HA 2023.8+ native — plays on browser or physical speaker |\n| **HA Service (legacy)** | `tts.google_translate_say` / `tts.cloud_say` — older setups |\n| **None** | Disable TTS completely |\n\n```yaml\ntts:\n  engine: ha_service\n  service: tts.speak\n  entity_id: tts.google_translate_vi_com\n  media_player_entity_id: media_player.living_room_speaker\n  cache: true\n```\n\n---\n\n### 🎛️ Visual Config Editor\n\nEverything configurable without touching YAML. The editor uses accordion sections for a clean layout:\n\n| Section | Contents |\n|---------|----------|\n| ⚙️ **General** | Owner name, character nickname, card height |\n| 🎨 **Appearance** | Background blur, mini / pin mode dimensions |\n| 🖥️ **Server Sensors** | Default + custom sensors with rename and entity picker |\n| 📡 **Services \u0026 APs** | Default + custom services with entity picker |\n| 🔊 **TTS** | Engine, language, rate, pitch, HA service config |\n\n---\n\n## 📦 Installation\n\n### Option 1 — HACS (recommended, 30 seconds)\n\n**Step 1** — Add this repository to HACS:\n\n[![Open HACS Repository](https://my.home-assistant.io/badges/hacs_repository.svg)](https://my.home-assistant.io/redirect/hacs_repository/?owner=doanlong1412\u0026repository=sys-desk\u0026category=plugin)\n\n\u003e If the button doesn't work, add manually:\n\u003e **HACS → Frontend → ⋮ → Custom repositories**\n\u003e URL: `https://github.com/doanlong1412/sys-desk` → Type: **Dashboard** → Add\n\n**Step 2** — Search **SysDesk** → **Install**\n\n**Step 3** — Hard-reload your browser (`Ctrl+Shift+R`)\n\n---\n\n### Option 2 — Manual\n\n1. Download [`sysdesk.js`](https://github.com/doanlong1412/sys-desk/releases/latest)\n2. Copy to `/config/www/js/sysdesk.js`\n3. **Settings → Dashboards → Resources → Add resource:**\n   ```\n   URL:  /local/js/sysdesk.js\n   Type: JavaScript module\n   ```\n4. Hard reload (`Ctrl+Shift+R`)\n\n---\n\n## ⚙️ Configuration\n\nAdd the card to your dashboard:\n\n```yaml\ntype: custom:sys-desk\n```\n\nThen click **✏️ Edit** — the visual editor handles the rest.\n\n---\n\n### Full YAML example\n\n```yaml\ntype: custom:sys-desk\nname: Long                        # your name — the character calls you this\nchar_nickname: UMP45              # optional: override character's self-name\nheight: 440                       # card height in px\nfloat_height: 600                 # mini / pin mode character height\nfloat_width:  380                 # mini / pin mode width\ncard_blur: 0                      # background blur (0 = fully transparent)\n\n# ── Server Sensors (defaults shown — only override if your entities differ) ──\nha_cpu:        sensor.system_monitor_processor_use\nha_disk:       sensor.system_monitor_disk_usage\nha_ram:        sensor.system_monitor_memory_usage\nha_temp:       sensor.system_monitor_processor_temperature\npf_cpu:        sensor.pfsense_cpu_usage\npf_ram:        sensor.pfsense_memory_used\nfri_cpu:       sensor.frigate_200_cpu_used\nfri_ram:       sensor.qemu_frigate_200_memory_used_percentage\nnas_cpu:       sensor.nas_cpu\nnas_ram:       sensor.nas_memory\nnas_disk_temp: sensor.data_drive_1_temperature\n\n# ── Services / APs ──\nadguard: switch.adguard_home_protection\nwifi_5:  sensor.5_office_state\nwifi_6:  sensor.6_living_state\nwifi_7:  sensor.7_kitchen_state\nwifi_8:  sensor.8_garage_state\nwifi_9:  sensor.9_outside_state\nnano_hd: sensor.nano_hd_state\n\ntts:\n  engine: webspeech\n  lang: vi-VN\n  rate: 1.05\n  pitch: 1.1\n```\n\n---\n\n### Config reference\n\n| Key | Default | Description |\n|-----|---------|-------------|\n| `name` | `admin` | Owner name — used in every alert and greeting |\n| `char_nickname` | *(character default)* | Override character's self-name |\n| `height` | `440` | Card height (px) |\n| `float_height` | `600` | Mini / Pin mode character height (px) |\n| `float_width` | `380` | Mini / Pin mode width (px) |\n| `card_blur` | `0` | Background blur (0–30) |\n| `ha_cpu` | `sensor.system_monitor_processor_use` | HA CPU sensor |\n| `ha_disk` | `sensor.system_monitor_disk_usage` | HA Disk sensor |\n| `ha_ram` | `sensor.system_monitor_memory_usage` | HA RAM sensor |\n| `ha_temp` | `sensor.system_monitor_processor_temperature` | HA CPU Temp sensor |\n| `pf_cpu` | `sensor.pfsense_cpu_usage` | pfSense CPU sensor |\n| `pf_ram` | `sensor.pfsense_memory_used` | pfSense RAM sensor |\n| `fri_cpu` | `sensor.frigate_200_cpu_used` | Frigate CPU sensor |\n| `fri_ram` | `sensor.qemu_frigate_200_memory_used_percentage` | Frigate RAM sensor |\n| `nas_cpu` | `sensor.nas_cpu` | NAS CPU sensor |\n| `nas_ram` | `sensor.nas_memory` | NAS RAM sensor |\n| `nas_disk_temp` | `sensor.data_drive_1_temperature` | NAS Drive Temp sensor |\n| `adguard` | `switch.adguard_home_protection` | AdGuard switch |\n| `wifi_5–9` | *(office/living/kitchen/garage/outside)* | WiFi AP sensors |\n| `nano_hd` | `sensor.nano_hd_state` | Nano HD AP sensor |\n\n---\n\n### TTS engine reference\n\n#### Web Speech (default)\n```yaml\ntts:\n  engine: webspeech\n  lang: vi-VN      # optional\n  rate: 1.05       # 0.5–2.0\n  pitch: 1.1       # 0–2\n```\n\n#### Google Translate\n```yaml\ntts:\n  engine: google_translate\n  lang: vi\n```\n\n#### HA Service — tts.speak (HA 2023.8+, recommended)\n```yaml\ntts:\n  engine: ha_service\n  service: tts.speak\n  entity_id: tts.google_translate_vi_com\n  media_player_entity_id: media_player.living_room_speaker  # optional\n  cache: true\n```\n\n#### HA Service — legacy\n```yaml\ntts:\n  engine: ha_service\n  service: tts.google_translate_say\n  entity_id: media_player.living_room_speaker\n  lang: vi\n```\n\n#### Disable TTS\n```yaml\ntts:\n  engine: none\n```\n\n---\n\n## 🖥️ Compatibility\n\n| | |\n|---|---|\n| Home Assistant | 2023.1+ |\n| Lovelace | Default \u0026 custom dashboards |\n| Devices | Mobile \u0026 Desktop |\n| Dependencies | **None** |\n| Browsers | Chrome, Firefox, Safari, Edge |\n\n---\n\n## 📋 Changelog\n\n### v1.0.0\n- 🖥️ **9 Girls' Frontline characters** — UMP45, M4A1, SOPMOD-II, HK416, K2, PKP, RFB, Lewis, DSR-50, Gelina — switchable via ◀ ▶ buttons, saved in localStorage\n- 📌 **Mini Mode + Pin** — character collapses to floating corner widget, persists across all Lovelace views\n- 🚨 **Threshold-based alert system** — CPU, RAM, Disk, CPU Temp, Drive Temp with warn + critical levels\n- 🔁 **Auto-TTS loop** — spoken alert repeats until metric returns to safe range\n- 🖥️ **Multi-server monitoring** — Home Assistant, pfSense, Frigate, NAS out of the box\n- 📡 **Service \u0026 AP health monitoring** — AdGuard, WiFi APs, any switch or sensor\n- 💬 **Smart status bubbles** — time-aware greetings, system summary, character idle quotes\n- 🔊 **4 TTS engines** — Web Speech, Google Translate, HA Service (tts.speak + legacy), or None\n- 🎛️ **Visual Config Editor** — accordion sections, add/rename/remove sensors and services, no YAML required\n- 🌐 **i18n** — Vietnamese 🇻🇳 and English 🇬🇧, switchable in the editor\n\n---\n\n## 📄 License\n\nMIT — free to use, modify, and distribute.\nIf SysDesk makes your homelab feel alive, please ⭐ **star the repo** — it genuinely helps.\n\n---\n\n## 🙏 Credits\n\nBuilt by **[@doanlong1412](https://github.com/doanlong1412)** from 🇻🇳 Vietnam.\n\n\u003e ☕ If you enjoy SysDesk, consider [buying me a coffee](https://www.paypal.com/paypalme/doanlong1412) to keep the project going!\n\nLive2D models hosted via [jsdelivr CDN](https://www.jsdelivr.com/) — credits to original model authors.\nLive2D rendering powered by [live2d-widget](https://github.com/zenghongtu/live2d-model-assets).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdoanlong1412%2Fsys-desk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdoanlong1412%2Fsys-desk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdoanlong1412%2Fsys-desk/lists"}