{"id":50652948,"url":"https://github.com/megamansec/wiz-light-controller","last_synced_at":"2026-06-07T22:01:11.216Z","repository":{"id":362312027,"uuid":"1258320847","full_name":"MegaManSec/wiz-light-controller","owner":"MegaManSec","description":"Local, cloud-free control for Philips WiZ smart lights — a native macOS menu-bar app and a CLI, sharing one zero-dependency engine.","archived":false,"fork":false,"pushed_at":"2026-06-03T15:51:32.000Z","size":218,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-03T16:09:16.792Z","etag":null,"topics":["iot","local-control","philips-hue","philips-wiz","smart-home","smart-lighting","wiz","wiz-lights"],"latest_commit_sha":null,"homepage":"https://github.com/MegaManSec/wiz-light-controller","language":"Swift","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/MegaManSec.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-06-03T13:21:36.000Z","updated_at":"2026-06-03T15:55:15.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/MegaManSec/wiz-light-controller","commit_stats":null,"previous_names":["megamansec/wiz-light-controller"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/MegaManSec/wiz-light-controller","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MegaManSec%2Fwiz-light-controller","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MegaManSec%2Fwiz-light-controller/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MegaManSec%2Fwiz-light-controller/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MegaManSec%2Fwiz-light-controller/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MegaManSec","download_url":"https://codeload.github.com/MegaManSec/wiz-light-controller/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MegaManSec%2Fwiz-light-controller/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34039495,"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-07T02:00:07.652Z","response_time":124,"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":["iot","local-control","philips-hue","philips-wiz","smart-home","smart-lighting","wiz","wiz-lights"],"created_at":"2026-06-07T22:01:09.936Z","updated_at":"2026-06-07T22:01:11.205Z","avatar_url":"https://github.com/MegaManSec.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/app_iconhigh.png\" alt=\"WiZ Light Controller app icon\" width=\"200\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eWiZ Light Controller\u003c/h1\u003e\n\nFast, **local, cloud-free** control for Philips WiZ smart bulbs. It talks to bulbs directly over your LAN (UDP) — no account, no cloud round-trip, no telemetry. At its heart is one small, dependency-free JavaScript engine (`wiz-light-core`) that is reused by two front-ends: a `wiz` **CLI** and a **native macOS menu-bar app** (Swift), which runs the engine's pure colour and light-state logic via **JavaScriptCore** — so both share a single, tested implementation.\n\n## Features\n\nMirrors the original app's capabilities:\n\n- **Discovery** — find WiZ bulbs on your network (UDP broadcast), keyed by MAC.\n- **Saved lights** — remember bulbs by **MAC** with a friendly name; the IP is re-resolved on discovery, so it survives DHCP changes.\n- **Colour** — a **colour wheel** plus direct **RGB / HSV / hex** entry, with per-device colour memory.\n- **White temperature** — tunable white over the bulb's own negotiated range (e.g. **2200–6500 K**).\n- **Brightness** — 0–100% (clamped to the firmware-valid floor; see below).\n- **Presets** — seeded RGB + white presets, with apply / match.\n- **Sync from light** — read a bulb's current state (`getPilot`) back into the UI.\n- **Settings** — accent/highlight colour and auto-sync, persisted locally.\n\n## Screenshots\n\nThe native macOS app: a menu-bar dropdown for quick changes, and a full controls window. Each shot is annotated — the numbered callouts are explained beneath it.\n\n**Menu-bar dropdown** — click the bulb for instant control, no window needed:\n\n\u003cimg src=\"assets/screenshot-dropdown.png\" alt=\"Menu-bar dropdown (annotated)\" width=\"380\"\u003e\n\n**Controls — colour (RGB)** — colour wheel, RGB / HSV / hex entry, and the white-LED \"Brighter colours\" blend:\n\n\u003cimg src=\"assets/screenshot-rgb.png\" alt=\"RGB colour controls (annotated)\" width=\"520\"\u003e\n\n**Controls — white \u0026 presets** — tunable colour temperature and one-tap presets:\n\n\u003cimg src=\"assets/screenshot-white.png\" alt=\"White temperature and presets (annotated)\" width=\"520\"\u003e\n\n**Discover** — find bulbs on your LAN and save them:\n\n\u003cimg src=\"assets/screenshot-discover.png\" alt=\"Discovery sheet (annotated)\" width=\"480\"\u003e\n\n**Settings** — device info, auto-sync, and update checks:\n\n\u003cimg src=\"assets/screenshot-settings.png\" alt=\"Settings tab (annotated)\" width=\"500\"\u003e\n\n## Install\n\n### macOS app\n\n1. Download **`WiZ-Light-Controller-macOS.zip`** from the [latest release](https://github.com/MegaManSec/wiz-light-controller/releases/latest) and unzip it.\n2. Move **`WiZ Light Controller.app`** to `/Applications`.\n3. The build may be unsigned, so macOS blocks it on first launch — **right-click → Open**, or launch it and choose **Open Anyway** under **System Settings → Privacy \u0026 Security**. (If macOS calls the app \"damaged\", clear the download quarantine: `xattr -dr com.apple.quarantine \"/Applications/WiZ Light Controller.app\"`.)\n4. Approve **Local Network** access when prompted — it's required to reach the bulbs over your LAN. (You can grant it later under **System Settings → Privacy \u0026 Security → Local Network**.)\n\nIt lives in the menu bar with no Dock icon: click the bulb for the quick dropdown, or the controls button in its header for the full window.\n\n### CLI and engine (npm)\n\nPublished to npm; the CLI needs **Node ≥ 24**.\n\n```bash\npnpm add -g wiz-light-cli      # install the `wiz` command globally\nwiz discover                   # find bulbs on your LAN — then `wiz --help`\n```\n\nOr use the engine as a library in your own project:\n\n```bash\npnpm add wiz-light-core\n```\n\n(Both also install with npm: `npm i -g wiz-light-cli` / `npm i wiz-light-core`.)\n\n## Monorepo layout\n\nA pnpm workspace:\n\n```\npackages/core   wiz-light-core   Pure engine: WiZ UDP protocol, broadcast discovery, colour maths, light-state model, persisted stores. Zero runtime dependencies.\npackages/cli    wiz-light-cli    Dependency-free `wiz` CLI on top of wiz-light-core.\napps/macos                       Native macOS menu-bar app (SwiftPM). Runs wiz-light-core's pure logic in JavaScriptCore; UDP/persistence/UI in Swift.\nlegacy/                          Original GPL-3.0 Python app (wiz.py), preserved as-is.\nscripts/                         Repo tooling (build-jscore.mjs, release-notes.mjs).\n```\n\n## Build from source\n\nFor hacking on the project — the prebuilt app and published packages are under [Install](#install) above. Requires **Node 24** and **pnpm 10** (via Corepack — `corepack enable`).\n\n```bash\npnpm install              # integrity-checked: pnpm install --frozen-lockfile\n```\n\n### Engine\n\n```bash\npnpm test:core            # run the engine's node:test suite\n```\n\n### CLI\n\n```bash\npnpm --filter wiz-light-cli start -- discover     # find bulbs on your LAN\npnpm --filter wiz-light-cli start -- --help       # all commands\n```\n\n(To install the published `wiz` command, see [Install](#install). From a checkout, link it instead: `pnpm --filter wiz-light-cli exec npm link`.)\n\n### macOS app\n\nNeeds **Xcode** (Swift toolchain) on **macOS 13+**. The JavaScriptCore bundle is generated from `wiz-light-core`, so build it first:\n\n```bash\npnpm build:jscore             # generate the JSCore bundle from wiz-light-core\nmake -C apps/macos app        # assemble + ad-hoc-sign \"WiZ Light Controller.app\"\nmake -C apps/macos run        # build (if needed) and launch it\n```\n\nFor a signed, distributable build, set `CODESIGN_IDENTITY` to your Developer ID Application identity (see [`apps/macos`](apps/macos/README.md)).\n\n## Security\n\nLocal-only by design, with a deliberately small surface:\n\n- **Zero-dependency engine.** `wiz-light-core` and `wiz-light-cli` use **Node built-ins only** — nothing third-party at runtime.\n- **Supply chain.** CI installs with a **frozen lockfile**; pnpm 10 blocks dependency lifecycle (postinstall) scripts except an explicit `pnpm.onlyBuiltDependencies` allowlist.\n- **Native app.** Runs under the **App Sandbox** with only the two LAN networking entitlements it needs (`network.client` / `network.server`) and a clear Local-Network usage description. There is **no bundled browser or Node** — JavaScriptCore is a hardened Apple system framework. CI builds **ad-hoc signed** by default; tagged releases are **Developer ID** signed and notarized when the signing secrets are present.\n\nSee [`apps/macos`](apps/macos/README.md) for the app's full security, signing, and notarization model.\n\n## Requirements\n\n- **Node 24** and **pnpm 10** (pinned; use Corepack).\n- **macOS app:** **Xcode 15+** on **macOS 13+** (Apple frameworks only — no third-party Swift dependencies).\n- Your machine on the **same LAN** as the bulbs.\n\n## Packages\n\n- [`packages/core`](packages/core/README.md) — `wiz-light-core`, the engine (protocol, discovery, colour, model, stores).\n- [`packages/cli`](packages/cli/README.md) — `wiz-light-cli`, the `wiz` command-line interface.\n- [`apps/macos`](apps/macos/README.md) — the native macOS menu-bar app.\n\n## License\n\n[GPL-3.0-or-later](LICENSE). Originally a Python app by [Eshaan Pisal](https://github.com/kek353) (GPL-3.0), preserved under [`legacy/`](legacy/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmegamansec%2Fwiz-light-controller","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmegamansec%2Fwiz-light-controller","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmegamansec%2Fwiz-light-controller/lists"}