{"id":49901548,"url":"https://github.com/moellere/wirestudio","last_synced_at":"2026-06-28T02:01:34.977Z","repository":{"id":355483286,"uuid":"1228254372","full_name":"moellere/WireStudio","owner":"moellere","description":"Agent-driven design studio for ESP32 / ESPHome + LoRaWAN devices: generates ESPHome YAML, KiCad schematic/PCB, 3D-printable enclosures, and builds/flashes/provisions LoRaWAN firmware (ChirpStack + Home Assistant).","archived":false,"fork":false,"pushed_at":"2026-06-27T21:54:50.000Z","size":2113,"stargazers_count":15,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-27T22:11:30.425Z","etag":null,"topics":["ai-agent","chirpstack","claude","electronics","esp32","esphome","fastapi","hardware-design","home-assistant","iot","kicad","lorawan","mcp","model-context-protocol","openscad","pcb","platformio","radiolib","smart-home","webserial"],"latest_commit_sha":null,"homepage":"https://wirestudio.io","language":"Python","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/moellere.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","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-05-03T19:48:49.000Z","updated_at":"2026-06-27T21:54:52.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/moellere/WireStudio","commit_stats":null,"previous_names":["moellere/esphome-studio","moellere/wirestudio"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/moellere/WireStudio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moellere%2FWireStudio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moellere%2FWireStudio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moellere%2FWireStudio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moellere%2FWireStudio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/moellere","download_url":"https://codeload.github.com/moellere/WireStudio/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moellere%2FWireStudio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34874557,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-28T02:00:05.809Z","response_time":54,"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":["ai-agent","chirpstack","claude","electronics","esp32","esphome","fastapi","hardware-design","home-assistant","iot","kicad","lorawan","mcp","model-context-protocol","openscad","pcb","platformio","radiolib","smart-home","webserial"],"created_at":"2026-05-16T06:41:23.792Z","updated_at":"2026-06-28T02:01:34.972Z","avatar_url":"https://github.com/moellere.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# wirestudio\n\nAgent-driven IoT device design tool. Describe a goal (or pick parts);\nget ESPHome YAML, an ASCII wiring diagram, and a BOM that compile\nunder upstream ESPHome.\n\nTwo LoRaWAN paths share the studio. The standalone target builds and\nflashes RadioLib + LoRaWAN_ESP32 firmware over WebSerial. The newer\nexternal-component path emits ESPHome YAML referencing\n[`lorawan-for-esphome`](https://github.com/moellere/lorawan-for-esphome),\nso the LoRaWAN device joins the same ESPHome / fleet-for-esphome build\npipeline as every other device — provisioning, key handling, and\njoin-status polling all from the web UI. Both paths target US915 radio\nboards (TTGO T-Beam / LoRa32, Heltec WiFi LoRa 32 V2 / V3) and\nprovision against ChirpStack.\n\nProduces ESPHome configs but is not affiliated with the ESPHome\nproject — see [`weirded/fleet-for-esphome`](https://github.com/weirded/fleet-for-esphome)\nfor the OTA-deploy companion this studio's **Push to fleet** flow\ntalks to.\n\n## Documentation\n\nDetailed docs live in [`docs/`](docs/):\n\n- [Documentation index](docs/index.md) — architecture, repo layout, roadmap.\n- [User guide](docs/user_guide.md) — Web UI, inspector, header actions, HTTP API, examples.\n- [Deployment](docs/deployment.md) — self-host with Docker or Kubernetes.\n- [Integrations](docs/integrations.md) — agent, fleet handoff, enclosure search, KiCad.\n- [MCP server](docs/mcp.md) — drive the studio from Claude Code / Desktop.\n- [Library reference](docs/library.md) — every board and component.\n- [LoRaWAN target](docs/lorawan/) — build + flash LoRaWAN firmware, provision against ChirpStack.\n\n## Status\n\n`v0.17.1` — on PyPI (`pip install wirestudio`). The studio has wide\nsurface area (YAML, schematic, enclosure, agent, MCP server, fleet\nhandoff, web UI, two LoRaWAN flash/provision paths — standalone Arduino\nand an external-component path that emits ESPHome YAML referencing\n`lorawan-for-esphome`) and a set of things actually verified against\nupstream tools. Three of the four priority\ntiers (YAML, wiring schema, enclosure) are now gated in CI, and **every\nlibrary component and board is exercised by a bundled example** that\npasses those gates. This section is honest about which is which, ordered\nby how much it matters that it works.\n\nTiers, in priority order:\n\n| Tier | Area | What it does | Verified by |\n|---|---|---|---|\n| **Verified** | ESPHome YAML production | render `design.json` → ESPHome YAML | `esphome config` passes on every bundled example, every PR ([gate](.github/workflows/esphome-config.yml)); nightly `esphome compile` smoke against a representative example ([compile](.github/workflows/esphome-compile.yml)) |\n| **Verified** | CSP pin solver + compat checker | assign legal pins, surface boot-strap / ADC2-WiFi / voltage / locked-pin issues | unit tests + property checks in `tests/test_pin_solver.py` + `tests/test_compatibility.py` |\n| **Verified** | Fleet handoff | push YAML to `fleet-for-esphome` ha-addon, optional compile + log relay | round-trip tests in `tests/test_fleet.py` |\n| **Verified** | KiCad schematic | emit a SKiDL Python script the user runs locally to produce a `.kicad_sch` | every bundled example builds a KiCad netlist against the pinned upstream symbol libraries, every PR ([gate](.github/workflows/kicad-schematic.yml)) — no unresolved symbols or pins. Parts KiCad ships no symbol for (sensor/module breakouts) render as labeled generic headers |\n| **Verified** | Parametric enclosure | OpenSCAD `.scad` from board mount-hole metadata | every enclosure-capable board renders through real OpenSCAD to a non-empty, manifold (closed, printable) solid, every PR ([gate](.github/workflows/enclosure-render.yml)) |\n| **Works (hardware-validated)** | LoRaWAN target | build RadioLib + LoRaWAN_ESP32 firmware for US915 radio boards, flash over WebSerial, provision against ChirpStack | every radio board's firmware builds in CI ([gate](.github/workflows/lorawan-firmware.yml)); validated end-to-end on a TTGO T-Beam against live ChirpStack 4.17 — no automated live-device gate |\n| **Works (lighter checks)** | MCP server | drive the design tools from Claude Code / Desktop over the Model Context Protocol | tool / auth / resource tests in `tests/test_mcp_*.py`; not exercised against a live MCP client in CI |\n| **Experimental** | Thingiverse search relay | rank community models for a board | smoke-tested; depends on a third-party search API that ranks unevenly |\n| **Experimental** | Agent (Claude tool-using) | natural-language design driving | works in practice; tool surface is small; no auto-eval against task list yet |\n| **Deferred** | KiCad PCB layout | Freerouting + Gerber + JLCPCB CPL/BOM | 1.0+, not started |\n\nThe **Verified** tier is the bar the project is asking to be judged\non. Everything else is offered with the caveat that's spelled out in\nthe table.\n\nSee [`CONTRIBUTING.md`](CONTRIBUTING.md) for the bar a change has to\nclear before merging, [`CHANGELOG.md`](CHANGELOG.md) for per-release\ndeltas, and [`START.md`](START.md) for the longer-form design notes.\n\nTested against ESPHome **`==2025.12.7`** (pinned in\n`.github/workflows/esphome-config.yml` + bumped deliberately). When\nthat pin moves, this line moves with it.\n\n## Quickstart\n\n### Docker\n\n```sh\ndocker run --rm -p 8765:8765 \\\n  -e ANTHROPIC_API_KEY=sk-ant-... \\\n  -v wirestudio-data:/data \\\n  ghcr.io/moellere/wirestudio:v0.17.1\n```\n\nOpen \u003chttp://localhost:8765\u003e. The image bundles the FastAPI server +\nthe built web UI in one process. See [Deployment](docs/deployment.md)\nfor image tags, env vars, and the Kubernetes manifest.\n\n### CLI\n\n```sh\npip install wirestudio                       # from PyPI\n# ...or, for a dev checkout:  pip install -e .[dev]\npython -m wirestudio.generate wirestudio/examples/garage-motion.json\n```\n\nPrints rendered YAML and the ASCII wiring block to stdout.\n\n### HTTP API\n\n```sh\npython -m wirestudio.api                    # localhost:8765\npython -m wirestudio.api --reload           # dev mode (auto-reload on edits)\n```\n\nBrowse the auto-generated OpenAPI docs at \u003chttp://127.0.0.1:8765/docs\u003e.\nThe agent, fleet handoff, and MCP surfaces are each gated by an env\nvar — see [Integrations](docs/integrations.md).\n\n### Web UI (dev)\n\n```sh\n# In one terminal:\npython -m wirestudio.api\n# In another:\ncd web \u0026\u0026 npm install \u0026\u0026 npm run dev\n```\n\nOpen \u003chttp://localhost:5173\u003e; Vite proxies `/api/*` to the studio API.\nThe [User guide](docs/user_guide.md) walks the panes and header actions.\n\n## Tests\n\n```sh\npython -m pytest                          # ~680 cases\npython -m ruff check .                    # lint\ncd web \u0026\u0026 npx vitest run                  # vitest + jsdom\npip install 'esphome==2025.12.7'\npython scripts/check_examples.py          # the YAML gate -- every example through `esphome config`\n```\n\nThe `esphome config` gate is the headline test: it renders every\nbundled example through the studio and runs upstream ESPHome's own\nvalidator against the output. The GitHub Actions workflow runs the\nYAML gate + the full suite + multi-arch image build on every PR and\nmerge to `main`. A nightly compile-smoke runs `esphome compile`\nagainst a representative example. To run the gate before every push:\n\n```sh\npip install pre-commit\npre-commit install --hook-type pre-push\n```\n\n## Contributing\n\n[`CONTRIBUTING.md`](CONTRIBUTING.md) is the substantive bar — what\n\"working\" means for the artifacts the studio produces, including\nthe `esphome config` gate every PR has to clear. [`CLAUDE.md`](CLAUDE.md)\ncovers the prose / commit / comment conventions (concise, no emojis,\ndefault-to-no-comments, boundary-only validation, no premature\nabstraction).\n\n## License\n\nMIT. See [`LICENSE`](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoellere%2Fwirestudio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmoellere%2Fwirestudio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoellere%2Fwirestudio/lists"}