{"id":35117478,"url":"https://github.com/koosoli/esphomedesigner","last_synced_at":"2026-04-19T15:01:03.037Z","repository":{"id":323834849,"uuid":"1094887776","full_name":"koosoli/ESPHomeDesigner","owner":"koosoli","description":"A visual drag-and-drop editor for ESPHome displays (E-Ink, OLED, LCD, Touch), running as a Home Assistant integration or a standalone web app.","archived":false,"fork":false,"pushed_at":"2026-04-16T10:22:34.000Z","size":102413,"stargazers_count":820,"open_issues_count":29,"forks_count":45,"subscribers_count":13,"default_branch":"main","last_synced_at":"2026-04-16T12:32:08.284Z","etag":null,"topics":["custom-component","dashboard","editor","eink","esp32","hacs","hacs-integration","home-automation","homeassistant","integration","lvgl","opendisplay","openepaperlink","wysiwyg"],"latest_commit_sha":null,"homepage":"","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/koosoli.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.txt","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},"funding":{"github":["koosoli"]}},"created_at":"2025-11-12T10:00:54.000Z","updated_at":"2026-04-16T10:22:20.000Z","dependencies_parsed_at":null,"dependency_job_id":"c526ba99-ab97-4be5-bf78-d0aded93c8ba","html_url":"https://github.com/koosoli/ESPHomeDesigner","commit_stats":null,"previous_names":["koosoli/reterminaldesigner","koosoli/esphomedesigner"],"tags_count":50,"template":false,"template_full_name":null,"purl":"pkg:github/koosoli/ESPHomeDesigner","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/koosoli%2FESPHomeDesigner","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/koosoli%2FESPHomeDesigner/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/koosoli%2FESPHomeDesigner/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/koosoli%2FESPHomeDesigner/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/koosoli","download_url":"https://codeload.github.com/koosoli/ESPHomeDesigner/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/koosoli%2FESPHomeDesigner/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32010957,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T20:23:30.271Z","status":"online","status_checked_at":"2026-04-19T02:00:07.110Z","response_time":55,"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-component","dashboard","editor","eink","esp32","hacs","hacs-integration","home-automation","homeassistant","integration","lvgl","opendisplay","openepaperlink","wysiwyg"],"created_at":"2025-12-27T21:55:59.493Z","updated_at":"2026-04-19T15:01:03.031Z","avatar_url":"https://github.com/koosoli.png","language":"JavaScript","funding_links":["https://github.com/sponsors/koosoli","https://buymeacoffee.com/koosoli"],"categories":[],"sub_categories":[],"readme":"# ESPHome Designer\n\n**A visual drag-and-drop editor for smart displays, supporting ESPHome, OpenEpaperLink (OEPL), and OpenDisplay - running as a Home Assistant integration or a standalone web app.**\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://github.com/sponsors/koosoli\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Sponsor-Project-ff69b4?style=for-the-badge\u0026logo=github-sponsors\" alt=\"Sponsor Project\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://buymeacoffee.com/koosoli\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Buy%20Me%20a%20Coffee-ffdd00?style=for-the-badge\u0026logo=buy-me-a-coffee\u0026logoColor=black\" alt=\"Buy Me a Coffee\"\u003e\n  \u003c/a\u003e\n  \u003cbr\u003e\n  \u003cstrong\u003eIf you find this project useful, consider \u003ca href=\"https://github.com/sponsors/koosoli\"\u003esupporting its development!\u003c/a\u003e\u003c/strong\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://youtu.be/BLkzDYYQJcQ\"\u003e\n    \u003cimg src=\"https://img.youtube.com/vi/BLkzDYYQJcQ/maxresdefault.jpg\" alt=\"Watch the v0.8.6 Feature Walkthrough\" width=\"600\"\u003e\n  \u003c/a\u003e\n  \u003cbr\u003e\n  \u003ca href=\"https://youtu.be/BLkzDYYQJcQ\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/YouTube-Watch%20v0.8.6%20Overview-red?style=for-the-badge\u0026logo=youtube\u0026logoColor=white\" alt=\"Watch Video\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://koosoli.github.io/ESPHomeDesigner/\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Live%20Demo-Try%20it%20now-blue?style=for-the-badge\u0026logo=google-chrome\u0026logoColor=white\" alt=\"Live Demo\"\u003e\n  \u003c/a\u003e\n  \u003cbr\u003e\n  \u003cstrong\u003eClick to watch the latest feature walkthrough or try the demo.\u003c/strong\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \n### Supported Platforms\n  \n| Platform | Output Format | Use Case |\n|----------|---------------|----------|\n| **ESPHome** | C++ Lambda / LVGL YAML | ESP32 devices with direct display control |\n| **OpenEpaperLink** | Home Assistant Service Call (JSON) | Wireless e-paper price tags (AP-based) |\n| **OpenDisplay** | JSON Actions | HTTP-driven e-paper displays |\n\n\u003c/div\u003e\n\n**No more hand-coding ESPHome display lambdas.**\n\nBuild premium, touch-interactive dashboards for ESP32-based devices, wireless e-paper price tags, and HTTP-driven displays - all without writing a single line of display code.\n\n---\n\n## What Does It Do?\n\n- **Visual drag-and-drop editor** - Design layouts in your browser, see your actual HA entities update live on the canvas\n- **Multi-Platform Export** - One design, multiple outputs:\n  - **ESPHome**: Native C++ lambda code or LVGL YAML for ESP32 devices with direct display control\n  - **OpenEpaperLink (OEPL)**: JSON service calls for wireless e-paper tags via the OEPL Access Point\n  - **OpenDisplay (ODP)**: JSON action payloads for HTTP-driven displays\n- **Flexible Data Sources** - Connect widgets to Home Assistant entities or **MQTT topics** directly with no extra configuration needed.\n- **Multi-Page \"World View\"** - Manage all your project pages on a single unified stage with artboard-style rendering.\n- **Plugin-Based Architecture** - 55+ independent widget modules for everything from sensors and graphs to polygons and complex patterns.\n- **Round-trip editing** - Import existing ESPHome configs, OEPL YAML arrays, or ODP JSON payloads back into the editor.\n- **AI-Powered Dashboard Assistant** - Generate entire layouts or individual widgets from simple text prompts.\n- **Conditional Visibility** - Show or hide any widget based on Home Assistant entity state (binary, numeric, text, and range conditions).\n- **Time-Based Page Scheduling** - Assign visibility windows to pages so your device automatically shows the right content at the right time.\n- **Full device integration** - Exposes buttons, buzzer, temperature, and humidity sensors back to HA for automations.\n- **Smart power management** - Battery monitoring, configurable refresh intervals, and hardware-aware energy saving strategies.\n\n**Use case:** Display a weather page when you wake up, switch to a sensor dashboard during the day, show a specific alert page when the doorbell rings - all automated through Home Assistant.\n\n---\n\n## Quick Start\n\n### Installation (pick one)\n\n#### 1. Live Web Version (Easiest)\n\nYou can use the designer without installing anything! \n\n1. Go to [koosoli.github.io/ESPHomeDesigner/](https://koosoli.github.io/ESPHomeDesigner/)\n2. Open **Editor Settings** (gear icon)\n3. Enter your Home Assistant URL and a **Long-Lived Access Token** (created in your HA profile)\n4. Add the designer URL to your HA `cors_allowed_origins` (see below)\n\n#### 2. Install via HACS (Recommended)\n\n1. Add `https://github.com/koosoli/ESPHomeDesigner` to HACS as a custom repository\n2. Search for \"ESPHome Designer\" and install\n3. Restart Home Assistant\n4. Go to **Settings** -\u003e **Devices \u0026 Services** -\u003e **Add Integration** -\u003e Search for \"ESPHome Designer\"\n\n#### 3. Manual Installation\n\n1. Download the `custom_components/esphome_designer` folder from this repo\n2. Copy it to your Home Assistant `config/custom_components/` directory\n3. Restart Home Assistant\n4. Add the integration via **Settings** -\u003e **Devices \u0026 Services**\n\n### Where Home Assistant Stores Your Data\n\nWhen you run ESPHome Designer inside Home Assistant, your saved layouts are stored in Home Assistant's storage folder:\n\n- **Layouts and editor state**: `/config/.storage/esphome_designer`\n- **Custom layouts you create in the editor**: saved inside that same `/config/.storage/esphome_designer` file as separate layout entries\n- **Manual edits made in the YAML snippet box**: saved inside the active layout entry in `/config/.storage/esphome_designer` as part of the layout state, not as a standalone ESPHome device YAML file\n- **Legacy installs (0.8.6.2 and older)**: may still have old data in `/config/.storage/reterminal_dashboard`; the integration can read that and migrate it on a later save\n- **Uploaded custom hardware profiles**: `/config/esphomedesigner_custom_profiles/*.yaml`\n\nIf you are browsing the Home Assistant filesystem from the host OS, replace `/config` with your actual Home Assistant configuration directory.\n\n### How Saving and YAML Import Work\n\n- **Save Layout** saves the current canvas, layout settings, and any persisted manual YAML override to the active layout in Home Assistant storage. It does **not** automatically overwrite your real ESPHome device YAML file.\n- **Save Hardware Profile** is a separate action for reusable hardware recipes. It writes a YAML profile to `/config/esphomedesigner_custom_profiles/*.yaml`.\n- **Generated ESPHome YAML** in the snippet box is meant to be copied into your actual ESPHome device configuration. The normal workflow is still: design in the editor, copy the generated snippet, paste/merge it into your device YAML, then compile/flash from ESPHome.\n- **Import YAML back to canvas** / **Update Layout from YAML** does the reverse: it parses supported YAML back into pages/widgets and rebuilds the editor canvas for round-trip editing.\n- **Round-trip note**: very custom `lambda:` or `script:` code may not preview or reconstruct perfectly in the visual editor, even though the raw YAML can still be preserved.\n\n#### 4. Local Development Server\n\nRun the editor locally without Home Assistant:\n\n**Option A: Full Repository Clone (with npm/bun)**\n\nIf you cloned the full repository, run from the project root:\n\n```bash\nnpm install\nnpm run dev\n```\n\nOpen `http://localhost:5174` in your browser.\n\n**Option B: Frontend-Only (Python HTTP Server)**\n\nIf you only have the `custom_components` folder (e.g., HACS install), serve the frontend directly:\n\n```bash\ncd custom_components/esphome_designer/frontend\npython3 -m http.server 8000\n```\n\nOpen `http://localhost:8000` in your browser.\n\nConnect to Home Assistant by entering your HA URL and a Long-Lived Access Token in Editor Settings.\n\n### Development Verification\n\nFor local feature work, the canonical verification path is:\n\n```bash\nnpm test\nnpm run python:test\nnpm run quality\n```\n\n`npm test` runs the frontend suite and checks the schema hash without rewriting the committed baseline. If you intentionally changed a schema or snapshot contract, inspect it with `npm run schema:check` and then update the baseline with `npm run schema:update`.\n\nTo run the full Python panel/auth test flow locally, install the optional Python dependencies into your virtualenv once:\n\n```bash\nnpm run python:deps\n```\n\nThe Python helper scripts automatically prefer the repository `.venv` when it exists, then fall back to your active Python environment.\n\nCI runs `npm run quality` on every pull request, and the protected-branch guidance in [docs/branch_protection.md](docs/branch_protection.md) should require those `test (...)` checks before merge.\n\nFor manual GitHub uploads, especially version bumps or frontend changes, run:\n\n```bash\nnpm run release:prepare:skip-hassfest\n```\n\nThis rebuilds the shipped frontend bundle, checks the release/version surfaces, runs the local CI-style checks, and writes `tmp/release-upload-manifest.txt` so you do not forget the full `custom_components/esphome_designer/frontend/dist` directory. If Docker is available and you want Hassfest too, use `npm run release:prepare`.\n\nThe shipped dist bundle now includes `custom_components/esphome_designer/frontend/dist/build-meta.json`. CI uses that file to verify that the current frontend sources and the active manifest-backed dist files stay in sync without false-failing on Windows-vs-Linux text normalization, checkout-only workspace drift, or leftover unreferenced hashed assets from manual browser uploads.\n\n### Setup (ESPHome devices)\n\n#### 5. Prepare Your Device\n\n**Important:** Copy the Material Design Icons font file first!\n\nFrom this repo: `font_ttf/font_ttf/materialdesignicons-webfont.ttf`  \nTo your ESPHome: `/config/esphome/fonts/materialdesignicons-webfont.ttf`\n\n(Create the `fonts` folder if it doesn't exist)\n\nThen create a new ESPHome device:\n\n1. Create a new device in ESPHome Dashboard\n2. Let ESPHome generate the base config (WiFi, API, OTA, etc.)\n3. Configure the correct ESP platform for your device (instructions included in the generated YAML comments)\n\n#### 6. Design Your Dashboard\n\n1. Open the integration at `/esphome-designer` in Home Assistant\n2. Select your device type (E1001, E1002, TRMNL,...)\n3. Drag widgets onto the canvas\n4. Add your sensors, weather entities, icons, shapes\n5. Create multiple pages with different refresh rates\n6. **Live Preview**: Your YAML is generated on the fly as you design! Just look at the YAML snippet box.\n   \u003cp align=\"center\"\u003e\u003cimg src=\"screenshots/canvas.gif\" width=\"800\" alt=\"Modern Canvas Interaction\"\u003e\u003c/p\u003e\n\n#### 7. Flash It\n\n1. Copy the generated YAML snippet\n2. Paste it below ESPHome's auto-generated sections in your device config\n3. Compile and flash via ESPHome\n\n`Save Layout` stores your editor state in Home Assistant so you can come back later. Flashing still uses the YAML in your actual ESPHome device configuration.\n\nDone! Your custom dashboard is now running on your device.\n\n#### 8. Connect \u0026 Automate\n\nOnce flashed, your device will come online.\n\n1. Go to **Settings** -\u003e **Devices \u0026 Services** in Home Assistant.\n2. Your device should be discovered (or you can add it via the ESPHome integration).\n3. **Configure it** to ensure Home Assistant connects to its API.\n\n---\n\n## Widget Types\n\n- **Text \u0026 Sensor Text** - Static labels or live HA entity values with smart type detection and multiple formatting options\n  \u003cp align=\"center\"\u003e\u003cimg src=\"screenshots/text_formatting.gif\" width=\"700\" alt=\"Rich Text Formatting\"\u003e\u003c/p\u003e\n- **Icon \u0026 Weather Icon** - 360+ Material Design Icons or dynamic weather-state icons with full size/color control\n  \u003cp align=\"center\"\u003e\u003cimg src=\"screenshots/icon_picker2.gif\" width=\"700\" alt=\"Icon Picker System\"\u003e\u003c/p\u003e\n- **Date, Time \u0026 Calendar** - Customizable clock, date, and full monthly calendar views\n- **Progress Bar \u0026 Battery** - Visual indicators for percentages and dynamic battery level tracking\n- **Shapes \u0026 Rounded Rects** - Rectangles, circles, lines, and rounded rects with gray/dither support\n- **Graph** - Advanced sensor history plotting with auto-scaling, grid lines, and X/Y axis labeling\n- **Image \u0026 Online Image** - Static photos or dynamic URLs (weather maps, cameras) with auto-dithering\n- **Quote / RSS Feed** - Inspirational quotes or external RSS feeds with auto-scaling, refresh logic, and **multi-item display** (up to 10 items per feed)\n- **QR Code** - Dynamic QR generation for URLs, text, or **WiFi credentials** (auto-formats SSID/password for instant phone scanning)\n- **Touch Area** - Invisible or icon-labeled interactive zones to trigger HA actions (supports dual-state feedback)\n  \u003cp align=\"center\"\u003e\u003cimg src=\"screenshots/touch_icons.gif\" width=\"700\" alt=\"Touch Interactive Icons\"\u003e\u003c/p\u003e\n- **Weather Forecast** - Multi-day or **hourly** forecast display integrated with HA weather entities, with configurable hour slots and start offsets\n\n---\n\n## LVGL Support (Experimental)\n\n**Warning: Highly Experimental - Expect Bugs!**\n\nThis tool includes experimental support for **LVGL (Light and Versatile Graphics Library)** widgets on LCD+Touch devices. LVGL enables interactive widgets like buttons, switches, sliders, and checkboxes that can control Home Assistant entities directly from the touchscreen.\n\n### Important Notes\n\n- **LCD+Touch devices only** - LVGL is designed for real-time displays, not e-paper\n- **Entire page switches to LVGL mode** if you add any LVGL widget\n- **High memory usage** - Requires ESP32-S3 with PSRAM\n- **May be unstable** - This feature is under active development\n\n### Available LVGL Widgets\n\n- Buttons, Switches, Checkboxes, Sliders (interactive, can trigger HA actions)\n- Arcs, Bars, Charts (display sensor values)\n- Labels, Images, QR Codes, and more\n- **Service Overrides** for buttons - explicitly choose `cover.open_cover`, `button.press`, etc. instead of default toggle\n- **Grid Layout Mode** - assign widgets to grid cells with automatic row/column span detection\n\nFor stable results, stick to **Native Mode** (standard widgets without LVGL prefix).\n\n---\n\n## OpenEpaperLink \u0026 OpenDisplay\n\nDesign once, export to wireless e-paper displays:\n\n- **[OpenEpaperLink](https://github.com/jjwbruijn/OpenEPaperLink)** - Select \"OpenEpaperLink\" mode, enter your tag's entity ID, copy the JSON for use in HA service calls\n- **[OpenDisplay](https://github.com/open-display/open-display)** - Select \"OpenDisplay\" mode, copy the JSON actions, send via HTTP POST\n\nMost widgets (text, shapes, images, icons, QR codes) work on all platforms. Graphs, touch areas, and LVGL are ESPHome-only.\n\n---\n\n## Features\n\n**Editor**\n- Visual drag-and-drop canvas with snap-to-grid and live entity state updates\n- Multi-page \"World View\" - see all pages as artboards on a unified stage\n- Hierarchy panel for layer management, z-index, and widget locking\n- Entity picker with real-time preview of your HA entities\n- AI assistant (Gemini, OpenAI, OpenRouter) for generating layouts from text prompts\n- Round-trip editing - import existing ESPHome/OEPL/ODP code back into the editor\n- Per-page visibility windows for time-based content scheduling\n- Conditional widget visibility based on HA entity states\n\n**Output**\n- Live code generation as you design (no \"Generate\" button needed)\n- Multi-platform export: ESPHome C++/LVGL, OpenEpaperLink JSON, OpenDisplay JSON\n- Smart YAML generator - clean, additive output that won't conflict with your base config\n- **MQTT data source support** - widgets can subscribe directly to MQTT topics instead of HA entities\n- Optimized LVGL export with automatic stripping of default property values\n\n**Design Tools**\n- RGB color picker, dark mode toggle, zoom controls\n- Smart spacing, alignment guides, and radial context menu\n- **Multi-select editing** - edit common properties across multiple widgets simultaneously\n- Widget grouping with preserved hierarchy\n- 55+ widget plugins (v1.0 modular architecture)\n\n**Hardware**\n- Buttons, buzzer, temp/humidity sensors exposed to Home Assistant\n- Battery monitoring and configurable refresh intervals\n- Hardware-aware energy strategies for LCD, OLED, and E-Ink\n- Custom hardware profile creation (experimental)\n\n---\n\n## Technical Details\n\nThe generator produces a **complete display/application snippet** for your project. In the normal ESPHome workflow, you paste that snippet into your existing device YAML below ESPHome's auto-generated base sections.\n\n**What it generates (everything you need):**\n- **Hardware Config**: `psram`, `i2c`, `spi`, `external_components`, and device-specific sections (`m5paper`, `axp2101`)\n- **Core Components**: `http_request`, `time` (Home Assistant), `globals` (page tracking), and `deep_sleep`\n- **Widgets \u0026 Assets**: `font` (MDI icons), `image` (deduplicated), `online_image`, `graph`, and `qr_code`\n- **HA Integration**: `sensor`, `text_sensor`, `binary_sensor`, `button`, and `switch` entities\n- **Logic \u0026 Display**: `script` (smart refresh), `display` (lambda code), and `lvgl` (if enabled)\n\n**What ESPHome provides** (auto-generated when you create a device):\n- `wifi:`, `api:`, `ota:`, `logger:`\n\nThe workflow is safe and deterministic - same layout always produces the same YAML.\n\n---\n\n## Hardware Support\n\n**Currently Supported:**\n- **Seeed Studio**: [reTerminal E1001](https://www.seeedstudio.com/reTerminal-E1001-p-6534.html?sensecap_affiliate=U5gNTEF\u0026referring_service=link) (BW), [reTerminal E1002](https://www.seeedstudio.com/reTerminal-E1002-p-6533.html?sensecap_affiliate=U5gNTEF\u0026referring_service=link) (Color), [TRMNL 7.5'' OG DIY Kit](https://www.seeedstudio.com/TRMNL-7-5-Inch-OG-DIY-Kit-p-6481.html?sensecap_affiliate=U5gNTEF\u0026referring_service=link) (S3)\n- **Waveshare**: [PhotoPainter](https://www.waveshare.com/esp32-s3-photopainter.htm?\u0026aff_id=136175) (7-Color)\n- **M5Stack**: [M5Paper](https://shop.m5stack.com/products/m5paper-esp32-development-kit-v1-1-960x540-4-7-eink-display-235-ppi?ref=qcwynykf\u0026srsltid=AfmBOopfcra6VDlyNoA8jSlBq8CLjnDIqCT8peRIUqGMq_4DVDSAMGCV\u0026variant=39966887903404) (Touch), [M5Stack M5Core Ink](https://shop.m5stack.com/products/m5stack-esp32-core-ink-development-kit1-54-elnk-display?ref=qcwynykf)\n- **TRMNL**: Original [ESP32-C3 e-paper device](https://shop.usetrmnl.com/collections/devices/products/trmnl)\n\n\u003e [!IMPORTANT]\n\u003e All devices not explicitly listed above are **untested** and may require troubleshooting.\n\n**Hardware Features Exposed:**\n- 3 physical buttons (GPIO 3/4/5)\n- RTTTL buzzer (GPIO 45)\n- SHT4x temp/humidity sensor (I2C)\n- Battery voltage monitoring (ADC GPIO1)\n- WiFi signal strength\n\nAll exposed as Home Assistant entities for use in automations.\n\n---\n\n## Repository Structure\n\n- `custom_components/esphome_designer/` - Home Assistant integration\n  - `api/` - Modular Python backend handlers for HA\n  - `yaml_parser/` - Modular engine for importing ESPHome code\n  - `frontend/` - Visual drag-and-drop editor (Vite-based)\n  - `renderer.py` - Core engine for generating ESPHome lambdas\n  - `models.py` - Shared data models for widgets and layouts\n  - `storage.py` - Persistence layer for layouts and settings\n- `release_notes.md` - Full changelog and version history\n- `font_ttf/` - Icon font for widgets (Material Design Icons)\n- `hardware_recipes_guide.md` - Guide for creating custom hardware profiles\n- `screenshots/` - Editor screenshots\n\n---\n\n## Troubleshooting\n\n**Font compilation error?**\n- Make sure you copied `materialdesignicons-webfont.ttf` to `/config/esphome/fonts/`\n\n**Display not updating?**\n- Check `update_interval: never` in display config\n- Verify buttons are wired to `component.update: epaper_display`\n\n\n**Duplicate section errors?**\n- The generator now produces a complete, standalone configuration including `psram`, `i2c`, etc.\n- **Do not** use old hardware templates that define these sections. Rely on the generated code.\n\n**Compilation Fails (\"Killed signal\" / Out of Memory)?**\nIf your Raspberry Pi crashes with `Killed signal terminated program`, it lacks the RAM for these fonts.\n\n**Try this first:**\nAdd `compile_process_limit: 1` to your `esphome:` section in the YAML. This reduces memory usage but slows down compilation.\n\n**If that fails, compile on your PC:**\n\n1. **Install ESPHome**: Install Python, then run `pip install esphome` in your terminal.\n2. **Setup Folder**: Create a folder like `C:\\esphome_build` (**Important**: No spaces in the folder path!).\n3. **Copy Files**: Copy your `reterminal.yaml` and the `fonts/` folder into that folder.\n4. **Compile**: Run this command:\n   ```powershell\n   python -m esphome compile C:\\esphome_build\\reterminal.yaml\nUpload: Take the generated .bin file and upload it via the Home Assistant ESPHome dashboard (Install -\u003e Manual Download).\n\n**CORS errors with GitHub-hosted version?**\nAdd this to your Home Assistant `configuration.yaml` and restart:\n```yaml\nhttp:\n  cors_allowed_origins:\n    - https://koosoli.github.io\n```\n\n---\n\n## License\n\nMade with love - free and Open Source under the GPL 3.0 license. Share the love.\n\n\u003cdiv align=\"center\"\u003e\n\n**If you find this project useful, consider supporting its development.**\n\n[![Sponsor](https://img.shields.io/badge/Sponsor-Project-ff69b4?style=for-the-badge\u0026logo=github-sponsors)](https://github.com/sponsors/koosoli)\n[![Buy Me a Coffee](https://img.shields.io/badge/Buy%20Me%20a%20Coffee-ffdd00?style=for-the-badge\u0026logo=buy-me-a-coffee\u0026logoColor=black)](https://buymeacoffee.com/koosoli)\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkoosoli%2Fesphomedesigner","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkoosoli%2Fesphomedesigner","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkoosoli%2Fesphomedesigner/lists"}