{"id":47705760,"url":"https://github.com/paolobets/retro-panel","last_synced_at":"2026-04-16T14:10:52.238Z","repository":{"id":346144690,"uuid":"1188679203","full_name":"paolobets/retro-panel","owner":"paolobets","description":"Touch-optimized kiosk dashboard for Home Assistant — works on iOS 15 Safari and legacy browsers","archived":false,"fork":false,"pushed_at":"2026-04-02T18:20:38.000Z","size":2151,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-04-03T04:21:21.532Z","etag":null,"topics":["home-assistant","home-assistant-addon","ios15","kiosk","raspberry-pi"],"latest_commit_sha":null,"homepage":"https://github.com/paolobets/retro-panel","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/paolobets.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-03-22T12:40:29.000Z","updated_at":"2026-04-02T18:20:42.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/paolobets/retro-panel","commit_stats":null,"previous_names":["paolobets/retro-panel"],"tags_count":62,"template":false,"template_full_name":null,"purl":"pkg:github/paolobets/retro-panel","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paolobets%2Fretro-panel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paolobets%2Fretro-panel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paolobets%2Fretro-panel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paolobets%2Fretro-panel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/paolobets","download_url":"https://codeload.github.com/paolobets/retro-panel/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paolobets%2Fretro-panel/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31483380,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-06T17:22:55.647Z","status":"ssl_error","status_checked_at":"2026-04-06T17:22:54.741Z","response_time":112,"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":["home-assistant","home-assistant-addon","ios15","kiosk","raspberry-pi"],"created_at":"2026-04-02T17:57:12.673Z","updated_at":"2026-04-10T10:07:44.384Z","avatar_url":"https://github.com/paolobets.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Retro Panel — Home Assistant Add-on\n\n[![Release][release-badge]][release-url]\n[![License][license-badge]](LICENSE)\n[![HA Supervisor][ha-badge]][ha-url]\n[![Supports aarch64][aarch64-badge]][aarch64-url]\n[![Supports amd64][amd64-badge]][amd64-url]\n[![Supports armhf][armhf-badge]][armhf-url]\n[![Supports armv7][armv7-badge]][armv7-url]\n\n[release-badge]: https://img.shields.io/github/v/release/paolobets/retro-panel?style=flat-square\n[release-url]: https://github.com/paolobets/retro-panel/releases\n[license-badge]: https://img.shields.io/github/license/paolobets/retro-panel?style=flat-square\n[ha-badge]: https://img.shields.io/badge/Home%20Assistant-2023.1%2B-blue?style=flat-square\n[ha-url]: https://www.home-assistant.io/\n[aarch64-badge]: https://img.shields.io/badge/aarch64-yes-green?style=flat-square\n[amd64-badge]: https://img.shields.io/badge/amd64-yes-green?style=flat-square\n[armhf-badge]: https://img.shields.io/badge/armhf-yes-green?style=flat-square\n[armv7-badge]: https://img.shields.io/badge/armv7-yes-green?style=flat-square\n[aarch64-url]: https://github.com/paolobets/retro-panel\n[amd64-url]: https://github.com/paolobets/retro-panel\n[armhf-url]: https://github.com/paolobets/retro-panel\n[armv7-url]: https://github.com/paolobets/retro-panel\n\n---\n\n\u003e **A touch-optimized, kiosk-ready Home Assistant dashboard built for iOS 12+,\n\u003e old Android tablets, and resource-constrained devices.**\n\u003e Real-time updates via WebSocket. Zero build dependencies. Works where Lovelace doesn't.\n\nGive a second life to that old iPad, Fire tablet, or wall-mounted Android that struggles\nwith the standard Home Assistant interface. Retro Panel is a lightweight always-on control\npanel designed from the ground up for **legacy browsers and older hardware** — no transpilation,\nno frameworks, no `const`, no arrow functions.\n\n---\n\n## Dashboard\n\n\u003cimg src=\"docs/assets/dashboard-overview.svg\" alt=\"Retro Panel dashboard overview\" width=\"100%\"/\u003e\n\nThe panel is split into a collapsible **sidebar** (navigation sections) and a **content area**\nwith a fixed-height tile grid. A live **clock**, connection **status dot** and **theme toggle**\nsit in the header. Everything works at 120 px tile height with no layout shift.\n\n---\n\n## Lights \u0026 Switches\n\n\u003cimg src=\"docs/assets/tiles-light-switch.svg\" alt=\"Light and switch tiles\" width=\"100%\"/\u003e\n\n| Action | Result |\n|--------|--------|\n| Tap light | Toggle on/off (optimistic, immediate feedback) |\n| Long-press light (500 ms) | Bottom sheet: brightness · colour temperature · hue |\n| Tap switch / input_boolean | Toggle on/off |\n\n---\n\n## Sensors\n\n\u003cimg src=\"docs/assets/tiles-sensors.svg\" alt=\"Sensor tiles\" width=\"100%\"/\u003e\n\nRead-only tiles that display the current value and unit. Icon and visual style adapt\nautomatically to the device class: `temperature` · `humidity` · `co2` · `battery` ·\n`power` · `energy` · `pressure` · `illuminance` · and any generic sensor.\n\n---\n\n## Binary sensors \u0026 Scenarios\n\n\u003cimg src=\"docs/assets/tiles-binary-scenario.svg\" alt=\"Binary sensor and scenario tiles\" width=\"100%\"/\u003e\n\n**Binary sensors** show a state-driven icon (open/closed, detected/clear, armed/ok…).\nAn **orange pulsing border** signals an active alert.\n\n**Scenario tiles** (scene · script · automation) trigger with a single tap.\nEach tile shows a **domain badge**, a configurable **MDI icon** and an optional **border colour**.\n\n---\n\n## Configuration UI\n\n\u003cimg src=\"docs/assets/config-ui.svg\" alt=\"Configuration UI\" width=\"100%\"/\u003e\n\nAccess the admin panel at `http://[HA-IP]:7654/config`. Five tabs cover everything:\n\n| Tab | What you configure |\n|-----|--------------------|\n| **Overview** | Main home screen entities · Power flow card · Navigation order |\n| **Rooms** | Rooms with sections · Import from HA Areas · Per-entity icon and label |\n| **Scenarios** | Scene/script/automation groups · MDI icon per item · Border colour per item |\n| **Cameras** | Camera feeds · Per-camera refresh interval · Hide/show |\n| **Alarms** | Alarm panels · Zone sensors per panel |\n\nThe icon picker includes **7 400+ MDI icons** with Italian-language search\n(\"tapparella\", \"umido\", \"riscaldamento\"…).\n\n---\n\n## Energy flow card\n\nLive power-flow visualisation mapping up to 7 sensor entities:\n\n```\n  ☀ Solare     🔋 Batteria (85%)     🏠 Casa\n  2.4 kW  ──→──  +0.8 kW  ──────→──  1.6 kW\n                     │  ↑↓\n                 ⚡ Rete  0.0 kW\n```\n\nAnimated arrows reflect live energy direction. Tested with ZCS Azzurro · SMA · Fronius · Huawei SUN2000.\n\n---\n\n## All supported entity types\n\n| Entity | Layout type | What you can do |\n|--------|-------------|-----------------|\n| `light` | `light` | Toggle · brightness · colour temperature · hue |\n| `switch` · `input_boolean` | `switch` | Toggle on/off |\n| `sensor` (various device classes) | `sensor_*` | Read-only value + unit |\n| `binary_sensor` (door/window/motion/smoke/lock…) | `binary_*` | State display + alert pulse |\n| `cover` | `cover_standard` | Toggle open/close · position bar |\n| `alarm_control_panel` | `alarm` | PIN keypad · Arm Home/Away/Night · zone sensors |\n| `camera` | `camera` | MJPEG live stream · snapshot fallback · lightbox |\n| `scene` · `script` · `automation` | `scenario` | Tap-to-activate · custom icon/colour |\n| _(virtual)_ | `energy_flow` | Solar/battery/grid/home power card |\n| _(virtual)_ | `sensor_conditional` | Conditional state card (AND/OR logic) |\n\n---\n\n## Alarm panel\n\n```\n  DISARMATO — scegli modalità          ARMATO FUORI\n  ┌──────────────────────────┐         ┌────────────────────────┐\n  │ Allarme Casa             │         │ Allarme Casa           │\n  │ DISARMATO                │         │ ARMATO — Fuori         │\n  │                          │         │                        │\n  │ [Casa]  [Fuori]  [Notte] │         │      [ Disarma ]       │\n  │                          │         │                        │\n  │  1   2   3               │         │  ● Porta ingresso      │\n  │  4   5   6  [ Arma ]     │         │  ○ Finestra soggiorno  │\n  └──────────────────────────┘         └────────────────────────┘\n```\n\nPIN keypad appears only when required. Zone sensors are listed per panel.\nThe PIN is never stored — sent to HA and cleared immediately.\n\n---\n\n## Camera grid \u0026 lightbox\n\nCameras are displayed in a responsive grid. Tap any camera to open a full-screen\nMJPEG lightbox. Snapshot polling is used as automatic fallback when MJPEG is unavailable.\nEach camera has a configurable per-item refresh interval.\n\n---\n\n## Installation\n\n### Add this repository to Home Assistant\n\n**Settings → Add-ons → Add-on Store → ⋮ (top right) → Repositories**\n\n```\nhttps://github.com/paolobets/retro-panel\n```\n\nRefresh the store, find **Retro Panel**, click **Install**.\n\n### Configure\n\nGo to the **Configuration** tab and fill in:\n\n| Option | Description | Default |\n|--------|-------------|---------|\n| `ha_url` | HA instance URL | `http://homeassistant:8123` |\n| `ha_token` | Long-Lived Access Token _(leave empty on HA OS/Supervised)_ | auto |\n| `panel_title` | Title shown in the header | `Home` |\n| `theme` | `dark` · `light` · `auto` | `dark` |\n| `refresh_interval` | REST fallback poll in seconds (5–300) | `30` |\n\n### Start\n\nClick **Start**, then **Open Web UI**. The dashboard is at `/`, the admin at `/config`.\n\n---\n\n## iOS kiosk setup\n\n1. Open **Safari** → `http://[HA-IP]:7654`\n2. **Share → Add to Home Screen → Add**\n3. Open the icon → full-screen, no browser chrome\n\n**Hide the HA sidebar** using [kiosk-mode](https://github.com/NemesisRE/kiosk-mode) (HACS):\n\n```yaml\nkiosk_mode:\n  hide_sidebar: '[[[ location.href.includes(\"hassio/ingress\") ]]]'\n  hide_header:  '[[[ location.href.includes(\"hassio/ingress\") ]]]'\n```\n\n---\n\n## Security\n\n| Layer | Mechanism |\n|-------|-----------|\n| Network | Cloudflare Tunnel or WireGuard VPN (avoid direct port forwarding) |\n| Authentication | HA Ingress — requires a valid HA session |\n| Token isolation | Long-Lived Access Token stored server-side, never sent to the browser |\n| Service whitelist | All service calls validated against a hard-coded allowlist |\n| Rate limiting | Brute-force protection on alarm PIN and config endpoints |\n\nUse a **dedicated, non-admin** HA account for the kiosk tablet.\nEnable **2FA** on all administrator accounts.\n\n---\n\n## Requirements\n\n| | Minimum |\n|-|---------|\n| Home Assistant | 2023.1 (OS or Supervised) |\n| Architecture | aarch64 · amd64 · armhf · armv7 |\n| Browser | iOS 12+ Safari · Chrome 70+ · Firefox 65+ · Android WebView |\n| Host RAM | ~50 MB RSS (Raspberry Pi 3B+ compatible) |\n\n---\n\n## Documentation\n\n| Document | Contents |\n|----------|----------|\n| [`retro-panel/DOCS.md`](retro-panel/DOCS.md) | User guide: entity reference, alarm, light controls, troubleshooting |\n| [`retro-panel/docs/INSTALLATION.md`](retro-panel/docs/INSTALLATION.md) | Detailed install guide: SSH, Samba, Ingress, kiosk setup |\n| [`retro-panel/docs/ARCHITECTURE.md`](retro-panel/docs/ARCHITECTURE.md) | System design, data flow, security model, browser compatibility |\n| [`retro-panel/docs/API.md`](retro-panel/docs/API.md) | Backend REST endpoints and WebSocket protocol |\n| [`retro-panel/docs/DEVELOPMENT.md`](retro-panel/docs/DEVELOPMENT.md) | Developer guide: local setup, adding entity types, iOS 12 rules |\n| [`retro-panel/docs/TESTING.md`](retro-panel/docs/TESTING.md) | Test procedures and security tests |\n| [`retro-panel/CHANGELOG.md`](retro-panel/CHANGELOG.md) | Full version history |\n| [`retro-panel/docs/ROADMAP.md`](retro-panel/docs/ROADMAP.md) | Planned features and release schedule |\n\n---\n\n## Roadmap\n\n| Version | Status | Highlights |\n|---------|--------|------------|\n| **v2.0** | Released | Full refactor · layout_type system · two-URL architecture |\n| **v2.9** | Released | Energy card · camera grid/lightbox · alarm redesign · security hardening |\n| **v2.9.20** | Released | Per-device theme toggle (dark/light/auto) |\n| **v2.9.26** | Released | MDI icon picker (7 400+ icons) with Italian-language search |\n| **v2.9.28** | Released | Conditional sensor tile with AND/OR logic |\n| **v2.9.32** | Released | Scenario tile redesign: MDI icons, domain badge, colour border |\n| **v2.9.34** | Released | Per-item icon + colour picker for scenarios in `/config` |\n| **v2.10.0** | Released | Push notifications: bell, drawer, toast, alert border · HA `retro_panel_notify` event |\n| **v2.10.1** | Released | Fix bell colore (SVG al posto di emoji) · fix layout toggle/bell ai due estremi |\n| **v2.10.2** | Released | Fix automazioni (whitelist entity_id) · sync notifiche multi-device · fix alarm freeze dopo disarmo |\n| **v2.10.3** | Released | Fix priorità italiane (`critica`/`alta`/`normale`/`bassa` ora accettate) |\n| **v2.10.4** | Released | Fix bordatura full-screen · pulse critico · beep audio · auto-reload su update |\n| **v2.10.5** | Released | Fix audio iOS (unlock gesture) · fix auto-reload Ingress · fix theme toggle auto |\n| **v2.10.6** | Released | Fix testo notifiche in light mode · toast rimosso su eliminazione (tutti i device) |\n| **v2.10.7** | Released | Versione nell'header (verifica aggiornamenti automatici) |\n| **v2.10.8** | Released | Fix energy card: poll periodico dedicato (refresh_interval) indipendente dal WebSocket |\n| **v2.10.9** | **Current** | Fix critici pre-beta: Ingress notifiche, lazy-load sezioni, 12 fix totali da code review |\n| **v3.0** | Planned | Plugin system · custom themes · history charts · offline-first |\n\n---\n\n## License\n\nMIT — see [LICENSE](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaolobets%2Fretro-panel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpaolobets%2Fretro-panel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaolobets%2Fretro-panel/lists"}